- 一、背景
- 二、需求描述
- 三、系统设计
- 四、系统流程
- 五、数据库设计
- 六、API设计
-
- 发送站内信:POST /v1/message
- 获取站内信列表:GET /v1/message User-Id: xxx
- 获取未读站内信数量:GET /v1/message/unread_count
- 获取单个站内信内容:GET /v1/message/:id
- 已阅、批量已阅站内信:PUT /v1/read_messages/:messageIds
- 全部已阅 PUT:/v1/read_all_messages
- 删除、批量删除站内信:PUT /v1/delete_messages/:messageIds
- 全部删除站内信:PUT /v1/delete_all_messages
- 获取消息来源列表:GET /v1/module
-
- 七、测试注意点
- 八、优化
- 九、关键功能点设计
- 参考文档
- 参考产品
一、背景
当前使用运维平台的用户进行沟通时,更多的是依赖微信和邮件通知,而运维平台作为一个整体的产品,也需要能够进行内部沟通的一种服务 - 站内信。
站内信的设计基调
站内信的设计基调取决于用户如何使用站内信:
- 用户不会守着运维平台这个页面,等待消息通知,查看消息内容,然后跳转到要操作的页面。
- 也就是说站内信不是第一入口,站内信的实时性意义也不大。
- 同很多社交网站不同(Facebook,知乎,微博等),用户会守在社交网站的主页面,不断刷新新内容,同时检查新消息(主要是个人私信、别人的回复等,也绝不是为了检查系统通知消息)
- 用户会根据邮件通知,决定是否要进入运维平台进行操作
- 如果邮件特别多,例如同时有多个工单需要用户处理,用户也会在工单平台提供的“我的待办”页面进行所有工作。
- 如果邮件被误删了,没有邮件链接直接进入要操作的模块
- 那么或者通过索要链接/单号的方式,前往指定页面
- 或者直接在相关模块进行搜索
上面的描述都意味着用户基本不会使用站内信,那么在什么样的场合会使用站内信呢?
- 不发邮件,只发站内信的消息通知,例如全站通知、编辑操作、Comment操作等
- 当具体模块没有详细的操作记录时,可以通过查看站内信的发生时间
当前只有产品消息通知,消息展示也没有进行归类聚合,以后增加全站通知、mention、like、comment等类型的站内信时,就需要考虑按类型进行消息聚合了。
二、需求描述
站内信通常需要解决两个需求:
- 用户对用户的站内信,管理员对用户的站内信:即一对一发送
- 管理员对多用户、用户组、全站的站内信:即一对多发送
(还有一种是用户对产品的站内信,例如对某个模块的反馈、疑问之类的)
我们目前的需求是:
- 管理员对多用户发送站内信
- 对用户真实性不做校验
- 对标题长度、内容长度进行限制(分别是45个字节、150个字节,对应中文字符15个、50个)
- 对收件人的拼音长度进行限制(最长50个字节)
- 用户可以查看自己的站内信
- 按“全部、已读、未读”过滤
- 按消息来源分类:工单平台、资源管理、自动装机、漏洞平台、故障平台。。。
- 用户可以删除、批量删除站内信
- 用户可以已阅、批量已阅、全部标记为已读 站内信
- 运维平台页面顶部的消息图标
- 展示未读消息数,超过99显示 99+
- 鼠标放上去,会有下拉框,展示最近10条未读消息(展示“时间”,“消息来源”,“标题”)
- 下拉框的底部有两个按钮:“更多”,加载更多未读消息;“查看全部”,跳转到站内信列表页面(最好另开一个窗口)
- 点击下拉框里的未读消息,通过弹出框展示详情;然后在未读列表里删除该记录,在数据库里标记为已读,消息图标的未读消息数量减一
- 管理员页面:
- 更新用户
- 删除消息
- 统计数据
- 增加module
- 增加站内信类型
- 发送全站消息
三、系统设计
功能设计
功能 | 接口 | 详情 |
---|---|---|
发送站内信 | POST /v1/message | 校验module_name,校验title content receiver_name 长度 |
获取站内信列表 | GET / | |
统计信息 | 暂无 |
四、系统流程
发送站内信
- 读取POST请求的request body
- 校验长度
- 插入数据库
- 返回
获取站内信列表
- 调用子模块,插入发送给全站或我所属用户组的站内信
- 根据查询条件,返回数据库数据
获取未读站内信数量
- 调用子模块,插入发送给全站或我所属用户组的站内信
- 返回数量
批量已阅
检查messageId是不是属于当前用户
inbox_message表里把 read 置为1,修改update_time
全部已阅
- update inbox_message set “read”=1, “update_time”=now where “receiver_name”=currentUser() and “read” = 0
批量删除
检查messageId是不是属于当前用户
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;
Field | Type | Null | Key | Default | Extra | Comment |
---|---|---|---|---|---|---|
id | bigint(20) | NO | PRI | NULL | auto_increment | |
title | varchar(128) | NO | ||||
content | longtext | NO | NULL | |||
create_time | datetime | NO | NULL | |||
update_time | datetime | NO | NULL | |||
send_type | tinyint(4) | NO | 0 | 0是发全部,1是指定用户 | ||
creator_name | varchar(255) | NO | 系统管理员是 sysadmin | |||
module_id< |