1、準備階段(需求設計)node
鑑權數據庫
採用哪一種權限認證模式,Cookie因爲有域的限制,考慮到之後可能作桌面端,IPhone端等,因此決定採用token進行權限認證,客戶端經過token保存客戶驗證信息。而token則採用JWT進行(補充知識:JSON Web令牌)驗證,用token建議是最好不用查詢數據庫就能獲取一些經常使用信息,這樣就能節省一些訪問時間。json
補充知識:服務器
JSON Web Token 入門教程 阮一峯分佈式
消息ide
前面說過採用MQTT進行消息傳輸,那麼怎樣定義消息,怎樣保存消息,以及離線消息怎麼拉取就是當前最大的問題,MQTT到底傳輸些什麼呢?spa
MQTT到底傳輸的是文本仍是整個文件(若是有文件的話),參照jwt咱們能夠將消息分爲正常內容以及載荷(payload),將視頻、文件等大致積的內容單獨發送到文件服務器,返回對應id而後放在載荷中,這樣傳輸的就只有全文本(json格式)了。設計
消息必須有發送者賬號、名稱以及接收者賬號、名稱,發送時間,以及消息類別,消息內容等;考慮到消息發佈時先發布出去,再上傳到服務器,在消息中增長一個惟一標識字段msgId,在服務端推送來時能夠區分,不會有重複消息。視頻
消息內容分爲兩大類,普通文本直接放在消息內容中,而其餘消息(如文件、音頻、視頻等)則以json的方式保存在消息內容中。jwt
消息類型:
類別 |
說明 |
備註 |
text |
普通文本 |
|
Image |
圖片 |
|
audio |
語音 |
|
file |
文件 |
|
location |
位置 |
|
emotion |
自定義表情 |
|
video |
視頻 |
|
idcard |
名片 |
其餘消息(除文本消息外)類型結構:
名稱 |
類型 |
說明 |
備註 |
type |
String |
類型,也就是以上列出全部類型 |
|
path |
String |
若是是文件,則是對應的路徑 |
|
content |
String |
正文暫時預留 |
|
size |
int |
文件大小 |
|
mlength |
int |
語音,視頻長度 |
|
thumb |
String |
視頻縮略圖,路徑 |
消息數據庫
暫時考慮消息只保存一張表(若是數據過多,或時間過長影響效率的時候再考慮將這張表作爲活動表,過時信息移到別的表中,這是後話,有機會再完善)。只有一張表的狀況下,拉取離線消息也相對簡單,只要在客戶端記錄最後一次拉取的時間,在下次登陸的時候將時間發送後臺就能夠拉取全部離線消息。
數據庫仍然只保存MQTT發送的消息內容,表結構:
字段名稱 |
類型 |
說明 |
備註 |
type |
String |
類型 |
系統消息,p2p,group |
recAccount |
String |
接收者賬號 |
能夠是組account,也能夠是我的account,主要看type是group仍是p2p |
recName |
String |
接收者賬號 |
|
msgContentType |
String |
消息正文類型 |
對應image,text… |
msgContent |
String |
消息正文 |
前面說明兩種,要麼就是正文,要麼是json |
sender |
ImAccount |
發送者 |
|
senderTime |
Date |
發送時間 |
|
msgId |
String |
消息惟一值 |
|
is_callbacked |
Boolean |
是否撤回 |
|
add_time |
Date |
添加時間 |
|
update_time |
Date |
修改時間 |
文件上傳下載
開始直接使用Django的文件上傳下載,後來發現效率過低,下載會有問題。因而想使用分佈式文件管理系統,在網上查找都是在Linux系統的,而我沒有Linux服務器,只能作其餘想。因而決定使用Mongodb Gridfs進行文件管理,花了很長時間終於調通(這個會在後面具體實現中說明)。
賬號數據庫
主要使用到即時通信表分別爲賬號表,羣組表,以及消息表(前面說過),以及相關聯表。賬號表除相關信息外,還有friends字段用於保存好友,groups字段用於保存羣組列表。而一樣羣組表,也有賬號列表字段用於保存羣組的賬號信息。
表ImAccount
字段名稱 |
類型 |
說明 |
備註 |
account |
String |
賬號,惟一 |
|
mobile |
String |
手機號 |
|
name |
String |
暱稱 |
|
search |
String |
搜索鍵,保存account以及name的拼音搜索字段 |
|
|
String |
郵箱 |
|
|
String |
QQ號 |
|
is_active |
Boolean |
是否在線,暫時未使用 |
|
head |
String |
頭像對應路徑 |
|
add_time |
Date |
添加時間 |
|
update_time |
Date |
修改時間 |
|
friends |
List<ImAccount> |
好友列表 |
|
groups |
List<ImGroup> |
組列表 |
表ImGroup
字段名稱 |
類型 |
說明 |
備註 |
account |
String |
賬號 |
|
name |
String |
組名 |
|
desc |
String |
描述 |
|
creater |
ImAccount |
建立者 |
|
imAccounts |
List<ImAccount> |
組成員 |
|
head |
String |
組頭像 |
|
add_time |
Date |
添加時間 |
|
update_time |
Date |
修改時間 |
希望大家能繼續關注後期文章,下一期專門講解消息隊列相關內容
請關注公衆號有更多精彩等你: