零晚零晚
首页
  • 列表页面
  • 详情页面
  • 编辑页面
  • 导入导出
  • 消息模块
  • 短信模块
部署
Source
首页
  • 列表页面
  • 详情页面
  • 编辑页面
  • 导入导出
  • 消息模块
  • 短信模块
部署
Source

消息模块系统设计文档

系统功能特点

  • 模板驱动:通过模板定义结构、变量占位,实现统一化消息生成。
  • 多渠道支持:允许同一条消息通过多个渠道并发或按优先级发送。
  • 消息归档:所有消息发送日志都完整记录,支持后期追溯。
  • 用户可读状态跟踪:支持记录用户是否已读以及读取时间。
  • 多端链接支持:支持移动端与桌面端跳转链接,增强互动性。

架构图

消息发送流程图 消息发送流程图.png

系统设计

1. 消息模板(system_message_template)

定义通用的消息模板,支持变量替换、多渠道发送。

字段类型描述
no字符串编码(唯一标识)
name字符串模板名称
content文本模板内容(支持变量替换)
channel关联业务对象渠道
is_enable布尔值是否启用

2. 消息渠道(system_message_channel)

用于配置各类消息渠道的信息,包括 API 接入参数。

字段类型描述
name字符串名称
no字符串编码
extra_configJSON额外配置(如签名、发送规则)
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_dataJSON扩展数据(如附件信息等)

二次开发

后端

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);

最佳实践

  1. 消息类型管理:
    • 所有消息类型应在 SseMessageTypeEnum 中明确定义
    • 避免直接使用字符串作为消息类型
  2. 性能考虑:
    • 广播消息会发送给所有连接客户端,高频使用时需注意性能影响
    • 大数据量对象建议先进行压缩或简化
  3. 错误处理:
    • 工具类内部已处理基本异常
    • 重要消息建议添加日志记录发送状态

2.发送单个消息

方法签名

public static <T> void sendMessage(MessageDto<T> data, Map<String, Object> templateVariables)

功能描述

发送带有模板参数的消息到指定用户。该方法是一个通用消息发送接口,支持通过模板ID和动态参数构建消息内容。

参数说明

参数名类型必填说明
dataMessageDto<T>是消息数据传输对象,包含消息的基本信息
templateVariablesMap<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);

注意事项

  1. 模板ID必须在消息模板系统中预先定义
  2. 模板变量键名必须与模板中定义的变量名一致
  3. 方法内部不处理null检查,调用方需确保参数有效性
  4. 消息实际内容由模板引擎根据模板ID和变量生成

前端

Last Updated:
Contributors: lingwan