Rumah > Soal Jawab > teks badan
大概情况是这样的:
当A登陆以后,可以发消息给B,如下图,选择B的工号
发送以后,B登陆,可以在部门消息那里会显示一个小红点,提示有消息
我的思路是这样的:当A按下发送以后,就向存放消息的数据库里写一条记录,并把消息的状态码设置成未读,接收人是B,当B登陆以后,因为状态码是未读,就会显示提示信息。可是这个提示怎么实现?
这是我消息的数据库:
如果我一次发同样的消息给多个人,是不是应该写多条记录?向数据库写消息要循环?
还有一个问题是:如果我的消息中包含图片,图片是不是要放在一个文件夹里?
希望能给点意见,谢谢!
大家讲道理2017-04-10 15:45:58
你确定只是在用户登录时看到消息就可以了是吧。如果是,那接着往下看。
在你的表里,message_id应该是这个表的主键,每个消息都对应着一个message_id。当某用户登录时,就查询这个message表里的receive_id和message_status,即查询登录的用户中未读消息的个数,若个数>0,表示有未读消息,登录成功跳转时,有一个mes_status的字段也同时传过去。比如跳转到首页(index),index中再判断mes_status的值,给用户以提示。
其实你的message表里的主键是message_id,跟发送给几个人没什么关系,当他登录时,只查询这个用户自己作为接收方,收到的消息的个数。比如数据表里有这样的一些数据:
message_id | send_id | message_date | message_title | message_content | receive_id | message_status |
1 | 111 | 2015-06-25 13:00:00 | hello | hello world | 222 | 1 |
2 | 111 | 2015-06-25 14:00:00 | may | 中国,你好 | 333 | 1 |
3 | 444 | 2015-06-26 11:00:00 | wenzi | wenzi | 222 | 1 |
4 | 666 | 2015-06-26 16:00:00 | hello | hello world | 222 | 1 |
用户111
可以给多个用户222
, 333
发送消息,并不冲突;用户也能接收多个其他用户的消息,比如222
。当用户(userid=='222')登录时,就查询(receive_id==userid)的消息即可。
你的推断是对的,首先应该把用户上传的图片放到一个文件件中,然后返回给用户一个图片链接,用户把这个图片链接插入到消息中。
ringa_lee2017-04-10 15:45:58
这个要用到推送。
说实话。PHP不适合做推送。要用到ajax轮询。这样的话效率不高,还容易出问题。
这里已经有很不错的解决方案了。
http://segmentfault.com/q/1010000000589829/a-1020000000591493
巴扎黑2017-04-10 15:45:58
发送消息 都可以直接写db 附件当然是得有个静态文件服务器进行上传生成url 也方便以后的扩展;
至于推送到浏览器,客户端 就必须用长连接(推荐),websocket(推荐)或者ajax轮询方式去实现. 监听状态变化接口
怪我咯2017-04-10 15:45:58
消息接收方的字段可以存储 1,2,3,4 这样发送多人就不需要写入多条数据了
登录时候去查询消息推送表是否有未读消息
如果需要在线 提示就需要做前端ajax轮询咯
巴扎黑2017-04-10 15:45:58
实时性要求不高的话,前端可以每5分钟AJAX轮询一次消息表。
如果要插入多条记录的话,建议开启事务,循环插入,提交事务,能加快插入速度。
不想插入多条记录的话,可以像 @饭盒 说的那样,消息接收方的字段receive_id保存接收人的ID序列(1,2,3,4),消息状态字段message_status保存未阅读消息的接收人ID序列(2,3),message_status初始值为(1,2,3,4),已查看消息的用户ID则从其中删除。可以用MySQL内部函数FIND_IN_SET(返回找到的位置,从1开始)进行查询,比如:
$user_id = 2;
$sql = <<<heredoc
SELECT * FROM `message`
WHERE FIND_IN_SET('{$user_id}', `message_status`)
AND FIND_IN_SET('{$user_id}', `receive_id`);
heredoc;
数据量比较大的话,FIND_IN_SET可能会存在性能问题,建议定时清理message表过期的消息。