这个功能类似于网页版的聊天工具,方便了两个会员之间私密地交流,练习写这样的功能是非常实用的。如果以后去开发婚恋系统,肯定少不了信件功能。
开发信件功能是有一点难度的,首先至少设计两张数据表:
说说这两张表的关系:
用户A可以与用户B写信(互发信息),可以与用户C写信,也就是所有用户随意两个人即可组成一组,建立通信的关系。“用户来信对话表”就是通信关系表。
“用户来信内容表”就是内容表。每一条记录包含信息内容,信息来源,信息接收人,所属关系表ID……
两张表是一对多的关系。这样知道了两个人的UID,即可获得两人的对话ID,通过对话ID可获取两人所有的(未删除)聊天记录。
相关的代码:
控制器:app\home\controller\Uletter.php
模型:app\common\model\UserLetterDialog.php、UserLetterMsg.php
视图:app\home\view\uletter\index.html、dialog.html、app\home\view\huser\index.html
上图展示的是对话列表。
备:图上的分页使用的是楠神曾经写过的一个分页类库,分享给大家
上图展示的是对话内容。和消息提示功能一样,楠神也做了来信提示,第一时间让用户知道有未读信件。
楠神这个信件功能与QQ、微信聊天工具不一样的地方就是不能实时接收,需要刷新页面才能获取到新信件。所以楠神叫它信件功能,而不是聊天功能。实现实时接收也不是不可能,只需要在聊天的界面每隔一秒ajax请求下后台看看有没有新内容产生。但是这样做,频繁地请求服务器,太耗费系统资源。楠神看过一些婚恋网站的信件功能,也都没有做成实时接收的。处于系统角度考虑,我也不把信件功能做成实时接收的聊天功能。
还需要注意的地方,信件的删除功能:
我们都知道两个人的通信记录,比如A与B对话聊天,他俩的聊天记录存入数据库,两个人都能读到共同的聊天记录(楠神设计的没有单独分开存)。
如果做删除功能我们必须考虑这样的情况:
假如A清空聊天记录,但B没有清空聊天记录。如果程序直接把A的聊天记录删掉了,由于共用同一聊天数据,那B是不是也读取不到聊天记录了。所以必须在对话表、内容表上用一个字段('in_del')来标记有一方已把当前对话、当条聊天记录已删,通过程序判断,双方都删除了,这样才从数据库中真实地删掉。
当然也可以这样设计:
设计两张对话内容表(min_uid专属的与max_uid专属的),每个用户的每一条对话内容分别存入两张表中,min_uid用户删除某对话的聊天记录,就直接删掉min_uid专属的内容表。max_uid同理。
这样设计的弊端:1.造成数据库大量的重复数据 2.在未删除的情况下,有可能程序上的错误造成A、B两人看到的聊天记录不一样。