一、需求 最近工作中遇到了一个坑,在次记录一下。 社区管理员在后台发布一条社区公告,手机端该社区下的所有居民都可以收到这条公告,并且消息有已读未读状态。 二、分析 这个需求看起来很简单,无非就是后台发布完公告之后,同时在消息表里添加一条记录
最近工作中遇到了一个坑,在次记录一下。
社区管理员在后台发布一条社区公告,手机端该社区下的所有居民都可以收到这条公告,并且消息有已读未读状态。
这个需求看起来很简单,无非就是后台发布完公告之后,同时在消息表里添加一条记录,移动端通过社区去查询到此条公告,给用户展示即可。
最初的设计是这样的,发送消息使用MQ异步发送,消息表中新增一个消息类型字段和接收的ID字段,消息类型分为角色、用户、小区、社区四种类型。如果消息发送的用户数不庞大,则类型使用用户发送,查询出要发送的所有用户ID,向消息表中添加多条记录即可;如果发送的用户数过于庞大(比如社区下的所有居民),显然这种方式就不合理了,这个时候就需要通过社区发送,将社区ID作为接收的ID,在消息表中最终只需要添加一条记录即可。
具体的表字段如下:
CREATE TABLE `basic_remind` ( `ID` bigint(20) NOT NULL COMMENT '主键ID', `COMMUnity_ID` bigint(20) DEFAULT NULL COMMENT '社区ID', `RESOURCES_ID` bigint(20) DEFAULT NULL COMMENT '资源ID', `TITLE_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '消息标题', `CONTENT_` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '消息内容', `ACCOUNT_TYPE` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '消息接收类型(角色、用户、小区、社区)', `ACCOUNT_ID` bigint(20) DEFAULT NULL COMMENT '接收id', `TRIGGER_TIME` datetime DEFAULT NULL COMMENT '提醒时间', `STATUS_` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '状态(0-未读 1-已读)', `MSG_SCENE_TYPE` char(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '应用场景', `MSG_CHANNEL_TYPE` char(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '消息渠道(WEB端、C端)', `TEMPLATE_CODE` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '模板编码-由MSG_SCENE_TYPE、MSG_BUS_TYPE、MSG_TYPE、CHANNEL_TYPE组合而成', `READ_PERSON_IDS` JSON DEFAULT NULL COMMENT '已读人id(类型为社区或小区时使用)', `IS_DELETE` tinyint(1) DEFAULT '0' COMMENT '状态:0-正常,1-删除', `SEQ_NO` int(11) NOT NULL DEFAULT '0' COMMENT '排序号', `CREATE_DATE` datetime DEFAULT NULL COMMENT '创建时间', `CREATE_USER_ID` bigint(20) NOT NULL COMMENT '创建者', KEY `remind_account_id_index` (`ACCOUNT_ID`) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='消息提醒表';
到目前为止,已经实现了消息发送和展示的功能。但具体的业务中每条消息是有已读和未读的状态的,也就是说,用户点进消息详情,这条消息是要变为已读的。
回想上面的方案,虽然表中设计了阅读状态字段,但当消息不是按用户ID发送的时候,比如按社区发送,在消息表中是只有一条消息的,也就是说,一旦这个社区下任何一个居民阅读了这条消息,状态字段就会修改为已读,这就导致社区下其他居民看到这条消息的状态也是已读。
最终的解决方案是:当消息类型不是用户时,使用Mysql
的jsON
字段,去存储已阅读此消息的用户ID。当用户阅读此消息时,将用户ID作为数组,存入此字段,查询时使用JSON_CONTaiNS()
看当前用户ID是否在此数组中,在的话表示已读,否则未读。
mybatis代码片段如下:
问题解决!!
来源地址:https://blog.csdn.net/Always206/article/details/128796559
--结束END--
本文标题: 踩坑记录:消息推送已读未读
本文链接: https://www.lsjlt.com/news/373347.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-10-23
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0