@dooy
2016-10-19T14:41:48.000000Z
字数 4489
阅读 486
数据格式
设计
分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 | 否 | 头像 |