[关闭]
@dooy 2016-10-19T14:41:48.000000Z 字数 4489 阅读 486

消息中心 聊天室设计

数据格式 设计

1.总设计

分4类系统

消息名称 简称 回复 说明 chat设计
系统消息 T1 不可 系统对全局整个站用户 系统默认一个chat
系统对部分 T2 不可 一些如待办事情等有点像 单对多 单是系统 多是用户 abc_uid abc表示系统名称
多对多 T3 群聊,大家共同订阅在同一个频道(chat_id)上 qun_id
单对单 T4 单对单,2人订阅在同一频道上道(chat_id) user_uid1_uid2

2. 消息保存和分发

假设
发送信息:x条,全站用户为T人,部分用户为 n人,一个群有 m人

消息名称 简称 msg表 user表 分发
系统消息 T1 x条 T条 x(广播)
系统对部分 T2 x条 n条(x条的id压入 msgid中) x*n
多对多 T3 x条 m条 x*m
单对单 T4 x条 2条 x*2

T2 如果 n非常的大 可以考虑用 T1的系统 然后在客户端过滤,比如对整个地区发一消息
T2 中本来是 msg表示x*n的考虑到 msg基本都是重复的,可以将msd的id保存到user表中

2.1 设计图

Created with Raphaël 2.1.2消息消息msg_systemmsg_systemmsg_icometmsg_icometmsg_mongomsg_mongo前端发送队列分发分发队列分发保存

msg_icomet 消息分发 crontab/mq_msg_icomet.php
msg_mongo 消息保存 crontab/mq_msg_mongo.php

2.2 解决基于T1跟T2之间 用户非常多的问题

上面已经提到 T2 当部分用n非常大的时候,记录会把数据库撑大,而且大都是重复性的
为了解决这个问题还是使用T1 在chat_id 做文章 但是消息的保存跟消息及时分发都的特别处理

2.2.1 用户的属性

属性 chat_id 说明
身份 sys_1_{ts} sys_1_t 为教师 sys_1_s 为学生
学校 sys_1_s_{school} sys_1_s_清华大学 只针对清华大学
地区 sys_1_z_{zone} sys_1_z_北京 只针对北京
  1. 及时推送 先不处理:如何要做也是真能推送到 sys_1 下然后根据属性过滤
  2. 消息历史数据 用户如果用了 chat_id sys_1 其实是msg的表总 chat_id in (sys_1, sys_1_{ts}, sys_1_s_{school} , sys_1_z_{zone} ) 来取得数据
  3. 这个无法做到 北京的老师 北京大学的学生
  4. 如何做到未读提醒?markuser 表中 chat_id 为 sys_1 的用户这行加上用户的信息 ts,school,zone 当发生这些消息时 直接用 chat_id=sys_1 and 属性=属性值(school=清华大学) 匹配 noread上加1

3.数据库设计

3.1 msg表

字段 类型 说明
chat_id string 聊天chat的唯一Id索引
T string 系统类型 T1,T2,T3,T4
uid int 用户uid
uname string 名字
img string 头像
touids array 发给哪些人的uid数组
ctime int 时间截
ct data 消息建立时间 用于ttl
msg object 消息内容
其他扩展信息 ... ...

其他信息参考 消息类型及其格式

3.2 user表

字段 类型 说明
chat_id string 聊天chat的唯一Id索引
uid int 接受者用户uid索引
mark data 最后访问时间
total int 消息总条数
noread int 未读消息条数
chat_name string 聊天教室名称
msg_id array 只有T2时候用到 是msg唯一ID 以数据形式保存进来
其他扩展信息 ... ...

4.消息类型及其数据格式

共同格式格式

  1. {
  2. "chat_id":"chat通道",
  3. "T":"系统类型 T1,T2,T3,T4",
  4. "uid":"发送者uid",
  5. "uname":"用户名称",
  6. "img":"http://head.png",
  7. "touids":[123,456,"发送给用户的uid数组"],
  8. "ctime":"建立时间截 ",
  9. "msg":{
  10. "type":"消息类型 n:一般消息,h:html消息,i:图片消息, s:声音, v:视频",
  11. "txt":"消息内容",
  12. "url":"链接",
  13. "更多":"扩展"
  14. }
  15. }

4.1 一般消息

  1. {
  2. "msg":{
  3. "type":"n(必须)",
  4. "txt":"消息内容",
  5. "url":"链接"
  6. }
  7. }

4.2 html消息

  1. {
  2. "msg":{
  3. "type":"h(必须)",
  4. "txt":"消息内容(必须)",
  5. "url":"链接(必须)",
  6. "tag":"标签",
  7. "urlname":"链接按钮名称",
  8. "endtime":"截止时间",
  9. "score":"分数80",
  10. "pingyu":"这篇文章不错的说",
  11. "img":"图像url"
  12. }
  13. }

4.3 图片消息

  1. {
  2. "msg":{
  3. "type":"i",
  4. "img":"img url",
  5. "url":"链接"
  6. }
  7. }

4.4 语音消息

  1. {
  2. "msg":{
  3. "type":"s",
  4. "file":"file url",
  5. "time":10 单位秒
  6. }
  7. }

4.5 小视频消息(待开发)

5 API

主要在批改网内部使用

5.1 约定格式:

Post:/api-sendmsg?uid=123&ts=1234567809&sign=dddd
postdata

变量 必须 说明
uid 用户user_id
ts 发送时间截 跟服务器误差时间为5分钟
sign 简单签名,2个md5 uid_key_ts md5(md5( uid_key_ts))

对于不同的接口数据在postdata在体现
postdata 为新的格式 注意要转换

  1. {
  2. "T": "单对单为4(可回复), sys_2待办事情(不可回复)",
  3. "touids":"123,456 当是T为4的时候是单对单值为一个即对方的uid,如果是sys_2可以是多个 以','分开",
  4. "msg": "msg的格式参照 第4张结构中 msg的格式"
  5. }

注意要转换
T=sys_2&touids=123,456&msg[type]=n&msg[txt]=ok

5.2 api demo

发一搬消息(看不全请复制到下一行):
curl "http://yourhostname.com/?c=api&a=sendmsg&uid=17&ts=123&sign=12" -d "T=4&touids=21&msg[type]=n&msg[txt]=ok"

发待办事情(看不全请复制到下一行):
curl "http://yourhostname/?c=api&a=sendmsg&uid=17&ts=123&sign=12" -d "T=sys_2&touids=21&msg[type]=h&msg[txt]=%e8%bf%99%e4%b8%aa%e6%98%af%e6%8f%90%e7%a4%ba%e4%bf%a1%e6%81%af%ef%bc%8c%e8%bf%99%e8%be%b9%e6%94%be%e4%b8%bb%e8%a6%81%e5%86%85%e5%ae%b9&msg[url]=http%3a%2f%2fwww.pigai.org&msg[tag]=Tiku&msg[pingyu]=%e9%9a%8f%e4%be%bf%e8%af%b4%e7%82%b9%e4%bb%80%e4%b9%88"

6 API Chat

主要在客户端使用 或者web 界面中使用

接口 URL 说明
sign登录 qq.pigai.org/pgserver/sign 获取监控
监听server qq.pigai.org:8100

6.1 获取好友

http://yourhostname/chat/msg/listFriend?uid=21&ts=1464678447&sign=70207821cd87a7ef6b8fa7cb1adfeecf
sign= md5( md5( 21_key_1464678447));
说明 sign 为 2个md5 uid_key_ts
ts 5分钟的误差

6.2 发送消息

这边只能对客户端
http://yourhostname/chat/msg/send?uid=21&ts=1464678447&sign=70207821cd87a7ef6b8fa7cb1adfeecf
&chat_id=u_c7551e0af689f702d4a8b35918b17fba
&T=T4&msg%5Btxt%5D=%E8%80%81%E5%B8%88%E5%A5%BD%0A&msg%5Btype%5D

消息urldecode后
chat_id=u_c7551e0af689f702d4a8b35918b17fba&T=T4&msg[txt]=老师好
&msg[type]=n

变量 必须 说明
uid 用户user_id
ts 发送时间截
sign 2个md5 uid_key_ts
chat_id 消息chat_id
T T4 必须为T4
msg.txt 消息内容
msg.type 消息类型 值为n

6.3 获得历史消息

http://yourhostname/chat/msg/msglist?uid=21&ts=1464678447&sign=70207821cd87a7ef6b8fa7cb1adfeecf
&chat_id=u_c7551e0af689f702d4a8b35918b17fba&T=T4

变量 必须 说明
chat_id 消息chat_id
T T为T4、T1、T2、T3

6.4 mark已经读取

http://yourhostname/chat/msg/mark?uid=21&ts=1464678447&sign=70207821cd87a7ef6b8fa7cb1adfeecf
&chat_id=u_ea297f5d0630a6adfd5589b69097bb14

变量 必须 说明
chat_id 消息chat_id

其他

1. 订阅直播室、可聊天 (几种 icomet 数据格式 课堂互动)

http://www.pigai.org/res/note/zhibo-mui.html?17
cname:chat_17

数据格式

  1. {
  2. "uid": 21,
  3. "uname": "張預奇",
  4. "school": "句酷批改網2015",
  5. "ts": "2",
  6. "txt": "[修改作文](第10次) The Rehabilitation of Sinology ",
  7. "img": "http://pic.pigai.org/upload/head/default.png"
  8. }
变量 必须 说明
uid 用户user_id
uname 用户名
school 学校
ts 1为老师身份 其他为学生
txt 内容
img 头像
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注