系统模块是 Tagtag Starter 框架的基础模块之一,提供系统配置、数据字典、操作日志等基础功能支持。
字典管理用于动态管理系统范围内的常量和枚举值,减少前端硬编码,提高系统的灵活性和可维护性。
属性:
sys_user_sex属性:
1功能:
实现细节:
dict:{type_code}缓存配置:
# 字典缓存配置
dict:
cache:
enabled: true
expire: 3600 # 缓存过期时间(秒)
前端最佳实践 (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) 提供的接口来获取字典数据,实现模块间的解耦。
tagtag-contract-system 中定义 DictApi 接口。public interface DictApi {
/**
* 根据字典类型获取数据列表
*/
List<DictItemDTO> getDictData(String typeCode);
/**
* 获取字典标签(翻译)
*/
String getDictLabel(String typeCode, String itemValue);
}
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;
}
}
{模块}_{功能}_{字段} 格式,如 sys_user_sex消息管理用于系统内的消息通知,支持多种消息类型和发送方式。
属性:
属性:
功能:
实现细节:
消息发送流程:
发送消息:
// 注入消息服务
@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 });
记录关键的用户操作行为,用于审计和追踪。
属性:
功能:
实现细节:
@OperationLog 注解自动捕获操作日志使用方式:
@OperationLog(module = "用户管理", name = "新增用户", type = OperationType.ADD)
@PostMapping
public Result<Void> addUser(@RequestBody @Validated UserDTO userDTO) {
// 新增用户逻辑
}
管理系统运行时的动态参数,提高系统的灵活性和可配置性。
属性:
功能:
实现细节:
使用方式:
// 获取配置值
ConfigService configService = SpringContextHolder.getBean(ConfigService.class);
String siteTitle = configService.getConfigValue("site_title");
// 或使用注解
@Value("${config.site_title}")
private String siteTitle;
{模块}_{功能} 格式,如 site_title提供统一的文件上传和管理能力,支持多种存储模式。
功能:
实现细节:
# 本地存储配置
storage:
type: local
local:
base-path: uploads
domain: http://localhost:8080
# MinIO 配置
storage:
type: minio
minio:
endpoint: http://minio:9000
access-key: minioadmin
secret-key: minioadmin
bucket-name: tagtag
domain: http://minio:9000
上传文件:
// 注入存储服务
@Autowired
private StorageService storageService;
// 上传文件
MultipartFile file = request.getFile("file");
StorageResult result = storageService.upload(file, "image/");
下载文件:
// 下载文件
String fileId = request.getParameter("fileId");
storageService.download(fileId, response);
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
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
前端相关代码位于 frontend/apps/tagtag/src/views/modules/system。
| 功能 | 页面路径 | 描述 |
|---|---|---|
| 字典管理 | /system/dict | 字典类型和数据的维护 |
| 消息管理 | /system/message | 消息模板和记录的管理 |
| 操作日志 | /system/log | 日志查询与详情查看 |
| 文件管理 | /storage/file | 文件上传与列表管理 |
| 存储配置 | /storage/config | 存储服务配置 |
| 方法 | 端点 | 描述 |
|---|---|---|
| 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} | 删除文件 |
为系统模块添加多租户支持,实现租户间数据隔离。
系统模块是 Tagtag Starter 系统的核心模块之一,负责管理全局配置、字典数据、消息管理、日志监控以及文件存储服务。
通过系统模块,管理员可以方便地管理系统配置、维护字典数据、发送消息通知、查看操作日志以及管理文件存储。同时,系统模块提供了完善的 API 接口,便于其他模块调用。
系统模块的设计和实现遵循了模块化、可扩展的原则,便于后续功能扩展和定制化开发。