crud-code-generator — 数据库表对象增删查改导出代码生成器
根据 DDL 建表语句,一键生成后端 Java 全栈代码(Entity/DTO/QueryParam/Mapper/Service/Controller/Converter/Enum)+ 前端 Vue2 页面 + SQL 文件
激活条件
当用户提到以下任一内容时激活:
"根据模板生成增删查改代码"
"根据建表语句生成 CRUD"
"生成数据管理端接口"
"生成 table object CRUD"
提供 DDL SQL 并要求生成对应管理代码
核心原则
先确认后生成 — 在生成代码前,必须确认以下信息:
DDL 建表语句或 SQL 文件路径
后端工程主路径
是否需要生成前端代码及前端工程主路径(可选)
表中文注释(用于生成 Controller 的 Swagger 注解和前端页面标题)
生成后验证 — 后端执行 mvn clean package,前端提示用户是否验证 npm run dev。
Step 0-A: 自动探测项目结构
在生成代码前,必须先探测后端工程目录结构,自动适配不同的项目模块名。
探测步骤
扫描后端工程根目录下的所有 Maven 模块:
# 找到所有包含 pom.xml 的子模块
find {backend-root} -maxdepth 2 -name "pom.xml" -not -path "/target/"
识别模块用途 — 通过以下方式判断各模块的角色:
查找已有 Entity 类所在目录 → 确认为 domain 模块
查找已有 Service/ServiceMapper/Converter 类所在目录 → 确认为 core/service 模块
查找已有 Controller 类所在目录 → 确认为 admin/controller 模块
记录各模块的包路径:
Entity 包路径(如 com.infypower.fycev.domain)
DTO/QueryParam 包路径(如 com.infypower.fycev.service.dto)
Enum 包路径(如 com.infypower.enums)
Service 接口包路径(如 com.infypower.fycev.service)
ServiceImpl 包路径(如 com.infypower.fycev.service.impl)
Converter 包路径(如 com.infypower.fycev.service.converter)
Mapper 包路径(如 com.infypower.fycev.service.mapper)
Mapper XML 路径(如 ces-core/src/main/resources/mapper/)
Controller 包路径(如 com.infypower.fycev.rest)
探测前端结构:
检查 {frontend-root}/src/components/CRUD/crud.js 是否存在 → 确认使用 CRUD mixin
检查已有 API 文件路径(如 src/api/ces/)→ 确认 API 文件存放目录
检查已有页面路径(如 src/pages/ces/)→ 确认页面组件存放目录
探测失败处理
如果无法自动识别某个模块路径:
向用户展示已识别的部分
询问用户确认未识别部分的路径,给出示例选项
得到用户确认后再继续生成
Step 0-B: 确认输入信息
需要用户确认:
- DDL 建表语句(直接粘贴 或 提供 SQL 文件路径)
- 后端工程主路径(自动探测失败时需确认)
- 是否生成前端代码?如果是,提供前端工程主路径(自动探测失败时需确认)
- 表业务中文名称(用于 Controller 注解和页面标题,可从 DDL COMMENT 提取)
Step 1: 解析 DDL
从 DDL 中提取以下信息:
提取项 来源
表名 CREATE TABLE xxx
表注释 COMMENT = 'xxx'
字段列表 字段名、类型、注释、是否 NOT NULL、默认值
主键 PRIMARY KEY 或 id BIGINT
索引/唯一约束 INDEX / UNIQUE KEY
逻辑删除字段 deleted 字段 → 自动添加 @TableLogic
字段类型映射规则
SQL 类型 Java Entity 类型 DTO 类型 说明
BIGINT / BIGINT UNSIGNED Long Long (@JsonSerialize ToStringSerializer) ID 字段需要 ToStringSerializer 防止 JS 精度丢失
INT / TINYINT (枚举用途) 自定义 Enum 自定义 Enum 需要生成对应枚举类,见字段注释枚举值定义
TINYINT (0/1 二值) Boolean Boolean 如 status=0/1 映射为 Boolean,Excel 导出用 replace = {"启用_true", "禁用_false"}
VARCHAR / CHAR String String (@NotBlank/@Size) 需要加校验注解
TEXT String String
DATETIME / TIMESTAMP Date Date java.util.Date
TIME java.sql.Time java.sql.Time
DECIMAL / NUMERIC BigDecimal BigDecimal
JSON String String 以 JSON 字符串处理
DOUBLE / FLOAT Double Double
逻辑删除字段检测
如果 DDL 中包含 deleted 字段(注释含"逻辑删除"或默认值为 0),在 Entity 中添加:
@ApiModelProperty("逻辑删除:0=未删除, 1=已删除")
@TableLogic private Integer deleted;
Query 字段选择
仅将以下字段加入 QueryParam:
业务上可能用于筛选的字段(如 operatorId、status、类型字段)
时间字段生成范围查询(字段名 + Ge + _suffix Le,使用 @Query(type = Query.Type.GREATER_THAN_EQ))
字符串字段用 LIKE 查询(@Query(type = Query.Type.INNER_LIKE))
枚举字段判断
如果字段类型为 TINYINT 且注释中包含多个枚举值描述(如 1=xxx, 2=yyy),需要生成对应枚举类
如果字段类型为 TINYINT 且注释仅为 0=禁用, 1=启用 等二值描述,映射为 Boolean,不生成枚举
如果已有相同含义的枚举(如 CommonEffectiveStatusEnum),直接复用不生成
Step 2: 生成后端代码
重要:使用 Step 0-A 探测到的实际路径,而非硬编码路径。
按以下顺序生成文件,每个文件参考模板见 references/java-templates.md:
Enum 枚举类(如果有 tinyint 等枚举字段)
Entity 实体类
DTO 数据传输对象
QueryParam 查询条件对象
Mapper 接口
Mapper XML
Converter(MapStruct)
Service 接口
ServiceImpl 实现类
Controller 控制器
命名转换规则
表名 ces_xxx_yyy_zzz → 类名 XxxYyyZzz(去掉 ces_ 前缀,大写驼峰)
如果表名没有 ces_ 前缀,直接转换为大写驼峰
Controller 类名: XxxYyyZzzController
Service 接口: XxxYyyZzzService
ServiceImpl: XxxYyyZzzServiceImpl
DTO: XxxYyyZzzDTO
QueryParam: XxxYyyZzzQueryParam
Converter: XxxYyyZzzConverter
Mapper: XxxYyyZzzMapper
URL 路径: /api/ces/xxx-yyy-zzz(中划线分隔,保持表名前缀 ces_ 后面的部分)
权限前缀: xxxYyyZzz:list / xxxYyyZzz:add / xxxYyyZzz:edit / xxxYyyZzz:del
QueryParam 必须包含枚举 import
如果 QueryParam 中引用了枚举类型,必须添加对应 import:
import com.infypower.enums.XxxStatusEnum;
ServiceImpl 必须包含 List import
import java.util.List;
import java.util.Set;
Step 3: 生成 SQL 文件
在 sql/{year}/{month}/ 目录下创建两个 SQL 文件:
DDL 文件: {日期}-ddl-{表名}.sql — 包含完整建表语句
DML 文件: {日期}-dml-{表名}.sql — 包含菜单权限 SQL,模板见 references/sql-templates.md
Step 4: 生成前端代码(如果用户要求)
4-A: 前端字典配置
如果后端生成了新的枚举类,需要在前端对应字典文件中添加字典配置。
查找前端字典配置文件 — 通常在 src/store/modules/permission.js 或 src/utils/dict.js 或类似的字典配置文件中
添加字典项 — 根据枚举的 code/desc 值生成对应的字典配置:
// 示例:在权限/字典 store 中添加
{ name: 'ces_xxx_status', items: [
{ label: '禁用', value: '0' },
{ label: '启用', value: '1' }
]}
如果无法自动识别字典配置文件路径,告知用户需要手动添加,并给出具体的字典配置代码片段。
4-B: 页面和 API 文件
API 文件 {frontend-root}/src/api/ces/{page-name}.js
页面组件 {frontend-root}/src/pages/ces/{page-name}/index.vue
模板参考 references/vue-templates.md。
页面名称转换:
表名 ces_xxx_yyy_zzz → 页面目录 xxx-yyy-zzz
API 文件 xxx-yyy-zzz.js
Step 5: 验证
后端验证(必须)
cd {backend-root}
mvn clean package -q
前端验证(可选,提示用户)
生成前端代码后,询问用户: