站内信、活动、公告和推送技术调研

本文最后更新于:1 天前

1 需求分析

帮我调研下 web 系统的站内信、活动、公告和推送的设计实现解决方案

站内信的核心抽象:消息内容消息和发送人的关系是否已读

2 理论设计

【xxx】【点赞】了你的【文章】【文章的标题】
【xxx】【评论】了你的【文章】【文章的标题】
【xxx】【点赞】了你在【文章】【文章的标题】下的评论
【xxx】【回复】了你的【评论】【被回复的评论的内容】
【xxx】【点赞】了你在【文章】【文章标题】下的回复
【xxx】在【文章】【文章的标题】中【@】了你
【xxx】在【文章】下的【评论】中【@】了你
【xxx】在【文章】下的【回复】中【@】了你
【xxx】回答了你关注的【问题】【问题标题】
【xxx】更新了你关注的【文章】【文章标题】
【xxx】邀请你回答【问答】【问答标题】
【xxx】关注了你

一个完整的消息包括,【站内信的主语】、【主实体类型】、【关联对象】、【触发站内信的事件】、【站内信接收人】。

eg:张三点赞了李四的文章”码神是如何练成的!”

站内信主语:张三
主实体类型:文章(注意是主体类型,只是一个类型,比如掘金沸点、知乎问题、淘宝商品、订单等,根据业务定义)
关联对象:文章”码神是如何练成的!”(便于根据主实体类型和关联对象定位到对应的事件来源)
触发站内信的事件:点赞(触发消息事件的动作或行为)
站内信接收人:李四(接收到消息的人)

消息大致分为了三类:

  1. 系统推送的通知(System Notice);
  2. 回复、@、点赞等用户行为产生的提醒(Remind);
  3. 用户之间的私信(Chat)。

2.1 系统通知(System Notice)

系统通知一般是由后台管理员发出,然后指定某一类(全体,个人等)用户接收。基于此设想,可以把系统通知大致分为两张表:

  1. t_message(系统消息表) :记录发出的通知 ;
  2. t_message_belong(消息关联表) : 存储通知与接收者的关联关系。

t_message 结构如下:

字段名 类型 描述
id LONG 系统消息 ID
title VARCHAR 标题
content TEXT 内容
type TINYINT 发给哪些用户[1:单一目标;2:全体目标;3:部分目标];
belong_type TINYINT 所属类型[1:学员;2:项目;3:课程)
level TINYINT 级别[0:重要;1:普通]
state BOOLEAN 是否已被拉取过,如果已经拉取过,就无需再次拉取
status TINYINT 状态[0:未发布;1:已发布;2:已撤回]
publish_time TIMESTAMP 发布时间
create_account_id LONG 发布通知的账号 ID
update_account_id LONG 更新通知的账号 ID
create_time DATETIME 创建时间
update_time DATETIME 更新时间
is_deleted TINYINT 是否删除[0:未删除;1:已删除]

t_message_belong 结构如下:

字段名 类型 描述
id LONG 主键 ID
message_id LONG 系统通知的 ID
belong_id LONG 关联到对应类型的id(一对多学员时为null)
pull_time TIMESTAMP 拉取通知的时间
state BOOLEAN 阅读状态(belong_type为用户时才有效)
read_time DATETIME 已读时间(belong_type为用户时才有效)
create_account_id LONG 发布通知的账号 ID
update_account_id LONG 更新通知的账号 ID
create_time DATETIME 创建时间
update_time DATETIME 更新时间
is_deleted TINYINT 是否删除[0:未删除;1:已删除]

最终sql:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
CREATE TABLE t_message (
C_ID BIGINT(20) NOT NULL COMMENT '系统消息 ID',
C_TITLE VARCHAR(255) NOT NULL COMMENT '标题',
C_CONTENT TEXT COMMENT '内容',
C_TYPE TINYINT(4) NOT NULL COMMENT '发给哪些用户[1:单一目标;2:全体目标;3:部分目标]',
C_BELONG_TYPE TINYINT(4) NOT NULL COMMENT '所属类型[1:学员;2:项目;3:课程]',
C_LEVEL TINYINT(2) COMMENT '级别[0:重要;1:普通]',
C_STATE TINYINT(1) COMMENT '是否已被拉取过,如果已经拉取过,就无需再次拉取',
C_STATUS TINYINT(4) NOT NULL COMMENT '状态[0:未发布;1:已发布;2:已撤回]',
C_CREATE_ACCOUNT_ID BIGINT(20) NOT NULL COMMENT '创建通知的账号 ID',
C_UPDATE_ACCOUNT_ID BIGINT(20) NOT NULL COMMENT '更新通知的账号 ID',
C_PUBLISH_ACCOUNT_ID BIGINT(20) NOT NULL COMMENT '发布通知的账号 ID',
C_CREATE_TIME DATETIME NOT NULL COMMENT '创建时间',
C_UPDATE_TIME DATETIME NOT NULL COMMENT '更新时间',
C_PUBLISH_TIME DATETIME COMMENT '发布时间',
PRIMARY KEY (C_ID)
) COMMENT '系统消息表';

CREATE TABLE t_message_belong (
C_ID BIGINT(20) NOT NULL COMMENT '主键 ID',
C_MESSAGE_ID BIGINT(20) NOT NULL COMMENT '系统消息的 ID',
C_BELONG_ID BIGINT(20) COMMENT '关联到对应类型的id',
C_PULL_TIME DATETIME COMMENT '拉取通知的时间',
C_STATE TINYINT(1) COMMENT '阅读状态(belong_type为用户时才有效)',
C_READ_TIME DATETIME COMMENT '已读时间(belong_type为用户时才有效)',
C_CREATE_ACCOUNT_ID BIGINT(20) NOT NULL COMMENT '创建账号 ID',
C_UPDATE_ACCOUNT_ID BIGINT(20) NOT NULL COMMENT '更新账号 ID',
C_CREATE_TIME DATETIME NOT NULL COMMENT '创建时间',
C_UPDATE_TIME DATETIME NOT NULL COMMENT '更新时间',
PRIMARY KEY (C_ID)
) COMMENT '系统消息关联表';

3 免责说明

本博客的部分内容来源于互联网公开资料,包括但不限于文章、图片、视频、音频等素材。这些素材的版权归原作者或版权持有人所有。本博客引用这些素材的目的在于分享知识、传播信息,并非用于商业用途。

3.1 引用原则

  1. 非商业用途:本博客为个人非商业性质,所有引用的素材仅用于学习和交流目的。
  2. 注明来源:在引用他人素材时,我会尽量注明出处或来源链接。如果因疏忽未能标注,请联系我,我会及时补充或删除相关内容。
  3. 尊重版权:如果您是相关素材的版权持有人,认为本博客的内容侵犯了您的权益,请通过以下联系方式与我联系,我会第一时间核实并处理。

3.2 联系方式

如果您对本博客的内容有任何疑问或建议,或认为某些内容侵犯了您的合法权益,请通过以下方式联系我:

3.3 免责条款

  1. 本博客引用的互联网资料仅供学习和参考,不保证其准确性、完整性或时效性。
  2. 对于因使用或引用本博客内容而导致的任何直接或间接损失,本博客不承担任何责任。
  3. 本博客保留对免责声明的最终解释权。

感谢您的理解与支持!

4 参考来源


站内信、活动、公告和推送技术调研
https://alleyf.github.io/2025/02/b5a4e34680b7.html
作者
fcs
发布于
2025年2月11日
更新于
2026年3月9日
许可协议