最近笔者浏览网页的时候发现站内消息提醒99+,一时不知所措。点完消息后就在想消息功能是怎么实现的?

1. 站内信

站内信简单点就是网站内的消息通知,在网站内部实现,不用邮件,短信等服务。很多时候我们都在使用,比如系统推送的公告,用户的私信,订阅的更新等等很多

根据站内信的发送范围可将其分为:

**一对一:**属于私信,用户与用户之间互相发送私信,或者是系统对某一特定用户推送的内容

**一对多:**属于群发,一用户对多个用户发送消息(垃圾广告),或者系统对某特定的用户群体推送内容

**一对全体:**属于公告,是对全体用户生效的,每个用户都能收到这个公告消息

根据站内信的内容可将其大致分为(参考Bilibili模型):

回复我的

@ 我的

收到的赞

系统通知

我的消息

其他关注点:

**消息的设置:**是否开启消息提醒、免扰时间、消息提醒的范围

**消息提醒的时限:**消息也需要设置时限,不然几年前发的公告,现在刚创建的用户也会收到

**用户群体:**对某些特定的群体发送消息,比如对常浏览科技区的用户发送科技短讯

**消息订阅:**对那些订阅频道的用户推送更新提醒

说了那么多,开始说重点了。笔者只实现最基本的一对一私信与一对全体的公告功能,以最简洁的方式表达站内信的设计(主要是笔者没有实现整体功能的实力)

2. 数据库设计

将消息内容与阅读记录分开,这样做的目的是避免公告中每个用户都需要一份消息内容而形成冗余。两个表分别为t_message_content内容表,t_message_record记录表

t_message_content

CREATE TABLE `t_message_content` (

`c_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '消息的id',

`send_id` int(11) DEFAULT NULL COMMENT '消息发送者的id',

`content` varchar(255) DEFAULT NULL COMMENT '消息的内容',

`type` int(11) DEFAULT NULL COMMENT '消息的类型',

`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '消息发送的时间',

PRIMARY KEY (`c_id`)

) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

其中type消息类型分为私信和公告,0是私信、1为公告。发送时间默认为当前时间

t_message_record

CREATE TABLE `t_message_record` (

`r_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '阅读记录的id',

`rec_id` int(11) DEFAULT NULL COMMENT '消息接收者的id',

`c_id` int(11) DEFAULT NULL COMMENT '对应消息的id',

`status` int(11) DEFAULT '0' COMMENT '阅读记录的状态',

PRIMARY KEY (`r_id`)

) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

status表示阅读记录的状态,0表示未读,1已读,2删除。为什么需要删除? 以公告为例:个人删除公告的消息可将阅读记录标记为删除,这样个人就不会显示该公告了。但公告本身内容不能被个人删除,删除的话其余的人就无法收到这条公告了。阅读记录默认为未读。

3. 私信的操作步骤

3.1 用户7 发送私信给 用户10

一、在内容表里插入私信内容,并返回该内容的自增主键c_id = 5

INSERT INTO t_message_content (`send_id`,`content`,`type`) VALUES (7,"这是7发送私信给10",0)

二、往记录表里插入私信接收方未读的记录

INSERT INTO t_message_record (`rec_id`,`c_id`) VALUES (10,5)

3.2 私信接收方接收消息

一、用户10 登录时获取全部私信消息

SELECT c.*,r.status

FROM t_message_content c

LEFT JOIN t_message_record r

ON c.c_id = r.c_id

WHERE r.rec_id = 10

AND c.type = 0

AND r.`status` != 2

| c_id | send_id | content | type | create_time | status |

| ---- | ------- | ------------- | ---- | ------------------- | ------ |

| 5 | 7 | 7发送私信给10 | 0 | 2020-03-09 13:23:15 | 0 |

内容表左联记录表,外联+where都是操作在临时表上的,筛选出用户10 未删除的私信

二、用户10 点击阅读时

UPDATE t_message_record SET status = 1 WHERE c_id = 5 AND rec_id = 10

将阅读记录的状态修改为已读

三、当用户10 点击删除私信时

UPDATE t_message_record SET status = 2 WHERE c_id = 5 AND rec_id = 10

4. 公告的操作步骤

4.1 后台用户1 发布公告

INSERT INTO `t_message_content` (`send_id`,`content`,`type`) VALUES (1,"这是公告1的内容",1)

INSERT INTO `t_message_content` (`send_id`,`content`,`type`) VALUES (1,"这是公告2的内容",1)

没错就一步,不需要往记录表插入记录,因为公告是面对全体的。若插入记录以用户基数10万人算,那数据库不瞬间锁表卡死,具体接收操作请看下面

4.2 用户10 接收公告

一、用户10 登陆时获取全部公告消息

SELECT c.*,IFNULL(r.status,0) AS status

FROM t_message_content c

LEFT JOIN t_message_record r

ON (c.c_id = r.c_id AND r.rec_id = 10)

WHERE c.type = 1

这里需要思考了:先查出全部公告,然后左联记录表,得出临时表(记录了全部公告和能匹配的阅读记录),没有匹配则是null,然后用IFNULL设为0表示未读,此时阅读表里是没有这条记录的

二、公告1设为已读

INSERT INTO t_message_record (`rec_id`,`c_id`,`status`) VALUES (10,1,1)

三、删除公告1

UPDATE t_message_record SET status = 2 WHERE rec_id = 10 AND c_id = 1

至此笔者理解的站内信就讲完了

参考:

关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。

本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。

[站内信设计]http://www.zyiz.net/tech/detail-115650.html

java 实现站内信_站内信设计相关推荐

  1. java读取手机短信_使用短信猫读取短信java代码

    短信猫简单配置:https://www.cnblogs.com/Big-Boss/p/9699880.html 测试发送短信代码:https://www.cnblogs.com/Big-Boss/p/ ...

  2. java编程彩球滑梯作弊_课内资源 - 基于C++的学生成绩管理系统

    1 系统分析 1.1 学生成绩管理系统介绍 班主任管家软件以学生信息.课程信息为基础,以品行表现成绩(辅导员.班主任.班级评议成绩)和业务课程成绩为评价依据,每学期评定一次奖学金,奖学金作为学生评定各 ...

  3. ipv6 访问内网_【内网渗透】—— 隐藏通信隧道技术之网络层隧道技术

    hidden:是否完全隐藏控制面板,还有很多设置参数,比如也可以设置显示面板,然后设置宽高WIDTH="整数" 和 HIGH="整数". 1. 隐藏通信隧道基础 ...

  4. jvm 方法内联_方法内联在JVM中有多积极?

    jvm 方法内联 在IntelliJ IDEA中使用Ctrl + Alt + M 提取方法 . Ctrl + Alt + M. 这就像选择一段代码并按此组合一样简单. Eclipse也有它 . 我讨厌 ...

  5. 触摸屏左右屏幕外向内滑动_外向内发展的案例

    触摸屏左右屏幕外向内滑动 没有前端时,没有理由拥有后端. 当没有人使用API​​时,没有理由使用它. 没有其他类(或框架)可以使用时,没有理由拥有一个类. 没有人调用时,没有理由拥有一种方法. 仅应满 ...

  6. java at发短信_发送短信(1)

    //发送短信 @Override public int sendSms(String mobile){ int smsCode=0, ret=0; String temp; boolean resul ...

  7. 山寨机java自动发短信_恶搞短信附带代码 山寨手机最容易中招黑屏

    恶搞短信附带代码 山寨手机最容易中招黑屏 2012-03-27 13:49:34  来源:钱江晚报 扫码可以: 1.在手机上浏览 2.分享给微信好友或朋友圈 摘要: 用一条短信就能让你手机" ...

  8. android控件向内弧度_描边/内间距/四个角不同弧度(包括圆角)

    YLCircleImageView 如果依赖失败,可以直接下载Library中的YLCircleImageView 和 style.xml放入项目中 QQ:375984181 功能 具备描边功能 具备 ...

  9. java程序设计 一种跨学科_(工业) 设计是 一种 跨学科 的专业。_Java程序设计2018-2019第二学期答案_学小易找答案...

    [单选题]图中使用的光刻胶是( )? [单选题]在 Grove 提出的 CVD 模型中,在温度很高的情况下,淀积的速率通常为( )控制. [单选题]CMOS集成电路通常选用( )晶面的硅片. [判断题 ...

  10. java整数四则运算课设_用面向对象方法设计实现整数的四则运算(java)

    用面向对象方法设计实现整数的四则运算,并编写主程序演示该类用法.(要求:用继承或接口实现) import java.math.BigDecimal; public class OperationImp ...

最新文章

  1. 十大排序算法 导图总结
  2. linux的ftp服务器
  3. Webstrom卡顿问题解决
  4. 一张图说明Linux启动过程
  5. Hadoop系统架构
  6. ps、grep和kill联合使用杀掉进程(转)
  7. _Linux 系统挂载数据盘
  8. MITRE 发布工控系统的 ATTCK 框架
  9. Educational Codeforces Round 51 (Rated for Div. 2) The Shortest Statement
  10. 切换google的公共库缓解网站访问慢的问题
  11. 四种依恋类型_你们之间的爱情是哪种类型 | 爱情依恋关系测评
  12. 对口本科计算机专业,对口高考计算机类专业综合试题(卷).doc
  13. 服装尺寸 html,国家标准服装尺寸表
  14. linux上创建loopback接口,在python中的特定接口的linux loopback接口
  15. 蝴蝶网络 Butterfly network
  16. vray for 3dmax分布式渲染故障疑难解答!
  17. 揭秘微信对方正在输入……到底表示什么意思?
  18. 一台游戏服务器支持多少人,网络游戏一个服务器可以容纳多少人同时在线?
  19. Linux中压缩解压工具使用
  20. 牛客wannafly27 C 树形dp

热门文章

  1. 360安全卫士团队版or企业版卸载
  2. 使用redis客户端可以连接集群,但使用JedisCluster连接redis集群一直报Could not get a resource from the poo
  3. HyperLedger-Fabric v0.6环境搭建详细教程
  4. python从入门到实践16章答案
  5. 淘宝客小程序制作(3)-API编写及部署
  6. linux文件压缩和打包
  7. 我怎梦想是计算机科学家,我的梦想是当一名科学家作文
  8. 浩哥的Linux学习笔记之touch命令
  9. (转)全球顶级对冲基金TOP50
  10. Log Robust 日志异常检测