消息模块系统设计文档
系统功能特点
- 模板驱动:通过模板定义结构、变量占位,实现统一化消息生成。
- 多渠道支持:允许同一条消息通过多个渠道并发或按优先级发送。
- 消息归档:所有消息发送日志都完整记录,支持后期追溯。
- 用户可读状态跟踪:支持记录用户是否已读以及读取时间。
- 多端链接支持:支持移动端与桌面端跳转链接,增强互动性。
架构图
消息发送流程图
系统设计
1. 消息模板(system_message_template)
定义通用的消息模板,支持变量替换、多渠道发送。
| 字段 | 类型 | 描述 |
|---|---|---|
| no | 字符串 | 编码(唯一标识) |
| name | 字符串 | 模板名称 |
| content | 文本 | 模板内容(支持变量替换) |
| channel | 关联业务对象 | 渠道 |
| is_enable | 布尔值 | 是否启用 |
2. 消息渠道(system_message_channel)
用于配置各类消息渠道的信息,包括 API 接入参数。
| 字段 | 类型 | 描述 |
|---|---|---|
| name | 字符串 | 名称 |
| no | 字符串 | 编码 |
| extra_config | JSON | 额外配置(如签名、发送规则) |
| type | 枚举 | 渠道类型(企业微信、微信小程序、钉钉等) |
3. 消息发送记录(system_message_send)
记录每一次消息发送的日志信息,便于追踪和审计。
| 字段 | 类型 | 描述 |
|---|---|---|
| template_no | 字符串 | 模板编码 |
| template_id | 关联业务对象 | 模板 ID |
| title | 字符串 | 标题 |
| content | 文本 | 内容 |
| channel | 关联业务对象 | 渠道 |
| from_user_id | 关联业务对象 | 发送人 ID |
| to_user_id | 关联业务对象 | 接收人 ID |
| status | 枚举 | 发送状态(待发送、成功、失败) |
| send_at | 时间戳 | 发送时间 |
| finish_at | 时间戳 | 完成时间 |
| response_content | 文本 | 结果内容 |
| error_msg | 字符串 | 失败原因 |
4. 系统通知(system_notice)
用于系统主动推送的重要消息或通告,支持 PC 与移动端链接。
| 字段 | 类型 | 描述 |
|---|---|---|
| template_no | 字符串 | 模板编码 |
| template_id | 关联业务对象 | 模板 ID |
| title | 字符串 | 消息标题 |
| content | 文本 | 消息内容 |
| from_user_id | 关联业务对象 | 发送人 |
| link | 字符串 | 电脑端链接 |
| link_app | 字符串 | 移动端链接 |
5. 用户消息(system_user_message)
用于管理用户相关的消息,如系统通知、评论、私信等。
| 字段 | 类型 | 描述 |
|---|---|---|
| template_no | 字符串 | 模板编码 |
| template_id | 关联业务对象 | 模板 ID |
| title | 字符串 | 消息标题 |
| content | 文本 | 消息内容 |
| from_user_id | 关联业务对象 | 发送人 |
| to_user_id | 关联业务对象 | 接收人 |
| type | 枚举 | 消息类型(系统消息、私信、评论、点赞、业务模块) |
| link | 字符串 | 电脑端链接 |
| link_app | 字符串 | 移动端链接 |
| is_read | 布尔值 | 是否已读 |
| read_at | 时间戳 | 阅读时间 |
| source_id | 关联业务对象 | 来源数据 ID |
| source_business_id | 关联业务对象 | 来源业务对象 ID |
| extra_data | JSON | 扩展数据(如附件信息等) |
二次开发
后端
MessageUtils 是一个封装了多种消息发送策略的工具类,主要用于后端服务向客户端推送实时消息
1. 广播消息
方法签名:
public static <T> void broadcastHideMessage(SseMessageTypeEnum messageType, T data)
功能说明: 向所有连接的客户端发送隐式广播消息。
参数说明:
messageType:消息类型枚举,定义在SseMessageTypeEnum中data:要发送的消息内容对象(会自动序列化)
使用场景:
- 全局通知(如系统公告)
- 全站数据更新(如页面内容更新)
- 需要所有客户端同步状态的场景
示例代码:
// 发送页面更新广播
MessageUtils.broadcastHideMessage(SseMessageTypeEnum.PAGE_UPDATE, pageDTO);
// 发送系统通知广播
MessageUtils.broadcastHideMessage(SseMessageTypeEnum.SYSTEM_NOTICE, notice);
最佳实践
- 消息类型管理:
- 所有消息类型应在
SseMessageTypeEnum中明确定义 - 避免直接使用字符串作为消息类型
- 所有消息类型应在
- 性能考虑:
- 广播消息会发送给所有连接客户端,高频使用时需注意性能影响
- 大数据量对象建议先进行压缩或简化
- 错误处理:
- 工具类内部已处理基本异常
- 重要消息建议添加日志记录发送状态
2.发送单个消息
方法签名
public static <T> void sendMessage(MessageDto<T> data, Map<String, Object> templateVariables)
功能描述
发送带有模板参数的消息到指定用户。该方法是一个通用消息发送接口,支持通过模板ID和动态参数构建消息内容。
参数说明
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
data | MessageDto<T> | 是 | 消息数据传输对象,包含消息的基本信息 |
templateVariables | Map<String, Object> | 是 | 消息模板变量键值对集合 |
使用示例
基本用法
HashMap<String, Object> map = new HashMap<>();
map.put("name", message);
// 各个渠道的发送参数
MessageSiteSenderDTO siteData = new MessageSiteSenderDTO();
siteData.setType(SseMessageTypeEnum.USER);
siteData.setLeve(SseMessageLevelEnum.PRIMARY);
siteData.setMessageType(SystemUserMessageTypeEnum.PRIVATE_MESSAGE);
siteData.setSourceId(0L);
siteData.setSourceBusinessId("");
siteData.setLink("");
siteData.setAppLink("");
siteData.setExtraData(new Object());
// 构建消息
MessageDto<MessageSiteSenderDTO> messageData = new MessageDto<>(1L, 1L, userId, siteData);
// 发送消息
MessageUtils.sendMessage(messageData, map);
注意事项
- 模板ID必须在消息模板系统中预先定义
- 模板变量键名必须与模板中定义的变量名一致
- 方法内部不处理null检查,调用方需确保参数有效性
- 消息实际内容由模板引擎根据模板ID和变量生成

