一、准备阶段(需求设计)
鉴权
采用哪种权限认证模式,Cookie由于有域的限制,考虑到以后可能做桌面端,IPhone端等,所以决定采用token进行权限认证,客户端通过token保存客户验证信息。而token则采用JWT进行(补充知识:JSON Web令牌)验证,用token建议是最好不用查询数据库就能获取一些常用信息,这样就能节省一些访问时间。
补充知识:
JSON Web Token 入门教程 阮一峰
消息
前面说过采用MQTT进行消息传输,那么怎样定义消息,怎样保存消息,以及离线消息怎么拉取就是当前最大的问题,MQTT到底传输些什么呢?
MQTT到底传输的是文本还是整个文件(如果有文件的话),参照jwt我们可以将消息分为正常内容以及载荷(payload),将视频、文件等大体积的内容单独发送到文件服务器,返回对应id然后放在载荷中,这样传输的就只有全文本(json格式)了。
消息必须有发送者帐号、名称以及接收者帐号、名称,发送时间,以及消息类别,消息内容等;考虑到消息发布时先发布出去,再上传到服务器,在消息中增加一个唯一标识字段msgId,在服务端推送来时可以区分,不会有重复消息。
消息内容分为两大类,普通文本直接放在消息内容中,而其他消息(如文件、音频、视频等)则以json的方式保存在消息内容中。
消息类型:
类别
说明
备注
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
修改时间
文件上传下载