# Message 消息服务模块
Message 模块是 DarkM 框架的消息通知模块,提供了完整的消息发送和管理功能。支持消息模板、定时发送、消息日志、访问统计等功能,满足企业各种消息通知需求。
# 📋 模块概述
| 属性 | 说明 |
|---|---|
| 模块名称 | Message(消息服务) |
| 模块类型 | 业务模块 |
| 依赖关系 | 依赖 Admin 模块、Common 模块、Quartz 模块 |
| 必需性 | 可选(消息通知必需) |
| Git 仓库 | framework/darkm/darkm (opens new window) |
# 🎯 核心功能
# 功能清单
| 功能分类 | 功能 | 说明 | 重要性 |
|---|---|---|---|
| 消息配置 | 消息配置 | 消息发送配置 | ⭐⭐⭐⭐⭐ |
| 发送处理器配置 | 发送处理器配置 | ⭐⭐⭐⭐ | |
| 消息模板 | 消息模板管理 | ⭐⭐⭐⭐⭐ | |
| 消息发送 | 消息发送 | 消息发送处理 | ⭐⭐⭐⭐⭐ |
| 发送记录 | 发送记录管理 | ⭐⭐⭐⭐ | |
| 消息队列 | 消息发送队列 | ⭐⭐⭐⭐ | |
| 定时任务 | 事件管理 | 定时事件管理 | ⭐⭐⭐⭐ |
| 事件周期 | 事件周期配置 | ⭐⭐⭐⭐ | |
| 用户协议 | 用户协议 | 用户协议管理 | ⭐⭐⭐ |
| 协议记录 | 协议同意记录 | ⭐⭐⭐ | |
| 统计日志 | 消息日志 | 消息发送日志 | ⭐⭐⭐⭐ |
| 访问统计 | 消息访问统计 | ⭐⭐⭐⭐ | |
| 信息公告 | 信息公告管理 | ⭐⭐⭐ |
# 📦 安装配置
# NuGet 包安装
Install-Package DarkM.Module.Message.Web -Version 1.0.0
1
# NPM 包安装
npm i -S darkm-module-message
1
# 配置文件
{
"Db": {
"Modules": [
{
"Name": "Message",
"Database": "Nm_Message",
"Prefix": ""
}
]
},
"Message": {
// 是否开启消息服务
"Enable": true,
// 默认发送渠道
"DefaultChannel": "SMS",
// 消息保留天数
"LogKeepDays": 90
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
配置说明:
| 配置项 | 说明 | 默认值 |
|---|---|---|
Enable | 是否开启消息服务 | true |
DefaultChannel | 默认发送渠道(SMS/Email/WeChat) | SMS |
LogKeepDays | 消息日志保留天数 | 90 |
# 🗄️ 数据库表结构
# 消息配置表
| 表名 | 说明 | 主键 |
|---|---|---|
MessageConfig | 消息配置表 | Id (long) |
MessageTemplate | 消息模板表 | Id (long) |
SendProcessorConfig | 发送处理器配置表 | Id (long) |
# 消息发送表
| 表名 | 说明 | 主键 |
|---|---|---|
SendMessage | 发送消息表 | Id (long) |
SendMessageRecord | 发送记录表 | Id (long) |
MessageLog | 消息日志表 | Id (long) |
MessageSendQueue | 消息发送队列表 | Id (long) |
# 定时任务表
| 表名 | 说明 | 主键 |
|---|---|---|
Events | 事件表 | Id (long) |
EventsCycle | 事件周期表 | Id (long) |
# 用户协议表
| 表名 | 说明 | 主键 |
|---|---|---|
UserAgreement | 用户协议表 | Id (long) |
UserAgreementRecord | 用户协议记录表 | Id (long) |
# 统计表
| 表名 | 说明 | 主键 |
|---|---|---|
MessageVisitTimes | 消息访问统计表 | Id (long) |
Information | 信息公告表 | Id (long) |
# 🔐 权限系统设计
# Controller 定义
# 1. 消息配置管理
[Description("消息配置管理")]
public class MessageConfigController : ModuleController
{
private readonly IMessageConfigService _service;
public MessageConfigController(IMessageConfigService service)
{
_service = service;
}
[HttpGet]
[Description("查询")]
public Task<IResultModel> Query([FromQuery]MessageConfigQueryModel model)
{
return _service.Query(model);
}
[HttpPost]
[Description("添加")]
public Task<IResultModel> Add(MessageConfigAddModel model)
{
return _service.Add(model);
}
[HttpDelete]
[Description("删除")]
public Task<IResultModel> Delete([BindRequired]long id)
{
return _service.Delete(id);
}
[HttpGet]
[Description("编辑")]
public Task<IResultModel> Edit([BindRequired]long id)
{
return _service.Edit(id);
}
[HttpPost]
[Description("修改")]
public Task<IResultModel> Update(MessageConfigUpdateModel model)
{
return _service.Update(model);
}
}
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# 2. 消息模板管理
[Description("消息模板管理")]
public class MessageTemplateController : ModuleController
{
private readonly IMessageTemplateService _service;
public MessageTemplateController(IMessageTemplateService service)
{
_service = service;
}
[HttpGet]
[Description("查询")]
public Task<IResultModel> Query([FromQuery]MessageTemplateQueryModel model)
{
return _service.Query(model);
}
[HttpPost]
[Description("添加")]
public Task<IResultModel> Add(MessageTemplateAddModel model)
{
return _service.Add(model);
}
[HttpGet]
[Description("编辑")]
public Task<IResultModel> Edit([BindRequired]long id)
{
return _service.Edit(id);
}
[HttpPost]
[Description("修改")]
public Task<IResultModel> Update(MessageTemplateUpdateModel model)
{
return _service.Update(model);
}
}
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
32
33
34
35
36
37
38
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
32
33
34
35
36
37
38
# 权限解析结果
| 权限编码 | 说明 | 访问级别 |
|---|---|---|
message_messageconfig_query_get | 消息配置 - 查询 | 需授权 |
message_messageconfig_add_post | 消息配置 - 添加 | 需授权 |
message_messageconfig_edit_get | 消息配置 - 编辑 | 需授权 |
message_messageconfig_update_post | 消息配置 - 修改 | 需授权 |
message_messageconfig_delete_delete | 消息配置 - 删除 | 需授权 |
message_messagetemplate_query_get | 消息模板 - 查询 | 需授权 |
message_messagetemplate_add_post | 消息模板 - 添加 | 需授权 |
message_messagetemplate_update_post | 消息模板 - 修改 | 需授权 |
message_sendmessage_post | 发送消息 | 需授权 |
message_events_query_get | 事件管理 - 查询 | 需授权 |
# 🎨 核心功能详解
# 一、消息配置
# 1. 消息配置实体
[Table("MessageConfig")]
public partial class MessageConfigEntity : EntityBase
{
/// <summary>
/// 配置名称
/// </summary>
[Length(100)]
public string ConfigName { get; set; }
/// <summary>
/// 配置编码
/// </summary>
[Length(50)]
public string ConfigCode { get; set; }
/// <summary>
/// 发送渠道(SMS/Email/WeChat)
/// </summary>
[Length(20)]
public string Channel { get; set; }
/// <summary>
/// 配置内容(JSON 格式)
/// </summary>
[Length(2000)]
public string ConfigContent { get; set; }
/// <summary>
/// 是否启用
/// </summary>
public bool IsEnabled { get; set; }
}
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
32
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
32
# 二、消息模板
# 1. 模板实体
[Table("MessageTemplate")]
public partial class MessageTemplateEntity : EntityBase
{
/// <summary>
/// 模板名称
/// </summary>
[Length(100)]
public string TemplateName { get; set; }
/// <summary>
/// 模板编码
/// </summary>
[Length(50)]
public string TemplateCode { get; set; }
/// <summary>
/// 模板内容
/// </summary>
[Length(2000)]
public string TemplateContent { get; set; }
/// <summary>
/// 模板参数(JSON 格式)
/// </summary>
[Length(500)]
public string TemplateParams { get; set; }
/// <summary>
/// 发送渠道
/// </summary>
[Length(20)]
public string Channel { get; set; }
}
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
32
33
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
32
33
# 三、定时事件
# 1. 事件实体
[Table("Events")]
public partial class EventsEntity : EntityBase
{
/// <summary>
/// 事件名称
/// </summary>
[Length(100)]
public string EventName { get; set; }
/// <summary>
/// 事件编码
/// </summary>
[Length(50)]
public string EventCode { get; set; }
/// <summary>
/// 事件类型
/// </summary>
public EventType EventType { get; set; }
/// <summary>
/// 是否启用
/// </summary>
public bool IsEnabled { get; set; }
}
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 2. 事件周期实体
[Table("EventsCycle")]
public partial class EventsCycleEntity : EntityBase
{
/// <summary>
/// 事件 ID
/// </summary>
public long EventId { get; set; }
/// <summary>
/// 周期类型(Daily/Weekly/Monthly)
/// </summary>
[Length(20)]
public string CycleType { get; set; }
/// <summary>
/// 执行时间
/// </summary>
public DateTime ExecuteTime { get; set; }
/// <summary>
/// Cron 表达式
/// </summary>
[Length(100)]
public string CronExpression { get; set; }
}
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 🔧 核心服务接口
# IMessageConfigService(消息配置服务)
public interface IMessageConfigService
{
/// <summary>
/// 查询消息配置列表
/// </summary>
Task<IResultModel> Query(MessageConfigQueryModel model);
/// <summary>
/// 添加消息配置
/// </summary>
Task<IResultModel> Add(MessageConfigAddModel model);
/// <summary>
/// 删除消息配置
/// </summary>
Task<IResultModel> Delete(long id);
/// <summary>
/// 编辑消息配置
/// </summary>
Task<IResultModel> Edit(long id);
/// <summary>
/// 修改消息配置
/// </summary>
Task<IResultModel> Update(MessageConfigUpdateModel model);
/// <summary>
/// 获取消息配置
/// </summary>
Task<IResultModel> Get(string configCode);
}
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
32
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
32
# IMessageTemplateService(消息模板服务)
public interface IMessageTemplateService
{
/// <summary>
/// 查询消息模板列表
/// </summary>
Task<IResultModel> Query(MessageTemplateQueryModel model);
/// <summary>
/// 添加消息模板
/// </summary>
Task<IResultModel> Add(MessageTemplateAddModel model);
/// <summary>
/// 删除消息模板
/// </summary>
Task<IResultModel> Delete(long id);
/// <summary>
/// 编辑消息模板
/// </summary>
Task<IResultModel> Edit(long id);
/// <summary>
/// 修改消息模板
/// </summary>
Task<IResultModel> Update(MessageTemplateUpdateModel model);
/// <summary>
/// 获取消息模板
/// </summary>
Task<IResultModel> Get(string templateCode);
}
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
32
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
32
# IEventsService(事件服务)
public interface IEventsService
{
/// <summary>
/// 查询事件列表
/// </summary>
Task<IResultModel> Query(EventsQueryModel model);
/// <summary>
/// 添加事件
/// </summary>
Task<IResultModel> Add(EventsAddModel model);
/// <summary>
/// 删除事件
/// </summary>
Task<IResultModel> Delete(long id);
/// <summary>
/// 编辑事件
/// </summary>
Task<IResultModel> Edit(long id);
/// <summary>
/// 修改事件
/// </summary>
Task<IResultModel> Update(EventsUpdateModel model);
/// <summary>
/// 触发事件
/// </summary>
Task<IResultModel> Trigger(string eventCode);
}
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
32
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
32
# 🖥️ 前端组件说明
# NPM 包信息
{
"name": "darkm-module-message",
"version": "1.5.0-beta-2.0",
"code": "message",
"title": "消息服务",
"dependencies": {
"darkm-module-admin": "^1.5.0-beta-2.0",
"darkm-module-common": "^1.5.0-beta-2.0",
"darkm-module-quartz": "^1.5.0-beta-2.0",
"darkm-ui": "^1.5.0-beta-2.0"
}
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 组件目录结构
src/UI/module-message/
├── src/
│ ├── views/ # 页面组件
│ │ ├── messageConfig/ # 消息配置
│ │ ├── messageTemplate/ # 消息模板
│ │ ├── sendMessage/ # 消息发送
│ │ ├── events/ # 事件管理
│ │ ├── eventsCycle/ # 事件周期
│ │ └── userAgreement/ # 用户协议
│ └── components/ # 通用组件
│ ├── messageTemplate-select/ # 消息模板选择器
│ ├── messageTemplate-search-select/ # 消息模板搜索选择器
│ ├── sendProcessorConfig-select/ # 发送处理器选择器
│ └── config-message/ # 消息配置组件
└── package.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 📦 通用组件详解
# 1. MessageTemplateSelect 消息模板选择器
组件路径: components/messageTemplate-select
功能: 下拉选择消息模板
使用示例:
<template>
<messageTemplate-select
v-model="templateId"
:channel="channel"
/>
</template>
<script>
import { components } from 'darkm-module-message'
const { MessageTemplateSelect } = components
export default {
components: { MessageTemplateSelect },
data() {
return {
templateId: '',
channel: 'SMS'
}
}
}
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Props 参数:
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
value | Number | 否 | - | 选中的模板 ID(v-model) |
channel | String | 否 | - | 发送渠道筛选(SMS/Email/WeChat) |
disabled | Boolean | 否 | false | 是否禁用 |
Events 事件:
| 事件名 | 参数 | 说明 |
|---|---|---|
input | (value: Number) | 选中值变化时触发(v-model) |
change | (value: Number, data: Object) | 选中值变化时触发,返回完整数据 |
# 2. MessageTemplateSearchSelect 消息模板搜索选择器
组件路径: components/messageTemplate-search-select
功能: 弹窗式消息模板搜索选择
使用示例:
<template>
<messageTemplate-search-select
v-model="templateId"
:channel="channel"
@change="handleChange"
/>
</template>
<script>
import { components } from 'darkm-module-message'
const { MessageTemplateSearchSelect } = components
export default {
components: { MessageTemplateSearchSelect },
data() {
return {
templateId: '',
channel: 'SMS'
}
},
methods: {
handleChange(value, data) {
console.log('选中的模板:', data)
}
}
}
</script>
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
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
Props 参数:
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
value | Number | 否 | - | 选中的模板 ID(v-model) |
channel | String | 否 | - | 发送渠道筛选 |
disabled | Boolean | 否 | false | 是否禁用 |
Events 事件:
| 事件名 | 参数 | 说明 |
|---|---|---|
input | (value: Number) | 选中值变化时触发 |
change | (value: Number, data: Object) | 选中值变化时触发,返回完整数据 |
功能特点:
- ✅ 支持按渠道筛选
- ✅ 支持搜索模板名称和编码
- ✅ 弹窗式选择界面
- ✅ 显示模板预览
# 3. SendProcessorConfigSelect 发送处理器选择器
组件路径: components/sendProcessorConfig-select
功能: 下拉选择发送处理器配置
使用示例:
<template>
<sendProcessorConfig-select v-model="configId" />
</template>
<script>
import { components } from 'darkm-module-message'
const { SendProcessorConfigSelect } = components
export default {
components: { SendProcessorConfigSelect },
data() {
return {
configId: ''
}
}
}
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Props 参数:
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
value | Number | 否 | - | 选中的配置 ID(v-model) |
disabled | Boolean | 否 | false | 是否禁用 |
Events 事件:
| 事件名 | 参数 | 说明 |
|---|---|---|
input | (value: Number) | 选中值变化时触发(v-model) |
change | (value: Number, data: Object) | 选中值变化时触发,返回完整数据 |
# 📋 组件使用注意事项
# 1. 组件引入方式
// 方式一:引入单个组件
import { components } from 'darkm-module-message'
const { MessageTemplateSelect } = components
// 方式二:全局注册
import Message from 'darkm-module-message'
Vue.use(Message)
1
2
3
4
5
6
7
2
3
4
5
6
7
# 2. v-model 双向绑定
所有选择器组件都支持 v-model 双向绑定:
<!-- 推荐用法 -->
<messageTemplate-select v-model="templateId" />
<!-- 等价于 -->
<messageTemplate-select
:value="templateId"
@input="templateId = $event"
/>
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 3. 级联选择
多个选择器可以级联使用:
<template>
<div>
<messageConfig-select v-model="configId" />
<messageTemplate-select v-model="templateId" :channel="channel" />
<sendProcessorConfig-select v-model="processorId" />
</div>
</template>
1
2
3
4
5
6
7
2
3
4
5
6
7
# 4. 数据格式
所有组件返回的数据格式:
- 单选: 返回 ID(Number)
- change 事件: 返回
(value, data),data 为完整对象
# 5. 组件依赖
Message 模块依赖以下模块:
darkm-module-admin- 权限管理darkm-module-common- 通用模块darkm-module-quartz- 定时任务darkm-ui- UI 组件库
确保先安装依赖:
npm install darkm-module-admin --registry http://npm.woowis.com
npm install darkm-module-common --registry http://npm.woowis.com
npm install darkm-module-quartz --registry http://npm.woowis.com
npm install darkm-ui --registry http://npm.woowis.com
1
2
3
4
2
3
4
# 🔍 常见问题
# 1. 消息发送失败
问题: 调用发送接口报错
解决:
# 检查消息配置是否正确
# 检查发送渠道配置是否完整
# 检查模板参数是否匹配
# 查看详细错误日志
tail -f logs/message.log
1
2
3
4
5
6
2
3
4
5
6
# 2. 定时任务未执行
问题: 配置的定时事件未触发
解决:
- 检查 Quartz 模块是否正常运行
- 检查事件周期配置是否正确
- 检查 Cron 表达式是否有效
- 查看 Quartz 日志
# 3. 模板参数不匹配
问题: 发送消息时提示参数错误
解决:
- 检查模板参数定义
- 检查发送数据是否包含所有必填参数
- 检查参数类型是否匹配
- 查看模板预览功能
# 4. 消息日志未记录
问题: 发送消息后没有日志
解决:
# 检查日志配置
cat appsettings.json | grep Message
# 检查 MessageLog 表是否正常
# 检查日志保留天数配置
1
2
3
4
5
2
3
4
5
# 📚 相关文档
- Admin 权限管理 - 权限配置
- Quartz 任务调度 - 定时任务
- Common 通用模块 - 通用功能
- 系统架构 - 整体架构
# 🔗 参考链接
- 消息服务最佳实践 (opens new window)
- 短信服务 API (opens new window)
- 邮件服务 SMTP (opens new window)
- GitLab 仓库 (opens new window)
最后更新: 2026-03-20