mirror of
https://gitee.com/dromara/RuoYi-Vue-Plus.git
synced 2026-04-02 00:33:24 +08:00
add 增加 ai编程支持 支持codex与claude的skill
This commit is contained in:
56
.claude/agents/backend-crud.md
Normal file
56
.claude/agents/backend-crud.md
Normal file
@@ -0,0 +1,56 @@
|
||||
---
|
||||
name: backend-crud
|
||||
description: 标准后端 CRUD 专家。用于当前项目中的新增单表 CRUD、补 entity/bo/vo/mapper/service/controller、分页查询、导出、删除前校验等任务。
|
||||
---
|
||||
|
||||
你负责当前项目中的标准后端 CRUD 实现。
|
||||
|
||||
## 核心原则
|
||||
|
||||
1. 先参考 `ruoyi-modules/ruoyi-generator/src/main/resources/vm/` 下的模板。
|
||||
2. 再参考当前模块内最近似的标准管理模块。
|
||||
3. 分层保持稳定:
|
||||
`domain`、`domain.bo`、`domain.vo`、`mapper`、`service`、`service.impl`、`controller`
|
||||
|
||||
## 结构约定
|
||||
|
||||
- entity 默认继承 `BaseEntity`
|
||||
- mapper 默认继承 `BaseMapperPlus<Entity, Vo>`
|
||||
- BO 使用 `@AutoMapper(target = Entity.class, reverseConvertGenerate = false)`
|
||||
- VO 使用 `@AutoMapper(target = Entity.class)`
|
||||
- service 使用 `baseMapper`
|
||||
|
||||
## 默认方法集合
|
||||
|
||||
- `queryById`
|
||||
- `queryPageList`
|
||||
- `queryList`
|
||||
- `insertByBo`
|
||||
- `updateByBo`
|
||||
- `deleteWithValidByIds`
|
||||
|
||||
## 查询规则
|
||||
|
||||
- 单表查询优先用 `LambdaQueryWrapper`
|
||||
- 日期范围默认从 `bo.getParams()` 中读取 begin/end
|
||||
- 分页优先返回 `PageResult<Vo>`
|
||||
|
||||
## 接口规则
|
||||
|
||||
- controller 继承 `BaseController`
|
||||
- 返回值使用 `R<T>` 或 `R<Void>`
|
||||
- 标准 CRUD 路由通常是:
|
||||
`GET /list`
|
||||
`POST /export`
|
||||
`GET /{id}`
|
||||
`POST`
|
||||
`PUT`
|
||||
`DELETE /{ids}`
|
||||
- 默认检查是否需要 `@SaCheckPermission`、`@Log`、`@RepeatSubmit`
|
||||
|
||||
## 自检
|
||||
|
||||
- CRUD 链路是否完整
|
||||
- BO / VO / Entity 是否职责分离
|
||||
- 导出、分页、删除前校验是否齐全
|
||||
- 是否只是 generator 裸产物,如果是要继续补齐项目约定
|
||||
19
.claude/agents/backend-engineering.md
Normal file
19
.claude/agents/backend-engineering.md
Normal file
@@ -0,0 +1,19 @@
|
||||
---
|
||||
name: backend-engineering
|
||||
description: 后端工程总入口。用于在当前项目中识别任务属于标准 CRUD、复杂模块增强、联表与数据权限、或前后端联动,并选择合适的后端子 agent。
|
||||
---
|
||||
|
||||
你是当前后端工程的总入口 agent。
|
||||
|
||||
先判断任务类型,再按下面规则处理:
|
||||
|
||||
1. 如果是新增标准单表 CRUD、从表结构补 entity/bo/vo/mapper/service/controller,优先使用 `backend-crud.md` 的规则。
|
||||
2. 如果是修改 `system`、`workflow` 等已经很复杂的模块,优先使用 `backend-module-enhancement.md` 的规则。
|
||||
3. 如果重点在 MPJ 联表、`@DataPermission`、复杂查询、数据范围控制,优先使用 `backend-query-permission.md` 的规则。
|
||||
4. 如果同时要求同步前端接口或前端页面骨架,保持后端路由与 generator 风格稳定,便于前端 agent 对接。
|
||||
|
||||
通用要求:
|
||||
|
||||
- 先读同模块最近似实现,再动代码。
|
||||
- 发生冲突时优先相信当前模块真实代码,其次是公共基础设施,再其次才是 generator 模板。
|
||||
- 默认直接产出可落地代码,而不是只给抽象建议。
|
||||
33
.claude/agents/backend-module-enhancement.md
Normal file
33
.claude/agents/backend-module-enhancement.md
Normal file
@@ -0,0 +1,33 @@
|
||||
---
|
||||
name: backend-module-enhancement
|
||||
description: 复杂后端模块增强专家。用于修改当前项目中已经存在较重业务逻辑的模块,例如 system、workflow 等,强调增量修改、保留现有权限、事务、缓存、导入导出和业务校验。
|
||||
---
|
||||
|
||||
你负责复杂后端模块的增量增强,不是从零生成裸 CRUD。
|
||||
|
||||
## 核心原则
|
||||
|
||||
1. 优先阅读当前模块最近似实现。
|
||||
2. 增量修改,不重写整块 service/controller。
|
||||
3. 保留已有的数据权限、事务、缓存、导入导出、唯一性校验、删除前校验。
|
||||
4. 不能为了“简洁”把复杂模块退化成模板式单表 CRUD。
|
||||
|
||||
## 常见任务
|
||||
|
||||
- 修改 `system`、`workflow` 模块的查询与导出逻辑
|
||||
- 新增或调整写入前校验
|
||||
- 维护角色、岗位、用户等关联数据
|
||||
- 增加复杂页面所需的特殊接口
|
||||
|
||||
## 约束
|
||||
|
||||
- controller 不堆重业务逻辑
|
||||
- service 里的旧逻辑要先理解再改
|
||||
- 如果附近已有 `ServiceException`、缓存注解、事务注解、数据权限判断,新增逻辑默认保持一致
|
||||
- 如果存在联动前端页面,接口路径与返回结构尽量稳定
|
||||
|
||||
## 自检
|
||||
|
||||
- 是否破坏了原模块的权限边界
|
||||
- 是否误删了旧逻辑中的事务或校验
|
||||
- 是否错误简化了复杂关系维护
|
||||
28
.claude/agents/backend-query-permission.md
Normal file
28
.claude/agents/backend-query-permission.md
Normal file
@@ -0,0 +1,28 @@
|
||||
---
|
||||
name: backend-query-permission
|
||||
description: 后端查询、联表与数据权限专家。用于当前项目中的 MPJ 联表、DataPermission、复杂分页查询、范围控制和查询增强任务。
|
||||
---
|
||||
|
||||
你负责当前项目中的复杂查询和数据权限类任务。
|
||||
|
||||
## 核心原则
|
||||
|
||||
1. 优先看当前模块已有的 mapper 查询实现。
|
||||
2. 涉及数据权限时优先复用 `@DataPermission` 与已有字段映射方式。
|
||||
3. 复杂联表优先参考 MPJ 风格,不轻易改回手写零散 SQL。
|
||||
4. 如果 `BaseMapperPlus + wrapper` 足够,不要额外补 XML。
|
||||
|
||||
## 重点关注
|
||||
|
||||
- `BaseMapperPlus`
|
||||
- `@DataPermission`
|
||||
- `DataColumn`
|
||||
- `MPJBaseMapper`
|
||||
- `JoinWrappers.lambda(...)`
|
||||
- 复杂分页与列表查询
|
||||
|
||||
## 输出要求
|
||||
|
||||
- 明确说明查询是单表、联表还是带权限控制
|
||||
- 保持与当前模块 mapper 风格一致
|
||||
- 不要让查询参数风格和前端现有调用脱节
|
||||
152
.codex/skills/ruoyi-plus-ai-coding/SKILL.md
Normal file
152
.codex/skills/ruoyi-plus-ai-coding/SKILL.md
Normal file
@@ -0,0 +1,152 @@
|
||||
---
|
||||
name: ruoyi-plus-ai-coding
|
||||
description: 在仓库内按代码生成器模板和项目既有约定生成或修改代码。用于新增 CRUD 模块、补全 controller/service/mapper/BO/VO/entity、编写 MyBatis-Plus 查询,以及新增与后端接口配套的 Vue 3 + TypeScript 页面、types 和 api 文件。
|
||||
---
|
||||
|
||||
# RuoYi Plus AI 编码规范
|
||||
|
||||
先对齐代码生成器产物,再叠加仓库里真实业务代码已经形成的更强约定。
|
||||
|
||||
## 适用场景
|
||||
|
||||
在下面这些任务里优先使用此 skill:
|
||||
|
||||
- 新增标准 CRUD 模块。
|
||||
- 根据新表结构补齐 entity、bo、vo、mapper、service、controller。
|
||||
- 修改已有模块的查询、校验、导入导出、数据权限、事务逻辑。
|
||||
- 在系统、监控、工作流、demo 等模块内按现有约定扩展业务代码。
|
||||
- 为后端新增接口同步补前端 `api/types/index.vue` 骨架。
|
||||
|
||||
## 不适用场景
|
||||
|
||||
下面这些任务不要机械套用本 skill 的 CRUD 规则:
|
||||
|
||||
- 基础框架升级、Spring Boot 主版本迁移。
|
||||
- 与当前分层明显不同的实验性模块。
|
||||
- 第三方中间件深度接入、基础设施改造。
|
||||
- 完全脱离 generator 体系的独立子系统。
|
||||
|
||||
## 执行流程
|
||||
|
||||
1. 先确认目标模块,优先复用同模块中最近似功能的写法。
|
||||
2. 新增标准 CRUD 代码前,先读取 `ruoyi-modules/ruoyi-generator/src/main/resources/vm/` 下的模板。
|
||||
3. 命名和分层保持与仓库一致:
|
||||
`domain` entity、`domain.bo`、`domain.vo`、`mapper`、`service`、`service.impl`、`controller`。
|
||||
4. 优先在生成器结构上扩展,不要自行发明新的分层。
|
||||
5. 修改 `ruoyi-system` 这类复杂模块前,先阅读同类现有实现,因为这些模块通常比生成器默认产物多出数据权限、联表、缓存、安全校验等逻辑。
|
||||
|
||||
## 优先级规则
|
||||
|
||||
发生冲突时按下面顺序决策:
|
||||
|
||||
1. 当前模块内最近似业务代码。
|
||||
2. 当前仓库公共基础模块约定,例如 `common-mybatis`、`common-core`、`common-web`。
|
||||
3. 代码生成器模板。
|
||||
4. 通用 Spring Boot / MyBatis-Plus 习惯。
|
||||
|
||||
也就是说:
|
||||
|
||||
- 同模块已有成熟实现时,优先复用该实现。
|
||||
- 同模块没有现成代码时,再参考 generator 模板。
|
||||
- 不要因为“更通用”就覆盖掉项目已形成的强约定。
|
||||
|
||||
## 后端规则
|
||||
|
||||
Java、MyBatis-Plus、BO/VO/entity、controller、mapper、service 的具体规则见 [references/backend.md](references/backend.md)。
|
||||
|
||||
## 前端规则
|
||||
|
||||
Vue 3、TypeScript API 文件、生成式列表页、表单状态、字典和日期范围约定见 [references/frontend.md](references/frontend.md)。
|
||||
|
||||
## 使用案例
|
||||
|
||||
具体调用方式见 [references/examples.md](references/examples.md)。
|
||||
|
||||
## 仓库通用规则
|
||||
|
||||
- 遵循 [`.editorconfig`](../../../.editorconfig):UTF-8、LF,默认 4 空格,JSON/YAML 为 2 空格。
|
||||
- 不要把 `BaseMapperPlus`、`PageQuery`、`PageResult`、`R`、`MapstructUtils` 或项目工具类替换成临时自造方案。
|
||||
- 仓库已使用 `List.of(...)` 的地方,数组转列表优先继续沿用。
|
||||
- import、注解顺序、文件结构以附近代码为准,不要顺手重排整个文件。
|
||||
- 只有在业务逻辑不直观时才加简短注释。
|
||||
|
||||
## 决策规则
|
||||
|
||||
- 如果任务是围绕单表的标准 CRUD,尽量贴近生成器默认产物。
|
||||
- 如果目标模块已经存在自定义校验、数据权限、事务、缓存、Excel 导入导出、联表查询等逻辑,应在此基础上扩展,不要为了“简洁”把它们削平。
|
||||
- 如果附近 controller 接口已经带有权限、日志、防重、加密、分组校验等注解,新接口默认同步保持一致,除非有明确理由不这样做。
|
||||
- 如果 BO 或 VO 需要字段校验、翻译、Excel 注解,应优先参考同模块同用途对象,不要机械套通用注解。
|
||||
|
||||
## 目录映射规则
|
||||
|
||||
标准后端模块通常按下面结构组织:
|
||||
|
||||
- `src/main/java/.../domain/Entity.java`
|
||||
- `src/main/java/.../domain/bo/EntityBo.java`
|
||||
- `src/main/java/.../domain/vo/EntityVo.java`
|
||||
- `src/main/java/.../mapper/EntityMapper.java`
|
||||
- `src/main/java/.../service/IEntityService.java`
|
||||
- `src/main/java/.../service/impl/EntityServiceImpl.java`
|
||||
- `src/main/java/.../controller/EntityController.java`
|
||||
|
||||
标准生成器模板通常对应:
|
||||
|
||||
- `vm/java/domain.java.vm` -> entity
|
||||
- `vm/java/bo.java.vm` -> bo
|
||||
- `vm/java/vo.java.vm` -> vo
|
||||
- `vm/java/mapper.java.vm` -> mapper
|
||||
- `vm/java/service.java.vm` -> service interface
|
||||
- `vm/java/serviceImpl.java.vm` -> service impl
|
||||
- `vm/java/controller.java.vm` -> controller
|
||||
- `vm/xml/mapper.xml.vm` -> 自定义 XML mapper 起点
|
||||
|
||||
## 任务分型
|
||||
|
||||
### 1. 标准单表 CRUD
|
||||
|
||||
优先按 generator 模板落骨架,再补校验、权限、导出、翻译等项目约定。
|
||||
|
||||
### 2. 强业务模块扩展
|
||||
|
||||
如果目标模块像 `system`、`workflow` 一样已经有复杂逻辑,优先增量修改,不要回退成模板式简化代码。
|
||||
|
||||
### 3. 基础能力复用
|
||||
|
||||
如果涉及数据权限、缓存、事务、导入导出、字典、翻译、加密、分组校验,优先查项目已有做法并复用公共能力。
|
||||
|
||||
## 输出要求
|
||||
|
||||
使用本 skill 时,默认期望产出应满足:
|
||||
|
||||
- 后端分层完整,不直接在 controller 里堆业务逻辑。
|
||||
- `BO/VO/Entity` 职责分明。
|
||||
- 查询、分页、删除校验、写入校验逻辑闭环完整。
|
||||
- 权限、日志、防重、事务、数据权限尽量贴近同模块现有实现。
|
||||
- 如果同步改前端,前端 API 路径和后端接口保持一致。
|
||||
|
||||
## 快速检查清单
|
||||
|
||||
- 包路径和 `@RequestMapping` 与模块保持一致。
|
||||
- 权限标识遵循 `${module}:${business}:${action}`。
|
||||
- Mapper 继承 `BaseMapperPlus<Entity, Vo>`。
|
||||
- Service 使用 `baseMapper`,并按场景返回 `PageResult` 或 `List<Vo>`。
|
||||
- 查询代码优先使用 `LambdaQueryWrapper`,复杂模块沿用既有 MPJ 联表风格。
|
||||
- BO 使用 `@AutoMapper(target = Entity.class, reverseConvertGenerate = false)`。
|
||||
- VO 使用 `@AutoMapper(target = Entity.class)`。
|
||||
- 前端 API 路径与后端路由完全对应。
|
||||
- 前端列表页继续使用仓库里的 `proxy?.addDateRange`、`proxy?.$modal`、`proxy?.download`、`useDict`、`pagination` 等工具。
|
||||
|
||||
## 推荐提问方式
|
||||
|
||||
推荐把任务描述到下面这个粒度:
|
||||
|
||||
- 目标模块和业务名
|
||||
- 是新建模块还是修改已有模块
|
||||
- 表名或接口前缀
|
||||
- 是否需要分页、导出、导入、数据权限、字典、翻译、联表
|
||||
- 希望参考哪个现有模块
|
||||
|
||||
例如:
|
||||
|
||||
- 使用 `$ruoyi-plus-ai-coding` 在 `system` 模块新增一个标准单表 CRUD,参考 `SysConfig` 与 generator 模板。
|
||||
- 使用 `$ruoyi-plus-ai-coding` 修改 `workflow/category` 的查询和导出逻辑,保持现有模块风格。
|
||||
7
.codex/skills/ruoyi-plus-ai-coding/agents/openai.yaml
Normal file
7
.codex/skills/ruoyi-plus-ai-coding/agents/openai.yaml
Normal file
@@ -0,0 +1,7 @@
|
||||
interface:
|
||||
display_name: "RuoYi Plus 编码"
|
||||
short_description: "按生成器与仓库约定编写代码"
|
||||
default_prompt: "使用 $ruoyi-plus-ai-coding 在这个仓库里按现有约定实现代码修改。"
|
||||
|
||||
policy:
|
||||
allow_implicit_invocation: true
|
||||
221
.codex/skills/ruoyi-plus-ai-coding/references/backend.md
Normal file
221
.codex/skills/ruoyi-plus-ai-coding/references/backend.md
Normal file
@@ -0,0 +1,221 @@
|
||||
# 后端约定
|
||||
|
||||
## 优先参考的代码来源
|
||||
|
||||
- `ruoyi-modules/ruoyi-generator/src/main/resources/vm/java/*.vm`
|
||||
- `ruoyi-modules/ruoyi-demo/...`
|
||||
- `ruoyi-modules/ruoyi-system/...`
|
||||
- `ruoyi-common/ruoyi-common-mybatis/...`
|
||||
|
||||
## 决策顺序
|
||||
|
||||
写代码时按下面顺序取样:
|
||||
|
||||
1. 当前业务模块下最近似实现。
|
||||
2. 当前仓库公共能力模块中的统一约定。
|
||||
3. generator 模板。
|
||||
4. 通用 Spring / MyBatis-Plus 默认习惯。
|
||||
|
||||
如果规则冲突,优先相信当前仓库真实代码。
|
||||
|
||||
## 分层结构
|
||||
|
||||
标准 CRUD 代码应优先遵循下面这套结构:
|
||||
|
||||
- `domain/Entity.java`
|
||||
- `domain/bo/EntityBo.java`
|
||||
- `domain/vo/EntityVo.java`
|
||||
- `mapper/EntityMapper.java`
|
||||
- `service/IEntityService.java`
|
||||
- `service/impl/EntityServiceImpl.java`
|
||||
- `controller/EntityController.java`
|
||||
|
||||
## Entity 规则
|
||||
|
||||
- 除非所在模块明显另有约定,否则实体类继承 `org.dromara.common.mybatis.core.domain.BaseEntity`。
|
||||
- 使用 Lombok `@Data` 和 `@EqualsAndHashCode(callSuper = true)`。
|
||||
- 使用 `@TableName("table_name")`。
|
||||
- 主键使用 `@TableId`。
|
||||
- 存在 `delFlag` 时保留 `@TableLogic`,存在乐观锁字段时保留 `@Version`。
|
||||
- 如果附近实体已经使用 `@OrderBy` 等额外注解,应继续保持。
|
||||
|
||||
## BO 规则
|
||||
|
||||
- 实现 `Serializable`。
|
||||
- 添加 `@AutoMapper(target = Entity.class, reverseConvertGenerate = false)`。
|
||||
- 请求专用字段、查询专用字段放在 BO 中,包括 `params`。
|
||||
- 在生成器或附近代码已有分组校验时,继续使用:`AddGroup`、`EditGroup`、`QueryGroup`。
|
||||
- `@Xss`、`@Email`、`@Size`、`@NotBlank`、`@NotNull` 要按真实业务语义添加,不要一股脑全套上。
|
||||
- 查询存在日期范围或扩展条件时,保留 `params = new HashMap<>()`。
|
||||
|
||||
## VO 规则
|
||||
|
||||
- 实现 `Serializable`。
|
||||
- 添加 `@AutoMapper(target = Entity.class)`。
|
||||
- 生成器风格的导出对象通常带 `@ExcelIgnoreUnannotated`。
|
||||
- `@ExcelProperty`、`@ExcelDictFormat`、`ExcelDictConvert`、`@ExcelRequired`、`@ExcelNotation`、`@DateTimeFormat` 只在导入导出场景下使用。
|
||||
- 如果附近代码会把 ID 翻译成展示字段,沿用 `@Translation(type = TransConstant.USER_ID_TO_NAME, mapper = "createBy")` 这类写法。
|
||||
- 展示型派生字段放在 VO,不放在 Entity。
|
||||
|
||||
## Mapper 规则
|
||||
|
||||
- 默认形式是 `interface XxxMapper extends BaseMapperPlus<Xxx, XxxVo>`。
|
||||
- 不要为简单的 entity 转 vo 手写重复代码,优先依赖 `BaseMapperPlus`。
|
||||
- 模块已经使用 `@DataPermission` 时,在重写方法和自定义查询上继续保留。
|
||||
- 复杂模块里 mapper 可能同时继承 `MPJBaseMapper<Entity>` 并使用 `JoinWrappers.lambda(...)`,遇到这种风格要延续,不要换一种写法。
|
||||
- 只有在 `selectVoList/selectVoPage` 不够用时,才补 XML 或自定义 mapper 方法。
|
||||
|
||||
### Mapper 建议结构
|
||||
|
||||
标准 mapper 一般按这个顺序组织:
|
||||
|
||||
1. 接口声明
|
||||
2. 默认查询方法
|
||||
3. 自定义分页或列表方法
|
||||
4. 特殊数据权限重写
|
||||
5. 辅助构造方法
|
||||
|
||||
### 什么时候需要 XML
|
||||
|
||||
- 复杂联表 SQL 无法仅靠 wrapper 清晰表达时。
|
||||
- 需要手写查询列和结果映射时。
|
||||
- 项目当前模块已经大量使用 XML 时。
|
||||
|
||||
如果 `BaseMapperPlus + wrapper` 已足够,优先不要补 XML。
|
||||
|
||||
## Service 规则
|
||||
|
||||
- 类声明通常是 `@RequiredArgsConstructor`、`@Service`,按需补 `@Slf4j`。
|
||||
- mapper 注入字段命名为 `private final XxxMapper baseMapper;`。
|
||||
- 读操作通常返回 `Vo`、`List<Vo>` 或 `PageResult<Vo>`。
|
||||
- BO 转实体用 `MapstructUtils.convert(bo, Entity.class)`。
|
||||
- 查询条件优先用 `LambdaQueryWrapper` 和 `Wrappers.lambdaQuery()`。
|
||||
- 在 wrapper 条件里直接写 `StringUtils.isNotBlank(...)` 和 null 判断。
|
||||
- 分页查询优先采用:
|
||||
`Page<Vo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);`
|
||||
`return PageResult.build(result.getRecords(), result.getTotal());`
|
||||
- 生成器风格模块保留 `validEntityBeforeSave(...)` 这种扩展点。
|
||||
- 多表写操作使用 `@Transactional(rollbackFor = Exception.class)`。
|
||||
- 明确的业务失败,尤其是权限、数据完整性、删除校验,使用 `ServiceException`。
|
||||
- 不要绕过模块现有的数据权限、角色校验、删除前校验。
|
||||
|
||||
### Service 建议结构
|
||||
|
||||
标准 service impl 一般按下面顺序组织:
|
||||
|
||||
1. 查询单条
|
||||
2. 分页查询
|
||||
3. 列表查询
|
||||
4. 构建查询条件
|
||||
5. 新增
|
||||
6. 修改
|
||||
7. 保存前校验
|
||||
8. 删除前校验与删除
|
||||
9. 其他扩展业务方法
|
||||
|
||||
### 查询逻辑建议
|
||||
|
||||
- 单表查询优先使用 `LambdaQueryWrapper`。
|
||||
- 条件判断直接放在 wrapper 上,不要额外写大量 if 套壳。
|
||||
- 日期范围统一从 `bo.getParams()` 取 begin/end。
|
||||
- 复杂联表查询优先查同模块是否已有 MPJ 风格可复用。
|
||||
|
||||
### 写入逻辑建议
|
||||
|
||||
- BO 转实体统一走 `MapstructUtils.convert`。
|
||||
- 批量关系维护时优先拆成私有方法,例如角色、岗位、用户关联。
|
||||
- 修改前优先保留已有防误删、防越权、防并发覆盖逻辑。
|
||||
|
||||
## Controller 规则
|
||||
|
||||
- 继承 `BaseController`。
|
||||
- 类上通常带 `@Validated`、`@RestController`、`@RequiredArgsConstructor`、`@RequestMapping`。
|
||||
- 返回值使用 `R<T>` 或 `R<Void>`。
|
||||
- 标准 CRUD 接口通常是:`GET /list`、`POST /export`、`GET /{id}`、`POST`、`PUT`、`DELETE /{ids}`。
|
||||
- `@SaCheckPermission` 权限格式遵循 `${module}:${business}:${action}`。
|
||||
- 写操作、导入导出接口通常加 `@Log(title = "...", businessType = BusinessType.X)`。
|
||||
- 附近接口已有防重时,写接口继续使用 `@RepeatSubmit`。
|
||||
- 适合分组校验时,使用 `@Validated(AddGroup.class)` 和 `@Validated(EditGroup.class)`。
|
||||
- 特殊接口直接复用模块内现成做法,例如导入导出、`@ApiEncrypt`、multipart 上传、数据权限检查、写入前唯一性校验。
|
||||
|
||||
### Controller 建议结构
|
||||
|
||||
标准 controller 一般按下面顺序组织:
|
||||
|
||||
1. 列表
|
||||
2. 导出
|
||||
3. 详情
|
||||
4. 新增
|
||||
5. 修改
|
||||
6. 删除
|
||||
7. 特殊接口
|
||||
|
||||
### Controller 边界
|
||||
|
||||
- controller 负责接参、校验、权限、日志、返回值转换。
|
||||
- 重业务逻辑尽量放 service,不要在 controller 里堆长逻辑。
|
||||
- 但前置权限检查、唯一性提示、显式业务失败提示可以留在 controller,前提是同模块已有这种习惯。
|
||||
|
||||
## 查询与工具规则
|
||||
|
||||
- 分页统一使用 `PageQuery` 和 `PageResult`,不要无故引入新的分页 DTO。
|
||||
- 优先使用项目工具类:`MapstructUtils`、`StringUtils`、`StreamUtils`、`ValidatorUtils`、`SpringUtils`、`RedisUtils`。
|
||||
- 数组转列表按附近代码习惯使用 `List.of(ids)` 或 `Arrays.asList(ids)`。
|
||||
- 日期范围查询通常从 `bo.getParams()` 中读取 `beginTime`、`endTime` 或 `beginFieldName`、`endFieldName`。
|
||||
|
||||
## 前后端联动规则
|
||||
|
||||
- 新增后端接口时,路径和权限前缀尽量保持 generator 约定,方便前端目录和 API 命名同步。
|
||||
- 新增日期范围查询时,记得保留 `bo.params` 结构,避免前端 `addDateRange` 无法对接。
|
||||
- 导出接口通常保持 `POST /export` 风格,便于前端直接复用现有下载逻辑。
|
||||
- 批量删除接口通常使用 `DELETE /{ids}`,便于前端直接传数组或逗号串。
|
||||
|
||||
## 生成器优先模式
|
||||
|
||||
从零新增 CRUD 时,优先对齐生成器默认方法集合:
|
||||
|
||||
- `queryById`
|
||||
- `queryPageList`
|
||||
- `queryList`
|
||||
- `insertByBo`
|
||||
- `updateByBo`
|
||||
- `deleteWithValidByIds`
|
||||
|
||||
然后再叠加模块内已有增强,例如:
|
||||
|
||||
- 唯一性校验
|
||||
- 数据权限注解
|
||||
- MPJ 联表查询
|
||||
- 缓存注解
|
||||
- Excel 导入导出监听器
|
||||
- 关联表维护逻辑
|
||||
|
||||
## 什么时候优先看 generator
|
||||
|
||||
- 新增一个标准单表 CRUD 时。
|
||||
- 只有表结构和基本接口需求,没有现成业务模块可参考时。
|
||||
- 需要快速补齐整套骨架代码时。
|
||||
|
||||
## 什么时候优先看现有模块
|
||||
|
||||
- 目标模块已经有类似业务。
|
||||
- 涉及数据权限、联表、缓存、角色岗位关系、导入导出、工作流扩展时。
|
||||
- 任务是“修改已有模块”而不是“新建模块”时。
|
||||
|
||||
## 避免事项
|
||||
|
||||
- 不要在 controller 里直接暴露 entity 代替 BO/VO。
|
||||
- 不要给新的管理接口漏掉权限注解。
|
||||
- 没有明确必要时,不要从 `BaseMapperPlus` 风格退回手工映射。
|
||||
- 前端查询页用了日期范围时,不要删掉后端 `params` 相关处理。
|
||||
- 不要把 `ruoyi-system` 这类复杂逻辑强行简化成生成器式单表 CRUD。
|
||||
|
||||
## 交付前自检
|
||||
|
||||
交付前至少检查这些点:
|
||||
|
||||
- CRUD 主链路是否完整。
|
||||
- BO / VO / Entity 职责是否清晰。
|
||||
- 分页、查询、删除校验是否与前端对得上。
|
||||
- 权限、日志、防重、事务是否遗漏。
|
||||
- 是否只是 generator 裸产物,如果是,需要继续补齐同模块已有增强。
|
||||
101
.codex/skills/ruoyi-plus-ai-coding/references/examples.md
Normal file
101
.codex/skills/ruoyi-plus-ai-coding/references/examples.md
Normal file
@@ -0,0 +1,101 @@
|
||||
# 使用案例
|
||||
|
||||
## 案例 1:新增标准单表 CRUD
|
||||
|
||||
### 用户提问示例
|
||||
|
||||
```text
|
||||
使用 $ruoyi-plus-ai-coding 在 system 模块新增一个 client 管理的标准 CRUD。
|
||||
请参考 generator 模板和现有 system 模块写法,补齐 entity、bo、vo、mapper、service、controller。
|
||||
```
|
||||
|
||||
### 期望执行方式
|
||||
|
||||
- 先读 generator 的 `domain/bo/vo/service/serviceImpl/controller` 模板。
|
||||
- 再读 `system` 模块里最接近的现有管理模块。
|
||||
- 先生成骨架,再补权限、日志、校验、导出等细节。
|
||||
|
||||
## 案例 2:修改已有复杂模块
|
||||
|
||||
### 用户提问示例
|
||||
|
||||
```text
|
||||
使用 $ruoyi-plus-ai-coding 修改 workflow/category 的查询和导出逻辑,保持现有模块风格,不要简化成模板式单表 CRUD。
|
||||
```
|
||||
|
||||
### 期望执行方式
|
||||
|
||||
- 先读当前 workflow 模块同类代码。
|
||||
- 判断这是“复杂模块增强”,不是“从零生成”。
|
||||
- 增量修改原逻辑,不要重写整个 service/controller。
|
||||
|
||||
## 案例 3:补唯一性校验与删除前校验
|
||||
|
||||
### 用户提问示例
|
||||
|
||||
```text
|
||||
使用 $ruoyi-plus-ai-coding 为 demo/demo 模块补充新增和修改时的唯一性校验,并补充删除前校验。
|
||||
```
|
||||
|
||||
### 期望执行方式
|
||||
|
||||
- 优先修改 `validEntityBeforeSave(...)`。
|
||||
- 根据模块现有风格补 `ServiceException` 或显式失败返回。
|
||||
- 删除逻辑只补必要校验,不重构整套 CRUD。
|
||||
|
||||
## 案例 4:补数据权限与联表查询
|
||||
|
||||
### 用户提问示例
|
||||
|
||||
```text
|
||||
使用 $ruoyi-plus-ai-coding 为 system 模块某个列表查询增加部门数据权限和联表字段返回,参考现有 user mapper 的 MPJ 与 DataPermission 写法。
|
||||
```
|
||||
|
||||
### 期望执行方式
|
||||
|
||||
- 先看 `SysUserMapper` 和相关 service。
|
||||
- 判断需要 `BaseMapperPlus` 重写还是 MPJ 联表。
|
||||
- 保持权限注解和联表风格一致。
|
||||
|
||||
## 案例 5:新增后端接口并同步前端骨架
|
||||
|
||||
### 用户提问示例
|
||||
|
||||
```text
|
||||
使用 $ruoyi-plus-ai-coding 为 monitor/cache 新增一个导出接口,并同步补齐前端 api/types 调用骨架。
|
||||
```
|
||||
|
||||
### 期望执行方式
|
||||
|
||||
- 先补后端 `controller/service`。
|
||||
- 再根据后端路由补前端 `src/api` 或 generator 风格的前端骨架。
|
||||
- 保证导出接口路径和前端下载调用一致。
|
||||
|
||||
## 案例 6:推荐的高质量任务描述
|
||||
|
||||
下面这种描述最容易得到稳定结果:
|
||||
|
||||
```text
|
||||
使用 $ruoyi-plus-ai-coding 在 workflow 模块新增一个标准列表管理功能:
|
||||
1. 需要分页、导出、详情、增删改
|
||||
2. 查询包含状态和创建时间范围
|
||||
3. 保持现有 workflow 模块风格
|
||||
4. 参考 generator 模板生成基础骨架
|
||||
5. 删除前需要做业务校验
|
||||
```
|
||||
|
||||
## 不推荐的任务描述
|
||||
|
||||
下面这种描述太模糊,容易导致产物偏离项目:
|
||||
|
||||
```text
|
||||
帮我加个后端接口
|
||||
```
|
||||
|
||||
更好的写法至少要补充:
|
||||
|
||||
- 模块名
|
||||
- 表或业务名
|
||||
- 是新增还是修改
|
||||
- 是否需要分页、导出、权限、数据范围、联表
|
||||
- 想参考哪个现有模块
|
||||
71
.codex/skills/ruoyi-plus-ai-coding/references/frontend.md
Normal file
71
.codex/skills/ruoyi-plus-ai-coding/references/frontend.md
Normal file
@@ -0,0 +1,71 @@
|
||||
# 前端约定
|
||||
|
||||
## 优先参考的代码来源
|
||||
|
||||
- `ruoyi-modules/ruoyi-generator/src/main/resources/vm/ts/*.vm`
|
||||
- `ruoyi-modules/ruoyi-generator/src/main/resources/vm/vue/*.vm`
|
||||
- 前端工程中与目标模块最接近的现有页面
|
||||
|
||||
如果任务涉及前端,先看仓库里实际使用的前端目录和同类页面,不要直接套通用 Vue 习惯。
|
||||
|
||||
## API 文件规则
|
||||
|
||||
- 从 `@/utils/request` 引入 `request`。
|
||||
- 从 `axios` 引入 `AxiosPromise`。
|
||||
- 从 `@/api/<module>/<business>/types` 引入本模块类型。
|
||||
- 列表接口通常返回 `AxiosPromise<PageResult<Vo>>`。
|
||||
- 常规接口命名和路由保持:
|
||||
`listXxx` -> `GET /<module>/<business>/list`
|
||||
`getXxx` -> `GET /<module>/<business>/{id}`
|
||||
`addXxx` -> `POST /<module>/<business>`
|
||||
`updateXxx` -> `PUT /<module>/<business>`
|
||||
`delXxx` -> `DELETE /<module>/<business>/{id or ids}`
|
||||
|
||||
## 类型文件规则
|
||||
|
||||
- 定义 `VO`、`Form`、`Query`。
|
||||
- `Form` 通常继承 `BaseEntity`。
|
||||
- 非树表页面的 `Query` 通常继承 `PageQuery`。
|
||||
- 各类 ID 字段通常用 `string | number`。
|
||||
- Java 数值类型通常映射为 `number`。
|
||||
- Boolean 映射为 `boolean`。
|
||||
- 其他生成字段默认多为 `string`。
|
||||
- 存在日期范围查询时保留 `params?: any`。
|
||||
|
||||
## Vue 页面规则
|
||||
|
||||
- 使用 `<script setup lang="ts">`。
|
||||
- 常见 import 来自本模块 API 和本地 `types`。
|
||||
- 通过 `getCurrentInstance()` 取 `proxy`,使用项目注入的公共工具。
|
||||
- 字典通常通过 `proxy?.useDict(...)` 获取,再用 `toRefs` 解构。
|
||||
- 常见状态包括:列表数组、`loading`、`buttonLoading`、`showSearch`、`ids`、`single`、`multiple`、`total`。
|
||||
- 查询和表单状态通常放在 `reactive<PageData<Form, Query>>({...})` 中。
|
||||
- 弹窗状态通常使用 `dialog.visible` 和 `dialog.title`。
|
||||
- 表单引用通常命名为 `queryFormRef` 和 `<business>FormRef`。
|
||||
|
||||
## 页面行为规则
|
||||
|
||||
- `getList` 负责设置 loading、处理日期范围参数、调用列表接口、回填 `rows` 和 `total`。
|
||||
- `handleQuery` 通常先把 `pageNum` 重置为 `1`,再重新查询。
|
||||
- `resetQuery` 负责清空日期范围和查询表单,然后重新加载。
|
||||
- `handleSelectionChange` 更新 `ids`、`single`、`multiple`。
|
||||
- `handleAdd` 先重置表单,再打开弹窗。
|
||||
- `handleUpdate` 先查详情,再把数据赋值到表单。
|
||||
- `submitForm` 校验表单、切换 `buttonLoading`、根据主键判断调用新增还是更新、提示成功并刷新列表。
|
||||
- `handleDelete` 使用 `proxy?.$modal.confirm(...)` 确认,再调用删除接口并刷新。
|
||||
- `handleExport` 使用 `proxy?.download(...)`。
|
||||
|
||||
## 模板结构规则
|
||||
|
||||
- 优先保持生成器的页面布局结构:搜索区卡片、表格区卡片、工具栏、分页、弹窗表单。
|
||||
- 保留 `v-hasPermi="['module:business:add']"` 这类权限指令。
|
||||
- 继续使用仓库已有组件:`right-toolbar`、`pagination`、`dict-tag`、`image-preview`、`image-upload`、`file-upload`、`editor`。
|
||||
- 已有页面对时间列使用 `parseTime` 时,新页面保持一致。
|
||||
- BETWEEN 日期查询继续使用 `el-date-picker` 加 `proxy?.addDateRange(...)`。
|
||||
|
||||
## 避免事项
|
||||
|
||||
- 生成器风格页面不要突然换成完全不同的状态管理方式,除非该前端目录本身已经这么做。
|
||||
- 模块已使用字典时,不要把选项文案硬编码到页面里。
|
||||
- 不要让 API 函数名和路由段偏离后端约定。
|
||||
- 后端 BO/service 依赖 begin/end 参数时,不要从查询对象里删掉 `params` 和日期范围处理。
|
||||
Reference in New Issue
Block a user