PHP实现站内信

一、背景
当前使用运维平台的用户进行沟通时,更多的是依赖微信和邮件通知,而运维平台作为一个整体的产品,也需要能够进行内部沟通的一种服务 - 站内信 。
 
站内信的设计基调
站内信的设计基调取决于用户如何使用站内信:

  • 用户不会守着运维平台这个页面,等待消息通知,查看消息内容,然后跳转到要操作的页面 。
  1. 也就是说站内信不是第一入口,站内信的实时性意义也不大 。
  2. 同很多社交网站不同(Facebook,知乎,微博等),用户会守在社交网站的主页面,不断刷新新内容,同时检查新消息(主要是个人私信、别人的回复等,也绝不是为了检查系统通知消息)
  • 用户会根据邮件通知,决定是否要进入运维平台进行操作
  • 如果邮件特别多,例如同时有多个工单需要用户处理,用户也会在工单平台提供的“我的待办”页面进行所有工作 。
  • 如果邮件被误删了,没有邮件链接直接进入要操作的模块
  1. 那么或者通过索要链接/单号的方式,前往指定页面
  2. 或者直接在相关模块进行搜索
上面的描述都意味着用户基本不会使用站内信,那么在什么样的场合会使用站内信呢?
  • 不发邮件,只发站内信的消息通知,例如全站通知、编辑操作、Comment操作等
  • 当具体模块没有详细的操作记录时,可以通过查看站内信的发生时间
当前只有产品消息通知,消息展示也没有进行归类聚合,以后增加全站通知、mention、like、comment等类型的站内信时,就需要考虑按类型进行消息聚合了 。
二、需求描述
  1. 站内信通常需要解决两个需求:
  • 用户对用户的站内信,管理员对用户的站内信:即一对一发送
  • 管理员对多用户、用户组、全站的站内信:即一对多发送
(还有一种是用户对产品的站内信,例如对某个模块的反馈、疑问之类的)
 
我们目前的需求是:
1管理员对多用户发送站内信
对用户真实性不做校验
对标题长度、内容长度进行限制(分别是45个字节、150个字节,对应中文字符15个、50个)
对收件人的拼音长度进行限制(最长50个字节)
2 用户可以查看自己的站内信
按“全部、已读、未读”过滤
按消息来源分类:工单平台、资源管理、自动装机、漏洞平台、故障平台 。。。
3 用户可以删除、批量删除站内信
4 用户可以已阅、批量已阅、全部标记为已读 站内信
5 运维平台页面顶部的消息图标
  • 展示未读消息数,超过99显示 99+
  • 鼠标放上去,会有下拉框,展示最近10条未读消息(展示“时间”,“消息来源”,“标题”)
  • 下拉框的底部有两个按钮:“更多”,加载更多未读消息;“查看全部”,跳转到站内信列表页面(最好另开一个窗口)
  • 点击下拉框里的未读消息,通过弹出框展示详情;然后在未读列表里删除该记录,在数据库里标记为已读,消息图标的未读消息数量减一
6 管理员页面:
更新用户
删除消息
统计数据
增加module
增加站内信类型
发送全站消息
三、系统设计
功能设计
PHP实现站内信

文章插图
 
四、系统流程
发送站内信
  1. 读取POST请求的request body
  2. 校验长度
  3. 插入数据库
  4. 返回
获取站内信列表
  1. 调用子模块,插入发送给全站或我所属用户组的站内信
  2. 根据查询条件,返回数据库数据
获取未读站内信数量
  1. 调用子模块,插入发送给全站或我所属用户组的站内信
  2. 返回数量
批量已阅
  1. 检查messageId是不是属于当前用户
  2. inbox_message表里把 read 置为1,修改update_time
 
全部已阅
update inbox_message set “read”=1, “update_time”=now where “receiver_name”=currentUser() and “read” = 0批量删除
  1. 检查messageId是不是属于当前用户
  2. inbox_message表里把 deleted 置为1,修改update_time
全部删除
update inbox_message set “deleted”=1, “update_time”=now where “receiver_name”=currentUser() and “deleted” = 0五、数据库设计站内信内容表
CREATE TABLE `inbox_message_text` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `title` varchar(128) NOT NULL DEFAULT '', `content` longtext NOT NULL, `create_time` datetime NOT NULL, `update_time` datetime NOT NULL, `send_type` tinyint(4) NOT NULL DEFAULT '0', `creator_name` varchar(255) NOT NULL DEFAULT '', `deleted` tinyint(4) NOT NULL DEFAULT '0', `module_id` bigint(20) NOT NULL, `link` varchar(255) NOT NULL DEFAULT '', PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


推荐阅读