也是閑得蛋疼, 自己編寫了一個(gè)可以跑的聊天軟件(超級(jí)簡(jiǎn)易, 能添加好友, 發(fā)送文字, 離線接受消息).
1. 功能
- 用戶注冊(cè)
- 搜索/添加好友
- 與好友進(jìn)行文字聊天
2. 用到技術(shù)
采用C-S架構(gòu)
客戶端: cocos2dx-lua
服務(wù)器: mysql + sequelize + express
數(shù)據(jù)通訊方式: socket, http-json
3. 簡(jiǎn)要描述
- 數(shù)據(jù)庫以及表
數(shù)據(jù)庫使用mysql, 開源, 好用
表主要有下面3張:
(1) 首先是用戶表, 涉及uid, uname, password, email等
(2) 然后是好友表, 主鍵自然增長, 有srcUid, destUid等
(3) 然后是消息表, 包括消息id, 類型, 狀態(tài)(是否已讀), srcUid, destUid, 發(fā)送時(shí)間等 - ORM采用 sequelize
如果討厭寫sql語句(比如我這種渣渣), 可使用ORM代替
之前有過sequelize的簡(jiǎn)單介紹:傳送門
主要作用是將領(lǐng)域模型與數(shù)據(jù)庫對(duì)應(yīng)起來
舉個(gè)例子, "用戶(User)"是一個(gè)模型, 在數(shù)據(jù)庫中也對(duì)應(yīng)一張用戶表, 因此用sequelize可以將模型與數(shù)據(jù)庫表關(guān)聯(lián)起來, 之后的有關(guān)數(shù)據(jù)庫操作(例如新建用戶), 只需要按照sequelize方式很自然地做到 - 后端采用express框架
js給人的感覺就是快速好上手, 很多東西可以直接用, 它都自帶得有. express輕量常用, 也很好上手
將后端大致分為3層:
(1) controller層: 使用express框架中的route.js, 將web請(qǐng)求與后端服務(wù)層連接, 后端的數(shù)據(jù)也通過這些controller返回給請(qǐng)求者
(2) service層: controller穿過來的任務(wù)有些是重復(fù)的, 有些又是比較復(fù)雜的, 還有考慮到有些業(yè)務(wù)也可能會(huì)變動(dòng), 因此寫了各種manager.js來處理這些請(qǐng)求
(3) model層: 各種領(lǐng)域模型放在這里, 如本例子里的User, Message, Friend等, 跟數(shù)據(jù)庫和服務(wù)層關(guān)聯(lián)
舉個(gè)例子,
對(duì)于"用戶請(qǐng)求添加好友"這個(gè)操作, 首先請(qǐng)求者發(fā)來請(qǐng)求, 然后route目錄下的friend.js(controller)將該請(qǐng)求傳遞給FriendManager通知要添加好友, FriendManager調(diào)用添加好友服務(wù)(service), 該服務(wù)通知model層的FriendRequest模型(model), model在數(shù)據(jù)庫記下這條記錄, 最后一層層返回, 最后route.js(controller)向請(qǐng)求者通知"添加好友請(qǐng)求的消息已發(fā)送" - 客戶端使用cocos2dx-lua
簡(jiǎn)單輕快好上手, 由于自己是做這個(gè)的, 又很喜歡lua, 就用這個(gè)了
客戶端相當(dāng)于簡(jiǎn)易播放器, 負(fù)責(zé)數(shù)據(jù)展示.
客戶端頁面顯示就是這一塊了, 由于沒有UI設(shè)計(jì), 所以界面很糙, 但炫酷的界面無非是播放器好看一點(diǎn), 這個(gè)需要好的UI呀
主要分為三個(gè)部分:
(1) 頁面
每一個(gè)頁面都對(duì)應(yīng)一份.lua文件, 這樣的好處是只用關(guān)心頁面, 改動(dòng)UI, 不需要擔(dān)心改變邏輯
(2) 控制器
對(duì)于從后端拉取的數(shù)據(jù)類的接口, 從頁面里分離出來, 只關(guān)注接口的改動(dòng), 還有一些簡(jiǎn)單的邏輯功能也放在這里, 改動(dòng)邏輯不用擔(dān)心改了頁面
(3) 數(shù)據(jù)模型
對(duì)于一些多個(gè)頁面常用的數(shù)據(jù)模型(如User), 不必要每次都從后端拉取, 只有更新的時(shí)候重新從后端拉取, 使用單例模式封裝起來, 保證各個(gè)頁面可以訪問
4. 展示
聊天用戶Alice
聊天用戶BOB
服務(wù)器架設(shè)在騰訊云上, 一個(gè)app在cocos2dx開發(fā)工具player上跑, 一個(gè)在藍(lán)疊模擬器上跑. 發(fā)現(xiàn)藍(lán)疊上的時(shí)差有八個(gè)小時(shí), 估計(jì)地區(qū)設(shè)置在本初子午線那里了.
另外, 客戶端還使用了小型數(shù)據(jù)庫sqlite3, 用來本地存儲(chǔ)消息