用户在使用运维平台进行交流时,更多的依赖微信和邮件通知,而运维平台作为一个产品整体也需要一个可以交流的产品服务-网站通讯。####站信的设计基调站信的设计基调取决于用户如何使用站信:用户不会停留在运维平台的页面,等待消息通知,查看内容消息,然后跳转到要操作的页面。也就是说,内信不是第一个入口,内信的实时性意义不大。与很多社交网站(Facebook、知乎、微博等)不同,用户会停留在社交网站的主页上,不断刷新新内容,同时查看新消息(主要是个人私信、别人的回复等,绝对不是为了查看系统通知消息)用户将根据邮件通知决定是否进入运维平台进行操作。”页面完成所有工作。如果邮件被误删,没有邮件链接可以直接进入要操作的模块,那么要么通过索取链接/单号,进入指定页面,要么直接在相关模块中搜索。那么什么样的场合会用到站信呢?不发送邮件,只发送内部消息的消息通知,如全站通知、编辑操作、评论操作等。当具体模块没有详细的操作记录时,可以查看内部消息的发生时间.没有分类和汇总。以后在添加全站通知、提及、点赞、评论等时,需要考虑按类型进行消息聚合。2.需求描述站内消息通常需要解决两个需求:用户到用户的站内消息,管理员到用户的站内消息:即管理员到用户的一对一发送。多用户、用户组、全站站内消息:一对一发送给多个用户(也有用户给产品的内信,比如对某个模块的反馈,问题等)我们目前的需求是:1.管理员向多个用户发送内部消息,没有检查用户的真实性。限制标题长度和内容长度(分别为45个字节和150个字节,对应15个和50个汉字)和限制收件人拼音的长度(最多50个字节)2个用户你可以查看你的自己站内消息,按“全部、已读、未读”过滤,按来源分类:工单平台、资源管理、自动安装、漏洞平台、故障平台。..3用户可在站内删除、批量删除消息4用户可阅读、批量阅读、标记站内所有消息为已读5运维平台页面顶部消息图标显示未读消息数,超过99则显示99+鼠标放在上面,会出现下拉框显示最近10条未读消息(显示“时间”,“来源”,“标题”)有两个按钮下拉框底部:“更多”,加载更多未读消息;“查看全部”,跳转到站内消息列表页面(最好另开一个窗口),点击下拉框中的未读消息,通过弹框显示详情;然后删除未读列表中的记录,并在数据库中标记为已读,消息图标中的未读消息数减少16管理员页面:更新用户删除消息统计增加模块增加站内消息类型发送站点-宽消息3.系统设计功能设计4.系统流程发送站内消息读取POST请求请求体校验长度,插入数据库,返回获取站内消息列表,调用子模块,插入in-站内消息发送给全站或所属用户组根据查询条件,返回数据库数据,获取未读站内消息数,调用子模块,插入发送给全站或者批量读取我所属用户组返回的站内消息数,查看messageId是否属于当前用户。在inbox_message表中,设置read为1,修改update_time全部已读updateinbox_messageset"read"=1,"update_time"=nowwhere"receiver_name"=currentUser()and"read"=0批量删除CheckifmessageId属于当前用户的inbox_message表设置deleted为1,修改update_time删除所有更新inbox_message设置“deleted”=1,“update_time”=nowwhere“receiver_name”=currentUser()and“deleted”=0五、数据库设计站内部消息内容表CREATETABLE`inbox_message_text`(`id`bigint(20)NOTNULLAUTO_INCREMENT,`title`varchar(128)NOTNULLDEFAULT'',`content`longtextNOTNULL,`create_time`datetimeNOTNULL,`update_time`datetimeNOTNULL,`send_type`tinyint(4)NOTNULLDEFAULT'0',`creator_name`varchar(255)NOTNULLDEFAULT'',`deleted`tinyint(4)NOTNULLDEFAULT'0',`module_id`bigint(20)NOTNULL,`link`varchar(255)NOTNULLDEFAULT'',PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;除了消息来源(module_name),站内信本身还有一个纬度的描述,称为消息类型(message_type),比如安全消息,活动消息,服务消息等。在每个类别中,可以是子类别划分,比如活动消息-优先活动消息源和消息类型可以是正交关系,即工单平台也可以有活动消息;消息来源也可以是消息类型,叫做“产品消息”站消息发送表CREATETABLE`inbox_message`(`id`bigint(20)NOTNULLAUTO_INCREMENT,`message_text_id`bigint(20)NOTNULL,`receiver_name`varchar(255)NOTNULLDEFAULT'',`read`tinyint(4)NOTNULLDEFAULT'0',`deleted`tinyint(4)NOTNULLDEFAULT'0',`create_time`datetimeNOTNULL,`update_time`datetimeNOTNULL,PRIMARYKEY(`id`),KEY`inbox_message_receiver_name_deleted_read_id`(`receiver_name`,`deleted`,`read`,`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;源表CREATETABLE`inbox_module`(`id`bigint(20)NOTNULLAUTO_INCREMENT,`code`varchar(128)NOTNULLDEFAULT'',`name`varchar(128)NOTNULLDEFAULT'',`create_time`datetimeNOTNULL,`update_time`datetimeNOTNULL,PRIMARYKEY(`id`),UNIQUEKEY`code`(`code`),UNIQUEKEY`name`(`name`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;6、发送内部消息的API设计:POST/v1/messagerequestbodyContent-Type:application/json{"title":"WorkOrderApproval","content":"XXX提交变更申请,请批准","to":"sunzhongyuan,shenli,wangya","module_name":"工单平台","link":"xxx"}response{"code":200,"data":32,"msg":"OK"}获取内部消息列表:GET/v1/messageUser-Id:xxxhttp://127.0.0.1:10085/v1/message?query=message_text_id.module_id.name:xxx&limit=1{"code":200,"data“:{“数据”:[{“id”:1,“message_text”:{“id”:1,“标题”:“标题2”,“内容”:“内容2”,“create_ti我":"2018-01-1211:13:48","update_time":"2018-01-1211:13:48","send_type":1,"creator_name":"sysadmin","deleted":0,“链接”:“xxx”,“消息”:空,“模块”:{“id”:4,“代码”:“安全”,“名称”:“xxx”,“create_time”:“2018-01-1115:38:01","update_time":"2018-01-1115:38:01","MessageTexts":null}},"receiver_name":"xxx","read":0,"deleted":0,"create_time":"2018-01-1211:13:48","update_time":"2018-01-1211:13:48"}],"total":2},"msg":"OK"}注意:返回数据的个数受limit限制,total为满足查询条件的总个数(用于分页),目前没有发送用户组或整体的行为站点,在列表界面,添加一步“插入所有发送到我的用户组,或者整个站点的消息,并且没有记录在我自己的消息列表中”,获取未读消息数:GET/v1/message/unread_countresponse{"code":200,"data":29,"msg":"OK"}获取单站消息内容:GET/v1/message/:id{"code":200,"data":{"id":2,"message_text":{"id":2,"title":"标题2","content":"内容3","create_time":"2018-01-1211:37:54","update_time":"2018-01-1211:37:54","send_type":1,"creator_name":"sysadmin","deleted":0,"link":"","Messages":null,"module":{"id":4,"code":"secure","name":"xxx","create_time":"2018-01-1115:38:01","update_time":"2018-01-1115:38:01","MessageTexts":null}},"receiver_name":"xxx","read":1,"deleted":0,"create_time":"2018-01-1211:37:54","update_time":"2018-01-2217:33:20"},"msg":"OK"}**读取和批量读取消息:PUT/v1/read_messages/:messageIds**response{"code":200,"data":"OK","msg":"OK"}全部读取PUT:/v1/read_all_messagesresponse同上Delete,批量删除消息:PUT/v1/delete_messages/:messageIdsresponse同上,全部删除站内消息Message:PUT/v1/delete_all_messagesresponse同上获取消息来源列表:GET/v1/moduleresponse{"code":200,"data":[{"id":1,"code":"worksheet","name":"工单平台","create_time":"2018-01-1115:21:38","update_time":"2018-01-1115:21:38","MessageTexts":null},{"id":2,"code":"cmdb","name":"资源管理","create_time":"2018-01-1115:22:28","update_time":"2018-01-1115:22:28","MessageTexts":null},...],"msg":"OK"}七、测试注意事项1、发送内部消息的纯接口,用逗号隔开,收货时不检查真实性用户有长度检查,并且50字节的标题内容有长度校验,分别为45和150字节。module_name是一个列表,必须从这里选择一个2其他接口可以通过前端页面测试8.优化未读列表可以加粗显示,已读是普通字体对站内消息进行分类,并标注不同纬度,即方便过滤、搜索、屏蔽用户可以设置站内允许接收的消息来源。管理员可以对全站新闻、全站人员、全站消息属性进行增删改查。发送消息数、各产品使用情况、消息阅读比例、消息阅读时长、消息阅读方式(点击打开或批量操作)等9.关键功能点设计图标行为在右上角1点击图标显示最新的N条未读消息显示下拉框实时获取最新的N条未读消息N可以是5到10,具体值取决于下拉框的高度限制下拉框当未读消息数小于N时,下拉框可以自适应高度如果没有未读消息,显示“没有新消息”停止每10秒获取未读消息数。在界面2的下拉框中,显示来源、时间(相对于当前时间:10分钟前)、标题。向下滑动下拉框显示更多未读消息(只获取显示消息列表中小于最小id的id,即点击图标后不获取新消息)3点击下拉框中的一条消息下拉框没有消失,依然每10秒获取一次未读消息数。界面未读消息条数减1.未读消息列表删除当前消息(切片)并显示弹框4.弹框显示来源、时间(绝对时间)、标题、内容的消息。5关闭弹出框或点击外围:弹出框消失,下拉框不消失。您可以继续单击未读消息。6再次点击下拉框,图标外围下拉框消失,清除已有的未读消息列表,恢复每10秒获取未读消息数的界面。7再次点击图标,回到#1状态。阿里云的图标行为是:页面刷新时会请求一次未读消息数,之后不会定时刷新(当然也可能是刷新间隔时间比较长,没查到;或者使用socket方法来创建一个长链接)悬停图标,也就是显示未读消息的下拉框。点击图标进入站内消息管理页面。默认为“未读消息”。4点击未读消息,打开一个新的Tab,显示消息的详情(详情页),原Tab的内容不变,即未读计数没有减一,而消息5刚刚点击不会从下拉框中删除。最多显示5条消息。只要不刷新页面,就一直是这个5条6没有滚动更多的功能,只能查看更多,点击进入本站消息管理页面,默认为“未读消息”和与点击图标的区别是:点击图标直接跳转到本站消息管理页面,点击“查看更多”会新建一个Tab7,多一个“消息接受管理”按钮,当前页面会跳转进入站内消息管理页面,但默认为“基本接收管理”隐藏浏览器进度条。每10秒获取未读消息数的接口会触发浏览器显示进度条,分散用户注意力。进度条应该被移除隐藏其他刷新页面的行为不受影响。
