# jeecg-codegen Skills 使用指南

> 通过 Claude Code 以自然语言描述业务需求，自动生成 JeecgBoot 全套 CRUD 代码（后端 Java + 前端 Vue3 + 建表 SQL + 菜单 SQL）。
> 无需预建表结构，AI 根据语义自动推导表结构、字段类型与前端控件；也支持基于已有表或多表关联生成代码。覆盖单表、树表、一对多等模型，可一次性生成整个业务模块。主键策略自适应，字典字段自动匹配系统已有编码——不只是模板填充，而是从业务需求到可运行代码的端到端生成。

## 与传统代码生成器的区别

- **无需预建表结构**：只需用自然语言描述业务需求，AI 即可自动推导出表结构与字段属性，省去手动建表的前置工作
- **表结构驱动同样支持**：也可以直接基于已有的数据库表或多表关联关系生成代码，兼容传统代码生成器的使用习惯
- **模块级批量生成**：支持一次性生成整个业务模块的全部代码文件（涵盖多张表、多个功能点），而非逐表逐模型地单独生成
- **主键策略自适应**：AI 会参照项目中已有表的主键定义，自动选用合适的 MyBatis-Plus 主键策略，不局限于 String 类型的雪花 ID
- **字典智能匹配**：自动读取系统字典表（`sys_dict` + `sys_dict_item`），为字段精准匹配已有的字典编码，免去手动查找和指定的繁琐步骤
- **代码自动归位**：生成的前后端代码自动落入项目对应目录，建表与菜单 SQL 自动追加至 Flyway 升级脚本，无需手动搬运，生成即就绪

---

## 触发方式

在 Claude Code 对话中，用自然语言描述你要创建的功能，包含以下任意关键词即可自动触发：

```
代码生成 / 生成代码 / 创建模块 / 新增功能 / 建表 / 加字段 / 增加字段 / 新增字段 / 修改字段 / 删除字段
```

## 示例用法

### 1. 一句话描述（最简方式）

```
帮我生成一个商品管理模块，包含商品名称、价格、库存、状态、图片、描述
```

AI 会自动推导：表名 `biz_goods`、字段类型（价格→BigDecimal、库存→Integer、图片→JImageUpload 等）。

### 2. 指定表名和字典

```
创建一个订单管理功能：
- 表名 biz_order
- 字段：订单编号、客户名称、下单日期、金额、状态（待付款/已付款/已发货/已完成）、备注
- 状态用字典 order_status
```

### 3. 树表（带层级关系）

```
建一个部门分类的树表，包含分类名称和分类编码
```

提到"分类/层级/树/上下级"等关键词，AI 自动识别为树表模式。

### 4. 一对多（主子表）

```
生成一个采购单模块，主表是采购单（单号、供应商、日期、总金额），
子表是采购明细（商品名、数量、单价、小计）
```

提到"主子表/明细/一对多"等关键词，AI 自动识别为一对多模式。

### 5. 指定后端模块

```
在 jeecg-module-demo 模块下生成一个公告管理，包含标题、内容（富文本）、发布时间、状态
```

### 6. 已有表反向生成（给表名即可）

```
生成 tmp_tables 这个表的代码
```

AI 会自动连接数据库查询 DDL，解析主键类型、全部字段、系统字段，然后生成匹配的代码。无需手动描述字段。

### 7. 增量修改（给已有模块加/改/删字段）

```
给表信息管理加一个备注字段
```

```
给 tmp_tables 增加两个字段：排序号和状态（启用/停用）
```

```
把商品管理的价格字段从 int 改成 decimal
```

```
删除商品管理的描述字段
```

AI 会自动定位已生成的全部代码文件（Entity、data.ts、Form.vue 等），精确修改每个文件，并生成 ALTER TABLE 的 Flyway SQL，无需重新生成整个模块。

## 交互流程

### 全量生成流程

```
Step 0  判断操作类型：全量生成 or 增量修改？
        ↓
Step 1  解析需求，判断场景：
        · 场景A — 已有表 → 查数据库获取 DDL，自动解析字段
        · 场景B — 新建表 → 从自然语言推导表结构
        ↓
Step 2  询问 4 个选项（都有默认值，说"确认"即可）：
        ① 后端模块 — 默认 jeecg-module-system/jeecg-system-biz
        ② 前端风格 — vue3（封装风格）或 vue3Native（原生风格）
        ③ 前端目录 — 默认按 entityPackage 值
        ④ 是否读取系统字典 — 默认是，自动匹配已有字典编码
        ↓
Step 3  展示表结构摘要（含匹配到的字典），等待确认
        ↓
Step 4  确认后，自动生成全部文件写入项目目录
        ↓
Step 5  输出生成文件清单 + 后续操作说明
```

### 增量修改流程

```
Step 0  识别增量修改关键词（加字段/删字段/修改字段/给XX加...）
        ↓
Step 1  定位目标模块，扫描并读取已有代码文件
        （Entity.java / *.data.ts / *List.vue / *Modal.vue / *Form.vue）
        ↓
Step 2  解析已有字段，推导新字段属性
        ↓
Step 3  展示修改摘要（每个文件的具体变更内容），等待确认
        ↓
Step 4  确认后，用 Edit 精确修改每个文件 + 生成 ALTER TABLE SQL
        ↓
Step 5  输出修改文件清单 + 后续操作说明
```

## 生成产物

### 单表模式（11 个文件）

| 类别 | 文件 | 说明 |
|------|------|------|
| **后端** | `Entity.java` | 实体类，含 MyBatis-Plus / AutoPoi / Dict 注解 |
| | `Controller.java` | REST 控制器，继承 JeecgController，含权限注解 |
| | `IService.java` | Service 接口 |
| | `ServiceImpl.java` | Service 实现 |
| | `Mapper.java` | MyBatis Mapper 接口 |
| | `Mapper.xml` | MyBatis XML 映射 |
| **前端** | `*.api.ts` | API 接口定义（list/save/edit/delete/export/import） |
| | `*.data.ts` | 列定义 + 查询表单 + 编辑表单 Schema |
| | `*List.vue` | 列表页面（表格 + 查询 + 操作按钮） |
| | `*Modal.vue` | 编辑弹窗 |
| | `*Form.vue` | 表单组件（仅 vue3Native 风格） |
| **SQL** | `V*__.sql` | Flyway 迁移：建表DDL + 菜单 + 7个按钮权限 + 角色授权 |

### 树表模式

在单表基础上增加：
- Entity 额外字段：`pid`（父节点）、`has_child`（是否有子节点）
- Controller 额外接口：`rootList`、`childList`、`getChildListBatch`
- Service 额外方法：树节点的增删改逻辑
- 前端额外接口：树数据加载、子节点查询

### 一对多模式

在单表基础上增加：
- 子表完整的 Entity / Mapper / Service 各一套
- 主表 Service 包含联合保存/更新/删除
- Page VO 用于 Excel 主子表导入导出
- 前端 Tab 页展示子表数据

## 两种前端风格

| | vue3 封装风格 | vue3Native 原生风格 |
|---|-------------|-------------------|
| **表单** | `BasicForm` + FormSchema 配置驱动 | `a-form` + `a-form-item` 模板直接写控件 |
| **弹窗** | `BasicModal` + `useModal` Hook | `JModal` + `ref` + `defineExpose` |
| **表格** | `BasicTable` + `useTable` + `formConfig` 内置查询 | `BasicTable` + 手写查询表单区域 |
| **数据文件** | columns + searchFormSchema + formSchema | columns + superQuerySchema（表单在模板中） |
| **优点** | 代码量少，配置化，统一风格 | 灵活度高，可深度定制交互 |
| **适合** | 标准 CRUD 页面 | 需要复杂交互或自定义布局的场景 |

## 智能字段推导

AI 根据字段语义自动推导类型和控件：

| 语义关键词 | 数据库类型 | Java 类型 | 前端控件 |
|-----------|----------|----------|---------|
| 名称/标题/编码 | varchar(100) | String | Input / a-input |
| 金额/价格/费用 | decimal(10,2) | BigDecimal | InputNumber / a-input-number |
| 数量/个数 | int | Integer | InputNumber / a-input-number |
| 状态/类型/级别 | varchar(10) | String | JDictSelectTag |
| 是否/开关 | varchar(2) | String | Switch / a-switch |
| 日期/生日 | date | Date | DatePicker / a-date-picker |
| 时间/日期时间 | datetime | Date | DatePicker(showTime) |
| 备注/描述/说明 | text | String | InputTextArea / a-textarea |
| 内容/富文本 | text | String | JEditor |
| 图片/头像/照片 | varchar(1000) | String | JImageUpload |
| 文件/附件 | varchar(1000) | String | JUpload |
| 用户/负责人 | varchar(32) | String | JSelectUserByDept |
| 部门/组织 | varchar(32) | String | JSelectDept |
| 排序/序号 | int | Integer | InputNumber / a-input-number |

当然，你也可以在描述中明确指定字段类型，AI 会优先使用你的指定。

### 已有表的 DB 类型→控件自动映射

对于已有表场景，如果字段没有注释，AI 根据数据库列类型自动推导前端控件：

| DB 列类型 | Java 类型 | 默认前端控件 |
|----------|----------|-----------|
| varchar(n) n<=200 | String | Input |
| varchar(n) n>200 | String | InputTextArea |
| text / longtext | String | InputTextArea |
| int / tinyint | Integer | InputNumber |
| bigint | Long | InputNumber |
| decimal / double / float | BigDecimal | InputNumber |
| date | Date | DatePicker |
| datetime / timestamp | Date | DatePicker(showTime) |

## 字典智能匹配

生成代码时，AI 可选择读取系统字典表（`sys_dict` + `sys_dict_item`），自动为字段匹配已有的字典编码。

**匹配优先级：**
1. **用户明确指定** — `"状态用字典 order_status"`，直接使用
2. **字段名精确匹配** — 字段名 `status` 与字典编码 `status` 一致
3. **语义关键词匹配** — 字段注释含"状态"，搜索字典名称含"状态"的字典
4. **不匹配** — 找不到合适字典时，不使用字典注解，按普通 Input 处理

**效果示例：**

假设系统中已有字典 `order_status`（待付款=0, 已付款=1, 已完成=2），当你描述字段"订单状态"时：

| 位置 | 自动生成内容 |
|------|-------------|
| Entity.java | `@Dict(dicCode = "order_status")` |
| columns | `dataIndex: 'orderStatus_dictText'` |
| formSchema | `component: 'JDictSelectTag', componentProps: { dictCode: 'order_status' }` |
| searchFormSchema | `component: 'JDictSelectTag', componentProps: { dictCode: 'order_status' }` |

在 Step 3 表结构摘要中会展示匹配结果，确认前可以修改或取消字典关联。

## 已有表反向生成

给定表名时，AI 会自动连接数据库获取精确表结构：

1. **查询 DDL**：`SHOW CREATE TABLE 表名` 获取完整建表语句
2. **查询字段详情**：从 `information_schema.COLUMNS` 获取每个字段的类型、注释、是否可空、默认值、主键标识
3. **解析主键策略**：根据主键列类型和是否 AUTO_INCREMENT 选择 MyBatis-Plus 注解
4. **识别系统字段**：检查 create_by/create_time/update_by/update_time/sys_org_code 是否存在
5. **推导前端控件**：优先用字段注释语义匹配，无注释时按 DB 类型映射

数据库连接信息：`mysql -h127.0.0.1 -P3306 -uroot -proot jeecgboot3`（配置文件：`application-dev.yml`）

## 增量修改详解

### 支持的操作

| 操作 | 说明 | 影响的文件 |
|------|------|-----------|
| **加字段** | 在所有文件中追加新字段定义 | Entity + data.ts + Form.vue(Native) + ALTER TABLE SQL |
| **删字段** | 从所有文件中移除指定字段 | Entity + data.ts + Form.vue(Native) + DROP COLUMN SQL |
| **改字段** | 修改字段类型/控件/注释等 | Entity + data.ts + Form.vue(Native) + MODIFY COLUMN SQL |

### 修改位置清单

每次增量修改，AI 会精确定位并修改以下位置：

1. **Entity.java** — 字段声明 + 注解（@Excel、@Dict、@Schema、@JsonFormat 等）+ 必要的 import
2. ***.data.ts** — columns 列定义 + formSchema 表单项 + searchFormSchema 查询条件（如需） + superQuerySchema（如存在）
3. ***Form.vue**（仅 vue3Native）— `<a-form-item>` 控件 + `formData` 初始值
4. **Flyway SQL** — `ALTER TABLE ADD/DROP/MODIFY COLUMN` 语句

## Flyway 版本号规则

生成 Flyway SQL 前自动检查已有版本号，递增避免冲突：

- 版本命名：`V{YYYYMMDD}_{序号}__{描述}.sql`
- 检查当天是否已有文件（如 `V20260311_1__xxx.sql`）
- 如果有，序号递增（`V20260311_2__xxx.sql`）
- 如果没有，从 `_1` 开始
- 菜单 SQL 的 ID 使用 13 位毫秒级真实时间戳（`date +%s%3N`），确保全局唯一

## 主键策略自适应

AI 会根据已有表的 DDL 自动选择正确的主键策略：

| 表DDL中的主键定义 | Java类型 | MyBatis-Plus 注解 |
|------------------|---------|------------------|
| `int AUTO_INCREMENT` | Integer | `@TableId(type = IdType.AUTO)` |
| `bigint AUTO_INCREMENT` | Long | `@TableId(type = IdType.AUTO)` |
| `varchar(36)` 无自增 | String | `@TableId(type = IdType.ASSIGN_ID)` |
| `bigint` 无自增 | Long | `@TableId(type = IdType.ASSIGN_ID)` |

新建表时默认使用 JeecgBoot 标准的 `varchar(36) + ASSIGN_ID`。

**注意：** 当主键为 Integer/Long 类型时，Controller 中 `delete` 和 `queryById` 的参数类型也要对应调整，`deleteBatch` 需要做类型转换。

## 系统字段智能判断

**对于已有表**，AI 会检查表结构，只生成表中实际存在的系统字段：

| 字段 | 不存在时 |
|------|---------|
| `create_by` / `create_time` | 不生成对应 Java 属性 |
| `update_by` / `update_time` | 不生成对应 Java 属性 |
| `sys_org_code` | 不生成对应 Java 属性 |

**对于新建表**（自然语言描述需求），默认添加全部系统字段。

树表额外字段：`pid`、`has_child`（同样需检查是否实际存在）。

## 生成后的操作

### 1. 执行 SQL

生成的 Flyway SQL 文件位于：
```
jeecg-module-system/jeecg-system-start/src/main/resources/flyway/sql/mysql/
```

两种方式：
- **自动执行**：重启后端时 Flyway 自动执行
- **手动执行**：在数据库中手动执行 SQL 文件内容

### 2. 重启后端

```bash
cd jeecg-boot-framework-2026
mvn spring-boot:run -pl jeecg-module-system/jeecg-system-start
```

### 3. 刷新前端

开发服务器（`pnpm dev`）会自动热更新，无需重启。

### 4. 访问功能

登录系统后，新菜单已自动添加（默认授权给 admin 角色），直接可见可用。

## 文件路径说明

| 类别 | 路径 |
|------|------|
| 后端代码 | `jeecg-boot-framework-2026/{module}/src/main/java/org/jeecg/modules/{package}/` |
| 前端代码 | `jeecgboot-vue3-2026/src/views/{viewDir}/` |
| Flyway SQL | `jeecg-boot-framework-2026/jeecg-module-system/jeecg-system-start/src/main/resources/flyway/sql/mysql/` |

## 注意事项

1. **每次生成/修改前会展示摘要等你确认**，不会直接写文件，放心使用
2. **已有表按实际结构生成**，不会盲目添加不存在的字段
3. **权限编码规则**：`{entityPackage}:{tableName}:add/edit/delete/deleteBatch/exportXls/importExcel`
4. **如果后端模块目录不存在**，AI 会提示你先创建 Maven 模块结构
5. **生成的代码可以二次修改**，和手写代码完全一样，没有任何框架锁定
6. **增量修改只改动必要的文件和位置**，不会影响你手动修改过的其他代码
7. **字典匹配可选**，不想自动匹配字典时在 Step 2 选择"否"即可
