一、需求

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

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

二、分析

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

最初的设计是这样的,发送消息使用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代码片段如下:


问题解决!!

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

  1. 未读消息(小红点),前端 与 RabbitMQ 实时消息推送实践,贼简单~

    前几天粉丝群里有个小伙伴问过:web 页面的未读消息(小红点)怎么实现比较简单,刚好本周手头有类似的开发任务,索性就整理出来供小伙伴们参考,没准哪天就能用得上呢. 之前在 <springboot ...

  2. uniapp unipush接入个推消息推送(各种踩坑记录)安卓+IOS+在线消息+离线消息

    uniapp 消息推送功能实现 上周公司要求做一个消息推送的功能,由于现有的电商APP是用uniapp做的,所以优先考虑uniapp自带的unipush消息推送. ios证书导出踩坑 ios推送证书导 ...

  3. 【微信小程序】消息推送服务器配置及服务器域名配置(记录坑)

    我最近想在微信小程序推送通知,于是开始学怎么弄模板消息. 首先要配置服务器域名和消息推送配置. 先配置服务器域名吧,这个简单. 配置服务器域名 首先进入小程序后台>>开发>>开 ...

  4. 消息已读未读的模型设计_阿里云技术专家分享:现代 IM 系统中消息推送和存储架构的实现...

    前言 IM 全称是"Instant Messaging",中文名是即时通讯.在这个高度信息化的移动互联网时代,生活中 IM 类产品已经成为必备品,比较有名的如钉钉.微信.QQ 等以 ...

  5. 苹果消息推送服务教程(下有php服务端DEMO,已验证可用)

    转载自:http://www.raywenderlich.com/zh-hans/24732/苹果消息推送服务教程:第一部分(共2部分) 这篇文章还可以在这里找到 英语 文琳照着这个做的:http:/ ...

  6. vue项目中将视频链接分享至推特的解决方法及踩坑记录

    vue项目中将视频链接分享至推特的解决方法及踩坑记录 将动态改变的视频链接分享至推特,并希望能直接在推特上播放视频的需求实现方法及踩坑记录 如果只要将文本或链接分享到推特,不需要推特识别图片/视频等媒 ...

  7. 微信订阅消息推送(记录)

    1.打开微信公众平台,选用订阅消息模板(可在公共库选用,也可自己申请:审核时间3-7天): 2.打开微信官方文档,了解订阅消息的方法subscribeMessage.send | 微信开放文档 3.建 ...

  8. 微信小程序java后端开发记录(三):模板消息推送

    ·模板消息推送 1.1推送参数dto: 按照文档逐层次封装请求参数. 这些参数 /*** @author hanyy* @Description: 微信小程序模板消息推送参数* @date 2019/ ...

  9. 设计一个百万级的消息推送系统

    2019独角兽企业重金招聘Python工程师标准>>> 前言 首先迟到的祝大家中秋快乐. 最近一周多没有更新了.其实我一直想憋一个大招,分享一些大家感兴趣的干货. 鉴于最近我个人的工 ...

最新文章

  1. oracle 查看表是否被锁
  2. 车牌识别--Towards End-to-End License Plate Detection and Recognition: A Large Dataset and Baseline
  3. 使用croc命令在Linux系统电脑之间传输文件和文件夹
  4. python中os.path.dirname(__file__)的使用(获取文件夹路径)(获取当前py文件绝对路径)
  5. Windows环境下多线程编程原理与应用读书笔记(8)————信号量及其应用
  6. linux安装ant环境变量,CentOS下Ant环境配置
  7. 大学生医保的报销范围
  8. HBase API 创建表
  9. 语音信号预加重与去加重(Matlab+Keil)
  10. 网络中心化 和 去中心化
  11. OutMan——Foundation框架中的集合类(一)(二)
  12. Vue+Element UI弹窗实现表格编辑
  13. HDU1172 猜数字
  14. 电脑启动快捷键一览表
  15. Windows下Idea,AndroidStudio的字体美化
  16. 微信公众号订阅号申请注册教程
  17. 数据结构:图(一) 图的基本知识
  18. CentOS安装pycurl报错
  19. 长视频+正版+精准化广告 从奇艺网看三网合一
  20. 极客搜索爬取request payload构建post请求

热门文章

  1. 题目75:若两个素数之差为2,则该对素数称为双胞胎数,如3,5就是一对双胞胎数。编写程序,实现如下功能:输入n的值,统计显示n以内的所有双胞胎数。
  2. c语言编程翻转,c语言编程:实现数字的翻转
  3. 从护士“逆袭”微软中国总裁,打工女皇消失20年后重出江湖回应2亿年薪传闻...
  4. 如何写新闻稿?写好新闻稿的技巧与步骤
  5. web应用用户头像处理
  6. 游戏本电脑性价比排行2020新品竟如此给力?
  7. Badboy录制模式
  8. 几款好用的指纹识别工具
  9. 国内外旅游数据(1994-2018年)
  10. oracle 10g升级到11g