Commit 3b46fab7 by xiaowei

添加了规则文件

parent ec7a0a31
---
description: 全项目代码通用强制自检清单,所有Java、Vue、UniApp、SQL文件全局生效
globs: ["**/*.java","**/*.vue","**/*.ts","**/*.sql","**/*.xml","**/*.vue"]
alwaysApply: true
---
# 冲突优先级声明
若本规则与其他专项规则冲突,专项业务规则优先级高于本文件;达梦数据库、Java编码禁令、信创约束拥有最高不可覆盖优先级。
# 通用代码强制自检清单(若依微服务+达梦8+信创,无会议/BPM)
## 一、Java 通用红线
1. 依赖注入统一 @Resource,禁止 @Autowired;
2. 禁止连环set赋值,DO/VO全部使用@Builder链式构建;
3. 禁止手写getter/setter,统一Lombok @Data;
4. 非空判断统一Hutool工具类(StrUtil/CollUtil),禁止裸判空;
5. 禁止魔法数字/字符串,统一枚举、常量类;
6. 多层if嵌套改用卫语句,禁止深度嵌套;
7. 循环内禁止调用Mapper,统一批量操作;
8. 时间统一 LocalDateTime,禁止 Date/Timestamp;
9. 所有业务异常统一 ServiceExceptionUtil,禁止直接new RuntimeException;
10. Service查询无数据必须抛异常,禁止return null;
11. Controller禁止try-catch,使用若依全局异常处理器;
12. Controller禁止直接注入Mapper,仅允许注入Service;
13. 微服务跨模块调用仅允许Feign DTO远程调用,禁止直接依赖对方server模块;
14. 所有新增表/字段必须适配达梦8语法,禁止MySQL专属函数;
15. 项目无BPM流程、会议预约相关业务,禁止新增Flowable依赖、审批监听、流程表单代码。
## 二、SQL & 达梦8 强制红线
1. 主键统一String雪花ID,达梦8禁止自增ID,不使用序列作为业务主键;
2. 时间字段使用达梦 TIMESTAMP,禁止 TIMESTAMPTZ;
3. 分页使用达梦分页语法,禁止MySQL LIMIT/OFFSET逗号写法;
4. 表名、字段名全部小写蛇形,规避达梦关键字;
5. 必须包含租户、软删除、创建人、创建时间等框架字段;
6. 字典初始化SQL适配达梦insert语法,兼容信创达梦驱动;
7. 禁止使用MySQL专属函数:IFNULL、DATE_FORMAT等,替换达梦对应函数;
8. 不创建会议、审批流程相关数据表、索引、初始化数据。
## 三、前端双端通用红线(管理后台Vue3 + UniApp APP)
1. ID统一string类型,禁止number,避免雪花ID精度丢失;
2. 表单基础校验使用el-form/uni-form内置提示,业务逻辑弹窗提示;
3. 禁止页面硬编码魔法状态、文本,统一枚举/字典翻译;
4. API请求统一封装若依axios请求,禁止原生fetch/axios裸调用;
5. 所有删除、批量操作增加二次确认弹窗;
6. APP端适配国产安卓系统,避免闭源第三方SDK;
7. 页面类型区分:管理后台页面、APP表单页面,规范目录拆分;
8. 不开发流程审批、会议预约类页面、弹窗、表单组件。
## 四、信创强制约束(全代码通用)
1. 第三方依赖优先选用国产化开源包,剔除国外闭源组件;
2. SQL脚本、配置文件兼容国产服务器(鲲鹏、飞腾CPU);
3. JDK统一使用国产龙芯/鲲鹏适配OpenJDK,禁止Oracle JDK;
4. 中间件使用国产东方通、金蝶,不使用Tomcat商业版、WebLogic;
5. 打包产物支持信创容器镜像,无海外镜像依赖;
6. 所有功能无依赖境外API、境外存储服务。
## 五、微服务通用约束
1. 多模块拆分遵循若依微服务标准:gateway、system、business、api;
2. 远程调用统一Feign接口,DTO隔离,server模块不互相依赖;
3. 配置全部存入Nacos,禁止本地yml硬编码环境配置;
4. 接口路径统一 /api/{模块}/{功能},网关统一路由转发;
5. 权限标识遵循 模块:业务:操作 格式,适配若依Sa-Token鉴权;
6. 分布式防重复提交使用Redis幂等注解,适配微服务多实例。
---
description: 达梦8 DM8数据库全局强制规范,信创数据库最高优先级规则
globs: ["**/*.sql","**/*DO.java","**/*Mapper.xml"]
alwaysApply: true
---
# 达梦8(DM8)数据库规范 信创适配
## 一、达梦 8 字段类型强制约束
1. 雪花 ID 主键:Java String,达梦 `VARCHAR(20)`;**禁止 BIGINT 自增、禁止序列做主键**;
2. 状态、枚举值:Java Integer,达梦 `INT`;
3. 短文本名称:`VARCHAR(100)`,长描述 `VARCHAR(500)`;
4. 时间统一 `TIMESTAMP`;**禁止 TIMESTAMPTZ、DATE 单独存储时分秒**;
5. 布尔值使用 `BIT`,0/1;
6. JSON 数组、复杂集合存储使用 `TEXT`,配合 MyBatis-Plus JacksonTypeHandler;
7. 不使用达梦大字段 CLOB/BLOB,业务文本统一 VARCHAR/TEXT。
## 二、DDL 脚本达梦专属规范
1. 表名、字段名全部小写蛇形命名,规避达梦系统关键字;
2. 注释使用 `COMMENT ON TABLE` / `COMMENT ON COLUMN` 达梦标准语法;
3. 新增字段使用 `ALTER TABLE 表名 ADD COLUMN xxx 类型 约束 COMMENT '注释'`;
4. 建表语句包裹 `BEGIN;` 和 `COMMIT;`,事务执行;
5. 索引创建语法:`CREATE INDEX idx_xxx ON table_name(col);`;唯一索引 `CREATE UNIQUE INDEX`;
6. 达梦分页语法:`OFFSET x LIMIT y`,禁止 MySQL LIMIT 0,10 逗号写法;
7. 达梦函数替换 MySQL 函数:
- IFNULL → NVL
- DATE_FORMAT → TO_CHAR
- NOW() → SYSDATE
- SUBSTRING → SUBSTR
## 三、MyBatis-Plus 适配达梦 8
1. Mapper 继承 `BaseMapperX`(项目封装适配达梦),禁止原生 BaseMapper;
2. 分页使用 `LambdaQueryWrapperX` 空值安全条件,达梦分页自动适配;
3. 禁止 MySQL 专属 XML SQL,所有原生 SQL 必须兼容达梦;
4. 主键注解统一 `@TableId(type = IdType.ASSIGN_ID)`,达梦全局关闭自增;
5. 软删除使用 MyBatis-Plus 逻辑删除,达梦 BIT 字段自动适配。
## 四、达梦 8 信创部署约束
1. 驱动包使用达梦官方国产化驱动 DmJdbcDriver,不使用兼容 MySQL 驱动;
2. 数据库字符集统一 GB18030,适配信创中文存储;
3. 排序规则统一达梦中文排序,避免中文查询乱序;
4. 生产环境达梦 8 部署在鲲鹏 / 飞腾国产服务器,禁止 x86 海外服务器;
5. 数据库备份脚本适配达梦 dexp/dimp 工具,不使用 mysqldump;
6. 账号权限最小化,业务账号仅拥有 DML 权限,DDL 仅 DBA 可执行,满足等保信创要求。
## 五、数据库开发禁止事项
❌ 禁止使用自增主键、序列作为业务主键;
❌ 禁止 MySQL 专属函数、分页语法;
❌ 禁止字段名、表名使用达梦保留关键字不加转义;
❌ 禁止存储过程、触发器承载大量业务逻辑,业务全部下沉 Java 服务层;
❌ 禁止 TEXT/CLOB 存储超长业务文本,拆分字段;
❌ 禁止手动更新 deleted 软删除字段,使用框架内置逻辑删除方法;
❌ 禁止达梦数据库存储境外加密、境外第三方数据;
❌ 禁止创建会议、审批流程相关数据表、存储过程、触发器。
---
description: 若依微服务前后端协作规范(Vue管理后台 + UniApp APP双端,无会议/BPM)
globs: ["**/*.java","**/*.vue","**/*.ts","**/*.sql","**/*.js"]
alwaysApply: true
---
# 冲突优先级声明
达梦数据库、Java编码、信创部署规则优先级高于本文件;若依微服务专项架构规则冲突时以专项文件为准。
# 若依微服务全栈协作规范
## 一、前后端字段映射标准(统一适配达梦8)
### TS类型 → Java类型 → 达梦8字段映射
| 前端TS类型 | Java实体类型 | 达梦8列类型 | 说明 |
| ---- | ---- | ---- | ---- |
| string(雪花ID) | String | VARCHAR(20) | 主键,防止精度丢失 |
| number(状态枚举) | Integer | INT | 业务状态、字典值 |
| string(名称文本) | String | VARCHAR(100) | 名称、标题 |
| string(长描述) | String | VARCHAR(500) | 备注、描述 |
| string(ISO时间) | LocalDateTime | TIMESTAMP | 统一时间类型 |
| boolean | Boolean | BIT | 布尔标识 |
| string[] | List<String> | TEXT | JSON数组存储,JacksonTypeHandler |
## 二、前端页面推导后端代码流程
1. 管理后台Vue页面、UniApp APP页面,先提取全部表单字段、列表查询条件、接口请求;
2. 区分双端接口隔离:管理后台接口、APP移动端独立接口,禁止复用同一套Controller;
3. 后端分层严格遵循:SQL DDL(达梦语法)→ DO → Mapper → VO → Controller → Service;
4. 跨模块查询使用Feign远程调用,不直接操作其他业务Mapper;
5. 字典、枚举前后端同步,后端存数字code,前端通过若依字典组件自动翻译中文;
6. 分页统一PageResult返回,前端PageReqVO继承若依PageParam。
## 三、微服务接口路径规范
1. 管理后台接口前缀:`/api/admin/{module}/{business}`
2. APP移动端接口前缀:`/api/app/{module}/{business}`
3. 公共基础模块接口:`/api/common/{function}`
4. CRUD固定后缀:/create /update /delete /get /page /export-excel
## 四、双端代码产出区分
1. Vue管理后台:基于Element Plus,SqSearchTableFrame标准列表框架;
2. UniApp APP端:uni-form、uni-data-select、uni-list等原生组件,适配移动端触控;
3. 公共类型统一抽离api/types.ts,后台与APP类型文件隔离,不共用;
4. APP端不展示复杂后台管理字段(租户ID、创建人、操作日志等)。
## 五、数据库字段对齐强制要求
1. DO驼峰字段 ↔ 达梦表下划线字段完全一一对应;
2. SaveReqVO覆盖前端所有可编辑字段,不含框架内置字段;
3. RespVO增加富化展示字段(关联名称、字典中文),DO不存储;
4. 新增字段必须同步:达梦ALTER脚本、DO实体、前后端VO类型。
## 六、信创前后端适配要求
1. 前端打包产物无海外CDN资源,静态资源本地化;
2. UniApp打包支持国产安卓系统、国产芯片设备;
3. 前端加密、工具类使用国产加密算法(SM2/SM3/SM4),禁用RSA国际算法;
4. 接口日志脱敏手机号、身份证等敏感信息,满足信创等保规范。
---
description: Java编码八大强制红线禁令(最高优先级Java规则,达梦、信创规则除外,无BPM/会议)
globs: ["**/*.java"]
alwaysApply: false
---
# 冲突优先级声明
本文件为Java代码最高强制约束,仅达梦数据库、信创部署规则优先级高于本文件,其余所有Java相关规则冲突时以本文件为准。
# Java编码强制八大禁令(若依微服务+达梦8+信创)
## 禁令1:禁止连环set硬赋值,统一@Builder链式构建
❌ 错误:new DO() 后逐行setXxx
✅ 正确:DO实体添加@Builder、@NoArgsConstructor、@AllArgsConstructor,使用DO.builder().field(val).build()
## 禁令2:禁止手写getter/setter,统一Lombok @Data
❌ 手动编写get/set方法
✅ 所有DO、VO、DTO统一使用@Data,配合@EqualsAndHashCode(callSuper = true)
## 禁令3:依赖注入统一@Resource,完全禁止@Autowired
❌ 混用@Autowired和@Resource
✅ Controller、ServiceImpl中所有Mapper、Service、Feign接口全部使用@Resource注入
## 禁令4:非空判断禁止裸判断,统一Hutool工具类
❌ if(str != null && !str.equals("")) / if(list != null && list.size()>0)
✅ 字符串:StrUtil.isNotBlank();集合:CollUtil.isNotEmpty();对象:ObjectUtil.isNotNull()
## 禁令5:禁止魔法数字、魔法字符串,统一枚举/常量类
❌ 直接写if(status == 0)、return "goods_offline"
✅ 业务状态定义枚举,固定文本、阈值写入XXXConstants常量类
## 禁令6:禁止多层if-else嵌套,卫语句优先,复杂状态使用策略模式
❌ 超过2层if嵌套
✅ 所有边界、校验条件前置,提前return/抛异常,消除else分支;状态机多分支采用策略模式
## 禁令7:循环内部禁止调用Mapper单条操作,统一批量方法
❌ for循环中mapper.insert() / mapper.deleteById()
✅ 批量插入insertBatch、批量删除deleteBatchIds、条件批量更新wrapper更新,单次DB交互
## 禁令8:时间类型统一LocalDateTime,完全禁止Date、Timestamp
❌ java.util.Date、java.sql.Timestamp
✅ DO、VO、DTO时间字段全部使用LocalDateTime,达梦8 TIMESTAMP字段对应
# 补充强制编码约束
1. 业务异常统一 ServiceExceptionUtil.exception(ErrorCode),禁止直接new RuntimeException、IllegalArgumentException;
2. Service查询无数据必须抛不存在异常,禁止return null区分不存在;
3. Controller禁止编写try-catch捕获业务异常,使用若依全局异常处理器;
4. Controller禁止直接注入Mapper,仅允许注入对应Service;
5. 跨模块调用仅允许注入Feign API接口,禁止依赖对方ServiceImpl;
6. 所有类、Service接口方法、DO字段必须添加中文Javadoc注释;
7. 错误提示文案使用业务操作人员易懂中文,禁止技术术语、数据库字段名、英文编码;
8. 新增/修改/删除/导出接口必须添加@ApiAccessLog操作日志注解;
9. 创建、状态变更接口必须添加@Idempotent幂等注解防重复提交;
10. 所有DO主键统一String雪花ID,@TableId(type = IdType.ASSIGN_ID),适配达梦8;
11. 禁止引入Flowable、BPM流程审批相关类、注解、依赖。
---
description: 对象转换Convert类规范,DO/VO/DTO分层隔离转换
globs: ["**/*Convert.java"]
alwaysApply: false
---
# 冲突优先级声明
Java编码规范、达梦实体规则优先级高于本文件。
# 对象转换Convert类开发规范
## 一、基础规范
1. 存放路径:convert包下,命名 XxxConvert;
2. 类添加 @Mapper(componentModel = "spring") 注解,使用MapStruct自动生成转换实现;
3. 所有转换方法为静态/实例抽象方法,禁止手动编写set赋值转换逻辑;
4. 转换类只做对象属性拷贝,不编写业务计算、数据查询逻辑。
## 二、标准转换方法定义
### 1. DO ↔ RespVO
RespVO toRespVO(DO entity);
List<RespVO> toRespVOList(List<DO> list);
### 2. SaveReqVO → DO
DO toDO(SaveReqVO reqVO);
### 3. DO ↔ Feign DTO(跨服务传输)
DTO toDTO(DO entity);
DO toDO(DTO dto);
List<DTO> toDTOList(List<DO> list);
## 三、特殊字段转换处理规则
1. 字典翻译、关联名称等富化字段:转换基础拷贝后,在Service层单独赋值,Convert不处理;
2. 时间字段 LocalDateTime 自动映射,无需额外转换配置;
3. 雪花ID String类型自动映射,无精度丢失问题;
4. 枚举字段:统一存储Integer编码,转换时直接拷贝数字,中文翻译在VO层处理;
5. 集合List<String> JSON字段:MyBatis类型处理器处理,转换层直接拷贝。
## 四、MapStruct 注解配置规范
1. 字段名称完全一致时,无需额外@Mapping;
2. 字段名称不一致时,添加映射注解:
@Mapping(source = "userId", target = "uid")
3. 忽略不需要拷贝的字段:
@Mapping(target = "richName", ignore = true)
4. 禁止使用复杂表达式在@Mapping中,复杂逻辑交给Service处理。
## 五、Convert通用禁止项
❌ 禁止手动new对象+连环set做转换,必须MapStruct自动生成;
❌ 禁止在转换方法中调用Mapper、Feign、Service查询数据;
❌ 禁止转换类添加业务工具方法、常量;
❌ 禁止跨模块直接转换VO与DO,跨服务只能通过DTO中转;
❌ 禁止转换方法返回null,空集合统一返回空列表Collections.emptyList()。
---
description: 业务枚举、数据字典前后端同步规范,适配若依字典+达梦初始化SQL
globs: ["**/*Enum.java","**/*.sql"]
alwaysApply: false
---
# 冲突优先级声明
达梦数据库规范、Java编码规范优先级高于本文件。
# 枚举 & 数据字典同步开发规范
## 一、业务枚举开发规范
1. 存放路径:enums包,命名 XxxEnum;
2. 枚举固定结构:code(Integer编码)、desc(中文描述);
3. 基础方法:getCode()、getDesc(),提供静态工具方法根据code获取枚举;
4. 所有业务状态、类型、标识全部使用枚举,禁止硬编码魔法数字;
5. 枚举添加中文类注释、每个实例添加单行注释说明业务含义;
6. 禁止枚举中编写数据库查询、远程调用、复杂业务逻辑。
示例标准枚举:
public enum GoodsStatusEnum {
UP(1, "上架"),
DOWN(2, "下架");
private final Integer code;
private final String desc;
GoodsStatusEnum(Integer code, String desc) {
this.code = code;
this.desc = desc;
}
// getter、根据code查询工具方法
}
## 二、若依数据字典规范
1. 系统字典复用内置两张表:sys_dict_type(字典类型)、sys_dict_data(字典项);
2. 字典类型编码规则:`business_xxx`,区分系统字典与业务字典;
3. 达梦初始化SQL规范:
1. 先判断字典类型不存在再插入;
2. 批量插入字典项,适配达梦INSERT多行语法;
3. 所有字符串值使用单引号,注释符合达梦语法;
4. 前后端同步规则:
- 后端存储数字code;
- 管理后台Vue使用 <dict-tag /> 组件自动翻译中文;
- UniApp APP端封装全局字典翻译工具,根据code展示中文;
5. 区分使用场景:
- 固定不变、全项目通用状态:优先使用Java枚举;
- 支持后台动态新增修改的分类、标签:使用数据库数据字典。
## 三、枚举与字典同步约束
1. 若业务同时使用枚举+字典,必须保证code编码完全一致,避免前后端翻译错乱;
2. 新增业务状态时,同步更新枚举类、字典初始化SQL、前端字典选项;
3. 禁止枚举code与字典项value不一致,统一Integer数字编码;
4. 生产环境字典初始化脚本仅执行新增,不修改已有字典项,避免线上数据变更风险。
## 四、禁止事项
❌ 禁止业务状态硬编码数字,必须枚举/字典;
❌ 禁止字典初始化SQL使用MySQL专属语法,严格适配达梦;
❌ 禁止枚举存储字符串编码,统一Integer;
❌ 禁止前端硬编码状态文本,全部依赖枚举/字典翻译;
❌ 禁止动态可变业务分类使用Java枚举,必须数据库字典。
---
description: DO/ReqVO/RespVO/DTO实体规范,适配达梦8雪花ID、字段类型映射
globs: ["**/*DO.java","**/*VO.java","**/*DTO.java"]
alwaysApply: false
---
# 冲突优先级声明
达梦数据库全局规则、Java编码禁令优先级高于本文件。
# DO、VO、DTO 实体开发规范(达梦8适配)
## 一、DO 数据库实体规范
1. 存放路径:domain/dataobject,命名 Xxx;
2. 基础注解:
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@TableName("xxx")
3. 主键字段统一:
@TableId(type = IdType.ASSIGN_ID)
private String id;
4. 必须包含框架通用字段:creator、createTime、updater、updateTime、deleted;
5. 字段类型严格遵循达梦8映射规则,时间统一LocalDateTime,布尔使用Boolean;
6. 复杂数组/集合字段添加类型处理器注解:
@TableField(typeHandler = JacksonTypeHandler.class)
private List<String> tagList;
7. 禁止在DO中添加业务计算字段、字典翻译字段,翻译逻辑统一在RespVO处理;
8. 所有字段添加中文注释,说明业务含义。
## 二、ReqVO 请求VO规范
### 1. SaveReqVO(新增/编辑共用)
1. 命名:XxxSaveReqVO;
2. 仅包含前端可编辑业务字段,**不包含id、租户、创建人、创建时间、软删除**等框架字段;
3. 字段校验注解统一使用Hibernate Validator:@NotBlank、@NotNull、@Size、@Min、@Max;
4. 时间字段统一LocalDateTime;ID、编码类文本统一String;
### 2. PageReqVO(分页查询)
1. 命名:XxxPageReqVO,继承若依框架 PageParam;
2. 仅包含分页参数、业务模糊查询、状态筛选条件;
3. 禁止分页VO携带大文本、复杂数组参数;
4. 所有查询条件允许为空,不强制@NotNull。
## 三、RespVO 返回VO规范
1. 命名:XxxRespVO;
2. 包含DO全部基础字段,额外增加富化展示字段(如分类名称、字典中文名称、关联业务名称);
3. 富化字段仅用于前端展示,不参与新增/编辑保存;
4. 时间统一LocalDateTime,序列化输出标准ISO格式;
5. 字典状态字段同时返回数字编码和中文翻译,方便前端展示。
## 四、Feign DTO 传输对象规范
1. 命名:XxxDTO,存放于ruoyi-business-api模块;
2. DTO仅存储跨服务传输必要字段,精简冗余字段;
3. 禁止将DO、VO直接作为Feign接口入参/返回值;
4. DTO不添加数据库相关注解(@TableName、@TableId等);
5. 基础注解仅保留@Data、@Builder,按需构造无参/全参构造。
## 五、实体通用禁止项
❌ 禁止DO直接返回前端,必须通过RespVO转换;
❌ 禁止SaveReqVO携带主键ID做新增操作;
❌ 禁止DTO中使用LocalDate、Date,统一LocalDateTime;
❌ 禁止实体字段使用基本类型(int、long、boolean),统一包装类型(Integer、Long、Boolean);
❌ 禁止在VO/DTO中编写业务逻辑方法,实体仅做数据载体。
---
description: 全局错误码分段管理规范,微服务多模块隔离
globs: ["**/ErrorCodeConstants.java"]
alwaysApply: false
---
# 冲突优先级声明
Java编码规范优先级高于本文件。
# 全局错误码常量规范
## 一、错误码分段规则(无BPM分段)
采用三段式数字编码:`模块段_子模块_序号`
1. system系统模块:1_001_001 ~ 1_001_999
用户、部门、角色、菜单、字典、登录权限相关错误;
2. business业务模块:1_100_001 ~ 1_999_999
所有自定义业务模块错误码,每个业务子模块分配100个序号区间;
3. 通用框架错误:1_000_001 ~ 1_000_999
参数校验、幂等、文件上传、导出、远程调用通用异常。
## 二、常量定义规范
1. 统一存放于 `ErrorCodeConstants.java` 常量类;
2. 常量命名:全大写,下划线分隔,业务含义清晰;
3. 常量值严格遵循分段编码,注释写明异常提示文案;
4. 示例:
// 商品模块-商品不存在
public static final Integer GOODS_NOT_EXIST = 1_100_001;
5. 同一业务模块错误码按业务流程顺序递增,预留间隔序号便于后续扩展;
6. 禁止重复错误码,新增错误码前检查已存在常量。
## 三、异常文案规范
1. 错误提示面向业务操作人员,使用通俗中文;
2. 禁止文案包含数据库字段名、技术术语、英文编码;
3. 参数校验类文案清晰指明错误字段,例:"商品名称不能为空";
4. 远程调用、服务异常文案屏蔽底层技术细节,统一友好提示。
## 四、使用规范
1. 业务抛出异常统一使用工具类:
ServiceExceptionUtil.exception(ErrorCodeConstants.GOODS_NOT_EXIST);
2. 禁止直接在代码中写数字错误码,全部引用常量;
3. 捕获Feign远程调用异常时,透传远端错误码与提示文案;
4. 前端接收错误码,可根据特定错误码做页面特殊处理(如跳转登录、弹窗提示)。
## 五、禁止事项
❌ 禁止使用重复错误码;
❌ 禁止硬编码数字错误码,必须引用常量;
❌ 禁止文案暴露底层技术、数据库、服务名称;
❌ 禁止跨模块混用错误码分段,严格按区间分配;
❌ 禁止新增BPM流程相关错误码分段。
---
description: 分布式幂等注解 @Idempotent 使用规范,基于Redis实现微服务防重复提交
globs: ["**/controller/**/*.java"]
alwaysApply: false
---
# 冲突优先级声明
Controller三层规范、Java编码规范优先级高于本文件。
# 分布式幂等防重复提交规范
## 一、注解基础说明
使用项目自定义 `@Idempotent` 注解,基于Redis实现分布式幂等控制,防止用户快速重复点击、网络重试造成重复新增、重复扣款、重复生成数据问题,适配微服务多实例集群环境。
## 二、注解属性配置规范
1. expireTime:幂等key过期时间,单位秒;
- 新增、编辑表单:默认5秒;
- 提交复杂业务、导出任务:设置30~60秒;
2. message:重复提交时返回的提示文案,示例:"请勿重复提交表单";
3. keyType:幂等key生成策略:
- TOKEN:基于用户登录Token + 接口路径(表单页面通用);
- PARAM:基于指定请求参数(唯一编码、订单号等唯一性字段)。
## 三、强制添加幂等注解的接口
1. POST /create 新增业务数据接口;
2. PUT /update 修改核心业务数据接口;
3. 状态变更、数据生成、批量处理接口;
4. APP端表单提交、订单创建类接口;
## 四、使用约束
1. 注解仅添加在Controller接口方法上;
2. 所有面向用户提交、可重复点击的写接口,必须配置@Idempotent;
3. 读接口(分页查询、详情查询、导出)无需添加幂等注解;
4. Redis统一使用国产化分布式缓存,不依赖境外Redis商业版本;
5. 幂等key自动绑定当前登录用户,用户之间互不干扰。
## 五、禁止事项
❌ 新增、编辑、业务提交接口不添加幂等注解,存在重复提交风险;
❌ 自定义本地内存锁替代分布式Redis幂等,集群多实例失效;
❌ 幂等提示文案使用技术术语,必须使用通俗易懂业务提示;
❌ 导出、单纯查询接口滥用@Idempotent注解,浪费Redis资源。
---
description: Mapper接口与XML规范,适配达梦8分页、函数、语法
globs: ["**/*Mapper.java","**/*Mapper.xml"]
alwaysApply: false
---
# 冲突优先级声明
达梦数据库全局规则优先级最高,其次为Java编码规范。
# Mapper层开发规范(达梦8专属适配)
## 一、Mapper接口规范
1. 存放路径:mapper,命名 XxxMapper;
2. 自定义查询方法命名规范:
- selectXxxByXxx:单条件查询列表
- countXxxByXxx:统计数量
- deleteXxxBatch:批量删除
- updateXxxBatch:批量更新
4. 方法入参:单参数直接传;多参数使用@Param("xxx")注解;
5. 禁止在Mapper接口编写业务逻辑,仅做数据库CRUD操作。
## 二、Mapper XML 文件规范
1. XML与Mapper接口同目录,文件名与接口名完全一致 XxxMapper.xml;
2. namespace 严格对应Mapper接口全类名;
3. 通用字段复用sql片段,抽取公共查询列、通用条件:
<sql id="common_column">
id, creator, create_time, updater, update_time, deleted
</sql>
4. 分页查询统一使用达梦分页语法 OFFSET #{offset} LIMIT #{pageSize},禁止MySQL逗号分页;
5. 函数统一使用达梦内置函数 NVL、TO_CHAR、SYSDATE,禁止IFNULL、DATE_FORMAT、NOW();
6. 所有SQL关键字大写(SELECT、FROM、WHERE、LEFT JOIN、ORDER BY),字段、表名下划线小写;
7. 禁止写SELECT *,必须明确查询需要的字段,减少IO开销。
## 三、MyBatis-Plus Wrapper 查询规范
1. 业务查询统一使用 LambdaQueryWrapperX、LambdaUpdateWrapperX,项目封装适配达梦;
2. 等值查询:eq;模糊查询:like;范围查询:ge、le;
3. 多条件拼接使用链式调用,禁止硬编码SQL字符串;
4. 分页查询调用 mapper.selectPage(page, wrapper),分页参数由上层PageParam转换;
5. 批量操作优先使用BaseMapperX提供的批量方法:insertBatch、updateBatchById。
## 四、达梦适配强制约束
1. 不使用自增主键、序列,主键由框架雪花ID生成;
2. 关联查询多表时,表别名简洁(t1、t2),避免关键字冲突;
3. 文本模糊查询长度适配达梦VARCHAR,超长文本使用TEXT字段查询;
4. 批量操作单次数据量控制在500条以内,防止达梦事务压力过大;
5. 禁止在XML中使用MySQL专属注释、引擎、字符集配置。
## 五、Mapper开发禁止项
❌ 禁止继承原生BaseMapper,必须BaseMapperX;
❌ 禁止SELECT * 查询所有字段;
❌ 禁止MySQL分页、MySQL专属函数;
❌ 禁止循环调用Mapper单条操作,统一批量方法;
❌ 禁止在XML中硬编码租户ID、软删除条件,统一框架自动填充;
❌ 禁止存储过程、复杂函数在XML中调用,业务逻辑下沉Service层。
---
description: Java类、方法、数据库表、接口路径、权限标识全量命名规范(若依微服务+达梦8,无会议/BPM)
globs: ["**/*.java","**/*.sql","**/*.yml"]
alwaysApply: false
---
# 冲突优先级声明
达梦数据库规范、Java编码禁令优先级高于本文件。
# 全项目统一命名规范
## 一、Java类命名
| 类类型 | 命名格式 | 示例 |
| ---- | ---- | ---- |
| 数据库DO实体 | {业务}DO | GoodsDO |
| 创建更新请求VO | {业务}SaveReqVO | GoodsSaveReqVO |
| 分页查询请求VO | {业务}PageReqVO | GoodsPageReqVO |
| 响应VO | {业务}RespVO | GoodsRespVO |
| Feign远程DTO | {业务}DTO | GoodsDTO |
| Service接口 | {业务}Service | GoodsService |
| Service实现 | {业务}ServiceImpl | GoodsServiceImpl |
| Mapper接口 | {业务}Mapper | GoodsMapper |
| 转换类Convert | {业务}Convert | GoodsConvert |
| 枚举类 | {业务}Enum | GoodsStatusEnum |
| 错误码常量 | ErrorCodeConstants | 统一文件追加 |
| Controller后台 | {业务}AdminController | GoodsAdminController |
| Controller移动端APP | {业务}AppController | GoodsAppController |
## 二、Service方法命名统一标准
| 功能 | 方法名 | 返回值 |
| ---- | ---- | ---- |
| 新增创建 | create{Entity} | String(雪花ID) |
| 更新 | update{Entity} | void |
| 删除单条 | delete{Entity} | void |
| 批量删除 | delete{Entity}ListByIds | void |
| 根据ID查询(不存在抛异常) | get{Entity} | DO实体 |
| 根据ID查询(允许空) | get{Entity}IfExists | DO实体 |
| 分页查询 | get{Entity}Page | PageResult<DO> |
## 三、达梦8数据库命名规范
1. 业务表前缀 `business_`,格式 `business_{模块}_{业务}`,全小写蛇形;
示例:`business_goods_info`、`business_user_address`
2. 字段全小写蛇形,与DO驼峰字段一一映射;
3. 索引命名:普通索引 `idx_字段名`;唯一索引 `uk_字段名`;
4. 字典系统表复用若依自带 `sys_dict_type`、`sys_dict_data`,不新建字典表。
## 四、微服务接口路径命名
1. 管理后台接口:`/api/admin/{模块}/{业务}`
示例:`/api/admin/business/goods`
2. APP移动端接口:`/api/app/{模块}/{业务}`
示例:`/api/app/business/goods`
3. CRUD固定后缀:
创建 POST `/create`;更新 PUT `/update`;删除 DELETE `/delete`;
查询单条 GET `/get`;分页 GET `/page`;导出 GET `/export-excel`
## 五、权限标识命名(Sa-Token)
格式:`{模块}:{业务}:{操作}`
操作固定枚举:create / update / delete / query / export
示例:`business:goods:create`、`business:goods:query`
## 六、常量&魔法值命名
1. 业务状态全部枚举类,禁止硬编码数字;
2. 全局固定阈值、模板ID、字典Key统一放入XXXConstants常量类;
3. 错误码分段规范:
- system系统模块:1_001_xxx_xxx
- business业务模块:1_100_xxx_xxx
## 七、前端文件命名
1. Vue后台列表页面:index.vue;表单抽屉:XxxFormDrawer.vue;详情抽屉:XxxDetailDrawer.vue;
2. UniApp APP页面:短横线kebab-case命名;
3. API类型文件:types.ts;接口请求文件:index.ts。
---
description: 若依框架操作日志注解 @ApiAccessLog 使用规范
globs: ["**/controller/**/*.java"]
alwaysApply: false
---
# 冲突优先级声明
Controller三层规范、Java编码规范优先级高于本文件。
# 操作日志 @ApiAccessLog 使用规范
## 一、注解基础说明
使用若依内置注解 `@ApiAccessLog`,自动记录操作人、操作时间、接口地址、请求参数、操作类型、耗时,满足信创等保审计日志要求。
## 二、注解必填属性规范
1. title:必填,模块业务中文名称,例:"商品管理";
2. operateType:操作类型枚举,可选值:
- CREATE:新增
- UPDATE:编辑修改
- DELETE:删除
- EXPORT:导出Excel
- QUERY:查询(分页/详情)
3. saveRequestData:布尔值,默认true,记录请求参数;敏感接口(含身份证、手机号)设置为false,防止日志泄露隐私。
## 三、接口注解使用强制规则
1. 以下接口**必须添加@ApiAccessLog**:
- POST /create 新增
- PUT /update 编辑
- DELETE /delete 删除
- GET /export-excel 导出
2. 查询接口(分页、详情)按需添加,内部管理系统建议全部记录;APP端普通查询可省略日志注解;
3. 注解仅允许添加在Controller接口方法上,禁止在Service、Mapper层使用。
## 四、日志脱敏规范
1. 接口参数包含手机号、身份证、银行卡、家庭地址等敏感字段时:
1. @ApiAccessLog(saveRequestData = false) 关闭参数记录;
2. 或全局配置日志脱敏规则,自动隐藏敏感信息中间字符;
2. 生产环境日志持久化存储,保留至少6个月审计日志,符合信创等保三级要求。
## 五、禁止事项
❌ 新增/修改/删除/导出接口不添加操作日志注解;
❌ 在Service、Mapper、Convert等非Controller层使用日志注解;
❌ 敏感隐私接口完整记录明文身份证、手机号;
❌ 自定义日志打印替代框架统一@ApiAccessLog日志,分散审计日志。
## 4、01_java_ruoyi_cloud_architecture.mdc
```mdc
---
description: 若依RuoYi-Vue-Cloud微服务工程分层、模块分包、Nacos/Feign/Gateway规范(无BPM模块)
globs: ["**/*.java","**/pom.xml","**/application.yml","**/bootstrap.yml"]
alwaysApply: false
---
# 冲突优先级声明
达梦数据库、Java编码禁令优先级高于本文件;本文件规范优先级高于通用全栈协作规则。
# 若依微服务工程架构规范(RuoYi-Vue-Cloud)
## 一、标准模块拆分(移除ruoyi-bpm流程模块)
1. `ruoyi-gateway` 网关模块:路由转发、鉴权、跨域、限流、请求日志;
2. `ruoyi-system` 系统基础模块:用户、部门、角色、菜单、字典、操作日志;
3. `ruoyi-business-api` 业务公共API模块:Feign远程调用DTO、接口定义(仅接口、DTO,无业务实现);
4. `ruoyi-business-server` 业务实现服务模块:所有业务CRUD、ServiceImpl、Mapper、DO;
5. `ruoyi-common` 通用工具模块:常量、工具类、异常、枚举、全局返回体;
6. `ruoyi-admin` 管理后台前端;`ruoyi-app` UniApp移动端前端。
## 二、包结构标准(business-server业务模块)
com.ruoyi.business.{业务模块名}
├── controller 业务控制器(统一继承 BaseController,区分后台 / APP 接口)
├── domain 数据库实体 DO(达梦表映射实体,替换旧 dal/dataobject)
├── domain/vo 各类vo
├── mapper Mapper 接口(MyBatis-Plus 接口)
├── service
│ ├── impl ServiceImpl 业务实现类
│ └── 业务 Service 接口
├── convert 对象转换 Convert 类
├── enums 业务枚举、错误码常量
├── util 业务工具类
ruoyi-modules/ruoyi-busi/src/main/resources
├── mapper/busi Mapper.xml SQL 映射文件
├── application-dev.yml 开发环境配置
├── bootstrap.yml 启动配置
## 三、微服务核心组件规范
### 1. Nacos配置中心
1. 所有环境配置(数据库连接、Redis、Feign超时、线程池)存入Nacos;
2. bootstrap.yml仅配置Nacos地址、命名空间、集群;application.yml仅少量本地默认值;
3. 区分开发、测试、生产Nacos命名空间,生产配置加密存储(国产加密算法);
4. 达梦数据库连接池配置统一在Nacos,适配达梦驱动参数。
### 2. Feign远程调用(跨模块)
1. 跨服务调用仅允许通过 \`ruoyi-business-api\` 定义Feign接口;
2. API模块仅存放接口、DTO数据传输对象,无任何业务实现代码;
3. Server模块之间禁止直接依赖,只能依赖对应API模块;
4. Feign调用异常统一捕获,使用若依全局异常处理,返回标准化CommonResult;
5. Feign超时、重试策略在Nacos统一配置,适配微服务分布式场景。
### 3. Gateway网关
1. 所有接口请求统一经过网关,不允许服务直连访问;
2. 网关统一处理Sa-Token鉴权、跨域、接口限流、请求参数脱敏;
3. 路由规则区分admin后台、app移动端、内部服务接口;
4. 网关日志记录请求来源、耗时、操作人,满足信创等保审计要求。
### 4. Sa-Token 微服务鉴权
1. 管理后台、APP端使用两套独立Token体系,权限隔离;
2. 接口必须添加 \`@PreAuthorize("@ss.hasPermission('模块:业务:操作')")\` 权限校验;
3. APP移动端仅开放查询、提交保存等基础权限,禁止后台管理类权限;
4. 分布式会话存储Redis,适配多实例微服务集群。
## 四、微服务部署&信创适配
1. 所有服务打包为jar镜像,支持鲲鹏/飞腾国产CPU容器化部署;
2. 中间件国产化:Nacos国产适配版、东方通/TongWeb替代Tomcat;
3. Redis使用国产分布式缓存,禁用海外Redis企业版;
4. 服务日志输出适配国产日志采集工具,日志脱敏敏感信息;
5. 容器镜像不依赖海外Docker镜像源,全部本地化信创镜像。
## 五、模块依赖禁止事项
❌ 禁止server模块互相直接依赖;跨模块仅依赖xxx-api;
❌ 禁止将业务实现代码写入api模块;
❌ 禁止硬编码环境地址、数据库连接,全部Nacos配置;
❌ 禁止Feign接口传DO数据库实体,统一使用隔离DTO;
❌ 禁止APP端Controller开放后台管理权限接口;
❌ 禁止微服务多实例本地缓存存储状态,分布式状态统一Redis;
❌ 禁止引入Flowable、BPM流程相关依赖包。
\ No newline at end of file
---
description: Controller、Service、ServiceImpl三层代码模板规范,微服务鉴权、多租户适配
globs: ["**/controller/**/*.java","**/service/**/*.java"]
alwaysApply: false
---
# 冲突优先级声明
Java编码、达梦实体规范优先级高于本文件。
# Controller & Service & ServiceImpl 三层开发规范
## 一、Controller 分层规范
### 1. 基础约束
1. 存放路径:controller/;
2. AdminController:@RestController + @RequestMapping("/api/admin/business/xxx");
3. AppController:@RestController + @RequestMapping("/api/app/business/xxx");
4. 统一添加 @Tag 接口文档注解,标注模块名称;
5. 依赖注入仅注入对应Service,禁止直接注入Mapper、Feign(Feign在Service层注入);
6. 接口权限校验:@PreAuthorize("@ss.hasPermission('business:goods:query')");
7. APP端接口不添加后台管理类权限标识,仅做登录Token校验。
### 2. 标准CRUD接口模板
1. 新增 POST /create:入参SaveReqVO,返回雪花ID;添加@Idempotent、@ApiAccessLog;
2. 更新 PUT /update:入参SaveReqVO(携带id);添加@Idempotent、@ApiAccessLog;
3. 删除 DELETE /delete/{id}:路径ID,添加@ApiAccessLog;
4. 分页查询 GET /page:入参PageReqVO,返回PageResult<XxxRespVO>;
5. 单条详情 GET /get/{id}:返回XxxRespVO;
6. 导出 GET /export-excel:分页查询数据,导出Excel,添加导出权限校验。
### 3. Controller禁止项
❌ 禁止Controller编写业务逻辑、数据库查询;
❌ 禁止Controller捕获业务异常,全局统一异常处理器处理;
❌ 禁止Controller直接注入Mapper、Feign接口;
❌ 禁止Admin与APP接口写在同一个Controller;
❌ 禁止接口路径、权限标识混用后台与移动端。
## 二、Service 接口规范
1. 存放路径:service包,命名 XxxService;
2. 仅定义业务抽象方法,不编写实现逻辑;
3. 方法返回值规范:
- 新增:String(雪花ID)
- 更新/删除:void
- 单条查询:XxxDO(不存在抛异常)
- 分页查询:PageResult<XxxDO>
4. 所有方法添加中文Javadoc注释,写明入参、返回值、异常场景;
5. 跨服务远程调用方法,在Service接口定义对应方法。
## 三、ServiceImpl 实现类规范
1. 存放路径:service/impl,命名 XxxServiceImpl,实现XxxService;
2. 添加 @Service 注解;
3. 依赖注入:@Resource 注入Mapper、Feign接口、其他Service;
4. 业务分层逻辑:
1. 参数校验(非空、长度、状态合法性);
2. 数据库CRUD操作,批量数据处理;
3. 跨服务Feign远程调用;
4. 数据转换DO ↔ VO/DTO;
5. 组装分页、返回结果;
5. 多租户自动过滤:使用MyBatis-Plus租户插件,无需手动拼接租户条件;
6. 不存在数据统一抛出业务异常,禁止返回null。
## 四、通用三层统一约束
1. 入参校验统一使用Hibernate Validator注解,Controller层自动校验;
2. 所有分页返回统一包装 PageResult,包含总条数、当前页、数据列表;
3. 时间、创建人等公共字段由MyBatis-Plus自动填充,无需手动set;
4. 软删除统一框架逻辑删除,ServiceImpl不手动修改deleted字段。
---
description: 若依Vue3管理后台前端规范(Element Plus)
globs: ["**/ruoyi-admin/**/*.vue","**/ruoyi-admin/**/*.ts"]
alwaysApply: false
---
# 冲突优先级声明
全局前后端协作规范优先级高于本文件。
# 若依Vue3后台前端开发规范
## 一、页面目录结构规范
页面存放路径 `views/{业务模块}/`,目录拆分:
1. index.vue:列表主页面(搜索栏、表格、新增/编辑弹窗入口);
2. XxxFormDrawer.vue:新增、编辑抽屉表单;
3. XxxDetailDrawer.vue:详情查看抽屉;
4. components/:页面内部复用小型组件,不全局公用;
5. api/:当前模块接口请求文件;
6. types.ts:当前模块TS类型定义。
## 二、页面基础框架规范
统一使用项目封装通用列表组件 `SqSearchTableFrame`,内置搜索区、表格、分页、新增/删除按钮插槽;
1. 搜索表单使用el-form-item,搜索项控制在6个以内,多余折叠;
2. 表格列使用el-table-column,字典状态列使用 <dict-tag /> 自动翻译;
3. 表格操作列统一封装操作按钮组件,区分查看、编辑、删除;
4. 删除、批量删除按钮绑定二次确认弹窗,提示用户确认操作;
5. 分页统一使用框架封装分页组件,参数pageNum、pageSize与后端PageReqVO对齐。
## 三、表单抽屉规范
1. 新增/编辑共用一套FormDrawer组件,通过入参id区分新增/编辑;
2. 表单校验使用el-form内置rules校验,必填项标红*;
3. 下拉选择、状态选择统一使用字典接口回显,禁止硬编码选项;
4. 表单提交统一调用封装api,成功后关闭抽屉并刷新表格列表;
5. 复杂多行数据使用el-table内嵌表单行,支持新增、删除子行。
## 四、TS类型规范
1. types.ts 统一定义PageReq、SaveReq、Resp类型,与后端VO字段完全一致;
2. 所有ID字段定义为string,避免雪花ID数字精度丢失;
3. 状态枚举直接复用后端字典编码,前端不单独维护状态数字;
4. 接口请求统一封装axios工具,请求参数、返回值绑定TS类型。
## 五、前端通用禁止项
❌ 禁止页面硬编码字典状态、业务枚举数字;
❌ 禁止手动拼接接口地址,统一api文件导出请求方法;
❌ 禁止表单不做前端必填校验,仅依赖后端校验;
❌ 禁止表格操作无二次确认弹窗(删除、批量删除);
❌ 禁止TS类型中ID使用number类型,防止雪花ID精度丢失。
---
description: 全项目代码通用强制自检清单,所有Java、Vue、UniApp、SQL文件全局生效
globs: ["**/*.java","**/*.vue","**/*.ts","**/*.sql","**/*.xml","**/*.vue"]
alwaysApply: true
---
# 冲突优先级声明
若本规则与其他专项规则冲突,专项业务规则优先级高于本文件;达梦数据库、Java编码禁令、信创约束拥有最高不可覆盖优先级。
# 通用代码强制自检清单(若依微服务+达梦8+信创,无会议/BPM)
## 一、Java 通用红线
1. 依赖注入统一 @Resource,禁止 @Autowired;
2. 禁止连环set赋值,DO/VO全部使用@Builder链式构建;
3. 禁止手写getter/setter,统一Lombok @Data;
4. 非空判断统一Hutool工具类(StrUtil/CollUtil),禁止裸判空;
5. 禁止魔法数字/字符串,统一枚举、常量类;
6. 多层if嵌套改用卫语句,禁止深度嵌套;
7. 循环内禁止调用Mapper,统一批量操作;
8. 时间统一 LocalDateTime,禁止 Date/Timestamp;
9. 所有业务异常统一 ServiceExceptionUtil,禁止直接new RuntimeException;
10. Service查询无数据必须抛异常,禁止return null;
11. Controller禁止try-catch,使用若依全局异常处理器;
12. Controller禁止直接注入Mapper,仅允许注入Service;
13. 微服务跨模块调用仅允许Feign DTO远程调用,禁止直接依赖对方server模块;
14. 所有新增表/字段必须适配达梦8语法,禁止MySQL专属函数;
15. 项目无BPM流程、会议预约相关业务,禁止新增Flowable依赖、审批监听、流程表单代码。
## 二、SQL & 达梦8 强制红线
1. 主键统一String雪花ID,达梦8禁止自增ID,不使用序列作为业务主键;
2. 时间字段使用达梦 TIMESTAMP,禁止 TIMESTAMPTZ;
3. 分页使用达梦分页语法,禁止MySQL LIMIT/OFFSET逗号写法;
4. 表名、字段名全部小写蛇形,规避达梦关键字;
5. 必须包含租户、软删除、创建人、创建时间等框架字段;
6. 字典初始化SQL适配达梦insert语法,兼容信创达梦驱动;
7. 禁止使用MySQL专属函数:IFNULL、DATE_FORMAT等,替换达梦对应函数;
8. 不创建会议、审批流程相关数据表、索引、初始化数据。
## 三、前端双端通用红线(管理后台Vue3 + UniApp APP)
1. ID统一string类型,禁止number,避免雪花ID精度丢失;
2. 表单基础校验使用el-form/uni-form内置提示,业务逻辑弹窗提示;
3. 禁止页面硬编码魔法状态、文本,统一枚举/字典翻译;
4. API请求统一封装若依axios请求,禁止原生fetch/axios裸调用;
5. 所有删除、批量操作增加二次确认弹窗;
6. APP端适配国产安卓系统,避免闭源第三方SDK;
7. 页面类型区分:管理后台页面、APP表单页面,规范目录拆分;
8. 不开发流程审批、会议预约类页面、弹窗、表单组件。
## 四、信创强制约束(全代码通用)
1. 第三方依赖优先选用国产化开源包,剔除国外闭源组件;
2. SQL脚本、配置文件兼容国产服务器(鲲鹏、飞腾CPU);
3. JDK统一使用国产龙芯/鲲鹏适配OpenJDK,禁止Oracle JDK;
4. 中间件使用国产东方通、金蝶,不使用Tomcat商业版、WebLogic;
5. 打包产物支持信创容器镜像,无海外镜像依赖;
6. 所有功能无依赖境外API、境外存储服务。
## 五、微服务通用约束
1. 多模块拆分遵循若依微服务标准:gateway、system、business、api;
2. 远程调用统一Feign接口,DTO隔离,server模块不互相依赖;
3. 配置全部存入Nacos,禁止本地yml硬编码环境配置;
4. 接口路径统一 /api/{模块}/{功能},网关统一路由转发;
5. 权限标识遵循 模块:业务:操作 格式,适配若依Sa-Token鉴权;
6. 分布式防重复提交使用Redis幂等注解,适配微服务多实例。
---
description: 达梦8 DM8数据库全局强制规范,信创数据库最高优先级规则
globs: ["**/*.sql","**/*DO.java","**/*Mapper.xml"]
alwaysApply: true
---
# 达梦8(DM8)数据库规范 信创适配
## 一、达梦 8 字段类型强制约束
1. 雪花 ID 主键:Java String,达梦 `VARCHAR(20)`**禁止 BIGINT 自增、禁止序列做主键**
2. 状态、枚举值:Java Integer,达梦 `INT`
3. 短文本名称:`VARCHAR(100)`,长描述 `VARCHAR(500)`
4. 时间统一 `TIMESTAMP`**禁止 TIMESTAMPTZ、DATE 单独存储时分秒**
5. 布尔值使用 `BIT`,0/1;
6. JSON 数组、复杂集合存储使用 `TEXT`,配合 MyBatis-Plus JacksonTypeHandler;
7. 不使用达梦大字段 CLOB/BLOB,业务文本统一 VARCHAR/TEXT。
## 二、DDL 脚本达梦专属规范
1. 表名、字段名全部小写蛇形命名,规避达梦系统关键字;
2. 注释使用 `COMMENT ON TABLE` / `COMMENT ON COLUMN` 达梦标准语法;
3. 新增字段使用 `ALTER TABLE 表名 ADD COLUMN xxx 类型 约束 COMMENT '注释'`
4. 建表语句包裹 `BEGIN;``COMMIT;`,事务执行;
5. 索引创建语法:`CREATE INDEX idx_xxx ON table_name(col);`;唯一索引 `CREATE UNIQUE INDEX`
6. 达梦分页语法:`OFFSET x LIMIT y`,禁止 MySQL LIMIT 0,10 逗号写法;
7. 达梦函数替换 MySQL 函数:
- IFNULL → NVL
- DATE_FORMAT → TO_CHAR
- NOW() → SYSDATE
- SUBSTRING → SUBSTR
## 三、MyBatis-Plus 适配达梦 8
1. Mapper 继承 `BaseMapperX`(项目封装适配达梦),禁止原生 BaseMapper;
2. 分页使用 `LambdaQueryWrapperX` 空值安全条件,达梦分页自动适配;
3. 禁止 MySQL 专属 XML SQL,所有原生 SQL 必须兼容达梦;
4. 主键注解统一 `@TableId(type = IdType.ASSIGN_ID)`,达梦全局关闭自增;
5. 软删除使用 MyBatis-Plus 逻辑删除,达梦 BIT 字段自动适配。
## 四、达梦 8 信创部署约束
1. 驱动包使用达梦官方国产化驱动 DmJdbcDriver,不使用兼容 MySQL 驱动;
2. 数据库字符集统一 GB18030,适配信创中文存储;
3. 排序规则统一达梦中文排序,避免中文查询乱序;
4. 生产环境达梦 8 部署在鲲鹏 / 飞腾国产服务器,禁止 x86 海外服务器;
5. 数据库备份脚本适配达梦 dexp/dimp 工具,不使用 mysqldump;
6. 账号权限最小化,业务账号仅拥有 DML 权限,DDL 仅 DBA 可执行,满足等保信创要求。
## 五、数据库开发禁止事项
❌ 禁止使用自增主键、序列作为业务主键;
❌ 禁止 MySQL 专属函数、分页语法;
❌ 禁止字段名、表名使用达梦保留关键字不加转义;
❌ 禁止存储过程、触发器承载大量业务逻辑,业务全部下沉 Java 服务层;
❌ 禁止 TEXT/CLOB 存储超长业务文本,拆分字段;
❌ 禁止手动更新 deleted 软删除字段,使用框架内置逻辑删除方法;
❌ 禁止达梦数据库存储境外加密、境外第三方数据;
❌ 禁止创建会议、审批流程相关数据表、存储过程、触发器。
---
description: 若依微服务前后端协作规范(Vue管理后台 + UniApp APP双端,无会议/BPM)
globs: ["**/*.java","**/*.vue","**/*.ts","**/*.sql","**/*.js"]
alwaysApply: true
---
# 冲突优先级声明
达梦数据库、Java编码、信创部署规则优先级高于本文件;若依微服务专项架构规则冲突时以专项文件为准。
# 若依微服务全栈协作规范
## 一、前后端字段映射标准(统一适配达梦8)
### TS类型 → Java类型 → 达梦8字段映射
| 前端TS类型 | Java实体类型 | 达梦8列类型 | 说明 |
| ---- | ---- | ---- | ---- |
| string(雪花ID) | String | VARCHAR(20) | 主键,防止精度丢失 |
| number(状态枚举) | Integer | INT | 业务状态、字典值 |
| string(名称文本) | String | VARCHAR(100) | 名称、标题 |
| string(长描述) | String | VARCHAR(500) | 备注、描述 |
| string(ISO时间) | LocalDateTime | TIMESTAMP | 统一时间类型 |
| boolean | Boolean | BIT | 布尔标识 |
| string[] | List<String> | TEXT | JSON数组存储,JacksonTypeHandler |
## 二、前端页面推导后端代码流程
1. 管理后台Vue页面、UniApp APP页面,先提取全部表单字段、列表查询条件、接口请求;
2. 区分双端接口隔离:管理后台接口、APP移动端独立接口,禁止复用同一套Controller;
3. 后端分层严格遵循:SQL DDL(达梦语法)→ DO → Mapper → VO → Controller → Service;
4. 跨模块查询使用Feign远程调用,不直接操作其他业务Mapper;
5. 字典、枚举前后端同步,后端存数字code,前端通过若依字典组件自动翻译中文;
6. 分页统一PageResult返回,前端PageReqVO继承若依PageParam。
## 三、微服务接口路径规范
1. 管理后台接口前缀:`/api/admin/{module}/{business}`
2. APP移动端接口前缀:`/api/app/{module}/{business}`
3. 公共基础模块接口:`/api/common/{function}`
4. CRUD固定后缀:/create /update /delete /get /page /export-excel
## 四、双端代码产出区分
1. Vue管理后台:基于Element Plus,SqSearchTableFrame标准列表框架;
2. UniApp APP端:uni-form、uni-data-select、uni-list等原生组件,适配移动端触控;
3. 公共类型统一抽离api/types.ts,后台与APP类型文件隔离,不共用;
4. APP端不展示复杂后台管理字段(租户ID、创建人、操作日志等)。
## 五、数据库字段对齐强制要求
1. DO驼峰字段 ↔ 达梦表下划线字段完全一一对应;
2. SaveReqVO覆盖前端所有可编辑字段,不含框架内置字段;
3. RespVO增加富化展示字段(关联名称、字典中文),DO不存储;
4. 新增字段必须同步:达梦ALTER脚本、DO实体、前后端VO类型。
## 六、信创前后端适配要求
1. 前端打包产物无海外CDN资源,静态资源本地化;
2. UniApp打包支持国产安卓系统、国产芯片设备;
3. 前端加密、工具类使用国产加密算法(SM2/SM3/SM4),禁用RSA国际算法;
4. 接口日志脱敏手机号、身份证等敏感信息,满足信创等保规范。
---
description: Java编码八大强制红线禁令(最高优先级Java规则,达梦、信创规则除外,无BPM/会议)
globs: ["**/*.java"]
alwaysApply: false
---
# 冲突优先级声明
本文件为Java代码最高强制约束,仅达梦数据库、信创部署规则优先级高于本文件,其余所有Java相关规则冲突时以本文件为准。
# Java编码强制八大禁令(若依微服务+达梦8+信创)
## 禁令1:禁止连环set硬赋值,统一@Builder链式构建
❌ 错误:new DO() 后逐行setXxx
✅ 正确:DO实体添加@Builder、@NoArgsConstructor、@AllArgsConstructor,使用DO.builder().field(val).build()
## 禁令2:禁止手写getter/setter,统一Lombok @Data
❌ 手动编写get/set方法
✅ 所有DO、VO、DTO统一使用@Data,配合@EqualsAndHashCode(callSuper = true)
## 禁令3:依赖注入统一@Resource,完全禁止@Autowired
❌ 混用@Autowired和@Resource
✅ Controller、ServiceImpl中所有Mapper、Service、Feign接口全部使用@Resource注入
## 禁令4:非空判断禁止裸判断,统一Hutool工具类
❌ if(str != null && !str.equals("")) / if(list != null && list.size()>0)
✅ 字符串:StrUtil.isNotBlank();集合:CollUtil.isNotEmpty();对象:ObjectUtil.isNotNull()
## 禁令5:禁止魔法数字、魔法字符串,统一枚举/常量类
❌ 直接写if(status == 0)、return "goods_offline"
✅ 业务状态定义枚举,固定文本、阈值写入XXXConstants常量类
## 禁令6:禁止多层if-else嵌套,卫语句优先,复杂状态使用策略模式
❌ 超过2层if嵌套
✅ 所有边界、校验条件前置,提前return/抛异常,消除else分支;状态机多分支采用策略模式
## 禁令7:循环内部禁止调用Mapper单条操作,统一批量方法
❌ for循环中mapper.insert() / mapper.deleteById()
✅ 批量插入insertBatch、批量删除deleteBatchIds、条件批量更新wrapper更新,单次DB交互
## 禁令8:时间类型统一LocalDateTime,完全禁止Date、Timestamp
❌ java.util.Date、java.sql.Timestamp
✅ DO、VO、DTO时间字段全部使用LocalDateTime,达梦8 TIMESTAMP字段对应
# 补充强制编码约束
1. 业务异常统一 ServiceExceptionUtil.exception(ErrorCode),禁止直接new RuntimeException、IllegalArgumentException;
2. Service查询无数据必须抛不存在异常,禁止return null区分不存在;
3. Controller禁止编写try-catch捕获业务异常,使用若依全局异常处理器;
4. Controller禁止直接注入Mapper,仅允许注入对应Service;
5. 跨模块调用仅允许注入Feign API接口,禁止依赖对方ServiceImpl;
6. 所有类、Service接口方法、DO字段必须添加中文Javadoc注释;
7. 错误提示文案使用业务操作人员易懂中文,禁止技术术语、数据库字段名、英文编码;
8. 新增/修改/删除/导出接口必须添加@ApiAccessLog操作日志注解;
9. 创建、状态变更接口必须添加@Idempotent幂等注解防重复提交;
10. 所有DO主键统一String雪花ID,@TableId(type = IdType.ASSIGN_ID),适配达梦8;
11. 禁止引入Flowable、BPM流程审批相关类、注解、依赖。
---
description: 对象转换Convert类规范,DO/VO/DTO分层隔离转换
globs: ["**/*Convert.java"]
alwaysApply: false
---
# 冲突优先级声明
Java编码规范、达梦实体规则优先级高于本文件。
# 对象转换Convert类开发规范
## 一、基础规范
1. 存放路径:convert包下,命名 XxxConvert;
2. 类添加 @Mapper(componentModel = "spring") 注解,使用MapStruct自动生成转换实现;
3. 所有转换方法为静态/实例抽象方法,禁止手动编写set赋值转换逻辑;
4. 转换类只做对象属性拷贝,不编写业务计算、数据查询逻辑。
## 二、标准转换方法定义
### 1. DO ↔ RespVO
RespVO toRespVO(DO entity);
List<RespVO> toRespVOList(List<DO> list);
### 2. SaveReqVO → DO
DO toDO(SaveReqVO reqVO);
### 3. DO ↔ Feign DTO(跨服务传输)
DTO toDTO(DO entity);
DO toDO(DTO dto);
List<DTO> toDTOList(List<DO> list);
## 三、特殊字段转换处理规则
1. 字典翻译、关联名称等富化字段:转换基础拷贝后,在Service层单独赋值,Convert不处理;
2. 时间字段 LocalDateTime 自动映射,无需额外转换配置;
3. 雪花ID String类型自动映射,无精度丢失问题;
4. 枚举字段:统一存储Integer编码,转换时直接拷贝数字,中文翻译在VO层处理;
5. 集合List<String> JSON字段:MyBatis类型处理器处理,转换层直接拷贝。
## 四、MapStruct 注解配置规范
1. 字段名称完全一致时,无需额外@Mapping;
2. 字段名称不一致时,添加映射注解:
@Mapping(source = "userId", target = "uid")
3. 忽略不需要拷贝的字段:
@Mapping(target = "richName", ignore = true)
4. 禁止使用复杂表达式在@Mapping中,复杂逻辑交给Service处理。
## 五、Convert通用禁止项
❌ 禁止手动new对象+连环set做转换,必须MapStruct自动生成;
❌ 禁止在转换方法中调用Mapper、Feign、Service查询数据;
❌ 禁止转换类添加业务工具方法、常量;
❌ 禁止跨模块直接转换VO与DO,跨服务只能通过DTO中转;
❌ 禁止转换方法返回null,空集合统一返回空列表Collections.emptyList()。
---
description: 业务枚举、数据字典前后端同步规范,适配若依字典+达梦初始化SQL
globs: ["**/*Enum.java","**/*.sql"]
alwaysApply: false
---
# 冲突优先级声明
达梦数据库规范、Java编码规范优先级高于本文件。
# 枚举 & 数据字典同步开发规范
## 一、业务枚举开发规范
1. 存放路径:enums包,命名 XxxEnum;
2. 枚举固定结构:code(Integer编码)、desc(中文描述);
3. 基础方法:getCode()、getDesc(),提供静态工具方法根据code获取枚举;
4. 所有业务状态、类型、标识全部使用枚举,禁止硬编码魔法数字;
5. 枚举添加中文类注释、每个实例添加单行注释说明业务含义;
6. 禁止枚举中编写数据库查询、远程调用、复杂业务逻辑。
示例标准枚举:
public enum GoodsStatusEnum {
UP(1, "上架"),
DOWN(2, "下架");
private final Integer code;
private final String desc;
GoodsStatusEnum(Integer code, String desc) {
this.code = code;
this.desc = desc;
}
// getter、根据code查询工具方法
}
## 二、若依数据字典规范
1. 系统字典复用内置两张表:sys_dict_type(字典类型)、sys_dict_data(字典项);
2. 字典类型编码规则:`business_xxx`,区分系统字典与业务字典;
3. 达梦初始化SQL规范:
1. 先判断字典类型不存在再插入;
2. 批量插入字典项,适配达梦INSERT多行语法;
3. 所有字符串值使用单引号,注释符合达梦语法;
4. 前后端同步规则:
- 后端存储数字code;
- 管理后台Vue使用 <dict-tag /> 组件自动翻译中文;
- UniApp APP端封装全局字典翻译工具,根据code展示中文;
5. 区分使用场景:
- 固定不变、全项目通用状态:优先使用Java枚举;
- 支持后台动态新增修改的分类、标签:使用数据库数据字典。
## 三、枚举与字典同步约束
1. 若业务同时使用枚举+字典,必须保证code编码完全一致,避免前后端翻译错乱;
2. 新增业务状态时,同步更新枚举类、字典初始化SQL、前端字典选项;
3. 禁止枚举code与字典项value不一致,统一Integer数字编码;
4. 生产环境字典初始化脚本仅执行新增,不修改已有字典项,避免线上数据变更风险。
## 四、禁止事项
❌ 禁止业务状态硬编码数字,必须枚举/字典;
❌ 禁止字典初始化SQL使用MySQL专属语法,严格适配达梦;
❌ 禁止枚举存储字符串编码,统一Integer;
❌ 禁止前端硬编码状态文本,全部依赖枚举/字典翻译;
❌ 禁止动态可变业务分类使用Java枚举,必须数据库字典。
---
description: DO/ReqVO/RespVO/DTO实体规范,适配达梦8雪花ID、字段类型映射
globs: ["**/*DO.java","**/*VO.java","**/*DTO.java"]
alwaysApply: false
---
# 冲突优先级声明
达梦数据库全局规则、Java编码禁令优先级高于本文件。
# DO、VO、DTO 实体开发规范(达梦8适配)
## 一、DO 数据库实体规范
1. 存放路径:domain/dataobject,命名 Xxx;
2. 基础注解:
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@TableName("xxx")
3. 主键字段统一:
@TableId(type = IdType.ASSIGN_ID)
private String id;
4. 必须包含框架通用字段:creator、createTime、updater、updateTime、deleted;
5. 字段类型严格遵循达梦8映射规则,时间统一LocalDateTime,布尔使用Boolean;
6. 复杂数组/集合字段添加类型处理器注解:
@TableField(typeHandler = JacksonTypeHandler.class)
private List<String> tagList;
7. 禁止在DO中添加业务计算字段、字典翻译字段,翻译逻辑统一在RespVO处理;
8. 所有字段添加中文注释,说明业务含义。
## 二、ReqVO 请求VO规范
### 1. SaveReqVO(新增/编辑共用)
1. 命名:XxxSaveReqVO;
2. 仅包含前端可编辑业务字段,**不包含id、租户、创建人、创建时间、软删除**等框架字段;
3. 字段校验注解统一使用Hibernate Validator:@NotBlank、@NotNull、@Size、@Min、@Max;
4. 时间字段统一LocalDateTime;ID、编码类文本统一String;
### 2. PageReqVO(分页查询)
1. 命名:XxxPageReqVO,继承若依框架 PageParam;
2. 仅包含分页参数、业务模糊查询、状态筛选条件;
3. 禁止分页VO携带大文本、复杂数组参数;
4. 所有查询条件允许为空,不强制@NotNull。
## 三、RespVO 返回VO规范
1. 命名:XxxRespVO;
2. 包含DO全部基础字段,额外增加富化展示字段(如分类名称、字典中文名称、关联业务名称);
3. 富化字段仅用于前端展示,不参与新增/编辑保存;
4. 时间统一LocalDateTime,序列化输出标准ISO格式;
5. 字典状态字段同时返回数字编码和中文翻译,方便前端展示。
## 四、Feign DTO 传输对象规范
1. 命名:XxxDTO,存放于ruoyi-business-api模块;
2. DTO仅存储跨服务传输必要字段,精简冗余字段;
3. 禁止将DO、VO直接作为Feign接口入参/返回值;
4. DTO不添加数据库相关注解(@TableName、@TableId等);
5. 基础注解仅保留@Data、@Builder,按需构造无参/全参构造。
## 五、实体通用禁止项
❌ 禁止DO直接返回前端,必须通过RespVO转换;
❌ 禁止SaveReqVO携带主键ID做新增操作;
❌ 禁止DTO中使用LocalDate、Date,统一LocalDateTime;
❌ 禁止实体字段使用基本类型(int、long、boolean),统一包装类型(Integer、Long、Boolean);
❌ 禁止在VO/DTO中编写业务逻辑方法,实体仅做数据载体。
---
description: 全局错误码分段管理规范,微服务多模块隔离
globs: ["**/ErrorCodeConstants.java"]
alwaysApply: false
---
# 冲突优先级声明
Java编码规范优先级高于本文件。
# 全局错误码常量规范
## 一、错误码分段规则(无BPM分段)
采用三段式数字编码:`模块段_子模块_序号`
1. system系统模块:1_001_001 ~ 1_001_999
用户、部门、角色、菜单、字典、登录权限相关错误;
2. business业务模块:1_100_001 ~ 1_999_999
所有自定义业务模块错误码,每个业务子模块分配100个序号区间;
3. 通用框架错误:1_000_001 ~ 1_000_999
参数校验、幂等、文件上传、导出、远程调用通用异常。
## 二、常量定义规范
1. 统一存放于 `ErrorCodeConstants.java` 常量类;
2. 常量命名:全大写,下划线分隔,业务含义清晰;
3. 常量值严格遵循分段编码,注释写明异常提示文案;
4. 示例:
// 商品模块-商品不存在
public static final Integer GOODS_NOT_EXIST = 1_100_001;
5. 同一业务模块错误码按业务流程顺序递增,预留间隔序号便于后续扩展;
6. 禁止重复错误码,新增错误码前检查已存在常量。
## 三、异常文案规范
1. 错误提示面向业务操作人员,使用通俗中文;
2. 禁止文案包含数据库字段名、技术术语、英文编码;
3. 参数校验类文案清晰指明错误字段,例:"商品名称不能为空";
4. 远程调用、服务异常文案屏蔽底层技术细节,统一友好提示。
## 四、使用规范
1. 业务抛出异常统一使用工具类:
ServiceExceptionUtil.exception(ErrorCodeConstants.GOODS_NOT_EXIST);
2. 禁止直接在代码中写数字错误码,全部引用常量;
3. 捕获Feign远程调用异常时,透传远端错误码与提示文案;
4. 前端接收错误码,可根据特定错误码做页面特殊处理(如跳转登录、弹窗提示)。
## 五、禁止事项
❌ 禁止使用重复错误码;
❌ 禁止硬编码数字错误码,必须引用常量;
❌ 禁止文案暴露底层技术、数据库、服务名称;
❌ 禁止跨模块混用错误码分段,严格按区间分配;
❌ 禁止新增BPM流程相关错误码分段。
---
description: 分布式幂等注解 @Idempotent 使用规范,基于Redis实现微服务防重复提交
globs: ["**/controller/**/*.java"]
alwaysApply: false
---
# 冲突优先级声明
Controller三层规范、Java编码规范优先级高于本文件。
# 分布式幂等防重复提交规范
## 一、注解基础说明
使用项目自定义 `@Idempotent` 注解,基于Redis实现分布式幂等控制,防止用户快速重复点击、网络重试造成重复新增、重复扣款、重复生成数据问题,适配微服务多实例集群环境。
## 二、注解属性配置规范
1. expireTime:幂等key过期时间,单位秒;
- 新增、编辑表单:默认5秒;
- 提交复杂业务、导出任务:设置30~60秒;
2. message:重复提交时返回的提示文案,示例:"请勿重复提交表单";
3. keyType:幂等key生成策略:
- TOKEN:基于用户登录Token + 接口路径(表单页面通用);
- PARAM:基于指定请求参数(唯一编码、订单号等唯一性字段)。
## 三、强制添加幂等注解的接口
1. POST /create 新增业务数据接口;
2. PUT /update 修改核心业务数据接口;
3. 状态变更、数据生成、批量处理接口;
4. APP端表单提交、订单创建类接口;
## 四、使用约束
1. 注解仅添加在Controller接口方法上;
2. 所有面向用户提交、可重复点击的写接口,必须配置@Idempotent;
3. 读接口(分页查询、详情查询、导出)无需添加幂等注解;
4. Redis统一使用国产化分布式缓存,不依赖境外Redis商业版本;
5. 幂等key自动绑定当前登录用户,用户之间互不干扰。
## 五、禁止事项
❌ 新增、编辑、业务提交接口不添加幂等注解,存在重复提交风险;
❌ 自定义本地内存锁替代分布式Redis幂等,集群多实例失效;
❌ 幂等提示文案使用技术术语,必须使用通俗易懂业务提示;
❌ 导出、单纯查询接口滥用@Idempotent注解,浪费Redis资源。
---
description: Mapper接口与XML规范,适配达梦8分页、函数、语法
globs: ["**/*Mapper.java","**/*Mapper.xml"]
alwaysApply: false
---
# 冲突优先级声明
达梦数据库全局规则优先级最高,其次为Java编码规范。
# Mapper层开发规范(达梦8专属适配)
## 一、Mapper接口规范
1. 存放路径:mapper,命名 XxxMapper;
2. 自定义查询方法命名规范:
- selectXxxByXxx:单条件查询列表
- countXxxByXxx:统计数量
- deleteXxxBatch:批量删除
- updateXxxBatch:批量更新
4. 方法入参:单参数直接传;多参数使用@Param("xxx")注解;
5. 禁止在Mapper接口编写业务逻辑,仅做数据库CRUD操作。
## 二、Mapper XML 文件规范
1. XML与Mapper接口同目录,文件名与接口名完全一致 XxxMapper.xml;
2. namespace 严格对应Mapper接口全类名;
3. 通用字段复用sql片段,抽取公共查询列、通用条件:
<sql id="common_column">
id, creator, create_time, updater, update_time, deleted
</sql>
4. 分页查询统一使用达梦分页语法 OFFSET #{offset} LIMIT #{pageSize},禁止MySQL逗号分页;
5. 函数统一使用达梦内置函数 NVL、TO_CHAR、SYSDATE,禁止IFNULL、DATE_FORMAT、NOW();
6. 所有SQL关键字大写(SELECT、FROM、WHERE、LEFT JOIN、ORDER BY),字段、表名下划线小写;
7. 禁止写SELECT *,必须明确查询需要的字段,减少IO开销。
## 三、MyBatis-Plus Wrapper 查询规范
1. 业务查询统一使用 LambdaQueryWrapperX、LambdaUpdateWrapperX,项目封装适配达梦;
2. 等值查询:eq;模糊查询:like;范围查询:ge、le;
3. 多条件拼接使用链式调用,禁止硬编码SQL字符串;
4. 分页查询调用 mapper.selectPage(page, wrapper),分页参数由上层PageParam转换;
5. 批量操作优先使用BaseMapperX提供的批量方法:insertBatch、updateBatchById。
## 四、达梦适配强制约束
1. 不使用自增主键、序列,主键由框架雪花ID生成;
2. 关联查询多表时,表别名简洁(t1、t2),避免关键字冲突;
3. 文本模糊查询长度适配达梦VARCHAR,超长文本使用TEXT字段查询;
4. 批量操作单次数据量控制在500条以内,防止达梦事务压力过大;
5. 禁止在XML中使用MySQL专属注释、引擎、字符集配置。
## 五、Mapper开发禁止项
❌ 禁止继承原生BaseMapper,必须BaseMapperX;
❌ 禁止SELECT * 查询所有字段;
❌ 禁止MySQL分页、MySQL专属函数;
❌ 禁止循环调用Mapper单条操作,统一批量方法;
❌ 禁止在XML中硬编码租户ID、软删除条件,统一框架自动填充;
❌ 禁止存储过程、复杂函数在XML中调用,业务逻辑下沉Service层。
---
description: Java类、方法、数据库表、接口路径、权限标识全量命名规范(若依微服务+达梦8,无会议/BPM)
globs: ["**/*.java","**/*.sql","**/*.yml"]
alwaysApply: false
---
# 冲突优先级声明
达梦数据库规范、Java编码禁令优先级高于本文件。
# 全项目统一命名规范
## 一、Java类命名
| 类类型 | 命名格式 | 示例 |
| ---- | ---- | ---- |
| 数据库DO实体 | {业务}DO | GoodsDO |
| 创建更新请求VO | {业务}SaveReqVO | GoodsSaveReqVO |
| 分页查询请求VO | {业务}PageReqVO | GoodsPageReqVO |
| 响应VO | {业务}RespVO | GoodsRespVO |
| Feign远程DTO | {业务}DTO | GoodsDTO |
| Service接口 | {业务}Service | GoodsService |
| Service实现 | {业务}ServiceImpl | GoodsServiceImpl |
| Mapper接口 | {业务}Mapper | GoodsMapper |
| 转换类Convert | {业务}Convert | GoodsConvert |
| 枚举类 | {业务}Enum | GoodsStatusEnum |
| 错误码常量 | ErrorCodeConstants | 统一文件追加 |
| Controller后台 | {业务}AdminController | GoodsAdminController |
| Controller移动端APP | {业务}AppController | GoodsAppController |
## 二、Service方法命名统一标准
| 功能 | 方法名 | 返回值 |
| ---- | ---- | ---- |
| 新增创建 | create{Entity} | String(雪花ID) |
| 更新 | update{Entity} | void |
| 删除单条 | delete{Entity} | void |
| 批量删除 | delete{Entity}ListByIds | void |
| 根据ID查询(不存在抛异常) | get{Entity} | DO实体 |
| 根据ID查询(允许空) | get{Entity}IfExists | DO实体 |
| 分页查询 | get{Entity}Page | PageResult<DO> |
## 三、达梦8数据库命名规范
1. 业务表前缀 `business_`,格式 `business_{模块}_{业务}`,全小写蛇形;
示例:`business_goods_info``business_user_address`
2. 字段全小写蛇形,与DO驼峰字段一一映射;
3. 索引命名:普通索引 `idx_字段名`;唯一索引 `uk_字段名`
4. 字典系统表复用若依自带 `sys_dict_type``sys_dict_data`,不新建字典表。
## 四、微服务接口路径命名
1. 管理后台接口:`/api/admin/{模块}/{业务}`
示例:`/api/admin/business/goods`
2. APP移动端接口:`/api/app/{模块}/{业务}`
示例:`/api/app/business/goods`
3. CRUD固定后缀:
创建 POST `/create`;更新 PUT `/update`;删除 DELETE `/delete`
查询单条 GET `/get`;分页 GET `/page`;导出 GET `/export-excel`
## 五、权限标识命名(Sa-Token)
格式:`{模块}:{业务}:{操作}`
操作固定枚举:create / update / delete / query / export
示例:`business:goods:create``business:goods:query`
## 六、常量&魔法值命名
1. 业务状态全部枚举类,禁止硬编码数字;
2. 全局固定阈值、模板ID、字典Key统一放入XXXConstants常量类;
3. 错误码分段规范:
- system系统模块:1_001_xxx_xxx
- business业务模块:1_100_xxx_xxx
## 七、前端文件命名
1. Vue后台列表页面:index.vue;表单抽屉:XxxFormDrawer.vue;详情抽屉:XxxDetailDrawer.vue;
2. UniApp APP页面:短横线kebab-case命名;
3. API类型文件:types.ts;接口请求文件:index.ts。
---
description: 若依框架操作日志注解 @ApiAccessLog 使用规范
globs: ["**/controller/**/*.java"]
alwaysApply: false
---
# 冲突优先级声明
Controller三层规范、Java编码规范优先级高于本文件。
# 操作日志 @ApiAccessLog 使用规范
## 一、注解基础说明
使用若依内置注解 `@ApiAccessLog`,自动记录操作人、操作时间、接口地址、请求参数、操作类型、耗时,满足信创等保审计日志要求。
## 二、注解必填属性规范
1. title:必填,模块业务中文名称,例:"商品管理";
2. operateType:操作类型枚举,可选值:
- CREATE:新增
- UPDATE:编辑修改
- DELETE:删除
- EXPORT:导出Excel
- QUERY:查询(分页/详情)
3. saveRequestData:布尔值,默认true,记录请求参数;敏感接口(含身份证、手机号)设置为false,防止日志泄露隐私。
## 三、接口注解使用强制规则
1. 以下接口**必须添加@ApiAccessLog**
- POST /create 新增
- PUT /update 编辑
- DELETE /delete 删除
- GET /export-excel 导出
2. 查询接口(分页、详情)按需添加,内部管理系统建议全部记录;APP端普通查询可省略日志注解;
3. 注解仅允许添加在Controller接口方法上,禁止在Service、Mapper层使用。
## 四、日志脱敏规范
1. 接口参数包含手机号、身份证、银行卡、家庭地址等敏感字段时:
1. @ApiAccessLog(saveRequestData = false) 关闭参数记录;
2. 或全局配置日志脱敏规则,自动隐藏敏感信息中间字符;
2. 生产环境日志持久化存储,保留至少6个月审计日志,符合信创等保三级要求。
## 五、禁止事项
❌ 新增/修改/删除/导出接口不添加操作日志注解;
❌ 在Service、Mapper、Convert等非Controller层使用日志注解;
❌ 敏感隐私接口完整记录明文身份证、手机号;
❌ 自定义日志打印替代框架统一@ApiAccessLog日志,分散审计日志。
## 4、01_java_ruoyi_cloud_architecture.mdc
```mdc
---
description: 若依RuoYi-Vue-Cloud微服务工程分层、模块分包、Nacos/Feign/Gateway规范(无BPM模块)
globs: ["**/*.java","**/pom.xml","**/application.yml","**/bootstrap.yml"]
alwaysApply: false
---
# 冲突优先级声明
达梦数据库、Java编码禁令优先级高于本文件;本文件规范优先级高于通用全栈协作规则。
# 若依微服务工程架构规范(RuoYi-Vue-Cloud)
## 一、标准模块拆分(移除ruoyi-bpm流程模块)
1. `ruoyi-gateway` 网关模块:路由转发、鉴权、跨域、限流、请求日志;
2. `ruoyi-system` 系统基础模块:用户、部门、角色、菜单、字典、操作日志;
3. `ruoyi-business-api` 业务公共API模块:Feign远程调用DTO、接口定义(仅接口、DTO,无业务实现);
4. `ruoyi-business-server` 业务实现服务模块:所有业务CRUD、ServiceImpl、Mapper、DO;
5. `ruoyi-common` 通用工具模块:常量、工具类、异常、枚举、全局返回体;
6. `ruoyi-admin` 管理后台前端;`ruoyi-app` UniApp移动端前端。
## 二、包结构标准(business-server业务模块)
com.ruoyi.business.{业务模块名}
├── controller 业务控制器(统一继承 BaseController,区分后台 / APP 接口)
├── domain 数据库实体 DO(达梦表映射实体,替换旧 dal/dataobject)
├── domain/vo 各类vo
├── mapper Mapper 接口(MyBatis-Plus 接口)
├── service
│ ├── impl ServiceImpl 业务实现类
│ └── 业务 Service 接口
├── convert 对象转换 Convert 类
├── enums 业务枚举、错误码常量
├── util 业务工具类
ruoyi-modules/ruoyi-busi/src/main/resources
├── mapper/busi Mapper.xml SQL 映射文件
├── application-dev.yml 开发环境配置
├── bootstrap.yml 启动配置
## 三、微服务核心组件规范
### 1. Nacos配置中心
1. 所有环境配置(数据库连接、Redis、Feign超时、线程池)存入Nacos;
2. bootstrap.yml仅配置Nacos地址、命名空间、集群;application.yml仅少量本地默认值;
3. 区分开发、测试、生产Nacos命名空间,生产配置加密存储(国产加密算法);
4. 达梦数据库连接池配置统一在Nacos,适配达梦驱动参数。
### 2. Feign远程调用(跨模块)
1. 跨服务调用仅允许通过 \`ruoyi-business-api\` 定义Feign接口;
2. API模块仅存放接口、DTO数据传输对象,无任何业务实现代码;
3. Server模块之间禁止直接依赖,只能依赖对应API模块;
4. Feign调用异常统一捕获,使用若依全局异常处理,返回标准化CommonResult;
5. Feign超时、重试策略在Nacos统一配置,适配微服务分布式场景。
### 3. Gateway网关
1. 所有接口请求统一经过网关,不允许服务直连访问;
2. 网关统一处理Sa-Token鉴权、跨域、接口限流、请求参数脱敏;
3. 路由规则区分admin后台、app移动端、内部服务接口;
4. 网关日志记录请求来源、耗时、操作人,满足信创等保审计要求。
### 4. Sa-Token 微服务鉴权
1. 管理后台、APP端使用两套独立Token体系,权限隔离;
2. 接口必须添加 \`@PreAuthorize("@ss.hasPermission('模块:业务:操作')")\` 权限校验;
3. APP移动端仅开放查询、提交保存等基础权限,禁止后台管理类权限;
4. 分布式会话存储Redis,适配多实例微服务集群。
## 四、微服务部署&信创适配
1. 所有服务打包为jar镜像,支持鲲鹏/飞腾国产CPU容器化部署;
2. 中间件国产化:Nacos国产适配版、东方通/TongWeb替代Tomcat;
3. Redis使用国产分布式缓存,禁用海外Redis企业版;
4. 服务日志输出适配国产日志采集工具,日志脱敏敏感信息;
5. 容器镜像不依赖海外Docker镜像源,全部本地化信创镜像。
## 五、模块依赖禁止事项
❌ 禁止server模块互相直接依赖;跨模块仅依赖xxx-api;
❌ 禁止将业务实现代码写入api模块;
❌ 禁止硬编码环境地址、数据库连接,全部Nacos配置;
❌ 禁止Feign接口传DO数据库实体,统一使用隔离DTO;
❌ 禁止APP端Controller开放后台管理权限接口;
❌ 禁止微服务多实例本地缓存存储状态,分布式状态统一Redis;
❌ 禁止引入Flowable、BPM流程相关依赖包。
\ No newline at end of file
---
description: Controller、Service、ServiceImpl三层代码模板规范,微服务鉴权、多租户适配
globs: ["**/controller/**/*.java","**/service/**/*.java"]
alwaysApply: false
---
# 冲突优先级声明
Java编码、达梦实体规范优先级高于本文件。
# Controller & Service & ServiceImpl 三层开发规范
## 一、Controller 分层规范
### 1. 基础约束
1. 存放路径:controller/;
2. AdminController:@RestController + @RequestMapping("/api/admin/business/xxx");
3. AppController:@RestController + @RequestMapping("/api/app/business/xxx");
4. 统一添加 @Tag 接口文档注解,标注模块名称;
5. 依赖注入仅注入对应Service,禁止直接注入Mapper、Feign(Feign在Service层注入);
6. 接口权限校验:@PreAuthorize("@ss.hasPermission('business:goods:query')");
7. APP端接口不添加后台管理类权限标识,仅做登录Token校验。
### 2. 标准CRUD接口模板
1. 新增 POST /create:入参SaveReqVO,返回雪花ID;添加@Idempotent、@ApiAccessLog;
2. 更新 PUT /update:入参SaveReqVO(携带id);添加@Idempotent、@ApiAccessLog;
3. 删除 DELETE /delete/{id}:路径ID,添加@ApiAccessLog;
4. 分页查询 GET /page:入参PageReqVO,返回PageResult<XxxRespVO>
5. 单条详情 GET /get/{id}:返回XxxRespVO;
6. 导出 GET /export-excel:分页查询数据,导出Excel,添加导出权限校验。
### 3. Controller禁止项
❌ 禁止Controller编写业务逻辑、数据库查询;
❌ 禁止Controller捕获业务异常,全局统一异常处理器处理;
❌ 禁止Controller直接注入Mapper、Feign接口;
❌ 禁止Admin与APP接口写在同一个Controller;
❌ 禁止接口路径、权限标识混用后台与移动端。
## 二、Service 接口规范
1. 存放路径:service包,命名 XxxService;
2. 仅定义业务抽象方法,不编写实现逻辑;
3. 方法返回值规范:
- 新增:String(雪花ID)
- 更新/删除:void
- 单条查询:XxxDO(不存在抛异常)
- 分页查询:PageResult<XxxDO>
4. 所有方法添加中文Javadoc注释,写明入参、返回值、异常场景;
5. 跨服务远程调用方法,在Service接口定义对应方法。
## 三、ServiceImpl 实现类规范
1. 存放路径:service/impl,命名 XxxServiceImpl,实现XxxService;
2. 添加 @Service 注解;
3. 依赖注入:@Resource 注入Mapper、Feign接口、其他Service;
4. 业务分层逻辑:
1. 参数校验(非空、长度、状态合法性);
2. 数据库CRUD操作,批量数据处理;
3. 跨服务Feign远程调用;
4. 数据转换DO ↔ VO/DTO;
5. 组装分页、返回结果;
5. 多租户自动过滤:使用MyBatis-Plus租户插件,无需手动拼接租户条件;
6. 不存在数据统一抛出业务异常,禁止返回null。
## 四、通用三层统一约束
1. 入参校验统一使用Hibernate Validator注解,Controller层自动校验;
2. 所有分页返回统一包装 PageResult,包含总条数、当前页、数据列表;
3. 时间、创建人等公共字段由MyBatis-Plus自动填充,无需手动set;
4. 软删除统一框架逻辑删除,ServiceImpl不手动修改deleted字段。
---
description: 若依Vue3管理后台前端规范(Element Plus)
globs: ["**/ruoyi-admin/**/*.vue","**/ruoyi-admin/**/*.ts"]
alwaysApply: false
---
# 冲突优先级声明
全局前后端协作规范优先级高于本文件。
# 若依Vue3后台前端开发规范
## 一、页面目录结构规范
页面存放路径 `views/{业务模块}/`,目录拆分:
1. index.vue:列表主页面(搜索栏、表格、新增/编辑弹窗入口);
2. XxxFormDrawer.vue:新增、编辑抽屉表单;
3. XxxDetailDrawer.vue:详情查看抽屉;
4. components/:页面内部复用小型组件,不全局公用;
5. api/:当前模块接口请求文件;
6. types.ts:当前模块TS类型定义。
## 二、页面基础框架规范
统一使用项目封装通用列表组件 `SqSearchTableFrame`,内置搜索区、表格、分页、新增/删除按钮插槽;
1. 搜索表单使用el-form-item,搜索项控制在6个以内,多余折叠;
2. 表格列使用el-table-column,字典状态列使用 <dict-tag /> 自动翻译;
3. 表格操作列统一封装操作按钮组件,区分查看、编辑、删除;
4. 删除、批量删除按钮绑定二次确认弹窗,提示用户确认操作;
5. 分页统一使用框架封装分页组件,参数pageNum、pageSize与后端PageReqVO对齐。
## 三、表单抽屉规范
1. 新增/编辑共用一套FormDrawer组件,通过入参id区分新增/编辑;
2. 表单校验使用el-form内置rules校验,必填项标红*
3. 下拉选择、状态选择统一使用字典接口回显,禁止硬编码选项;
4. 表单提交统一调用封装api,成功后关闭抽屉并刷新表格列表;
5. 复杂多行数据使用el-table内嵌表单行,支持新增、删除子行。
## 四、TS类型规范
1. types.ts 统一定义PageReq、SaveReq、Resp类型,与后端VO字段完全一致;
2. 所有ID字段定义为string,避免雪花ID数字精度丢失;
3. 状态枚举直接复用后端字典编码,前端不单独维护状态数字;
4. 接口请求统一封装axios工具,请求参数、返回值绑定TS类型。
## 五、前端通用禁止项
❌ 禁止页面硬编码字典状态、业务枚举数字;
❌ 禁止手动拼接接口地址,统一api文件导出请求方法;
❌ 禁止表单不做前端必填校验,仅依赖后端校验;
❌ 禁止表格操作无二次确认弹窗(删除、批量删除);
❌ 禁止TS类型中ID使用number类型,防止雪花ID精度丢失。
......@@ -11,8 +11,9 @@
<modules>
<module>ruoyi-system</module>
<module>ruoyi-gen</module>
<module>ruoyi-job</module>
<module>ruoyi-file</module>
<module>ruoyi-job</module>
<module>ruoyi-file</module>
<module>ruoyi-busi</module>
</modules>
<artifactId>ruoyi-modules</artifactId>
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论