返回顶部
首页 > 资讯 > 数据库 >踩坑记录:消息推送已读未读
  • 446
分享到

踩坑记录:消息推送已读未读

java数据库mysql 2023-08-17 22:08:39 446人浏览 独家记忆
摘要

一、需求 最近工作中遇到了一个坑,在次记录一下。 社区管理员在后台发布一条社区公告,手机端该社区下的所有居民都可以收到这条公告,并且消息有已读未读状态。 二、分析 这个需求看起来很简单,无非就是后台发布完公告之后,同时在消息表里添加一条记录

一、需求

最近工作中遇到了一个坑,在次记录一下。

社区管理员在后台发布一条社区公告,手机端该社区下的所有居民都可以收到这条公告,并且消息有已读未读状态。

二、分析

这个需求看起来很简单,无非就是后台发布完公告之后,同时在消息表里添加一条记录,移动端通过社区去查询到此条公告,给用户展示即可。

最初的设计是这样的,发送消息使用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发送的时候,比如按社区发送,在消息表中是只有一条消息的,也就是说,一旦这个社区下任何一个居民阅读了这条消息,状态字段就会修改为已读,这就导致社区下其他居民看到这条消息的状态也是已读。

四、解决问题

最终的解决方案是:当消息类型不是用户时,使用MysqljsON字段,去存储已阅读此消息的用户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

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作