@dooy
2016-10-19T14:41:48.000000Z
字数 4489
阅读 534
数据格式 设计
分4类系统
| 消息名称 | 简称 | 回复 | 说明 | chat设计 |
|---|---|---|---|---|
| 系统消息 | T1 | 不可 | 系统对全局整个站用户 | 系统默认一个chat |
| 系统对部分 | T2 | 不可 | 一些如待办事情等有点像 单对多 单是系统 多是用户 | abc_uid abc表示系统名称 |
| 多对多 | T3 | 可 | 群聊,大家共同订阅在同一个频道(chat_id)上 | qun_id |
| 单对单 | T4 | 可 | 单对单,2人订阅在同一频道上道(chat_id) | user_uid1_uid2 |
假设
发送信息: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表中
msg_icomet 消息分发 crontab/mq_msg_icomet.php
msg_mongo 消息保存 crontab/mq_msg_mongo.php
上面已经提到 T2 当部分用n非常大的时候,记录会把数据库撑大,而且大都是重复性的
为了解决这个问题还是使用T1 在chat_id 做文章 但是消息的保存跟消息及时分发都的特别处理
| 属性 | 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_北京 只针对北京 |
- 及时推送 先不处理:如何要做也是真能推送到 sys_1 下然后根据属性过滤
- 消息历史数据 用户如果用了 chat_id sys_1 其实是msg的表总 chat_id in (sys_1, sys_1_{ts}, sys_1_s_{school} , sys_1_z_{zone} ) 来取得数据
- 这个无法做到 北京的老师 北京大学的学生
- 如何做到未读提醒?markuser 表中 chat_id 为 sys_1 的用户这行加上用户的信息 ts,school,zone 当发生这些消息时 直接用 chat_id=sys_1 and 属性=属性值(school=清华大学) 匹配 noread上加1
| 字段 | 类型 | 说明 |
|---|---|---|
| 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 | 消息内容 |
| 其他扩展信息 | ... | ... |
其他信息参考 消息类型及其格式
| 字段 | 类型 | 说明 |
|---|---|---|
| chat_id | string | 聊天chat的唯一Id索引 |
| uid | int | 接受者用户uid索引 |
| mark | data | 最后访问时间 |
| total | int | 消息总条数 |
| noread | int | 未读消息条数 |
| chat_name | string | 聊天教室名称 |
| msg_id | array | 只有T2时候用到 是msg唯一ID 以数据形式保存进来 |
| 其他扩展信息 | ... | ... |
共同格式格式
{"chat_id":"chat通道","T":"系统类型 T1,T2,T3,T4","uid":"发送者uid","uname":"用户名称","img":"http://head.png","touids":[123,456,"发送给用户的uid数组"],"ctime":"建立时间截 ","msg":{"type":"消息类型 n:一般消息,h:html消息,i:图片消息, s:声音, v:视频","txt":"消息内容","url":"链接","更多":"扩展"}}
{"msg":{"type":"n(必须)","txt":"消息内容","url":"链接"}}
{"msg":{"type":"h(必须)","txt":"消息内容(必须)","url":"链接(必须)","tag":"标签","urlname":"链接按钮名称","endtime":"截止时间","score":"分数80","pingyu":"这篇文章不错的说","img":"图像url"}}
{"msg":{"type":"i","img":"img url","url":"链接"}}
{"msg":{"type":"s","file":"file url","time":10 单位秒}}
主要在批改网内部使用
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 为新的格式 注意要转换
{"T": "单对单为4(可回复), sys_2待办事情(不可回复)","touids":"123,456 当是T为4的时候是单对单值为一个即对方的uid,如果是sys_2可以是多个 以','分开","msg": "msg的格式参照 第4张结构中 msg的格式"}
注意要转换
T=sys_2&touids=123,456&msg[type]=n&msg[txt]=ok
发一搬消息(看不全请复制到下一行):
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"
主要在客户端使用 或者web 界面中使用
| 接口 | URL | 说明 |
|---|---|---|
| sign登录 | qq.pigai.org/pgserver/sign | 获取监控 |
| 监听server | qq.pigai.org:8100 |
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分钟的误差
这边只能对客户端
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 |
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 |
http://yourhostname/chat/msg/mark?uid=21&ts=1464678447&sign=70207821cd87a7ef6b8fa7cb1adfeecf
&chat_id=u_ea297f5d0630a6adfd5589b69097bb14
| 变量 | 必须 | 说明 |
|---|---|---|
| chat_id | 是 | 消息chat_id |
http://www.pigai.org/res/note/zhibo-mui.html?17
cname:chat_17
数据格式
{"uid": 21,"uname": "張預奇","school": "句酷批改網2015","ts": "2","txt": "[修改作文](第10次) The Rehabilitation of Sinology ","img": "http://pic.pigai.org/upload/head/default.png"}
| 变量 | 必须 | 说明 |
|---|---|---|
| uid | 是 | 用户user_id |
| uname | 是 | 用户名 |
| school | 否 | 学校 |
| ts | 否 | 1为老师身份 其他为学生 |
| txt | 否 | 内容 |
| img | 否 | 头像 |