Modules

系统模块

Tagtag Starter 系统模块文档,包括系统配置、字典管理和日志管理等功能。

系统模块是 Tagtag Starter 框架的基础模块之一,提供系统配置、数据字典、操作日志等基础功能支持。

1. 字典管理 (Dict)

字典管理用于动态管理系统范围内的常量和枚举值,减少前端硬编码,提高系统的灵活性和可维护性。

1.1 数据模型

1.1.1 字典类型 (DictType)

属性:

  • 类型编码 (type_code): 唯一标识,如 sys_user_sex
  • 类型名称 (type_name): 显示名称,如 "用户性别"
  • 状态 (status): 启用/禁用
  • 描述 (description): 类型描述
  • 排序 (sort): 显示顺序
  • 创建时间 (create_time): 创建时间
  • 更新时间 (update_time): 更新时间

1.1.2 字典数据 (DictData)

属性:

  • 字典类型编码 (type_code): 关联字典类型
  • 数据值 (value): 字典值,如 1
  • 标签 (label): 显示标签,如 "男"
  • 状态 (status): 启用/禁用
  • 排序 (sort): 显示顺序
  • 描述 (description): 数据描述
  • 创建时间 (create_time): 创建时间
  • 更新时间 (update_time): 更新时间

1.2 核心功能

功能:

  • 字典类型的增删改查
  • 字典数据的增删改查
  • 字典缓存管理
  • 字典导入导出

实现细节:

1.2.1 字典缓存机制

  • 使用 Redis 缓存字典数据,提高读取性能
  • 支持缓存自动刷新
  • 字典更新时自动清除缓存
  • 缓存键格式: dict:{type_code}

缓存配置:

# 字典缓存配置
dict:
  cache:
    enabled: true
    expire: 3600 # 缓存过期时间(秒)

1.2.2 字典使用方式

前端最佳实践 (Frontend Best Practice):

使用 useDict 组合式函数,优雅地管理字典数据与响应式状态。

<script setup lang="ts">
// 优雅解构,支持多个字典同时获取
const { sys_user_sex, sys_notice_type } = useDict('sys_user_sex', 'sys_notice_type');
</script>

<template>
  <!-- 直接绑定 options -->
  <Select v-model="form.sex" :options="sys_user_sex" />
</template>

后端最佳实践 (Backend Best Practice):

后端通过契约层 (Contract Layer) 提供的接口来获取字典数据,实现模块间的解耦。

  1. 定义契约接口: 在 tagtag-contract-system 中定义 DictApi 接口。
public interface DictApi {
    /**
     * 根据字典类型获取数据列表
     */
    List<DictItemDTO> getDictData(String typeCode);

    /**
     * 获取字典标签(翻译)
     */
    String getDictLabel(String typeCode, String itemValue);
}
  1. 注入并使用: 在其他模块(如 User 模块)中注入 DictApi,直接调用接口获取值。
@Service
@RequiredArgsConstructor
public class UserServiceImpl implements UserService {

    private final DictApi dictApi;

    public UserVO getUser(Long id) {
        User user = userMapper.selectById(id);
        UserVO vo = toVO(user);
        
        // 使用契约接口获取字典标签(仅需取值)
        vo.setSexLabel(dictApi.getDictLabel("sys_user_sex", user.getSex()));
        
        return vo;
    }
}

1.3 最佳实践

  • 命名规范: 字典类型编码使用 {模块}_{功能}_{字段} 格式,如 sys_user_sex
  • 缓存管理: 定期清理过期字典缓存
  • 数据维护: 定期审核字典数据,及时清理无用数据
  • 权限控制: 严格控制字典管理权限,避免误操作

2. 消息管理 (Message)

消息管理用于系统内的消息通知,支持多种消息类型和发送方式。

2.1 数据模型

2.1.1 消息模板 (MessageTemplate)

属性:

  • 模板编码 (template_code): 唯一标识
  • 模板名称 (template_name): 模板名称
  • 模板类型 (template_type): 消息类型,如短信、邮件、站内信
  • 模板内容 (content): 消息模板内容,支持变量替换
  • 状态 (status): 启用/禁用
  • 描述 (description): 模板描述

2.1.2 消息记录 (MessageRecord)

属性:

  • 消息类型 (type): 消息类型
  • 发送人 (sender_id): 发送人ID
  • 接收人 (receiver_id): 接收人ID
  • 消息标题 (title): 消息标题
  • 消息内容 (content): 消息内容
  • 发送状态 (send_status): 发送状态,如待发送、已发送、发送失败
  • 阅读状态 (read_status): 阅读状态,如未读、已读
  • 发送时间 (send_time): 发送时间
  • 阅读时间 (read_time): 阅读时间

2.2 核心功能

功能:

  • 消息模板管理
  • 消息发送
  • 消息接收
  • 消息阅读
  • 消息统计

实现细节:

2.2.1 消息发送机制

  • 同步发送: 即时发送消息
  • 异步发送: 通过消息队列异步发送,提高系统性能
  • 定时发送: 支持定时发送消息

消息发送流程:

  1. 构建消息对象
  2. 根据消息类型选择发送方式
  3. 发送消息
  4. 记录消息发送状态
  5. 通知接收人

2.2.2 消息接收方式

  • 站内信: 系统内消息通知
  • 邮件: 邮件通知
  • 短信: 短信通知
  • Webhook: 第三方系统通知

2.2.3 消息使用方式

发送消息:

// 注入消息服务
@Autowired
private MessageService messageService;

// 发送消息
MessageDTO messageDTO = new MessageDTO();
messageDTO.setTemplateCode("sys_user_register");
messageDTO.setReceiverId(userId);
messageDTO.setVariables(Collections.singletonMap("username", username));
messageService.send(messageDTO);

接收消息:

// 获取未读消息数量
import { useMessage } from '@/hooks/useMessage';

const { unreadCount, getUnreadCount } = useMessage();

// 获取消息列表
const messageList = await messageService.getMessageList({ page: 1, size: 10 });

2.3 最佳实践

  • 模板设计: 合理设计消息模板,支持变量替换
  • 消息分类: 根据业务需求分类管理消息
  • 权限控制: 严格控制消息发送权限
  • 性能优化: 批量发送消息,避免频繁调用
  • 消息清理: 定期清理过期消息,释放存储空间

3. 操作日志 (Operation Logs)

记录关键的用户操作行为,用于审计和追踪。

3.1 数据模型

属性:

  • 操作人 (user_id): 操作人ID
  • 操作人姓名 (username): 操作人姓名
  • 模块名称 (module): 操作模块
  • 操作方法 (method): 操作方法
  • 操作类型 (type): 操作类型,如新增、修改、删除
  • 操作IP (ip): 操作IP地址
  • 操作时间 (create_time): 操作时间
  • 执行结果 (status): 执行结果,成功/失败
  • 错误信息 (error_msg): 错误信息(如果失败)
  • 耗时 (cost_time): 执行耗时(毫秒)
  • 请求参数 (params): 请求参数
  • 返回结果 (result): 返回结果

3.2 核心功能

功能:

  • 操作日志自动记录
  • 操作日志查询
  • 操作日志导出
  • 操作日志分析

实现细节:

3.2.1 日志记录机制

  • 使用 @OperationLog 注解自动捕获操作日志
  • 支持自定义日志内容
  • 支持排除特定方法

使用方式:

@OperationLog(module = "用户管理", name = "新增用户", type = OperationType.ADD)
@PostMapping
public Result<Void> addUser(@RequestBody @Validated UserDTO userDTO) {
    // 新增用户逻辑
}

3.2.2 日志查询

  • 支持按时间范围查询
  • 支持按模块查询
  • 支持按用户查询
  • 支持按操作类型查询
  • 支持按执行结果查询

3.3 最佳实践

  • 日志级别: 只记录关键操作,避免日志过多
  • 日志内容: 记录足够的上下文信息,便于问题追踪
  • 性能优化: 异步记录日志,避免影响主业务流程
  • 日志保存: 合理设置日志保存期限,定期归档

4. 系统配置 (Config)

管理系统运行时的动态参数,提高系统的灵活性和可配置性。

4.1 数据模型

属性:

  • 配置键 (config_key): 唯一标识
  • 配置值 (config_value): 配置值
  • 配置名称 (config_name): 配置名称
  • 配置类型 (config_type): 配置类型,如字符串、数字、布尔值、枚举
  • 状态 (status): 启用/禁用
  • 描述 (description): 配置描述
  • 排序 (sort): 显示顺序

4.2 核心功能

功能:

  • 配置项的增删改查
  • 配置项分组管理
  • 配置项导入导出
  • 配置项缓存管理

实现细节:

4.2.1 配置缓存机制

  • 使用 Redis 缓存配置数据
  • 配置更新时自动刷新缓存
  • 支持配置热加载

使用方式:

// 获取配置值
ConfigService configService = SpringContextHolder.getBean(ConfigService.class);
String siteTitle = configService.getConfigValue("site_title");

// 或使用注解
@Value("${config.site_title}")
private String siteTitle;

4.3 最佳实践

  • 命名规范: 配置键使用 {模块}_{功能} 格式,如 site_title
  • 默认值: 为配置项设置合理的默认值
  • 类型检查: 严格验证配置值的类型
  • 权限控制: 严格控制配置管理权限

5. 文件存储 (Storage)

提供统一的文件上传和管理能力,支持多种存储模式。

5.1 支持模式

  • 本地存储: 文件保存在服务器磁盘
  • 对象存储 (OSS): 集成阿里云、腾讯云、MinIO 等

5.2 核心功能

功能:

  • 文件上传
  • 文件下载
  • 文件预览
  • 文件删除
  • 文件管理

实现细节:

5.2.1 本地存储配置

# 本地存储配置
storage:
  type: local
  local:
    base-path: uploads
    domain: http://localhost:8080

5.2.2 对象存储配置

# MinIO 配置
storage:
  type: minio
  minio:
    endpoint: http://minio:9000
    access-key: minioadmin
    secret-key: minioadmin
    bucket-name: tagtag
    domain: http://minio:9000

5.2.3 文件使用方式

上传文件:

// 注入存储服务
@Autowired
private StorageService storageService;

// 上传文件
MultipartFile file = request.getFile("file");
StorageResult result = storageService.upload(file, "image/");

下载文件:

// 下载文件
String fileId = request.getParameter("fileId");
storageService.download(fileId, response);

5.3 最佳实践

  • 文件命名: 使用唯一标识符命名文件,避免文件名冲突
  • 文件类型: 限制允许上传的文件类型
  • 文件大小: 设置合理的文件大小限制
  • 安全措施: 对上传文件进行病毒扫描
  • 备份策略: 定期备份重要文件

6. 核心代码结构

6.1 后端代码结构

tagtag-module-system
└── src
    └── main
        ├── java
        │   └── dev
        │       └── tagtag
        │           └── module
        │               └── system
        │                   ├── controller
        │                   │   ├── DictController.java
        │                   │   ├── MessageController.java
        │                   │   ├── OperationLogController.java
        │                   │   └── StorageController.java
        │                   ├── entity
        │                   │   ├── DictType.java
        │                   │   ├── DictData.java
        │                   │   ├── MessageTemplate.java
        │                   │   ├── MessageRecord.java
        │                   │   └── OperationLog.java
        │                   ├── mapper
        │                   │   ├── DictMapper.java
        │                   │   ├── MessageMapper.java
        │                   │   └── OperationLogMapper.java
        │                   ├── service
        │                   │   ├── DictService.java
        │                   │   ├── MessageService.java
        │                   │   ├── OperationLogService.java
        │                   │   └── StorageService.java
        │                   └── util
        │                       └── StorageUtil.java
        └── resources
            ├── db
            │   ├── schema.sql
            │   └── data
            │       ├── 01_sys_message.sql
            │       ├── 02_sys_message_menu.sql
            │       └── 03_sys_dict_menu.sql
            └── mapper
                └── system
                    ├── DictMapper.xml
                    ├── MessageMapper.xml
                    └── OperationLogMapper.xml

6.2 前端代码结构

frontend/apps/tagtag/src/views/modules/system
├── dict
│   ├── data.ts
│   └── index.vue
├── message
│   ├── data.ts
│   └── index.vue
├── log
│   ├── data.ts
│   └── index.vue
└── storage
    ├── file
    │   ├── data.ts
    │   └── index.vue
    └── config
        ├── data.ts
        └── index.vue

7. 前端实现

前端相关代码位于 frontend/apps/tagtag/src/views/modules/system

功能页面路径描述
字典管理/system/dict字典类型和数据的维护
消息管理/system/message消息模板和记录的管理
操作日志/system/log日志查询与详情查看
文件管理/storage/file文件上传与列表管理
存储配置/storage/config存储服务配置

8. API 参考

方法端点描述
GET/dict/types获取字典类型列表
GET/dict/data/{type}根据类型获取字典数据
POST/dict/types创建字典类型
PUT/dict/types更新字典类型
DELETE/dict/types删除字典类型
POST/dict/data创建字典数据
PUT/dict/data更新字典数据
DELETE/dict/data删除字典数据
GET/messages获取消息列表
POST/messages发送消息
PUT/messages/read标记消息为已读
DELETE/messages删除消息
GET/logs分页查询操作日志
POST/storage/upload上传文件
GET/storage/download/{fileId}下载文件
GET/storage/preview/{fileId}预览文件
DELETE/storage/{fileId}删除文件

9. 最佳实践

9.1 系统设计

  • 模块化设计: 各功能模块独立,便于扩展和维护
  • 可配置性: 核心参数支持动态配置
  • 高性能: 使用缓存提高系统性能
  • 高可用性: 关键功能支持容错处理

9.2 开发规范

  • 命名规范: 统一的命名规范,提高代码可读性
  • 注释规范: 完善的代码注释,便于后续维护
  • 测试规范: 为核心功能编写单元测试
  • 文档规范: 完善的接口文档和使用文档

9.3 部署建议

  • 环境隔离: 开发、测试、生产环境隔离
  • 配置隔离: 不同环境使用不同的配置文件
  • 监控告警: 配置完善的监控和告警机制
  • 备份策略: 定期备份数据和配置

10. 扩展建议

10.1 支持多租户

为系统模块添加多租户支持,实现租户间数据隔离。

10.2 增强消息功能

  • 支持更多消息类型,如推送通知
  • 支持消息模板变量验证
  • 支持消息发送失败重试机制

10.3 增强日志功能

  • 支持日志实时分析
  • 支持日志可视化展示
  • 支持日志告警

10.4 增强存储功能

  • 支持文件版本管理
  • 支持文件分享
  • 支持文件加密
  • 支持断点续传

11. 总结

系统模块是 Tagtag Starter 系统的核心模块之一,负责管理全局配置、字典数据、消息管理、日志监控以及文件存储服务。

通过系统模块,管理员可以方便地管理系统配置、维护字典数据、发送消息通知、查看操作日志以及管理文件存储。同时,系统模块提供了完善的 API 接口,便于其他模块调用。

系统模块的设计和实现遵循了模块化、可扩展的原则,便于后续功能扩展和定制化开发。