多种消息提醒系统的设计模式、实现方案(附功能截图+表结构)

我的网站需要增加3种消息提醒系统。需要实现的功能如下:
《多种消息提醒系统的设计模式、实现方案(附功能截图+表结构)》

1.评论提醒。

实现功能

他人回复自己后,右上角自动提醒“未阅读的新消息”的数量。
点击后,清空新消息的提示。

思路

这个是最简单的。在数据库查询:

select count(id) from 评论表 where 贴子作者 = $当前用户UID and 是否被阅读 = 1 and 是否被删除 = 1

前端判断,后端返回的json数据是否>0,若大于则显示具体数量。
然后,给消息提示绑定一个方法。点击后AJAX:

UPDATE comment SET 是否被阅读 = 2 where 贴子作者 = $当前用户UID;

然后,前端把消息清空。

2.系统消息。

实现功能

系统消息与“评论”类似。只不过增加了一点。

用户收到的消息分2种。
一种是管理员发送给全体成员的消息。(如活动通知)
《多种消息提醒系统的设计模式、实现方案(附功能截图+表结构)》

另一种是针对某个用户的通知。(举报反馈、登录异地提醒)
《多种消息提醒系统的设计模式、实现方案(附功能截图+表结构)》

数据库设计

数据库字段如下:

id(自增主键),发送时间,消息标题,消息内容,receive_uid消息接收对象(0是给全体人的消息,其他是针对某个用户UID),had_read(用户是否阅读过这条消息),评论是否被删除

思路

全体消息有2种解决方案。
1.是给遍历用户,给每个用户发消息。这种方法在设计、实现上很简单,类似上面的评论。但消耗资源比较大(看你用户多不多)。
2.是发送给0,也就是说发送公共消息。每个人都可以接收,却只需要发送一条消息。
(p.s:也可以延伸一下数据库字段,发送给某个用户组)
但也有缺点。若用户是在你“发送全体消息”之后,注册的账号。查询消息表时,也会加载历史消息。
不过这很容易解决。加载消息时判断“用户注册的时间戳”>“发送消息的时间戳”就可以。

下面我根据方法2实现一下:
首先,判断特定用户的消息是否被阅读。(同上)

select count(id) from 系统消息表 where 接收消息的UID = $当前用户UID and 是否被阅读 = 1 and 是否被删除 = 1

然后,给用户表新增字段。new_system_msg_count(新消息的数量)。
每次发送全体消息,给全体成员的new_system_msg_count字段+1。
用户刷新页面时,查询两个结果的和。显示在前端即可。
如何清空消息就不写了。

3.授权消息

实现功能

数据中心(后台)实现如下。
《多种消息提醒系统的设计模式、实现方案(附功能截图+表结构)》
授权消息分2大类:

  1. 当前用户是作者。他人向自己申请授权。
  2. 当前用户申请了他人的授权,被同意/被拒绝。

数据库设计

数据库字段如下:

申请人UID,申请人是否阅读“作者回复的结果”,申请的贴子ID,申请时间,申请内容,

作者UID,作者是否阅读“这条申请”,申请回复结果(1等待作者回复,2作者同意/3作者拒绝),回复时间,回复内容。

是否被申请人取消申请,是否被申请人删除…

思路

授权消息需要注意2点:

  1. 一条消息对应2个UID(申请人,作者)。
  2. 新授权发起时,作者得到提醒。作者回复后(agree/disagree),申请人得到提醒。

当前用户作为“作者身份”得到的提醒数:

select count(id) from comment where 作者UID = $当前用户UID and 作者是否阅读 = 1 and 是否被申请者取消 = 2
and 申请回复结果 = 1(等待作者回复)

加上,当前用户作为“申请人身份”得到的提醒数:

select count(id) from comment where 申请人UID = $当前用户UID and 申请人是否阅读 = 1 and 是否被申请者取消 = 2 
and (申请回复结果 = 2同意 or 申请回复结果 = 3拒绝)

前端显示2者的和即可。
清空消息就省略了。

需要注意的地方

我这种实现方式,是在“用户刷新页面时”。
在初始化方法里请求AJAX,所以不能实时提醒消息。
想实现的话可以用websocket。用户评论时、发送系统消息时,检测用户是否在线。再具体操作就可以了。

说明

本文用于:

  1. 整理思路
  2. 希望作为其他人的参考
  3. 欢迎大佬给出优化建议
    原文作者:设计模式
    原文地址: https://segmentfault.com/a/1190000016504894
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞