|
|
|
|
|
# Repository Guidelines
|
|
|
|
|
|
|
|
|
|
|
|
## 文档定位
|
|
|
|
|
|
本文件聚焦“写代码时需要的架构与模块提示信息”,不包含 Git 流程、编译或测试命令。
|
|
|
|
|
|
|
|
|
|
|
|
## 系统架构总览
|
|
|
|
|
|
- 工程形态:Maven 多模块单体应用,前后端分离(`ruoyi-ui` + Spring Boot 后端)。
|
|
|
|
|
|
- 模块分层:
|
|
|
|
|
|
- `ruoyi-admin`:应用入口、Controller 暴露层。
|
|
|
|
|
|
- `ruoyi-framework`:安全认证、AOP、拦截器、数据权限与限流实现层。
|
|
|
|
|
|
- `ruoyi-system`:系统业务域(用户/角色/菜单/字典等)服务层。
|
|
|
|
|
|
- `ruoyi-common`:跨模块基础设施与通用契约层。
|
|
|
|
|
|
- `ruoyi-quartz`:任务调度能力层。
|
|
|
|
|
|
- `ruoyi-generator`:代码生成能力层。
|
|
|
|
|
|
- 关键依赖方向:`admin -> framework -> system -> common`,`quartz/generator -> common`。
|
|
|
|
|
|
|
|
|
|
|
|
## Backend Tech Stack (With Versions)
|
|
|
|
|
|
版本来源:根 `pom.xml` 的 `properties` 与 `dependencyManagement`。
|
|
|
|
|
|
|
|
|
|
|
|
| 技术 | 版本 | 说明 |
|
|
|
|
|
|
|---|---:|---|
|
|
|
|
|
|
| Java | 17 | 语言与运行时基线 |
|
|
|
|
|
|
| Spring Boot BOM | 3.5.8 | Spring 生态版本管理 |
|
|
|
|
|
|
| MyBatis Spring Boot Starter | 3.0.5 | ORM/Mapper |
|
|
|
|
|
|
| Druid Spring Boot 3 Starter | 1.2.27 | 数据源与连接池 |
|
|
|
|
|
|
| PageHelper Starter | 2.1.1 | 分页 |
|
|
|
|
|
|
| MySQL Connector/J | 8.2.0 | MySQL 驱动 |
|
|
|
|
|
|
| SpringDoc OpenAPI | 2.8.14 | API 文档 |
|
|
|
|
|
|
| Spring Security | 由 Boot 3.5.8 管理 | 认证鉴权 |
|
|
|
|
|
|
| Spring Data Redis | 由 Boot 3.5.8 管理 | 缓存/会话 |
|
|
|
|
|
|
| JJWT | 0.9.1 | JWT |
|
|
|
|
|
|
| Quartz | 2.5.2 | 定时任务 |
|
|
|
|
|
|
| Fastjson2 | 2.0.60 | JSON |
|
|
|
|
|
|
| Apache POI | 4.1.2 | Excel 导入导出 |
|
|
|
|
|
|
| Velocity | 2.3 | 代码生成模板 |
|
|
|
|
|
|
| Kaptcha | 2.3.3 | 验证码 |
|
|
|
|
|
|
| YAUAA | 7.32.0 | User-Agent 解析 |
|
|
|
|
|
|
| OSHI | 6.9.1 | 主机监控信息 |
|
|
|
|
|
|
| Commons IO | 2.21.0 | IO 工具 |
|
|
|
|
|
|
| Jakarta Servlet API | 6.0.0 | Servlet 规范 |
|
|
|
|
|
|
|
|
|
|
|
|
## ruoyi-common 模块深度分析
|
|
|
|
|
|
|
|
|
|
|
|
### 模块定位与边界
|
|
|
|
|
|
- `ruoyi-common` 是后端基础设施层,提供统一契约、基类、工具和安全过滤,不承载业务流程。
|
|
|
|
|
|
- 当前约 `109` 个 Java 类,属于项目复用中心模块。
|
|
|
|
|
|
|
|
|
|
|
|
### 包结构概览(一级包)
|
|
|
|
|
|
- `utils`(36):通用工具主集合。
|
|
|
|
|
|
- `core`(22):Controller/Domain/Page/Redis/Text 基础抽象。
|
|
|
|
|
|
- `exception`(18):统一异常体系。
|
|
|
|
|
|
- `annotation`(9):横切能力注解契约。
|
|
|
|
|
|
- `constant`(6)/`enums`(8):常量与策略枚举。
|
|
|
|
|
|
- `filter`(6)/`xss`(2):请求过滤与输入安全。
|
|
|
|
|
|
- `config`(2):通用配置与序列化器。
|
|
|
|
|
|
|
|
|
|
|
|
### 架构中心性(跨模块复用)
|
|
|
|
|
|
- `ruoyi-framework`: 148 次 `import com.ruoyi.common.*`
|
|
|
|
|
|
- `ruoyi-admin`: 138 次
|
|
|
|
|
|
- `ruoyi-system`: 86 次
|
|
|
|
|
|
- `ruoyi-quartz`: 40 次
|
|
|
|
|
|
- `ruoyi-generator`: 25 次
|
|
|
|
|
|
- 高频类:`StringUtils`、`AjaxResult`、`Constants`、`BaseController`、`SecurityUtils`、`ExcelUtil`。
|
|
|
|
|
|
|
|
|
|
|
|
### 设计机制(写代码时重点)
|
|
|
|
|
|
- 契约与实现分离:`@DataScope/@RateLimiter/@RepeatSubmit/@Log` 定义在 common,实现放在 framework 的 Aspect/Interceptor。
|
|
|
|
|
|
- 统一返回规范:Controller 继承 `BaseController`,统一输出 `AjaxResult`/`TableDataInfo`。
|
|
|
|
|
|
- 统一实体扩展位:`BaseEntity.params` 用于数据权限 SQL 片段等横切参数传递。
|
|
|
|
|
|
- 统一安全输入链路:`SqlUtil`、`XssFilter`、`XssValidator`、`RepeatableFilter` 负责请求与参数安全治理。
|
|
|
|
|
|
|
|
|
|
|
|
## ruoyi-common 类级别索引清单(按包)
|
|
|
|
|
|
|
|
|
|
|
|
### `annotation`
|
|
|
|
|
|
| 类 | 使用场景 |
|
|
|
|
|
|
|---|---|
|
|
|
|
|
|
| `Anonymous` | 标记匿名可访问接口 |
|
|
|
|
|
|
| `DataScope` | 服务查询方法注入数据权限条件 |
|
|
|
|
|
|
| `DataSource` | 动态切换主从数据源 |
|
|
|
|
|
|
| `Excel`/`Excels` | 实体字段导入导出映射 |
|
|
|
|
|
|
| `Log` | 业务操作日志切面采集 |
|
|
|
|
|
|
| `RateLimiter` | 接口限流(全局或按 IP) |
|
|
|
|
|
|
| `RepeatSubmit` | 防重复提交 |
|
|
|
|
|
|
| `Sensitive` | 返回字段脱敏 |
|
|
|
|
|
|
|
|
|
|
|
|
### `config`
|
|
|
|
|
|
| 类 | 使用场景 |
|
|
|
|
|
|
|---|---|
|
|
|
|
|
|
| `RuoYiConfig` | 读取 `ruoyi.*` 业务基础配置(上传路径、验证码类型等) |
|
|
|
|
|
|
| `SensitiveJsonSerializer` | 配合 `@Sensitive` 做序列化脱敏 |
|
|
|
|
|
|
|
|
|
|
|
|
### `constant`
|
|
|
|
|
|
| 类 | 使用场景 |
|
|
|
|
|
|
|---|---|
|
|
|
|
|
|
| `Constants` | 全局常量(JWT 字段、权限标识、资源前缀等) |
|
|
|
|
|
|
| `CacheConstants` | Redis key 前缀统一管理 |
|
|
|
|
|
|
| `HttpStatus` | 返回状态码常量 |
|
|
|
|
|
|
| `GenConstants` | 代码生成器常量 |
|
|
|
|
|
|
| `ScheduleConstants` | 调度任务常量 |
|
|
|
|
|
|
| `UserConstants` | 用户/角色状态常量 |
|
|
|
|
|
|
|
|
|
|
|
|
### `core.controller`
|
|
|
|
|
|
| 类 | 使用场景 |
|
|
|
|
|
|
|---|---|
|
|
|
|
|
|
| `BaseController` | 分页、排序、安全用户获取、统一响应快捷方法 |
|
|
|
|
|
|
|
|
|
|
|
|
### `core.domain`
|
|
|
|
|
|
| 类 | 使用场景 |
|
|
|
|
|
|
|---|---|
|
|
|
|
|
|
| `AjaxResult` | 标准接口返回体(Map 风格) |
|
|
|
|
|
|
| `R<T>` | 泛型响应体(类型化返回) |
|
|
|
|
|
|
| `BaseEntity` | 审计字段与 `params` 扩展参数 |
|
|
|
|
|
|
| `TreeEntity`/`TreeSelect` | 树结构实体与前端下拉树数据 |
|
|
|
|
|
|
|
|
|
|
|
|
### `core.domain.entity`
|
|
|
|
|
|
| 类 | 使用场景 |
|
|
|
|
|
|
|---|---|
|
|
|
|
|
|
| `SysUser` | 用户领域共享实体(含校验、Excel 注解) |
|
|
|
|
|
|
| `SysRole` | 角色与数据权限范围 |
|
|
|
|
|
|
| `SysDept` | 部门树领域实体 |
|
|
|
|
|
|
| `SysMenu` | 菜单与权限节点 |
|
|
|
|
|
|
| `SysDictType`/`SysDictData` | 字典类型与字典项 |
|
|
|
|
|
|
|
|
|
|
|
|
### `core.domain.model`
|
|
|
|
|
|
| 类 | 使用场景 |
|
|
|
|
|
|
|---|---|
|
|
|
|
|
|
| `LoginBody` | 登录请求体 |
|
|
|
|
|
|
| `RegisterBody` | 注册请求体 |
|
|
|
|
|
|
| `LoginUser` | 安全上下文主体(token、权限、登录态) |
|
|
|
|
|
|
|
|
|
|
|
|
### `core.page`
|
|
|
|
|
|
| 类 | 使用场景 |
|
|
|
|
|
|
|---|---|
|
|
|
|
|
|
| `PageDomain` | 分页参数承载 |
|
|
|
|
|
|
| `TableSupport` | 从请求提取分页参数 |
|
|
|
|
|
|
| `TableDataInfo` | 表格分页响应结构 |
|
|
|
|
|
|
|
|
|
|
|
|
### `core.redis`
|
|
|
|
|
|
| 类 | 使用场景 |
|
|
|
|
|
|
|---|---|
|
|
|
|
|
|
| `RedisCache` | 对 `RedisTemplate` 的统一封装(对象/列表/集合/Map/过期) |
|
|
|
|
|
|
|
|
|
|
|
|
### `core.text`
|
|
|
|
|
|
| 类 | 使用场景 |
|
|
|
|
|
|
|---|---|
|
|
|
|
|
|
| `Convert` | 安全类型转换 |
|
|
|
|
|
|
| `StrFormatter` | `{}` 占位符格式化 |
|
|
|
|
|
|
| `CharsetKit` | 字符集处理 |
|
|
|
|
|
|
|
|
|
|
|
|
### `enums`
|
|
|
|
|
|
| 类 | 使用场景 |
|
|
|
|
|
|
|---|---|
|
|
|
|
|
|
| `BusinessType`/`OperatorType` | 操作日志分类 |
|
|
|
|
|
|
| `DataSourceType` | 主从数据源策略 |
|
|
|
|
|
|
| `LimitType` | 限流维度(默认/IP) |
|
|
|
|
|
|
| `HttpMethod` | 请求方法匹配 |
|
|
|
|
|
|
| `UserStatus`/`BusinessStatus` | 状态语义统一 |
|
|
|
|
|
|
| `DesensitizedType` | 脱敏策略函数集合 |
|
|
|
|
|
|
|
|
|
|
|
|
### `exception`
|
|
|
|
|
|
| 类 | 使用场景 |
|
|
|
|
|
|
|---|---|
|
|
|
|
|
|
| `BaseException` | 业务基础异常(支持国际化 code) |
|
|
|
|
|
|
| `ServiceException` | 服务层运行时异常(可带状态码) |
|
|
|
|
|
|
| `UtilException` | 工具类异常 |
|
|
|
|
|
|
| `DemoModeException`/`GlobalException` | 演示模式与全局业务异常 |
|
|
|
|
|
|
| `file.*` | 文件上传、大小、扩展名异常 |
|
|
|
|
|
|
| `user.*` | 登录、验证码、密码重试、黑名单异常 |
|
|
|
|
|
|
| `job.TaskException` | 定时任务执行异常 |
|
|
|
|
|
|
|
|
|
|
|
|
### `filter`
|
|
|
|
|
|
| 类 | 使用场景 |
|
|
|
|
|
|
|---|---|
|
|
|
|
|
|
| `RepeatableFilter`/`RepeatedlyRequestWrapper` | JSON 请求体可重复读取 |
|
|
|
|
|
|
| `XssFilter`/`XssHttpServletRequestWrapper` | 请求参数与 JSON 体 XSS 清洗 |
|
|
|
|
|
|
| `RefererFilter` | 防盗链 Referer 校验 |
|
|
|
|
|
|
| `PropertyPreExcludeFilter` | JSON 属性排除辅助 |
|
|
|
|
|
|
|
|
|
|
|
|
### `utils`(重点工具类补充)
|
|
|
|
|
|
| 类 | 使用场景 |
|
|
|
|
|
|
|---|---|
|
|
|
|
|
|
| `StringUtils` | 字符串/集合空判断、模板格式化、命名转换 |
|
|
|
|
|
|
| `DateUtils` | 日期解析与格式化 |
|
|
|
|
|
|
| `SecurityUtils` | 获取当前用户、权限匹配、密码加密 |
|
|
|
|
|
|
| `ServletUtils` | request/response/session 获取与渲染 |
|
|
|
|
|
|
| `PageUtils` | 分页启动与清理 |
|
|
|
|
|
|
| `DictUtils` | 字典缓存读写与标签值转换 |
|
|
|
|
|
|
| `FileUploadUtils` | 统一上传路径、命名、扩展名校验 |
|
|
|
|
|
|
| `FileUtils`/`ImageUtils`/`MimeTypeUtils` | 文件读写、图片处理、类型识别 |
|
|
|
|
|
|
| `ExcelUtil` | Excel 导入导出核心工具 |
|
|
|
|
|
|
| `SqlUtil` | orderBy 白名单校验与关键字过滤 |
|
|
|
|
|
|
| `IpUtils`/`AddressUtils` | IP 解析与归属地查询 |
|
|
|
|
|
|
| `HttpUtils`/`HttpHelper`/`UserAgentUtils` | HTTP 调用、请求体读取、UA 解析 |
|
|
|
|
|
|
| `SpringUtils` | 非托管代码获取 Bean/环境信息 |
|
|
|
|
|
|
| `BeanUtils`/`BeanValidators`/`ReflectUtils` | Bean 复制、校验、反射访问 |
|
|
|
|
|
|
| `IdUtils`/`UUID`/`Seq` | 唯一 ID 与序列号 |
|
|
|
|
|
|
| `Md5Utils`/`Base64` | 摘要与编码 |
|
|
|
|
|
|
|
|
|
|
|
|
### `xss`
|
|
|
|
|
|
| 类 | 使用场景 |
|
|
|
|
|
|
|---|---|
|
|
|
|
|
|
| `Xss` | 字段级 XSS 校验注解 |
|
|
|
|
|
|
| `XssValidator` | XSS 校验实现 |
|
|
|
|
|
|
|
|
|
|
|
|
## 写代码时的实用提示(聚焦 common)
|
|
|
|
|
|
- 返回值统一:优先使用 `AjaxResult`/`TableDataInfo`,避免模块间返回结构不一致。
|
|
|
|
|
|
- 分页与排序安全:动态排序字段必须走 `SqlUtil.escapeOrderBySql` 逻辑。
|
|
|
|
|
|
- Redis key 必须使用 `CacheConstants` 前缀,避免不同模块 key 冲突。
|
|
|
|
|
|
- 上传逻辑优先复用 `FileUploadUtils`,不要在业务层重复拼接文件路径。
|
|
|
|
|
|
- 涉及脱敏字段优先用 `@Sensitive`,不要在 Controller 手工字符串处理。
|
|
|
|
|
|
- 新增通用能力时,先判断是否应放在 `ruoyi-common`(跨模块复用)还是业务模块(仅单域使用)。
|