# xtools-app 项目设计文档
## 一、功能和用途
### 1.1 项目概述
- **项目名称**:xtools-app
- **项目版本**:1.0.0
- **父POM**:org.xujun:xtools-parent-cloud:5.0.0
- **项目定位**:基础应用平台,提供企业级应用开发的核心功能和公共模块,支持单体部署和微服务部署两种模式
- **组织**:org.xujun
#### 1.2 技术特点
- 采用最新的 **JDK 25** 版本,充分利用新特性(ScopedValue、虚拟线程、Record等)
- 基于 **Spring Boot 4.0.5** 构建,支持自动配置和快速开发
- 集成 **Spring Cloud 2025.1.1** 微服务框架
- 使用 **Spring Cloud Alibaba 2025.1.0.0** 微服务组件
- 使用 **MyBatis-Plus 3.5.16** 简化数据访问层开发(基于 MyBatis 4.0.1)
- 使用 **Spring Data Elasticsearch**(基于 Elasticsearch Client 9.2.6)实现日志存储和检索
- 支持 **Nacos 3.1.1** 服务注册与发现、配置中心
- 集成 **Sentinel 1.8.9** 实现流量控制和熔断降级
- 使用 **Spring Data Redis**(基于 Lettuce 6.8.2)实现分布式缓存
- 使用 **Spring AMQP 4.0.2**(RabbitMQ Client 5.27.1)实现异步消息处理
- 支持 **Knife4j 4.5.0**(基于 SpringDoc OpenAPI 3.0.3)自动生成 API 文档
- 使用 **Druid 1.2.28** 数据库连接池
- 使用 **SM2/SM3** 国密算法保障密码和数据安全
### 1.3 核心功能
```mermaid
graph TB
subgraph 系统管理模块
A1[用户管理
用户增删改查,角色分配,密码管理]
A2[角色管理
角色配置,权限分配,菜单分配]
A3[菜单管理
树形结构,动态加载,按钮权限]
A4[部门管理
树形结构,人员管理]
A5[字典管理
类型管理,字典项管理]
A6[日志管理
操作日志,登录日志,ES存储]
A7[通知管理
通知发布,用户通知,已读未读]
A8[任务管理
定时任务配置,任务监控]
A9[系统监控
服务器监控,JVM监控]
A10[JAR管理
JAR加载,JAR监控]
A11[文件管理
文件上传,S3存储]
A12[参数管理
系统参数配置]
A13[风控管理
IP限流,URI限流]
A14[地址管理
地址解析,IP归属]
end
subgraph 代码生成模块
B1[数据源管理
多数据源,连接测试]
B2[表结构管理
表查询,字段配置,同步]
B3[代码生成
参数配置,模板渲染,ZIP下载]
B4[代码预览
代码查看,多模板支持]
end
subgraph 公共模块
C1[缓存模块
Redis缓存,缓存枚举,AOP缓存]
C2[远程调用
OpenFeign,微服务通信]
C3[JAR管理
动态JAR加载,运行时扩展]
C4[日志总线
事件发布,MQ异步写入ES]
C5[日志过滤
请求拦截,操作日志采集]
C6[消息队列
RabbitMQ,异步处理,错误重试]
C7[任务调度
异步任务,定时任务,Redis分布式锁]
C8[限流模块
Sentinel集成,流量控制]
end
subgraph 监控模块
D1[监控服务端
Spring Boot Admin Server]
D2[监控客户端
Spring Boot Admin Client]
end
```
```mermaid
mindmap
root((xtools-app
基础应用平台))
系统管理
用户管理
增删改查
角色分配
密码管理
状态管理
角色管理
角色配置
权限分配
菜单分配
菜单管理
树形结构
动态加载
按钮权限
部门管理
树形结构
人员管理
字典管理
类型管理
字典项管理
日志管理
操作日志
ES存储检索
通知管理
通知发布
用户通知
文件管理
本地上传
S3存储
风控管理
IP限流
URI限流
代码生成
数据源管理
多数据源
连接测试
表结构管理
表同步
字段配置
代码生成
Velocity模板
ZIP下载
代码预览
多模板预览
公共模块
缓存管理
Redis缓存
缓存枚举
远程调用
OpenFeign
日志处理
日志总线
日志过滤
消息队列
RabbitMQ
任务调度
异步任务
定时任务
```
```mermaid
graph LR
User[用户] --> Login[登录认证]
User --> Menu[菜单访问]
User --> Data[数据操作]
Login --> Auth[认证授权]
Auth --> Token[Token管理]
Auth --> Redis[Redis缓存]
Menu --> Perm[权限验证]
Role[角色] --> Perm
Data --> LogFilter[日志过滤器]
LogFilter --> LogBus[日志总线]
LogBus --> MQ[RabbitMQ]
MQ --> LogMq[日志消费者]
LogMq --> ES[Elasticsearch]
Cache[Redis缓存] --> Data
Gen[代码生成] --> DB[数据库]
Gen --> Velocity[Velocity模板]
```
## 二、项目结构设计
### 2.1 整体架构
```mermaid
graph TD
xtools-app[xtools-app
基础应用平台
v1.0.0] --> common[xtools-app-common
公共模块]
xtools-app --> sys[xtools-app-sys
系统管理模块]
xtools-app --> gen[xtools-app-gen
代码生成模块]
xtools-app --> monitor[xtools-app-monitor
监控模块]
xtools-app --> standalone[xtools-app-standalone
单体部署模块]
common --> cache[common-cache
缓存模块]
common --> call[common-call
远程调用模块]
common --> jar[common-jar
JAR管理模块]
common --> job[common-job
任务调度模块]
common --> log[common-log
日志模块]
common --> mq[common-mq
消息队列模块]
common --> sentinel[common-sentinel
限流模块]
common --> task[common-task
异步任务模块]
log --> log-bus[log-bus
日志总线]
log --> log-filter[log-filter
日志过滤器]
sys --> sys-api[sys-api
系统API接口]
sys --> sys-auth[sys-auth
认证授权]
sys --> sys-biz[sys-biz
系统业务逻辑]
sys --> sys-boot[sys-boot
系统微服务启动]
sys --> sys-call[sys-call
系统远程调用]
sys --> sys-file[sys-file
文件管理]
sys --> sys-file-web[sys-file-web
文件Web服务]
sys --> sys-log-es[sys-log-bus-elasticsearch
日志ES存储]
sys --> sys-param[sys-param
系统参数]
sys --> sys-scheduled[sys-scheduled
定时任务]
sys --> sys-risk[sys-risk
风控管理]
gen --> gen-biz[gen-biz
代码生成业务]
gen --> gen-boot[gen-boot
代码生成微服务启动]
monitor --> monitor-boot[monitor-boot
监控服务端]
monitor --> monitor-client[monitor-client
监控客户端]
```
### 2.2 分层架构
```mermaid
flowchart TB
subgraph Controller层
A1[接收HTTP请求]
A2[参数验证
Valid]
A3[调用Service层]
A4[返回统一响应
Result]
end
subgraph Service层
B1[业务逻辑处理]
B2[事务控制
Transactional]
B3[调用Mapper层]
B4[缓存操作
Redis]
end
subgraph Mapper层
C1[MyBatis-Plus
BaseMapper]
C2[数据库访问]
C3[SQL执行]
end
subgraph 横切关注点
D1[AuthFilter
认证过滤器]
D2[LogBus
日志总线]
D3[Sentinel
流量控制]
D4[MqErrorHandle
消息错误处理]
end
A1 --> A2 --> A3 --> B1
B1 --> B2 --> B3 --> C1
C1 --> C2 --> C3
A1 -.-> D1
A1 -.-> D2
A1 -.-> D3
B1 -.-> D4
```
### 2.3 模块职责
| 层级 | 模块 | 职责说明 |
|------------------|-----------------------------------------|-------------------------------------------------|
| **Controller层** | SysUserController、SysLoginController等 | 接收HTTP请求、参数验证(@Valid)、调用Service层、返回统一响应(Result) |
| **Service层** | SysUserServiceImpl、SysLoginServiceImpl等 | 实现业务逻辑、事务控制(@Transactional)、调用Mapper层、缓存操作 |
| **BaseService层** | SysUserBaseService等 | 继承MyBatis-Plus ServiceImpl,提供基础CRUD操作 |
| **Mapper层** | SysUserMapper、SysRoleMapper等 | 继承MyBatis-Plus BaseMapper,数据库访问、SQL执行 |
| **Entity层** | SysUser、SysRole、SysMenu等 | 数据库实体映射 |
| **DTO层** | Req(请求)、Resp(响应)、Excel | 数据传输对象 |
| **Convert层** | SysUserConvert、SysRoleConvert等 | MapStruct对象转换 |
| **Config层** | SysConfig、ApiConfig等 | 配置类 |
| **MQ层** | SysLogMq、SysTaskMq等 | 消息队列消费者 |
| **Job层** | BaseJob、SysLogJob等 | 定时任务、异步任务 |
| **Utils层** | PasswdUtils、AuthUtils等 | 工具类 |
### 2.4 包结构设计
```
xtools.app.{module}
├── controller # 控制器层
├── service # 服务接口
│ ├── base # 基础服务(继承ServiceImpl)
│ └── impl # 服务实现
├── mapper # 数据访问层
├── model
│ ├── entity # 实体类
│ ├── dto
│ │ ├── req # 请求DTO(AddReq、UpdateReq、PageReq)
│ │ ├── resp # 响应DTO
│ │ └── excel # Excel导入导出DTO
│ └── vo # 视图对象
├── convert # MapStruct转换器
├── config # 配置类
├── utils # 工具类
├── mq # 消息队列处理
├── job # 定时任务
└── es # Elasticsearch相关
```
### 2.5 启动模块
项目支持两种部署模式:
| 模块 | 说明 |
|-----------------------------|-----------------------------------------------------|
| **xtools-app-standalone** | 单体部署模式,包含所有模块,通过 spring-boot-maven-plugin 打包为可执行JAR |
| **xtools-app-sys-boot** | 微服务模式 - 系统管理服务 |
| **xtools-app-gen-boot** | 微服务模式 - 代码生成服务 |
| **xtools-app-monitor-boot** | 微服务模式 - 监控服务 |
## 三、项目功能设计
### 3.1 认证授权设计
#### 认证流程
```mermaid
flowchart TD
A[用户请求登录] --> B[前端获取SM2公钥]
B --> C[用户输入账号密码
使用SM2公钥加密]
C --> D{验证验证码}
D -->|验证码已过期| E[返回验证码已过期]
D -->|验证码错误| F[返回验证码错误]
D -->|验证成功| G[后端SM2解密密码]
G --> H{查询账号}
H -->|账户不存在| I[返回账户不存在]
H -->|账户被禁用| J[返回账户被禁用]
H -->|账户正常| K{SM3密码比对}
K -->|密码错误| L[返回密码错误]
K -->|密码正确| M[查询用户角色]
M --> N[生成Token
缓存用户信息到Redis]
N --> O[返回TokenDto]
```
#### 验证码机制
系统支持两种验证码模式(随机切换):
- **GIF动态验证码**:基于 Easy Captcha 生成动态图片验证码
- **算术验证码**:随机生成加减法算术题图片
验证码通过 Redis 缓存(`AppCache.UID_CAPTCHA`,过期时间60秒)。
#### RBAC权限模型
```mermaid
graph TD
User[用户 SysUser] -->|多对多| UserRole[用户角色关联
SysUserRole]
UserRole -->|多对多| Role[角色 SysRole]
Role -->|多对多| RoleMenu[角色菜单关联
SysRoleMenu]
RoleMenu -->|多对多| Menu[菜单权限 SysMenu]
Menu --> M1[页面菜单]
Menu --> M2[按钮权限]
Menu --> M3[接口权限]
```
#### 权限验证流程
```mermaid
flowchart TD
A[用户发起请求] --> B{判断请求类型}
B -->|微服务请求| C[验证Cloud Token]
B -->|常规请求| D[获取请求URI]
C --> C1{Token有效?}
C1 -->|无效| C2[返回UNAUTHORIZED]
C1 -->|有效| C3[传递头部信息]
C3 --> C4[校验掩码设置]
C4 --> C5[放行请求]
D --> D1{URI在权限白名单?}
D1 -->|是| D2[放行请求]
D1 -->|否| D3{获取UID}
D3 -->|UID为空| D4[返回METHOD_NOT_ALLOWED]
D3 -->|UID存在| D5{URI在登录白名单?}
D5 -->|是| D2
D5 -->|否| D6{验证AccessToken}
D6 -->|无效| D7[返回UNAUTHORIZED]
D6 -->|有效| D8{校验URI访问权限}
D8 -->|无权限| D9[返回FORBIDDEN]
D8 -->|有权限| D10[设置上下文信息]
D10 --> D11[校验掩码设置]
D11 --> D2
```
#### 认证模式
系统支持两种认证模式,通过请求头 `Cloud` 标识区分:
- **微服务认证**:验证 Cloud Token(一次性令牌,Redis Hash存储)
- **常规认证**:验证 UID + AccessToken + URI权限
### 3.2 日志管理设计
#### 日志处理流程
```mermaid
flowchart LR
A[HTTP请求] --> B[LogFilter
日志过滤器]
B --> C[采集请求信息
URI,参数,IP,UserAgent]
C --> D[LogBus
日志总线]
D --> E[RabbitMQ
异步消息队列]
E --> F[SysLogMq
日志消费者]
F --> G[LogBusService
日志处理服务]
G --> H[Elasticsearch
日志存储]
```
#### 日志类型
| 类型 | 说明 | 处理方式 |
|------|----------|---------------------------------|
| 操作日志 | 用户操作行为记录 | LogFilter采集 -> MQ -> ES |
| 系统日志 | 系统运行日志 | LogBus记录 -> MQ -> ES |
| 任务日志 | 定时任务执行日志 | BaseJob记录 -> LogBus -> MQ -> ES |
| 错误日志 | 异常和错误信息 | 异常捕获 -> LogBus -> MQ -> ES |
#### 日志配置
- **日志总线**:基于 `xtools-boot-log` 封装,支持通过 `LogBus.init()` 链式调用记录日志
- **消息队列**:使用 RabbitMQ 异步处理,并发度配置为 5-10
- **存储**:日志存储到 Elasticsearch,通过 `EsSysLogRepository` 和 `EsSysLogServiceImpl` 实现
- **日志追踪**:使用 `LogTrackHolder`(基于 ScopedValue)实现日志链路追踪
### 3.3 代码生成设计
#### 代码生成流程
```mermaid
flowchart TD
A[配置数据源] --> B[测试连接]
B --> C[同步数据库]
C --> D{读取表信息}
D --> E[获取表列表
DatabaseMetaData]
E --> F[过滤排除表]
F --> G[生成表信息
GenTable]
G --> H[获取字段信息
DatabaseMetaData]
H --> I[处理字段类型
类型映射,表单类型]
I --> J[生成字段信息
GenTableColumn]
J --> K[保存到数据库]
K --> L{用户操作}
L -->|预览代码| M[Velocity渲染模板]
L -->|下载代码| N[Velocity渲染模板]
L -->|修改配置| O[保存表和字段配置]
M --> P[返回代码列表
GenCodeDto]
N --> Q[打包ZIP下载]
```
#### 模板引擎
- 使用 **Apache Velocity 2.4.1** 模板引擎
- 通过 `GenProperties` 配置模板路径和生成参数
- 支持多种模板类型:Entity、Service、ServiceImpl、Mapper、Controller、Vue、TS API、SQL等
- 支持微服务 API 模块生成(可配置开关 `openApi`)
- 支持字典数据、脱敏数据等高级配置
#### 代码生成特性
| 特性 | 说明 |
|--------|---------------------------|
| 多数据源 | 支持 MySQL 等多种数据库类型 |
| 表结构同步 | 自动读取表和字段元数据 |
| 智能类型映射 | 自动将数据库类型映射为 Java 类型 |
| 表单类型推断 | 根据字段类型自动推断表单组件 |
| 查询方式推断 | String类型默认LIKE,时间类型默认范围查询 |
| 模板配置 | 可配置后端和前端项目名称、模块路径等 |
| ZIP下载 | 生成的代码打包为ZIP文件下载 |
### 3.4 任务调度设计
#### 任务实现
```mermaid
flowchart TD
A[任务触发] --> B[BaseJob.run]
B --> C[初始化日志追踪
ScopedValue]
C --> D[获取Redis锁
tryLock]
D --> E{获取锁成功?}
E -->|否| F[记录日志:已存在]
E -->|是| G[执行runJob方法]
G --> H{执行成功?}
H -->|异常| I[记录错误日志]
H -->|成功| J[记录成功日志]
I --> K[释放锁
releaseLock]
J --> K
```
#### 任务类型
| 类型 | 实现方式 | 说明 |
|----------|-------------------------------|--------------------|
| 异步任务 | `BaseJob implements Runnable` | 支持分布式锁,防止重复执行 |
| XXL-JOB | `xtools-boot-job-xxl`(可选) | 分布式任务调度平台 |
| 定时任务 | `SysScheduled` | Spring Task 定时任务管理 |
| Spring任务 | `JobInterface.execute()` | Spring 原生任务执行接口 |
#### 任务调度特性
- **分布式锁**:使用 Redis `tryLock` / `releaseLock` 实现分布式锁,防止多实例重复执行
- **日志追踪**:通过 `ScopedValue`(JDK 25特性)实现任务执行上下文传递
- **异常处理**:任务执行异常自动记录错误日志
- **超时控制**:支持自定义锁超时时间
### 3.5 缓存设计
#### 缓存策略
| 缓存Key | 说明 | 过期时间 |
|------------------------------------|----------|------|
| `xtools-app:uid:{uid}:sm2` | SM2公钥缓存 | 5分钟 |
| `xtools-app:uid:{uid}:captcha` | 验证码缓存 | 60秒 |
| `xtools-app:auth:sys:user:{token}` | 用户认证信息 | 1小时 |
| `xtools-app:auth:sys:uri` | 权限URI缓存 | 永不过期 |
| `xtools-app:auth:cloud:token` | 微服务Token | 60秒 |
| `xtools-app:mq:msg:err:{id}` | MQ消息错误次数 | 60秒 |
| `xtools-app:lock:job:{className}` | 任务分布式锁 | 5分钟 |
| `xtools-app:risk:ip:{ip}` | 风控IP | 永不过期 |
| `xtools-app:risk:uri:{uri}` | 风控URI | 永不过期 |
| `xtools-app:sys:cache:param:{key}` | 系统参数缓存 | 永不过期 |
| `xtools-app:sys:cache:jar:{name}` | JAR包缓存 | 永不过期 |
| `xtools-app:sys:cache:addr:{key}` | 地址缓存 | 1小时 |
#### 缓存架构
```mermaid
graph TD
A[应用层] --> B[AppCache
缓存枚举]
B --> C[RedisService
Redis操作服务]
subgraph Redis缓存
D1[认证缓存
Token,用户信息]
D2[业务缓存
参数,地址,JAR]
D3[风控缓存
IP,URI限流]
D4[分布式锁
任务锁]
D5[临时数据
验证码,SM2密钥]
end
C --> D1
C --> D2
C --> D3
C --> D4
C --> D5
```
### 3.6 文件存储设计
项目支持多种文件存储方式(通过 `xtools-app-standalone` 可选配置):
| 存储方式 | 模块 | 说明 |
|------|----------------------------|--------------|
| S3存储 | `xtools-boot-storage-s3` | 兼容S3协议的对象存储 |
| 本地文件 | `xtools-boot-storage-file` | 本地文件系统存储(可选) |
## 四、编码规范设计
### 4.1 命名规范
#### 类命名
| 类型 | 命名规范 | 示例 |
|--------------|-------------------------------|----------------------------------|
| 实体类 | `Sys` + 模块名 | `SysUser`、`SysRole`、`SysMenu` |
| 请求DTO | 模块名 + `Req` | `SysUserAddReq`、`SysUserPageReq` |
| 响应DTO | 模块名 + `Resp` | `GenTableInfoResp` |
| Excel DTO | 模块名 + `Excel` | `SysDictExcel` |
| Service接口 | 模块名 + `Service` | `SysUserService` |
| Service实现 | 模块名 + `ServiceImpl` | `SysUserServiceImpl` |
| Base Service | 模块名 + `BaseService` | `SysUserBaseService` |
| Controller | 模块名 + `Controller` | `SysUserController` |
| Mapper | 模块名 + `Mapper` | `SysUserMapper` |
| 转换器 | 模块名 + `Convert` | `SysUserConvert` |
| 工具类 | 功能名 + `Utils` | `PasswdUtils`、`AuthUtils` |
| 配置类 | 功能名 + `Config` 或 `Properties` | `SysConfig`、`GenProperties` |
#### 方法命名
| 操作 | 命名规范 | 示例 |
|------|-------------------------|------------------|
| 查询单个 | `getXxx` | `getUserInfo()` |
| 分页查询 | `pageXxx` | `pageSysUser()` |
| 新增 | `addXxx` / `saveXxx` | `addSysUser()` |
| 修改 | `updateXxx` / `editXxx` | `editUserInfo()` |
| 删除 | `delXxx` / `deleteXxx` | `delSysUser()` |
| 统计 | `countXxx` | — |
### 4.2 注释规范
#### 类注释格式
```java
/**
*
Title : 类名称
*Description : 类描述
*DevelopTools : Idea_x64_v2026.1
*DevelopSystem : macOS Sequoia 15.7.5
*Company : org.xujun
* * @author : XuJun * @version : 1.0.0 * @date : 2026/1/31 21:18 */ ``` #### 方法注释格式 ```java /** * 方法描述 * * @param param 参数说明 * @return 返回值说明 */ ``` #### 常量注释格式 ```java /** * 微服务标识 */ private static final String CLOUD_FLAG = String.valueOf(Boolean.TRUE); ``` ### 4.3 代码风格 - **Lombok**:使用 `@RequiredArgsConstructor` 构造器注入,减少样板代码 - **MapStruct**:使用接口定义对象转换器,编译时自动生成实现 - **MyBatis-Plus**:继承 `ServiceImpl` 和 `BaseMapper`,简化CRUD操作 - **依赖注入**:使用 `@RequiredArgsConstructor` + `final` 字段(构造器注入)和 `@Resource`(特殊场景) - **统一返回**:使用 `Result