Skip to content

消息通知 PRD

文档信息

项目内容
产品名称PMForge - 消息通知
文档版本v2.0
创建日期2026-09-12
最后更新2026-09-24
文档状态评审中
优先级P1

一、功能概述

1.1 功能定位

消息通知是 PMForge 平台的"通信中枢"——就像一家公司的传达室,负责把各类信息准确、及时地送到对应的人手中。它统一管理邮件、短信、站内信、系统公告四种消息渠道,为整个系统提供标准化的消息发送、模板管理、发送记录追踪与通知偏好设置能力。

简单来说:业务模块只需要告诉消息通知"给谁发、发什么",剩下的渠道选择、模板渲染、发送执行、结果记录全部由消息通知模块统一完成。

1.2 目标用户

用户类型核心诉求使用频率
超级管理员小王配置邮件/短信渠道、管理全局模板,确保消息通道畅通低频(初始配置 + 日常维护)
运营人员小刘通过模板发送邮件/短信、发布公告、管理站内信中频(日常运营)
后端开发小张在业务代码中调用消息发送接口,无需关心渠道细节开发阶段集中使用
普通用户小陈接收站内信、查看公告、管理通知偏好高频(每次登录)
企业租户管理员在自己租户范围内配置消息渠道和模板低频

1.3 业务价值

  • 降低接入成本:业务模块只需调用统一接口,不用分别对接邮件/短信/站内信,新增渠道不影响业务代码
  • 内容标准化:通过模板管理确保同类消息格式一致,避免各模块"各写各的"导致风格混乱
  • 问题可追溯:完整的发送日志与回调记录,邮件/短信发没发出去、失败原因是什么,一目了然
  • 提升用户体验:用户可自定义通知偏好,选择接收哪些类型、通过什么方式接收,减少消息打扰
  • 全员信息触达:系统公告能力支持置顶、定时发布、有效期管理,确保重要信息精准传达

1.4 功能范围

功能分类后台管理端前台用户端说明
邮箱账号配置-配置 SMTP 发件邮箱
邮件模板管理-管理邮件模板,支持变量替换
邮件发送日志-查看每封邮件的发送结果
短信渠道配置-对接阿里云/腾讯云/云片等短信服务商
短信模板管理-管理短信模板,支持同步审核状态
短信发送日志-查看每条短信的发送结果
短信回调记录-查看服务商异步回调的原始数据
通知模板管理-管理站内信通知模板
通知消息管理-管理员查看和管理站内信
系统公告管理-发布、置顶、下线系统公告
站内信(消息列表/详情/已读标记)-用户查看和管理个人消息
系统公告(列表/详情)-用户查看平台公告
消息设置(通知偏好)-用户自定义通知接收方式

二、用户场景

2.1 用户角色

角色描述核心关注点
超级管理员小王系统最高权限管理员渠道配置正确、API 密钥安全、渠道故障能快速切换
运营人员小刘负责内容运营与用户沟通模板好用、发送高效、发送结果可追踪
后端开发小张业务模块开发人员接口简单易用、发送异步不阻塞、失败有日志
普通用户小陈C 端用户消息分类清晰、重要消息不遗漏、可以关闭不需要的通知
企业租户管理员B 端租户的管理者在自己租户内独立配置渠道和模板,数据互不干扰

2.2 使用场景

场景1:管理员配置邮件发送账号

  • 用户:超级管理员小王
  • 场景:公司需要给用户发送注册验证邮件 → 小王进入后台「消息通知 → 邮箱账号」→ 点击"新增"→ 填写公司邮箱的 SMTP 配置(服务器地址、端口、账号密码、是否 SSL)→ 点击"测试发送"验证配置 → 确认无误后保存
  • 期望:配置过程简单直观,能通过测试发送立即验证配置是否正确
  • 异常处理:SMTP 服务器不可达时,提示"连接超时,请检查服务器地址和端口";测试发送失败时,展示具体错误原因

场景2:运营创建邮件模板并发送

  • 用户:运营人员小刘
  • 场景:需要给用户发送活动邀请邮件 → 进入「邮件模板」页面 → 创建新模板 → 填写模板编码"activity_invite"、选择发件账号、编写标题"Hi ${username},诚邀您参加${activityName}"和正文内容 → 保存后通过"发送"功能输入收件人列表 → 去「邮件日志」查看发送结果
  • 期望:模板支持 ${变量} 替换,发送时自动填入实际值;发送结果实时可查
  • 关键细节:模板编码是全局唯一的"身份证号",业务代码通过编码调用模板,而不是用 ID

场景3:管理员配置短信渠道并同步模板

  • 用户:超级管理员小王
  • 场景:系统需要发送手机验证码 → 选择短信服务商(如阿里云)→ 在阿里云后台获取 AccessKey → 进入「短信渠道」新增渠道 → 填写 API 凭证 → 进入「短信模板」创建验证码模板 → 填写渠道方的模板编号 → 点击"同步"按钮拉取审核状态 → 确认审核通过后,业务即可使用
  • 期望:支持多家服务商,模板审核状态能一键同步,不用手动去服务商后台查看
  • 关键细节:短信模板需要在服务商后台先创建并审核通过后,才能在系统中使用。"同步"功能就是去服务商那里拉取最新的审核结果

场景4:运营发布系统公告

  • 用户:运营人员小刘
  • 场景:系统下周凌晨 2 点升级维护 → 小刘需要发公告通知所有用户 → 进入「系统公告」→ 新增公告 → 选择"系统公告"类型 → 编写富文本内容 → 设置有效期(升级前后时间范围)→ 勾选"置顶"→ 点击"发布"
  • 期望:支持富文本编辑、置顶显示、有效期控制,过期后自动对用户不可见
  • 关键细节:公告有三种状态流转——草稿 → 已发布 → 已下线。只有"已发布"且在有效期内的公告用户才能看到

场景5:用户查看站内信与管理消息

  • 用户:普通用户小陈
  • 场景:登录后看到顶部导航栏消息图标显示"3 条未读"→ 点击进入消息中心 → 左侧按类型筛选(系统通知/业务通知/活动通知)→ 未读消息加粗显示 → 点击某条消息查看详情 → 自动标记为已读 → 返回后未读数变为"2"
  • 期望:未读提醒醒目、消息分类清晰、查看即自动标记已读
  • 关键细节:消息列表页不会自动标记已读,只有点进详情页才标记。这样用户可以快速浏览列表而不改变已读状态

场景6:用户管理通知偏好

  • 用户:普通用户小陈
  • 场景:觉得活动通知太频繁 → 进入个人中心「消息设置」→ 找到"活动通知"→ 关闭站内信接收或关闭邮件接收 → 保存
  • 期望:能按消息类型分别控制接收方式,减少不必要的打扰
  • 关键细节:系统级安全通知(如密码修改提醒、异地登录告警)不可关闭,这是为了保护用户账号安全

场景7:后端开发接入消息发送

  • 用户:后端开发小张
  • 场景:在订单模块中需要给用户发订单确认邮件 → 调用 mailTemplateApi.sendMail(templateCode, toMails, params) → 传入模板编码和变量参数 → 邮件异步发出,接口立即返回 → 不用关心 SMTP 配置、发送重试等细节
  • 期望:接口调用简单,一行代码搞定发送;异步执行不影响业务接口性能
  • 关键细节:邮件和短信发送都是异步的,接口立即返回一个日志 ID,实际发送在后台进行。发送结果可以通过日志接口查询

2.3 用户故事

编号用户故事优先级验收标准
US-01作为管理员,我希望配置邮件账号,以便系统能够发送邮件P0① 填写 SMTP 配置后保存成功 ② 测试发送能收到邮件 ③ 密码加密存储,编辑时脱敏显示
US-02作为管理员,我希望管理邮件模板,以便统一邮件内容格式P0① 模板编码全局唯一 ② 支持 ${变量} 插值 ③ 模板可启用/禁用
US-03作为运营,我希望通过模板发送邮件,以便高效触达用户P0① 指定模板编码 + 收件人 + 变量值即可发送 ② 支持抄送/密送 ③ 发送结果可在日志中查看
US-04作为管理员,我希望查看邮件发送日志,以便追踪发送结果P1① 展示发送状态(发送中/成功/失败)② 失败时显示失败原因 ③ 支持按模板、状态、时间筛选
US-05作为管理员,我希望配置短信渠道,以便系统能够发送短信P0① 支持阿里云/腾讯云/云片等主流服务商 ② API 密钥加密存储 ③ 渠道编码全局唯一
US-06作为管理员,我希望管理短信模板,以便统一短信内容格式P0① 模板关联短信渠道 ② 支持同步渠道方审核状态 ③ 模板可启用/禁用
US-07作为管理员,我希望查看短信发送日志与回调,以便追踪发送结果P1① 展示发送状态和渠道返回消息 ② 回调记录展示原始 JSON 数据 ③ 支持按手机号、渠道筛选
US-08作为管理员,我希望管理通知模板,以便统一站内信内容格式P0① 模板按类型分类(系统/业务/活动)② 支持变量插值 ③ 编码全局唯一
US-09作为管理员,我希望发送和管理站内信,以便精准触达用户P0① 指定模板 + 用户列表即可发送 ② 可查看消息发送记录和已读状态
US-10作为管理员,我希望发布系统公告,以便向全员传达重要信息P1① 支持富文本编辑 ② 支持置顶和有效期 ③ 草稿/发布/下线状态管理
US-11作为用户,我希望查看站内信列表和详情,以便了解系统通知P0① 按类型分类展示 ② 未读消息高亮 ③ 查看详情自动标记已读
US-12作为用户,我希望标记消息已读/未读,以便管理我的消息P0① 支持单条/批量/全部标记已读 ② 未读数实时更新 ③ 已读不可恢复为未读
US-13作为用户,我希望查看系统公告,以便了解平台动态P1① 仅展示已发布且在有效期内的公告 ② 置顶公告优先显示 ③ 支持富文本渲染
US-14作为用户,我希望设置通知偏好,以便控制接收的通知类型和方式P2① 按消息类型分别设置 ② 可选站内信/邮件/短信 ③ 安全通知不可关闭

三、功能需求

3.1 后台管理端

3.1.1 功能清单

功能优先级权限标识说明
邮箱账号管理P0system:mail-account:*配置 SMTP 发件邮箱
邮件模板管理P0system:mail-template:*管理邮件模板(CRUD + 发送测试)
邮件发送日志P1system:mail-log:query查看邮件发送记录
短信渠道管理P0system:sms-channel:*配置短信服务商渠道
短信模板管理P0system:sms-template:*管理短信模板(CRUD + 同步审核状态)
短信发送日志P1system:sms-log:query查看短信发送记录
短信回调记录P1system:sms-log:query查看短信回调日志
通知模板管理P0system:notify-template:*管理站内信通知模板
通知消息管理P0system:notify-message:query发送和管理站内信消息
系统公告管理P1system:notice:*发布和管理系统公告

3.1.2 邮箱账号管理

页面描述:

邮箱账号管理列表页

  • 列表页:展示已配置的邮箱账号,支持搜索、新增、编辑、删除、批量删除
  • 新增/编辑弹窗:表单包含邮箱地址、SMTP 服务器、端口、用户名、密码、SSL 配置
  • 支持"测试发送"按钮验证配置是否正确

业务规则:

规则编号规则描述为什么这样设计
R-01同一邮箱地址不可重复配置防止同一账号被多次配置导致发送混乱
R-02SMTP 服务器地址与端口必填没有这两项无法建立邮件连接
R-03密码加密存储,编辑时回显为 ****** 脱敏防止密码泄露,即使管理员也看不到原始密码
R-04支持 SSL/TLS 加密传输现代邮件服务商普遍要求加密连接
R-05删除账号前检查是否有关联的邮件模板,有则阻止删除并提示防止模板失去发件账号导致发送失败
R-06提供精简列表接口(仅返回 ID + 邮箱地址),用于模板选择下拉框下拉框不需要完整信息,精简数据减少传输量

数据字段:

字段名类型必填说明
mailString邮箱地址
usernameStringSMTP 用户名
passwordStringSMTP 密码(加密存储)
hostStringSMTP 服务器域名,如 smtp.qq.com
portIntegerSMTP 端口,如 465(SSL)或 587(STARTTLS)
sslEnableBoolean是否开启 SSL 加密
starttlsEnableBoolean是否开启 STARTTLS 加密

接口设计:

接口名称请求方式接口路径权限标识说明
创建邮箱账号POST/admin-api/system/mail-account/createsystem:mail-account:create创建邮箱账号
修改邮箱账号PUT/admin-api/system/mail-account/updatesystem:mail-account:update修改邮箱账号
删除邮箱账号DELETE/admin-api/system/mail-account/deletesystem:mail-account:delete删除单个邮箱账号
批量删除邮箱账号DELETE/admin-api/system/mail-account/delete-listsystem:mail-account:delete批量删除
获取邮箱账号详情GET/admin-api/system/mail-account/getsystem:mail-account:query获取详情
获取邮箱账号分页GET/admin-api/system/mail-account/pagesystem:mail-account:query分页查询
获取邮箱账号精简列表GET/admin-api/system/mail-account/list-all-simple无需权限下拉选择用

分页查询请求参数:

参数名类型必填说明
mailString邮箱地址(模糊匹配)
usernameString用户名(模糊匹配)
pageNoInteger页码(从 1 开始)
pageSizeInteger每页条数(默认 10)

返回结果(邮箱账号详情):

字段名类型说明
idLong账号 ID
mailString邮箱地址
usernameString用户名
passwordString密码(脱敏为 ******
hostStringSMTP 服务器域名
portIntegerSMTP 端口
sslEnableBoolean是否开启 SSL
createTimeDateTime创建时间

3.1.3 邮件模板管理

页面描述:

邮件模板管理列表页

  • 列表页:展示所有邮件模板,支持按名称/编码/状态搜索
  • 新增/编辑弹窗:模板名称、编码、关联邮箱账号(下拉选择)、发送人昵称、标题、内容(富文本)、状态
  • 模板内容支持 ${变量名} 插值,如 ${username}${verifyCode}
  • 操作列提供"发送"按钮,弹出发送对话框输入收件人和变量值

业务规则:

规则编号规则描述为什么这样设计
R-01模板编码(code)全局唯一编码是业务代码调用模板的唯一标识,不能重复
R-02模板标题和内容支持 ${xxx} 格式变量发送时自动替换为实际值,实现"一套模板,千人千面"
R-03模板必须关联一个邮箱账号每个模板需要指定"从哪个邮箱发出"
R-04模板支持启用/禁用,发送时校验必须为启用状态禁用的模板不允许发送,防止使用过期内容
R-05精简列表仅返回启用状态的模板下拉选择时不需要展示已禁用的模板

数据字段:

字段名类型必填说明
nameString模板名称,如"注册验证邮件"
codeString模板编码(唯一标识),如 user_register
accountIdLong关联的邮箱账号 ID
nicknameString发送人昵称,显示在收件人邮箱中的"发件人名称"
titleString邮件标题(支持变量),如 欢迎注册,${username}!
contentString邮件正文(支持变量,富文本 HTML)
paramsString[]模板参数名列表,自动从标题和内容中提取
statusInteger状态(0-开启、1-关闭)
remarkString备注

接口设计:

接口名称请求方式接口路径权限标识说明
创建邮件模板POST/admin-api/system/mail-template/createsystem:mail-template:create创建模板
修改邮件模板PUT/admin-api/system/mail-template/updatesystem:mail-template:update修改模板
删除邮件模板DELETE/admin-api/system/mail-template/deletesystem:mail-template:delete删除模板
批量删除邮件模板DELETE/admin-api/system/mail-template/delete-listsystem:mail-template:delete批量删除
获取邮件模板详情GET/admin-api/system/mail-template/getsystem:mail-template:query获取详情
获取邮件模板分页GET/admin-api/system/mail-template/pagesystem:mail-template:query分页查询
获取邮件模板精简列表GET/admin-api/system/mail-template/list-all-simple无需权限启用模板下拉
发送邮件POST/admin-api/system/mail-template/send-mailsystem:mail-template:send通过模板发送

发送邮件请求参数:

参数名类型必填说明
templateCodeString模板编码
toMailsString[]收件人邮箱列表
ccMailsString[]抄送邮箱列表
bccMailsString[]密送邮箱列表
templateParamsMap模板变量参数,如 {"username": "张三", "code": "1234"}

返回结果:

字段名类型说明
dataLong邮件日志 ID(可用于后续查询发送结果)

3.1.4 邮件发送日志

页面描述:

邮件发送日志页面

  • 列表页:展示邮件发送记录,支持按收件人、模板、状态、时间筛选
  • 详情页:展示完整发送信息(收件人、标题、内容、发送结果、失败原因)

业务规则:

规则编号规则描述为什么这样设计
R-01每次发送邮件自动生成一条日志记录确保每封邮件的发送过程可追溯
R-02日志记录发送状态(发送中 → 成功/失败)和失败原因方便排查发送失败的原因
R-03日志只读,不支持修改或删除日志是事实记录,不可篡改
R-04发送状态异步更新:创建时为"发送中",发送完成后更新为"成功"或"失败"发送是异步过程,状态需要延迟更新

数据字段:

字段名类型说明
userIdLong触发发送的用户 ID
userTypeInteger用户类型
toMailString接收邮箱地址
accountIdLong发送邮箱账号 ID
fromMailString发送邮箱地址(冗余存储,防止账号删除后丢失)
templateIdLong模板 ID
templateCodeString模板编码(冗余存储)
templateNicknameString发送人昵称
templateTitleString邮件标题(变量已替换)
templateContentString邮件内容(变量已替换)
templateParamsMap模板参数(JSON 格式)
sendStatusInteger发送状态(0-发送中、10-成功、20-失败)
sendMessageString发送消息(失败时记录失败原因)
sendTimeDateTime发送完成时间
retryCountInteger重试次数

接口设计:

接口名称请求方式接口路径权限标识说明
获取邮件日志分页GET/admin-api/system/mail-log/pagesystem:mail-log:query分页查询
获取邮件日志详情GET/admin-api/system/mail-log/getsystem:mail-log:query获取详情

分页查询请求参数:

参数名类型必填说明
userIdLong用户 ID
userTypeInteger用户类型
toMailString接收邮箱(模糊匹配)
accountIdLong发送邮箱账号 ID
templateIdLong模板 ID
sendStatusInteger发送状态
sendTimeDateTime[]发送时间范围
pageNoInteger页码
pageSizeInteger每页条数

3.1.5 短信渠道管理

页面描述:

短信渠道管理列表页

  • 列表页:展示已配置的短信渠道
  • 新增/编辑弹窗:渠道名称、渠道编码、短信签名、API 地址、API 凭证(AccessKeyId/Secret)、回调配置

业务规则:

规则编号规则描述为什么这样设计
R-01渠道编码(code)全局唯一编码是路由到对应服务商的唯一标识,如 aliyuntencentyunpian
R-02API 密钥加密存储,查看时脱敏显示保护服务商凭证安全,防止泄露
R-03每个租户可配置多个渠道不同租户可能使用不同的短信服务商
R-04发送短信时根据渠道编码路由到对应服务商的发送实现统一发送入口,内部根据编码选择具体的 SDK 调用方式
R-05支持配置回调地址和回调解密密钥服务商异步通知发送结果时,需要验证回调来源的合法性

数据字段:

字段名类型必填说明
signatureString短信签名,如"PMForge",发送时显示在短信开头
codeString渠道编码,如 aliyuntencentyunpian
nameString渠道名称,如"阿里云"、"腾讯云"
urlString渠道 API 地址(部分服务商需要自定义)
apiKeyStringAPI 账号 ID(如 AccessKeyId)
apiSecretStringAPI 密钥(如 AccessKeySecret)
callbackUrlString回调地址(服务商发送结果通知的目标 URL)
callbackApiKeyString回调解密密钥(用于解密回调内容)

接口设计:

接口名称请求方式接口路径权限标识说明
创建短信渠道POST/admin-api/system/sms-channel/createsystem:sms-channel:create创建渠道
修改短信渠道PUT/admin-api/system/sms-channel/updatesystem:sms-channel:update修改渠道
删除短信渠道DELETE/admin-api/system/sms-channel/deletesystem:sms-channel:delete删除渠道
获取短信渠道详情GET/admin-api/system/sms-channel/getsystem:sms-channel:query获取详情
获取短信渠道分页GET/admin-api/system/sms-channel/pagesystem:sms-channel:query分页查询
获取短信渠道精简列表GET/admin-api/system/sms-channel/simple-list无需权限下拉选择用

3.1.6 短信模板管理

页面描述:

短信模板管理列表页

  • 列表页:展示所有短信模板,支持按名称/编码/类型/渠道/状态搜索
  • "同步"按钮:一键从服务商拉取所有模板的最新审核状态
  • 新增/编辑弹窗:模板名称、编码、类型、关联渠道、渠道方模板编号、短信内容、状态

业务规则:

规则编号规则描述为什么这样设计
R-01模板编码全局唯一业务代码通过编码调用模板
R-02模板内容支持 ${变量} 格式${code} 替换为实际验证码
R-03模板必须关联短信渠道,并填写渠道方的模板编号(apiTemplateId)发送时需要用渠道方的编号调用服务商 API
R-04支持"同步"操作,批量从服务商拉取模板审核状态省去手动去服务商后台逐个查看审核结果的麻烦
R-05审核状态:审核中 → 审核通过/审核失败只有审核通过的模板才能实际发送短信
R-06精简列表仅返回启用且审核通过的模板未通过审核的模板不能用于发送

数据字段:

字段名类型必填说明
typeInteger短信类型(1-验证码、2-通知、3-营销、4-国际)
statusInteger开启状态(0-开启、1-关闭)
codeString模板编码(唯一标识)
nameString模板名称
contentString模板内容,如 您的验证码是${code},5分钟内有效。
paramsString[]参数名数组,如 ["code"]
remarkString备注
apiTemplateIdString服务商侧的模板编号(如阿里云的 SMS_123456)
channelIdLong关联的短信渠道 ID
channelCodeString关联的短信渠道编码(冗余存储)
auditStatusInteger审核状态(1-审核中、2-审核通过、3-审核失败)
auditReasonString审核原因/失败原因

接口设计:

接口名称请求方式接口路径权限标识说明
创建短信模板POST/admin-api/system/sms-template/createsystem:sms-template:create创建模板
修改短信模板PUT/admin-api/system/sms-template/updatesystem:sms-template:update修改模板
删除短信模板DELETE/admin-api/system/sms-template/deletesystem:sms-template:delete删除模板
获取短信模板详情GET/admin-api/system/sms-template/getsystem:sms-template:query获取详情
获取短信模板分页GET/admin-api/system/sms-template/pagesystem:sms-template:query分页查询
获取短信模板精简列表GET/admin-api/system/sms-template/simple-list无需权限启用+审核通过
同步短信模板POST/admin-api/system/sms-template/syncsystem:sms-template:sync同步审核状态

同步返回结果:

字段名类型说明
syncCountInteger本次同步的模板数量
updateCountInteger审核状态发生变化的数量

3.1.7 短信发送日志

页面描述:

短信发送日志页面

  • 列表页:展示短信发送记录,支持按手机号、渠道、模板、状态、时间筛选
  • 详情页:展示完整发送信息,包括渠道返回的消息 ID

业务规则:

规则编号规则描述为什么这样设计
R-01每次发送短信自动生成日志确保每条短信可追溯
R-02记录发送状态和失败原因方便排查发送失败原因,如余额不足、手机号格式错误等
R-03记录渠道方返回的 apiMessageId用于与服务商侧的记录对账,以及接收回调时关联
R-04日志只读,不可修改或删除日志是事实记录

数据字段:

字段名类型说明
mobileString接收手机号
userIdLong触发发送的用户 ID
userTypeInteger用户类型
channelIdLong短信渠道 ID
channelCodeString短信渠道编码
templateIdLong模板 ID
templateCodeString模板编码
templateTypeInteger短信类型
templateContentString短信内容(变量已替换)
templateParamsMap模板参数
apiTemplateIdString渠道方模板编号
apiMessageIdString渠道返回的消息 ID
apiRequestIdString渠道返回的请求 ID
sendStatusInteger发送状态(0-初始化、10-发送成功、20-发送失败、30-不发送)
sendMessageString发送消息(失败原因)
sendTimeDateTime发送时间
retryCountInteger重试次数

接口设计:

接口名称请求方式接口路径权限标识说明
获取短信日志分页GET/admin-api/system/sms-log/pagesystem:sms-log:query分页查询
获取短信日志详情GET/admin-api/system/sms-log/getsystem:sms-log:query获取详情

3.1.8 短信回调记录

页面描述:

  • 列表页:展示短信服务商的回调记录,支持按渠道、手机号、状态筛选
  • 详情页:展示回调的原始 JSON 数据,用于排查问题

业务规则:

规则编号规则描述为什么这样设计
R-01服务商回调时自动创建回调记录保留回调原始数据,便于问题排查和对账
R-02记录回调原始请求体(JSON 格式)不同服务商的回调格式不同,保存原始数据最保险
R-03根据回调结果自动更新对应短信日志的发送状态有些服务商是"先返回已接收,再异步回调实际结果",需要根据回调更新最终状态
R-04回调记录只读回调数据是服务商推送的事实记录

数据字段:

字段名类型说明
smsLogIdLong关联的短信日志 ID
channelIdLong短信渠道 ID
channelCodeString短信渠道编码
mobileString手机号
statusInteger接收状态(0-接收成功、1-接收失败)
errorCodeString错误码
errorMessageString错误信息
apiMessageIdString渠道消息 ID(用于关联短信日志)
serialNoString短信序号
requestBodyString回调请求体(原始 JSON)

接口设计:

接口名称请求方式接口路径权限标识说明
获取短信回调分页GET/admin-api/system/sms-log/callback/pagesystem:sms-log:query分页查询

3.1.9 通知模板管理

页面描述:

通知模板管理页面

  • 列表页:展示所有通知模板,按类型分类展示
  • 新增/编辑弹窗:模板名称、编码、类型(系统通知/业务通知/活动通知)、发送人名称、内容、状态

业务规则:

规则编号规则描述为什么这样设计
R-01模板编码全局唯一业务代码通过编码调用模板
R-02模板内容支持 ${xxx} 变量插值发送时自动替换为实际值
R-03模板按类型分类:系统通知、业务通知、活动通知用户可按类型设置通知偏好(如关闭活动通知)
R-04发送站内信时需指定模板编码和接收用户列表站内信是"点对点"发送,必须明确接收人

数据字段:

字段名类型必填说明
nameString模板名称
codeString模板编码(唯一标识)
nicknameString发送人名称,显示在站内信中的"发送者"
typeInteger模板类型(1-系统通知、2-业务通知、3-活动通知)
contentString模板内容(支持变量)
paramsString[]参数名数组
statusInteger状态(0-开启、1-关闭)
remarkString备注

接口设计:

接口名称请求方式接口路径权限标识说明
创建通知模板POST/admin-api/system/notify-template/createsystem:notify-template:create创建模板
修改通知模板PUT/admin-api/system/notify-template/updatesystem:notify-template:update修改模板
删除通知模板DELETE/admin-api/system/notify-template/deletesystem:notify-template:delete删除模板
获取通知模板详情GET/admin-api/system/notify-template/getsystem:notify-template:query获取详情
获取通知模板分页GET/admin-api/system/notify-template/pagesystem:notify-template:query分页查询
获取通知模板精简列表GET/admin-api/system/notify-template/simple-list无需权限启用模板下拉
发送通知POST/admin-api/system/notify-template/send-notifysystem:notify-template:send通过模板发送

发送通知请求参数:

参数名类型必填说明
userIdsLong[]接收用户 ID 列表
templateCodeString模板编码
templateParamsMap模板变量参数

3.1.10 通知消息管理

页面描述:

通知消息管理页面

  • 列表页:展示已发送的站内信消息,支持按用户、类型、已读状态、时间筛选
  • 管理员可查看消息详情,但不可修改或删除已发送的消息

业务规则:

规则编号规则描述为什么这样设计
R-01每条消息需指定接收用户站内信是点对点发送,一人一条独立记录
R-02消息支持已读/未读状态追踪方便管理员了解消息触达情况
R-03消息关联模板,记录模板参数快照保留发送时的完整信息,即使模板后续修改也不影响历史记录
R-04已发送的消息不可修改或删除消息是已发生的事实,不可篡改

数据字段:

字段名类型必填说明
userIdLong接收用户 ID
typeInteger消息类型(1-系统通知、2-业务通知、3-活动通知)
templateIdLong模板 ID
templateCodeString模板编码
templateNicknameString发送人名称
templateContentString消息内容(变量已替换)
templateParamsMap模板参数快照
readStatusBoolean是否已读
readTimeDateTime阅读时间

接口设计:

接口名称请求方式接口路径权限标识说明
获取通知消息分页GET/admin-api/system/notify-message/pagesystem:notify-message:query分页查询
获取通知消息详情GET/admin-api/system/notify-message/getsystem:notify-message:query获取详情
更新消息已读状态PUT/admin-api/system/notify-message/update-readsystem:notify-message:update管理员标记已读

3.1.11 系统公告管理

页面描述:

系统公告管理列表页

  • 列表页:展示所有公告,支持按标题/类型/状态搜索
  • 新增/编辑弹窗:标题、类型、内容(富文本编辑器)、状态、置顶、有效期

公告状态流转:

公告状态机

业务规则:

规则编号规则描述为什么这样设计
R-01公告内容支持富文本编辑系统公告通常需要格式化排版(加粗、列表、链接等)
R-02公告类型:系统公告、安全公告、活动公告、版本更新分类展示,方便用户按类型筛选
R-03支持置顶功能重要公告(如升级维护)需要优先展示
R-04支持设置有效期(开始时间 ~ 结束时间)过期公告自动对用户不可见,保持公告列表的时效性
R-05只有"已发布"且在有效期内的公告在前台可见草稿和已下线的公告不应被用户看到

数据字段:

字段名类型必填说明
titleString公告标题
typeInteger公告类型(1-系统公告、2-安全公告、3-活动公告、4-版本更新)
contentString公告内容(富文本 HTML)
statusInteger发布状态(0-草稿、1-已发布、2-已下线)
topBoolean是否置顶
startTimeDateTime有效期开始时间
endTimeDateTime有效期结束时间
remarkString备注

接口设计:

接口名称请求方式接口路径权限标识说明
创建系统公告POST/admin-api/system/notice/createsystem:notice:create创建公告
修改系统公告PUT/admin-api/system/notice/updatesystem:notice:update修改公告
删除系统公告DELETE/admin-api/system/notice/deletesystem:notice:delete删除公告
获取系统公告详情GET/admin-api/system/notice/getsystem:notice:query获取详情
获取系统公告分页GET/admin-api/system/notice/pagesystem:notice:query分页查询

3.2 前台用户端

3.2.1 功能清单

功能优先级说明
站内信消息列表P0查看个人通知消息列表,按类型分类
消息详情P0查看单条消息完整内容,自动标记已读
已读/未读标记P0单条/批量/全部标记已读
未读消息数P0顶部导航栏实时显示未读消息数
系统公告列表P1查看已发布的系统公告
系统公告详情P1查看公告完整内容
消息设置P2设置通知偏好(接收类型和方式)

3.2.2 站内信消息列表

页面描述:

消息中心页面

  • 左侧分类导航:全部消息 / 系统通知 / 业务通知 / 活动通知
  • 右侧消息列表:每条展示摘要、发送时间、已读/未读标记
  • 未读消息用圆点标记 + 字体加粗高亮
  • 顶部"全部已读"按钮

业务规则:

规则编号规则描述为什么这样设计
R-01仅展示当前登录用户的消息用户只能看到发给自己的消息,数据隔离
R-02默认按创建时间倒序排列最新消息在最前面
R-03未读消息字体加粗/高亮显示让用户一眼区分已读和未读
R-04进入消息列表时不自动标记已读用户可能只是浏览列表,不代表已阅读内容
R-05支持分页加载(默认每页 20 条)消息量可能很大,分页加载提升性能

接口设计:

接口名称请求方式接口路径说明
获取我的消息分页GET/app-api/system/notify-message/page当前用户消息列表
获取未读消息数GET/app-api/system/notify-message/get-unread-count未读消息数量

请求参数(分页查询):

参数名类型必填说明
typeInteger消息类型(1-系统通知、2-业务通知、3-活动通知)
readStatusBoolean是否已读
pageNoInteger页码
pageSizeInteger每页条数(默认 20)

3.2.3 消息详情

页面描述:

  • 展示消息完整内容:发送人、发送时间、消息类型、消息正文
  • 查看消息详情时自动标记为已读

业务规则:

规则编号规则描述为什么这样设计
R-01查看详情自动标记已读并记录阅读时间用户点进来说明已经看到了,自动标记减少操作步骤
R-02只能查看自己的消息防止用户通过修改 ID 查看他人消息
R-03已读消息重复查看不改变已读状态和阅读时间保留首次阅读时间更有意义

接口设计:

接口名称请求方式接口路径说明
获取消息详情GET/app-api/system/notify-message/get查看详情(自动标记已读)

3.2.4 已读/未读标记

页面描述:

  • 消息列表中每条未读消息右侧有"标记已读"按钮
  • 支持勾选多条消息批量标记已读
  • 顶部"全部已读"按钮一键标记所有消息

业务规则:

规则编号规则描述为什么这样设计
R-01支持单条标记已读用户逐条阅读时逐条标记
R-02支持批量标记已读用户想快速清理多条未读消息
R-03支持全部标记已读一键清理所有未读,最便捷
R-04已读消息不可恢复为未读已读状态是单向的,符合常理
R-05标记操作实时生效,未读计数立即更新用户期望看到实时的未读数变化

接口设计:

接口名称请求方式接口路径说明
标记单条消息已读PUT/app-api/system/notify-message/update-read标记单条
批量标记消息已读PUT/app-api/system/notify-message/batch-update-read批量标记
全部标记已读PUT/app-api/system/notify-message/update-all-read全部标记

3.2.5 系统公告列表

页面描述:

  • 公告列表页面,展示已发布的系统公告
  • 置顶公告带"置顶"标签,优先展示
  • 每条公告展示:标题、类型标签、发布时间

业务规则:

规则编号规则描述为什么这样设计
R-01仅展示"已发布"状态的公告草稿和下线的公告不应被用户看到
R-02仅展示在有效期内的公告过期公告自动隐藏,保持列表时效性
R-03置顶公告优先展示重要公告需要最显眼的位置
R-04排序规则:置顶优先 → 发布时间倒序先重要后时效

接口设计:

接口名称请求方式接口路径说明
获取公告列表GET/app-api/system/notice/page当前有效公告列表

请求参数:

参数名类型必填说明
typeInteger公告类型
pageNoInteger页码
pageSizeInteger每页条数

3.2.6 系统公告详情

页面描述:

  • 公告详情页,展示标题、类型、发布时间、完整富文本内容

业务规则:

规则编号规则描述为什么这样设计
R-01仅展示已发布且在有效期内的公告防止通过直接访问 URL 查看非公开公告
R-02公告内容支持富文本渲染公告内容需要格式化排版

接口设计:

接口名称请求方式接口路径说明
获取公告详情GET/app-api/system/notice/get公告详情

3.2.7 消息设置(通知偏好)

页面描述:

通知偏好设置

  • 按消息类型分行展示,每行可选择接收方式(站内信/邮件/短信)
  • 邮件和短信选项需要用户已绑定邮箱/手机号后才可开启

业务规则:

规则编号规则描述为什么这样设计
R-01默认所有通知类型均开启站内信接收站内信是成本最低、最基础的通知方式
R-02用户可关闭特定类型的通知尊重用户意愿,减少打扰
R-03邮件和短信通知需用户已绑定邮箱/手机号才可开启没有联系方式就无法发送
R-04系统级安全通知不可关闭保护用户账号安全,如密码修改、异地登录等必须通知到
R-05偏好设置修改后实时生效下次消息触发时立即按新偏好执行

接口设计:

接口名称请求方式接口路径说明
获取我的通知偏好GET/app-api/system/notify-preference/get获取当前用户偏好
更新通知偏好PUT/app-api/system/notify-preference/update更新偏好设置

更新请求参数:

参数名类型必填说明
typeInteger消息类型(1-系统通知、2-业务通知、3-活动通知)
enableSiteBoolean是否接收站内信
enableEmailBoolean是否接收邮件
enableSmsBoolean是否接收短信

四、非功能需求

4.1 性能要求

指标要求说明
邮件发送接口响应时间< 2s接口异步发送,立即返回日志 ID
短信发送接口响应时间< 1s接口异步发送,立即返回日志 ID
站内信发送接口响应时间< 500ms站内信直接写库,无外部依赖
站内信列表查询响应时间< 500ms含未读状态标记
未读消息数查询响应时间< 200ms高频调用,需要快速响应
公告列表查询响应时间< 500ms含有效期过滤和置顶排序
短信回调处理响应时间< 200ms回调接口需快速响应,避免服务商重试
批量发送站内信< 5s(1000 个用户)批量发送采用异步队列处理

4.2 安全要求

要求说明实现方式
传输加密全站 HTTPSNginx 配置 SSL 证书
敏感信息加密邮箱密码、API 密钥加密存储使用 AES 对称加密,密钥通过配置中心管理
敏感信息脱敏日志中密码、API 密钥、手机号脱敏密码显示 ******,手机号显示 138****1234
权限控制后台接口按权限标识控制RBAC 权限模型,每个接口绑定权限标识
数据隔离前台用户只能查看自己的消息查询条件强制注入当前用户 ID
防重放发送接口做幂等处理相同参数短时间内不重复发送
限流保护短信/邮件发送接口限流同一用户每分钟最多发送 N 条(可配置)
回调验证短信回调验证来源合法性校验回调 IP 白名单 + 签名验证

4.3 兼容性要求

要求
PC 浏览器Chrome 80+、Firefox 75+、Safari 13+、Edge 80+
移动端浏览器iOS Safari 12+、Android Chrome 80+
微信内置浏览器支持
小程序微信基础库 2.0+

4.4 可用性要求

指标要求说明
消息发送服务可用性99.9%月度可用性不低于 99.9%
故障恢复时间< 30 分钟消息服务故障后 30 分钟内恢复
消息发送失败重试最多 3 次自动重试邮件/短信发送失败后自动重试
短信渠道故障支持切换备用渠道主渠道不可用时自动或手动切换备用渠道

五、数据设计

5.1 数据模型

5.1.1 邮箱账号表(system_mail_account)

字段名类型约束说明
idBIGINTPK, AUTO_INCREMENT编号
mailVARCHAR(255)NOT NULL邮箱地址
usernameVARCHAR(255)NOT NULLSMTP 用户名
passwordVARCHAR(255)NOT NULLSMTP 密码(AES 加密)
hostVARCHAR(255)NOT NULLSMTP 服务器域名
portINTNOT NULLSMTP 端口
ssl_enableBITNOT NULL, DEFAULT 0是否开启 SSL
starttls_enableBITDEFAULT 0是否开启 STARTTLS
tenant_idBIGINTNOT NULL租户编号
creatorVARCHAR(64)-创建者
create_timeDATETIMENOT NULL创建时间
updaterVARCHAR(64)-更新者
update_timeDATETIMENOT NULL更新时间
deletedBIT(1)NOT NULL, DEFAULT 0删除标记

索引设计:

索引名字段类型说明
uk_mailmailUNIQUE邮箱地址唯一索引
idx_tenanttenant_idNORMAL租户查询

5.1.2 邮件模板表(system_mail_template)

字段名类型约束说明
idBIGINTPK, AUTO_INCREMENT编号
nameVARCHAR(255)NOT NULL模板名称
codeVARCHAR(64)NOT NULL模板编码(唯一标识)
account_idBIGINTNOT NULL关联邮箱账号 ID
nicknameVARCHAR(255)-发送人昵称
titleVARCHAR(255)NOT NULL模板标题
contentTEXTNOT NULL模板内容(富文本)
paramsVARCHAR(255)-参数数组(JSON)
statusTINYINTNOT NULL, DEFAULT 0状态(0-开启、1-关闭)
remarkVARCHAR(255)-备注
tenant_idBIGINTNOT NULL租户编号
creator / create_time / updater / update_time / deleted--公共字段

索引设计:

索引名字段类型说明
uk_codecodeUNIQUE模板编码唯一索引
idx_account_idaccount_idNORMAL按关联账号查询

5.1.3 邮件日志表(system_mail_log)

字段名类型约束说明
idBIGINTPK, AUTO_INCREMENT编号
user_idBIGINT-用户 ID
user_typeTINYINT-用户类型
to_mailVARCHAR(255)NOT NULL接收邮箱
account_idBIGINT-发送账号 ID
from_mailVARCHAR(255)-发送邮箱(冗余)
template_idBIGINT-模板 ID
template_codeVARCHAR(64)-模板编码(冗余)
template_nicknameVARCHAR(255)-发送人昵称
template_titleVARCHAR(255)-邮件标题
template_contentTEXT-邮件内容
template_paramsVARCHAR(1024)-模板参数(JSON)
send_statusTINYINTNOT NULL, DEFAULT 0发送状态
send_messageVARCHAR(2048)-发送消息/失败原因
send_timeDATETIME-发送时间
retry_countINTDEFAULT 0重试次数
tenant_idBIGINTNOT NULL租户编号
creator / create_time / updater / update_time / deleted--公共字段

索引设计:

索引名字段类型说明
idx_to_mailto_mailNORMAL按收件人查询
idx_templatetemplate_idNORMAL按模板查询
idx_send_statussend_statusNORMAL按状态筛选
idx_create_timecreate_timeNORMAL按时间范围查询

5.1.4 短信渠道表(system_sms_channel)

字段名类型约束说明
idBIGINTPK, AUTO_INCREMENT编号
signatureVARCHAR(128)NOT NULL短信签名
codeVARCHAR(64)NOT NULL渠道编码
nameVARCHAR(128)NOT NULL渠道名称
urlVARCHAR(1024)-渠道 API 地址
api_keyVARCHAR(255)NOT NULLAPI 账号 ID(加密)
api_secretVARCHAR(255)-API 密钥(加密)
callback_urlVARCHAR(1024)-回调地址
callback_api_keyVARCHAR(255)-回调解密密钥(加密)
tenant_idBIGINTNOT NULL租户编号
creator / create_time / updater / update_time / deleted--公共字段

索引设计:

索引名字段类型说明
uk_codecodeUNIQUE渠道编码唯一索引

5.1.5 短信模板表(system_sms_template)

字段名类型约束说明
idBIGINTPK, AUTO_INCREMENT编号
typeTINYINTNOT NULL短信类型(1-验证码、2-通知、3-营销、4-国际)
statusTINYINTNOT NULL, DEFAULT 0开启状态
codeVARCHAR(64)NOT NULL模板编码
nameVARCHAR(255)NOT NULL模板名称
contentVARCHAR(2048)NOT NULL模板内容
paramsVARCHAR(255)-参数数组(JSON)
remarkVARCHAR(255)-备注
api_template_idVARCHAR(128)-渠道方模板编号
channel_idBIGINTNOT NULL渠道 ID
channel_codeVARCHAR(64)NOT NULL渠道编码(冗余)
audit_statusTINYINT-审核状态(1-审核中、2-通过、3-失败)
audit_reasonVARCHAR(255)-审核原因
tenant_idBIGINTNOT NULL租户编号
creator / create_time / updater / update_time / deleted--公共字段

索引设计:

索引名字段类型说明
uk_codecodeUNIQUE模板编码唯一索引
idx_channelchannel_idNORMAL按渠道查询
idx_audit_statusaudit_statusNORMAL按审核状态筛选

5.1.6 短信日志表(system_sms_log)

字段名类型约束说明
idBIGINTPK, AUTO_INCREMENT编号
mobileVARCHAR(20)NOT NULL接收手机号
user_idBIGINT-用户 ID
user_typeTINYINT-用户类型
channel_idBIGINT-渠道 ID
channel_codeVARCHAR(64)-渠道编码
template_idBIGINT-模板 ID
template_codeVARCHAR(64)-模板编码
template_typeTINYINT-短信类型
template_contentVARCHAR(2048)-短信内容
template_paramsVARCHAR(1024)-模板参数(JSON)
api_template_idVARCHAR(128)-渠道方模板编号
api_message_idVARCHAR(255)-渠道返回消息 ID
api_request_idVARCHAR(255)-渠道返回请求 ID
send_statusTINYINTNOT NULL, DEFAULT 0发送状态
send_messageVARCHAR(2048)-发送消息/失败原因
send_timeDATETIME-发送时间
retry_countINTDEFAULT 0重试次数
tenant_idBIGINTNOT NULL租户编号
creator / create_time / updater / update_time / deleted--公共字段

索引设计:

索引名字段类型说明
idx_mobilemobileNORMAL按手机号查询
idx_channelchannel_idNORMAL按渠道查询
idx_templatetemplate_idNORMAL按模板查询
idx_send_statussend_statusNORMAL按状态筛选
idx_create_timecreate_timeNORMAL按时间范围查询

5.1.7 短信回调表(system_sms_callback)

字段名类型约束说明
idBIGINTPK, AUTO_INCREMENT编号
sms_log_idBIGINT-短信日志 ID
channel_idBIGINT-渠道 ID
channel_codeVARCHAR(64)-渠道编码
mobileVARCHAR(20)-手机号
statusTINYINT-接收状态(0-成功、1-失败)
error_codeVARCHAR(128)-错误码
error_messageVARCHAR(2048)-错误信息
api_message_idVARCHAR(255)-渠道消息 ID
serial_noVARCHAR(255)-短信序号
request_bodyTEXT-回调请求体(JSON)
tenant_idBIGINTNOT NULL租户编号
creator / create_time / updater / update_time / deleted--公共字段

索引设计:

索引名字段类型说明
idx_sms_logsms_log_idNORMAL按日志 ID 关联查询
idx_api_messageapi_message_idNORMAL按渠道消息 ID 查询

5.1.8 通知模板表(system_notify_template)

字段名类型约束说明
idBIGINTPK, AUTO_INCREMENT编号
nameVARCHAR(255)NOT NULL模板名称
codeVARCHAR(64)NOT NULL模板编码
nicknameVARCHAR(255)-发送人名称
typeTINYINTNOT NULL模板类型(1-系统、2-业务、3-活动)
contentTEXTNOT NULL模板内容
paramsVARCHAR(255)-参数数组(JSON)
statusTINYINTNOT NULL, DEFAULT 0状态
remarkVARCHAR(255)-备注
tenant_idBIGINTNOT NULL租户编号
creator / create_time / updater / update_time / deleted--公共字段

索引设计:

索引名字段类型说明
uk_codecodeUNIQUE模板编码唯一索引
idx_typetypeNORMAL按类型查询

5.1.9 通知消息表(system_notify_message)

字段名类型约束说明
idBIGINTPK, AUTO_INCREMENT编号
user_idBIGINTNOT NULL接收用户 ID
typeTINYINTNOT NULL消息类型
template_idBIGINTNOT NULL模板 ID
template_codeVARCHAR(64)NOT NULL模板编码
template_nicknameVARCHAR(255)-发送人名称
template_contentTEXTNOT NULL消息内容
template_paramsVARCHAR(1024)-模板参数(JSON)
read_statusBITNOT NULL, DEFAULT 0是否已读
read_timeDATETIME-阅读时间
tenant_idBIGINTNOT NULL租户编号
creator / create_time / updater / update_time / deleted--公共字段

索引设计:

索引名字段类型说明
idx_user_readuser_id, read_statusNORMAL按用户 + 已读状态查询(核心查询场景)
idx_user_typeuser_id, typeNORMAL按用户 + 消息类型查询
idx_create_timecreate_timeNORMAL按时间范围查询

5.1.10 系统公告表(system_notice)

字段名类型约束说明
idBIGINTPK, AUTO_INCREMENT编号
titleVARCHAR(255)NOT NULL公告标题
typeTINYINTNOT NULL公告类型(1-系统、2-安全、3-活动、4-版本更新)
contentTEXTNOT NULL公告内容(富文本)
statusTINYINTNOT NULL, DEFAULT 0发布状态(0-草稿、1-已发布、2-已下线)
topBITNOT NULL, DEFAULT 0是否置顶
start_timeDATETIME-有效期开始时间
end_timeDATETIME-有效期结束时间
remarkVARCHAR(255)-备注
tenant_idBIGINTNOT NULL租户编号
creator / create_time / updater / update_time / deleted--公共字段

索引设计:

索引名字段类型说明
idx_status_timestatus, start_time, end_timeNORMAL按状态 + 有效期查询(前台核心查询)
idx_typetypeNORMAL按类型筛选

5.1.11 通知偏好表(system_notify_preference)

字段名类型约束说明
idBIGINTPK, AUTO_INCREMENT编号
user_idBIGINTNOT NULL用户 ID
typeTINYINTNOT NULL消息类型
enable_siteBITNOT NULL, DEFAULT 1是否接收站内信
enable_emailBITNOT NULL, DEFAULT 0是否接收邮件
enable_smsBITNOT NULL, DEFAULT 0是否接收短信
tenant_idBIGINTNOT NULL租户编号
creator / create_time / updater / update_time / deleted--公共字段

索引设计:

索引名字段类型说明
uk_user_typeuser_id, typeUNIQUE同一用户同一类型只有一条偏好记录

5.2 数据字典

字典类型编码字典名称字典数据项
system_sms_type短信类型1-验证码、2-通知、3-营销、4-国际
system_sms_channel_code短信渠道编码aliyun-阿里云、tencent-腾讯云、yunpian-云片
system_sms_audit_status短信模板审核状态1-审核中、2-审核通过、3-审核失败
system_sms_send_status短信发送状态0-初始化、10-发送成功、20-发送失败、30-不发送
system_sms_callback_status短信回调状态0-接收成功、1-接收失败
system_mail_send_status邮件发送状态0-发送中、10-成功、20-失败
system_notify_template_type通知模板类型1-系统通知、2-业务通知、3-活动通知
system_notify_message_type通知消息类型1-系统通知、2-业务通知、3-活动通知
system_notice_type公告类型1-系统公告、2-安全公告、3-活动公告、4-版本更新
system_notice_status公告状态0-草稿、1-已发布、2-已下线

六、跨模块联动

6.1 联动关系总览

消息通知作为基础通信模块,与以下模块存在数据或业务联动:

关联模块联动方式数据流向触发场景
用户管理读取用户信息用户管理 → 消息通知发送消息时需要查询用户邮箱、手机号
认证授权触发验证消息认证授权 → 消息通知注册验证码、登录验证码、密码重置邮件
租户管理租户隔离租户管理 → 消息通知每个租户独立配置渠道和模板
数据字典读取字典数据数据字典 → 消息通知短信类型、发送状态等枚举值翻译
日志审计记录操作日志消息通知 → 日志审计渠道配置、模板管理、公告发布等操作
工作流审批通知工作流 → 消息通知审批待办通知、审批结果通知
支付支付通知支付 → 消息通知支付成功通知、退款通知
商城订单通知商城 → 消息通知订单状态变更通知、发货通知
会员会员消息会员 → 消息通知积分变动通知、等级变更通知
前端全局未读消息角标消息通知 → 前端顶部导航栏未读消息数实时更新

6.2 关键联动流程

6.2.1 认证验证码发送流程

用户请求发送验证码
    → 认证模块校验手机号/邮箱格式
    → 调用消息通知模块的短信/邮件发送接口
    → 消息通知模块查找对应模板 → 渲染变量 → 异步发送
    → 生成日志记录
    → 返回日志 ID 给认证模块
    → 认证模块将验证码存入 Redis(有效期 5 分钟)

6.2.2 工作流审批通知流程

工作流发起审批
    → 工作流模块确定审批人
    → 查询审批人的通知偏好
    → 按偏好渠道调用消息通知模块发送通知
    → 站内信:直接写入通知消息表
    → 邮件:调用邮件模板发送
    → 短信:调用短信模板发送
    → 审批人收到通知 → 点击进入审批页面

6.2.3 通知偏好生效流程

业务模块触发消息发送
    → 查询接收用户的通知偏好(system_notify_preference)
    → 如果用户未设置偏好,使用默认值(站内信开启、邮件/短信关闭)
    → 按用户开启的渠道分别发送
    → 如果用户关闭了某渠道,跳过该渠道发送
    → 安全类通知不受偏好设置影响,始终发送

6.3 数据一致性要求

场景一致性要求实现方式
用户邮箱/手机号变更发送时使用最新信息发送前实时查询用户信息,不使用缓存
模板被禁用禁用后不可发送发送时校验模板状态,禁用则拒绝发送
渠道被删除关联模板不可发送删除前检查关联模板,有则阻止删除
通知偏好变更变更后立即生效发送前实时查询偏好,不使用缓存
公告过期过期后用户不可见查询时过滤有效期条件

七、附录

7.1 名词解释

术语解释类比
SMTP简单邮件传输协议(Simple Mail Transfer Protocol),发送邮件时使用的通信协议就像寄信需要遵循邮政系统的规则,SMTP 就是发送邮件的"邮政规则"
SSL/TLS安全传输层协议,用于加密邮件/数据传输就像挂号信比普通信件更安全,SSL 给数据传输加了"保险箱"
短信渠道短信服务商的接入通道,如阿里云短信、腾讯云短信就像快递公司,你可以选择不同的快递公司来寄包裹
短信签名短信开头显示的公司/产品名称,如"【PMForge】"就像信封上的寄件人名称,让收件人知道是谁发的
模板变量模板中的占位符,用 ${变量名} 格式表示,发送时替换为实际值就像合同模板中的"____"空白处,签署时填入具体内容
模板编码模板的唯一标识符,业务代码通过编码调用模板就像员工的工号,通过工号就能找到对应的人
回调(Callback)服务商异步通知发送结果的接口调用就像快递送达后快递员给你打电话通知,回调就是服务商的"送达通知"
站内信系统内部的消息通知,用户登录后在系统内查看就像公司内部的 OA 消息,只有登录系统才能看到
审核状态短信模板在服务商侧的审核结果,审核通过后才能发送就像广告发布前需要工商局审批,短信模板也需要服务商审核
通知偏好用户设置的各类通知接收偏好,控制哪些消息通过什么方式接收就像手机的通知设置,你可以选择关闭某些 App 的推送
富文本支持格式化(加粗、斜体、列表、图片等)的文本内容就像 Word 文档可以设置字体颜色大小,而纯文本只能写白开水文字
异步发送发送操作在后台执行,接口立即返回结果,不用等待发送完成就像在餐厅点餐后服务员立即去下单,你不用站在厨房等菜做好
幂等同一操作执行多次和执行一次的效果相同就像电梯的"关门"按钮,按一次和按多次效果一样
租户隔离不同租户的数据互相隔离,各自独立配置渠道和模板就像同一栋写字楼里的不同公司,各有各自的门禁卡和办公室

7.2 接口汇总

模块接口数量核心接口
邮箱账号7创建/修改/删除/详情/分页/精简列表
邮件模板8创建/修改/删除/详情/分页/精简列表/发送邮件
邮件日志2分页/详情
短信渠道6创建/修改/删除/详情/分页/精简列表
短信模板7创建/修改/删除/详情/分页/精简列表/同步
短信日志2分页/详情
短信回调1分页
通知模板7创建/修改/删除/详情/分页/精简列表/发送通知
通知消息(后台)3分页/详情/更新已读
系统公告(后台)5创建/修改/删除/详情/分页
通知消息(前台)5分页/详情/未读数/单条已读/批量已读/全部已读
系统公告(前台)2列表/详情
通知偏好2获取/更新
合计57

7.3 变更记录

版本日期修改内容修改人
v1.02026-09-12初始版本PM Team
v2.02026-09-19全面增强:补充业务场景人物画像、验收标准、ASCII 页面原型、业务规则增加设计原因说明、新增跨模块联动章节、新增名词解释PM Team

本文档为消息通知模块 PRD v2.0,如有问题请联系产品负责人。