# KRA AutoCode 自动代码生成工具 KRA AutoCode 是一个强大的代码生成工具,支持生成符合 Kratos DDD 架构的后端代码和 React TypeScript 前端代码。 ## 目录 - [功能特性](#功能特性) - [快速开始](#快速开始) - [CLI 命令说明](#cli-命令说明) - [配置文件格式](#配置文件格式) - [Web 界面使用](#web-界面使用) - [模板自定义](#模板自定义) - [生成的代码结构](#生成的代码结构) - [常见问题](#常见问题) ## 功能特性 - **Kratos DDD 架构**: 生成符合 Kratos 分层架构的代码(biz/data/service/server) - **GORM Gen 集成**: 使用 GORM Gen 生成类型安全的数据库操作代码 - **React TypeScript**: 生成现代化的 React 前端代码,使用 Ant Design Pro 组件 - **双入口支持**: 同时支持 CLI 命令行和 Web 界面两种生成方式 - **多数据库支持**: 支持 MySQL、PostgreSQL、SQLite 数据库 - **代码注入**: 自动注入 Wire Provider、路由注册等代码 - **历史记录**: 支持生成历史记录和代码回滚 ## 快速开始 ### 方式一:使用 CLI 工具 ```bash # 从配置文件生成代码 kra-gen generate -c autocode.yaml # 交互模式(推荐新手使用) kra-gen generate -i # 预览模式(不写入文件) kra-gen generate -c autocode.yaml -p ``` ### 方式二:使用 Web 界面 1. 启动 KRA 服务 2. 访问 `系统工具 > 代码生成器` 3. 选择数据库和表 4. 配置字段选项 5. 预览并生成代码 ## CLI 命令说明 KRA 代码生成工具提供了完整的命令行接口,支持配置文件、命令行参数和交互模式三种方式进行代码生成。 ### 安装 ```bash # 从源码编译 go build -o kra-gen ./cmd/kra-gen # 或者使用 go install go install ./cmd/kra-gen ``` ### 基础命令 ```bash kra-gen [command] [flags] ``` ### 全局参数 以下参数可用于所有子命令: | 参数 | 简写 | 说明 | 默认值 | |------|------|------|--------| | `--config` | `-c` | 配置文件路径 (YAML/JSON) | - | | `--output` | `-o` | 输出目录 | 当前项目目录 | | `--template` | `-t` | 模板目录 | resource/package | | `--verbose` | `-v` | 显示详细输出 | false | | `--help` | `-h` | 显示帮助信息 | - | ### 可用命令 | 命令 | 说明 | |------|------| | `generate` | 生成代码(核心命令) | | `preview` | 预览生成的代码(不写入文件) | | `list` | 列出可用资源(模板、包、数据库) | | `version` | 显示版本信息 | | `help` | 显示帮助信息 | --- ### generate 命令 生成 Kratos DDD 架构的后端代码和 React 前端代码。这是 CLI 工具的核心命令。 ```bash kra-gen generate [flags] ``` #### 参数说明 | 参数 | 简写 | 说明 | 默认值 | |------|------|------|--------| | `--config` | `-c` | 配置文件路径 (YAML/JSON) | - | | `--interactive` | `-i` | 交互模式(推荐新手使用) | false | | `--preview` | `-p` | 预览模式(不写入文件) | false | | `--output` | `-o` | 输出目录 | 当前目录 | | `--template` | `-t` | 模板目录 | resource/package | | `--db` | - | 数据库连接名 | - | | `--table` | - | 表名 | - | | `--package` | - | 包名 | - | | `--struct` | - | 结构体名 | - | | `--desc` | - | 描述 | - | | `--no-web` | - | 不生成前端代码 | false | | `--no-server` | - | 不生成后端代码 | false | | `--only-template` | - | 仅生成模板(不注入代码) | false | | `--add` | - | 追加模式(不覆盖已有文件) | false | | `--tree` | - | 树形结构数据 | false | | `--tree-json` | - | 树形结构展示字段 | - | | `--verbose` | `-v` | 显示详细输出 | false | #### 三种使用方式 **方式一:配置文件方式(推荐用于复杂配置)** ```bash # 使用 YAML 配置文件 kra-gen generate -c autocode.yaml # 使用 JSON 配置文件 kra-gen generate -c autocode.json ``` **方式二:命令行参数方式(适合简单场景)** ```bash # 基本用法 kra-gen generate --table users --package example --struct User # 完整参数 kra-gen generate \ --db mysql \ --table users \ --package example \ --struct User \ --desc "用户管理" ``` **方式三:交互模式(推荐新手使用)** ```bash kra-gen generate -i ``` 交互模式会引导你完成以下步骤: 1. 配置数据库连接(支持从 configs/config.yaml 自动读取) 2. 选择数据库 3. 选择数据表 4. 配置基本信息(结构体名、包名、描述等) 5. 配置字段(显示、验证、搜索、关联等) 6. 配置生成选项 #### 使用示例 ```bash # 从配置文件生成 kra-gen generate -c autocode.yaml # 使用命令行参数 kra-gen generate --db mysql --table users --package example --struct User --desc "用户管理" # 交互模式 kra-gen generate -i # 预览模式(不写入文件) kra-gen generate -c autocode.yaml -p # 仅生成后端代码 kra-gen generate -c autocode.yaml --no-web # 仅生成前端代码 kra-gen generate -c autocode.yaml --no-server # 仅生成模板(不注入代码到现有文件) kra-gen generate -c autocode.yaml --only-template # 追加模式(不覆盖已有文件) kra-gen generate -c autocode.yaml --add # 树形结构数据 kra-gen generate -c autocode.yaml --tree --tree-json name # 详细输出模式 kra-gen generate -c autocode.yaml -v # 指定输出目录 kra-gen generate -c autocode.yaml -o /path/to/project # 使用自定义模板 kra-gen generate -c autocode.yaml -t /path/to/custom/templates ``` #### 交互模式详细流程 交互模式提供了完整的引导式配置体验: ``` ======================================== KRA 代码生成 - 交互模式 ======================================== 步骤 1/6: 配置数据库连接 ---------------------------------------- 检测到配置文件: configs/config.yaml 是否使用配置文件中的数据库连接? (y/n): y 使用 MySQL 数据库: root@127.0.0.1:3306/kra 正在连接数据库... 成功! 步骤 2/6: 选择数据库 ---------------------------------------- 可用数据库: 1. information_schema 2. kra (当前) 3. mysql 请选择数据库 [2]: 2 已选择数据库: kra 步骤 3/6: 选择数据表 ---------------------------------------- 数据库 kra 中的表: 1. sys_users 2. sys_apis 3. articles 请选择表 (输入序号): 3 已选择表: articles 步骤 4/6: 配置基本信息 ---------------------------------------- 结构体名称 [Articles]: Article 包名 [articles]: example 缩写 [article]: article 功能描述 [Article管理]: 文章管理 步骤 5/6: 配置字段 ---------------------------------------- 表 articles 的字段: ---------------------------------------- [跳过] id (系统字段) [跳过] created_at (系统字段) [跳过] updated_at (系统字段) [跳过] deleted_at (系统字段) Title (string) - 标题 Content (string) - 内容 Status (int) - 状态 ---------------------------------------- 共 3 个字段 是否需要详细配置每个字段? (y/n): y 步骤 6/6: 配置生成选项 ---------------------------------------- 【基础配置】 使用 KRA_MODEL (包含 ID, CreatedAt, UpdatedAt, DeletedAt)? (y/n) [y]: y 自动迁移数据库表结构? (y/n) [y]: y 【生成范围】 生成后端代码? (y/n) [y]: y 生成前端代码? (y/n) [y]: y 【高级选项】 仅生成模板 (不注入代码到现有文件)? (y/n) [n]: n 追加模式 (不覆盖已有文件)? (y/n) [n]: n 【自动注册配置】 自动创建 API 记录? (y/n) [y]: y 自动创建菜单记录? (y/n) [y]: y 自动创建按钮权限? (y/n) [y]: y 自动创建资源标识? (y/n) [n]: n 【树形结构配置】 是否为树形结构数据? (y/n): n ======================================== 配置完成! ======================================== ``` --- ### preview 命令 预览将要生成的代码,不写入任何文件。这是 `generate -p` 的快捷方式,但提供了更多预览选项。 ```bash kra-gen preview [flags] ``` #### 参数说明 | 参数 | 简写 | 说明 | 默认值 | |------|------|------|--------| | `--config` | `-c` | 配置文件路径 | - | | `--db` | - | 数据库连接名 | - | | `--table` | - | 表名 | - | | `--package` | - | 包名 | - | | `--struct` | - | 结构体名 | - | | `--desc` | - | 描述 | - | | `--no-web` | - | 不生成前端代码 | false | | `--no-server` | - | 不生成后端代码 | false | | `--full` | - | 显示完整代码内容(带语法高亮) | false | | `--no-color` | - | 不使用语法高亮 | false | #### 使用示例 ```bash # 简单预览(显示文件列表和配置摘要) kra-gen preview -c autocode.yaml # 完整预览(显示所有生成的代码内容) kra-gen preview -c autocode.yaml --full # 完整预览,不使用语法高亮(适合重定向到文件) kra-gen preview -c autocode.yaml --full --no-color # 仅预览后端代码 kra-gen preview -c autocode.yaml --full --no-web # 仅预览前端代码 kra-gen preview -c autocode.yaml --full --no-server # 使用命令行参数预览 kra-gen preview --table users --package example --struct User ``` #### 预览输出示例 **简单预览模式:** ``` ======================================== 代码预览模式 ======================================== 包名: example 结构体: Article 表名: articles 描述: 文章管理 数据库: kra ---------------------------------------- 生成选项: 使用 KRA_MODEL: 是 自动迁移: 是 生成后端: 是 生成前端: 是 仅生成模板: 否 追加模式: 否 创建 API 记录: 是 创建菜单记录: 是 创建按钮权限: 是 创建资源标识: 否 ---------------------------------------- 将生成以下文件: 后端文件: - ./internal/biz/example/article.go - ./internal/data/example/article.go - ./internal/data/model/example/article.go - ./internal/service/example/article.go - ./internal/service/types/example/request/article.go - ./internal/server/handler/example/article.go - ./internal/server/router/example/article.go 前端文件: - ./web/src/pages/example/article/index.tsx - ./web/src/pages/example/article/form.tsx - ./web/src/pages/example/article/detail.tsx - ./web/src/services/kratos/example.ts - ./web/src/types/example/article.d.ts 字段配置: - Title (string): 标题 [搜索:LIKE] - Content (string): 内容 - Status (int): 状态 [搜索:EQ] [字典:article_status] ======================================== 预览完成,未写入任何文件 ======================================== ``` **完整预览模式(--full):** ``` ╔════════════════════════════════════════════════════════════════╗ ║ KRA 代码预览 (完整模式) ║ ╚════════════════════════════════════════════════════════════════╝ 包名: example 结构体: Article 表名: articles 描述: 文章管理 ──────────────────────────────────────────────────────────────── 📄 Biz Layer 输出路径: ./internal/biz/example/article.go 1 │ package example 2 │ 3 │ import ( 4 │ "context" 5 │ "github.com/go-kratos/kratos/v2/log" 6 │ ) 7 │ 8 │ // ArticleRepo 仓储接口 9 │ type ArticleRepo interface { 10 │ Create(ctx context.Context, article *Article) error ... ════════════════════════════════════════════════════════════════ 预览统计 成功: 12 个文件 ⚠️ 预览模式 - 未写入任何文件 ``` --- ### list 命令 列出可用的模板、包或数据库连接。 ```bash kra-gen list [templates|packages|databases] ``` #### 子命令说明 | 子命令 | 说明 | |--------|------| | `templates` | 列出可用的代码生成模板 | | `packages` | 列出已创建的业务包 | | `databases` | 列出配置的数据库连接 | #### 使用示例 ```bash # 列出可用模板 kra-gen list templates # 输出: # 可用模板: # package - 标准包模板 (Kratos DDD 架构) # plugin - 插件模板 (独立功能模块) # 列出已创建的包 kra-gen list packages # 输出: # 已创建的包: # (需要连接数据库获取) # 列出数据库连接 kra-gen list databases # 输出: # 数据库连接: # MySQL: root@127.0.0.1:3306/kra ``` --- ### version 命令 显示 KRA 代码生成工具的版本信息。 ```bash kra-gen version ``` #### 输出示例 ``` kra-gen v1.0.0 KRA 自动代码生成工具 支持 Kratos DDD 架构 + GORM Gen + React TypeScript ``` --- ### 退出码 | 退出码 | 说明 | |--------|------| | 0 | 成功 | | 1 | 一般错误(配置错误、验证失败等) | --- ### 环境变量 | 变量名 | 说明 | 默认值 | |--------|------|--------| | `KRA_CONFIG` | 默认配置文件路径 | - | | `KRA_TEMPLATE_DIR` | 默认模板目录 | resource/package | | `KRA_OUTPUT_DIR` | 默认输出目录 | 当前目录 | --- ### 常用命令组合 ```bash # 快速生成(使用配置文件) kra-gen generate -c autocode.yaml # 新手入门(交互模式) kra-gen generate -i # 预览后生成 kra-gen preview -c autocode.yaml --full && kra-gen generate -c autocode.yaml # 仅生成后端代码 kra-gen generate -c autocode.yaml --no-web # 仅生成前端代码 kra-gen generate -c autocode.yaml --no-server # 安全生成(追加模式,不覆盖已有文件) kra-gen generate -c autocode.yaml --add # 模板开发(仅生成模板,不注入代码) kra-gen generate -c autocode.yaml --only-template # 树形结构数据 kra-gen generate -c autocode.yaml --tree --tree-json name # 使用自定义模板 kra-gen generate -c autocode.yaml -t /path/to/custom/templates # 详细输出(调试用) kra-gen generate -c autocode.yaml -v ``` ## 配置文件格式 配置文件支持 YAML 和 JSON 两种格式,推荐使用 YAML 格式(更易读)。 ### 配置文件结构概览 ``` 配置文件 ├── 基础信息 # package, structName, tableName 等 ├── 生成选项 (options) # gvaModel, autoMigrate, generateWeb 等 ├── 字段配置 (fields) # 字段列表,每个字段包含类型、显示、搜索等配置 └── 自定义方法 (customMethods) # 可选,用于生成自定义查询方法 ``` ### YAML 格式完整示例 ```yaml # autocode.yaml # ==================== 基础信息 ==================== package: example # 包名(小写,用于目录和包名) structName: Article # 结构体名称(大驼峰,用于 Go 结构体) tableName: articles # 数据库表名(下划线命名) description: 文章管理 # 功能描述(用于注释和文档) businessDB: "" # 业务数据库(空表示默认数据库) abbreviation: article # 缩写(用于路由前缀和变量名) # ==================== 生成选项 ==================== options: # --- 基础配置 --- gvaModel: true # 使用 KRA_MODEL(包含 ID, CreatedAt, UpdatedAt, DeletedAt) autoMigrate: true # 自动迁移数据库表结构 # --- 生成范围 --- generateWeb: true # 生成前端代码 generateServer: true # 生成后端代码 # --- 高级选项 --- onlyTemplate: false # 仅生成模板(不注入代码到现有文件) isAdd: false # 追加模式(不覆盖已有文件) # --- 自动注册配置(仅在 onlyTemplate=false 时生效)--- autoCreateApiToSql: true # 自动创建 API 记录到 sys_apis 表 autoCreateMenuToSql: true # 自动创建菜单记录到 sys_base_menus 表 autoCreateBtnAuth: true # 自动创建按钮权限 autoCreateResource: false # 自动创建资源标识 # --- 树形结构配置 --- isTree: false # 是否为树形结构数据 treeJson: "" # 树形结构展示字段(如: name, title) # ==================== 字段配置 ==================== fields: # --- 字符串字段示例 --- - fieldName: Title # Go 字段名(大驼峰) fieldDesc: 标题 # 字段描述/注释 fieldType: string # Go 类型 fieldJson: title # JSON 字段名(小驼峰) columnName: title # 数据库列名(下划线) dataTypeLong: varchar(255) # 数据库类型 form: true # 显示在表单中 table: true # 显示在表格中 desc: true # 显示在详情页 excel: true # 支持导入/导出 require: true # 是否必填 errorText: 请输入标题 # 校验失败提示 clearable: true # 是否可清空 sort: false # 是否支持排序 fieldSearchType: LIKE # 搜索类型 fieldSearchHide: false # 是否隐藏搜索条件 fieldIndexType: "" # 索引类型 # --- 文本字段示例 --- - fieldName: Content fieldDesc: 内容 fieldType: string fieldJson: content columnName: content dataTypeLong: text form: true table: false # 长文本不在表格中显示 desc: true excel: false require: false clearable: true # --- 带字典的字段示例 --- - fieldName: Status fieldDesc: 状态 fieldType: int fieldJson: status columnName: status dataTypeLong: tinyint(1) form: true table: true desc: true require: false defaultValue: "1" # 默认值 fieldSearchType: EQ # 精确匹配 dictType: article_status # 字典类型(用于下拉选择) # --- 带数据源的字段示例 --- - fieldName: AuthorID fieldDesc: 作者ID fieldType: uint fieldJson: authorId columnName: author_id dataTypeLong: bigint(20) form: true table: true require: true fieldSearchType: EQ fieldIndexType: index # 普通索引 dataSource: # 数据源配置 dbName: "" # 数据库名(空表示当前数据库) table: sys_users # 关联表名 label: nick_name # 显示字段 value: id # 值字段 association: 1 # 关联关系: 1=一对一, 2=一对多 hasDeletedAt: true # 关联表是否有软删除 # --- 时间字段示例 --- - fieldName: PublishTime fieldDesc: 发布时间 fieldType: time.Time fieldJson: publishTime columnName: publish_time dataTypeLong: datetime form: true table: true desc: true require: false clearable: true sort: true fieldSearchType: BETWEEN # 时间范围搜索 # ==================== 自定义查询方法(可选)==================== customMethods: # --- 单条查询示例 --- - name: FindByTitle # 方法名称 description: 根据标题查询 # 方法描述 returnType: single # 返回类型: single(单个), list(列表), count(计数), exists(存在检查) params: # 方法参数 - name: title # 参数名 type: string # 参数类型 fieldName: Title # 对应字段名 conditions: # 查询条件 - fieldName: Title # 字段名 operator: eq # 操作符 paramName: title # 参数名 # --- 列表查询示例 --- - name: GetPublishedArticles description: 获取已发布的文章列表 returnType: list params: - name: status type: int fieldName: Status conditions: - fieldName: Status operator: eq paramName: status orderBy: created_at DESC # 排序 limit: 100 # 限制数量 ``` ### JSON 格式完整示例 ```json { "package": "example", "structName": "Article", "tableName": "articles", "description": "文章管理", "businessDB": "", "abbreviation": "article", "options": { "gvaModel": true, "autoMigrate": true, "generateWeb": true, "generateServer": true, "onlyTemplate": false, "isAdd": false, "autoCreateApiToSql": true, "autoCreateMenuToSql": true, "autoCreateBtnAuth": true, "autoCreateResource": false, "isTree": false, "treeJson": "" }, "fields": [ { "fieldName": "Title", "fieldDesc": "标题", "fieldType": "string", "fieldJson": "title", "columnName": "title", "dataTypeLong": "varchar(255)", "form": true, "table": true, "desc": true, "excel": true, "require": true, "errorText": "请输入标题", "clearable": true, "sort": false, "fieldSearchType": "LIKE", "fieldSearchHide": false, "fieldIndexType": "" }, { "fieldName": "Status", "fieldDesc": "状态", "fieldType": "int", "fieldJson": "status", "columnName": "status", "dataTypeLong": "tinyint(1)", "form": true, "table": true, "desc": true, "require": false, "defaultValue": "1", "fieldSearchType": "EQ", "dictType": "article_status" }, { "fieldName": "AuthorID", "fieldDesc": "作者ID", "fieldType": "uint", "fieldJson": "authorId", "columnName": "author_id", "dataTypeLong": "bigint(20)", "form": true, "table": true, "require": true, "fieldSearchType": "EQ", "fieldIndexType": "index", "dataSource": { "dbName": "", "table": "sys_users", "label": "nick_name", "value": "id", "association": 1, "hasDeletedAt": true } } ], "customMethods": [ { "name": "FindByTitle", "description": "根据标题查询", "returnType": "single", "params": [ { "name": "title", "type": "string", "fieldName": "Title" } ], "conditions": [ { "fieldName": "Title", "operator": "eq", "paramName": "title" } ] } ] } ``` ### 配置项详细说明 #### 基础信息 | 属性 | 类型 | 必填 | 说明 | 示例 | |------|------|------|------|------| | `package` | string | 是 | 包名(小写) | `example` | | `structName` | string | 是 | 结构体名称(大驼峰) | `Article` | | `tableName` | string | 是 | 数据库表名 | `articles` | | `description` | string | 是 | 功能描述 | `文章管理` | | `businessDB` | string | 否 | 业务数据库名(空=默认) | `""` | | `abbreviation` | string | 是 | 缩写(用于路由) | `article` | #### 生成选项 (options) | 属性 | 类型 | 默认值 | 说明 | |------|------|--------|------| | `gvaModel` | bool | `true` | 使用 KRA_MODEL(包含 ID, CreatedAt, UpdatedAt, DeletedAt) | | `autoMigrate` | bool | `true` | 自动迁移数据库表结构 | | `generateWeb` | bool | `true` | 生成前端代码 | | `generateServer` | bool | `true` | 生成后端代码 | | `onlyTemplate` | bool | `false` | 仅生成模板(不注入代码到现有文件) | | `isAdd` | bool | `false` | 追加模式(不覆盖已有文件) | | `autoCreateApiToSql` | bool | `true` | 自动创建 API 记录到 sys_apis 表 | | `autoCreateMenuToSql` | bool | `true` | 自动创建菜单记录到 sys_base_menus 表 | | `autoCreateBtnAuth` | bool | `true` | 自动创建按钮权限 | | `autoCreateResource` | bool | `false` | 自动创建资源标识 | | `isTree` | bool | `false` | 是否为树形结构数据 | | `treeJson` | string | `""` | 树形结构展示字段(如: name, title) | ### 字段配置说明 #### 基础属性 | 属性 | 类型 | 必填 | 说明 | |------|------|------|------| | `fieldName` | string | 是 | Go 结构体字段名(大驼峰) | | `fieldDesc` | string | 是 | 字段描述/注释 | | `fieldType` | string | 是 | Go 类型(string, int, uint, float64, bool, time.Time 等) | | `fieldJson` | string | 是 | JSON 序列化字段名(小驼峰) | | `columnName` | string | 是 | 数据库列名(下划线) | | `dataTypeLong` | string | 是 | 数据库类型(如 varchar(255), bigint(20)) | #### 显示属性 | 属性 | 类型 | 默认值 | 说明 | |------|------|--------|------| | `form` | bool | `false` | 是否显示在表单中 | | `table` | bool | `false` | 是否显示在表格中 | | `desc` | bool | `false` | 是否显示在详情页 | | `excel` | bool | `false` | 是否支持导入/导出 | #### 验证属性 | 属性 | 类型 | 默认值 | 说明 | |------|------|--------|------| | `require` | bool | `false` | 是否必填 | | `defaultValue` | string | `""` | 默认值 | | `errorText` | string | `""` | 校验失败提示文字 | | `clearable` | bool | `true` | 是否可清空 | #### 搜索属性 | 属性 | 类型 | 默认值 | 说明 | |------|------|--------|------| | `fieldSearchType` | string | `""` | 搜索类型(见下表) | | `fieldSearchHide` | bool | `false` | 是否隐藏搜索条件(高级搜索) | | `sort` | bool | `false` | 是否支持排序 | **搜索类型说明:** | 类型 | 说明 | 生成的 SQL 条件 | |------|------|----------------| | `LIKE` | 模糊匹配 | `WHERE title LIKE '%keyword%'` | | `EQ` | 精确匹配 | `WHERE status = 1` | | `BETWEEN` | 范围查询 | `WHERE created_at BETWEEN ? AND ?` | | `GT` | 大于 | `WHERE price > 100` | | `GTE` | 大于等于 | `WHERE price >= 100` | | `LT` | 小于 | `WHERE price < 100` | | `LTE` | 小于等于 | `WHERE price <= 100` | | `NEQ` | 不等于 | `WHERE status != 0` | #### 关联属性 | 属性 | 类型 | 默认值 | 说明 | |------|------|--------|------| | `dictType` | string | `""` | 字典类型(用于下拉选择) | | `dataSource` | object | `null` | 数据源配置(关联其他表) | | `fieldIndexType` | string | `""` | 索引类型(`index`, `unique`) | | `primaryKey` | bool | `false` | 是否为主键 | ### 数据源配置 (dataSource) 用于配置字段与其他表的关联关系,生成下拉选择组件。 | 属性 | 类型 | 必填 | 说明 | |------|------|------|------| | `dbName` | string | 否 | 数据库名(空表示当前数据库) | | `table` | string | 是 | 关联表名 | | `label` | string | 是 | 显示字段(用于下拉选项文本) | | `value` | string | 是 | 值字段(用于下拉选项值) | | `association` | int | 是 | 关联关系:`1`=一对一, `2`=一对多 | | `hasDeletedAt` | bool | 否 | 关联表是否有软删除字段 | **示例:** ```yaml dataSource: dbName: "" # 当前数据库 table: sys_users # 关联 sys_users 表 label: nick_name # 显示用户昵称 value: id # 值为用户 ID association: 1 # 一对一关系 hasDeletedAt: true # sys_users 表有软删除 ``` ### 自定义查询方法 (customMethods) 用于生成 GORM Gen 自定义查询方法,适用于复杂查询场景。 #### 方法配置 | 属性 | 类型 | 必填 | 说明 | |------|------|------|------| | `name` | string | 是 | 方法名称(如: FindByTitle, GetActiveUsers) | | `description` | string | 否 | 方法描述 | | `returnType` | string | 是 | 返回类型(见下表) | | `params` | array | 是 | 方法参数列表 | | `conditions` | array | 是 | 查询条件列表 | | `orderBy` | string | 否 | 排序字段(如: `created_at DESC`) | | `limit` | int | 否 | 限制数量(0 表示不限制) | **返回类型说明:** | 类型 | 说明 | 生成的方法签名 | |------|------|---------------| | `single` | 返回单条记录 | `func (r *repo) FindByTitle(ctx, title) (*Entity, error)` | | `list` | 返回记录列表 | `func (r *repo) GetActiveUsers(ctx, status) ([]*Entity, error)` | | `count` | 返回记录数量 | `func (r *repo) CountByStatus(ctx, status) (int64, error)` | | `exists` | 返回是否存在 | `func (r *repo) ExistsByTitle(ctx, title) (bool, error)` | #### 参数配置 (params) | 属性 | 类型 | 必填 | 说明 | |------|------|------|------| | `name` | string | 是 | 参数名称 | | `type` | string | 是 | 参数类型(string, int, uint, bool, time.Time 等) | | `fieldName` | string | 是 | 对应的字段名(用于生成查询条件) | #### 条件配置 (conditions) | 属性 | 类型 | 必填 | 说明 | |------|------|------|------| | `fieldName` | string | 是 | 字段名 | | `operator` | string | 是 | 操作符(见下表) | | `paramName` | string | 是 | 参数名(对应 params 中的 name) | **操作符说明:** | 操作符 | 说明 | 生成的条件 | |--------|------|-----------| | `eq` | 等于 | `field.Eq(param)` | | `neq` | 不等于 | `field.Neq(param)` | | `gt` | 大于 | `field.Gt(param)` | | `gte` | 大于等于 | `field.Gte(param)` | | `lt` | 小于 | `field.Lt(param)` | | `lte` | 小于等于 | `field.Lte(param)` | | `like` | 模糊匹配 | `field.Like("%" + param + "%")` | | `in` | 包含 | `field.In(params...)` | | `between` | 范围 | `field.Between(start, end)` | | `isNull` | 为空 | `field.IsNull()` | | `isNotNull` | 不为空 | `field.IsNotNull()` | #### 自定义方法示例 ```yaml customMethods: # 根据标题精确查询单条记录 - name: FindByTitle description: 根据标题查询文章 returnType: single params: - name: title type: string fieldName: Title conditions: - fieldName: Title operator: eq paramName: title # 根据状态查询列表,带排序和限制 - name: GetPublishedArticles description: 获取已发布的文章列表 returnType: list params: - name: status type: int fieldName: Status conditions: - fieldName: Status operator: eq paramName: status orderBy: created_at DESC limit: 100 # 统计指定作者的文章数量 - name: CountByAuthor description: 统计作者的文章数量 returnType: count params: - name: authorId type: uint fieldName: AuthorID conditions: - fieldName: AuthorID operator: eq paramName: authorId # 检查标题是否已存在 - name: ExistsByTitle description: 检查标题是否已存在 returnType: exists params: - name: title type: string fieldName: Title conditions: - fieldName: Title operator: eq paramName: title # 模糊搜索文章 - name: SearchByKeyword description: 根据关键词搜索文章 returnType: list params: - name: keyword type: string fieldName: Title conditions: - fieldName: Title operator: like paramName: keyword orderBy: created_at DESC # 多条件查询 - name: FindByStatusAndAuthor description: 根据状态和作者查询 returnType: list params: - name: status type: int fieldName: Status - name: authorId type: uint fieldName: AuthorID conditions: - fieldName: Status operator: eq paramName: status - fieldName: AuthorID operator: eq paramName: authorId ``` ### Go 类型与数据库类型映射 | Go 类型 | 数据库类型 | TypeScript 类型 | 说明 | |---------|-----------|-----------------|------| | `string` | `varchar(n)`, `text`, `longtext` | `string` | 字符串 | | `int` | `int`, `tinyint`, `smallint` | `number` | 整数 | | `int64` | `bigint` | `number` | 长整数 | | `uint` | `int unsigned`, `bigint unsigned` | `number` | 无符号整数 | | `float64` | `float`, `double`, `decimal` | `number` | 浮点数 | | `bool` | `tinyint(1)`, `boolean` | `boolean` | 布尔值 | | `time.Time` | `datetime`, `timestamp`, `date` | `string` | 时间 | | `datatypes.JSON` | `json`, `jsonb` | `object` | JSON 对象 | | `[]byte` | `blob`, `binary` | `string` | 二进制数据 | ## Web 界面使用 ### 访问代码生成器 1. 登录 KRA 管理后台 2. 导航到 `系统工具 > 代码生成器` ### 使用步骤 #### 1. 选择数据库和表 - 在左侧选择数据库连接 - 选择要生成代码的数据表 - 系统会自动读取表结构信息 #### 2. 配置基本信息 - **结构体名称**: Go 结构体名(大驼峰命名) - **包名**: 代码包名(小写) - **表名**: 数据库表名 - **描述**: 功能描述 - **缩写**: 用于路由和变量名 #### 3. 配置字段 对每个字段进行配置: - **显示配置**: 表单、表格、详情页、导出 - **验证配置**: 必填、默认值、校验提示 - **搜索配置**: 搜索类型、是否隐藏 - **关联配置**: 字典类型、数据源 #### 4. 配置生成选项 - **基础配置**: KRA_MODEL、自动迁移 - **生成范围**: 后端代码、前端代码 - **自动注册**: API 记录、菜单记录、按钮权限 #### 5. 预览和生成 - 点击「预览」查看将要生成的代码 - 确认无误后点击「生成」 - 生成完成后可在历史记录中查看 ### 历史记录管理 - 查看所有代码生成历史 - 支持代码回滚(删除生成的文件,移除注入的代码) - 支持重新生成 ## 模板自定义 KRA AutoCode 提供了灵活的模板自定义能力,允许开发者根据项目需求定制代码生成风格。本节详细介绍如何创建和使用自定义模板。 ### 模板目录结构 默认模板位于 `resource/package/` 目录下: ``` resource/package/ ├── server/ # 后端模板 │ ├── biz/ # Biz 层模板 │ │ ├── biz.go.tpl # Usecase + Repository 接口 │ │ └── enter.go.tpl # 包入口 │ ├── data/ # Data 层模板 │ │ ├── data.go.tpl # Repository 实现 │ │ ├── enter.go.tpl # 包入口 │ │ └── model.go.tpl # GORM Gen 模型 │ ├── handler/ # Handler 层模板 │ │ ├── handler.go.tpl # HTTP Handler │ │ └── enter.go.tpl # 包入口 │ ├── service/ # Service 层模板 │ │ ├── service.go.tpl # Service 实现 │ │ └── enter.go.tpl # 包入口 │ ├── router/ # Router 层模板 │ │ ├── router.go.tpl # 路由配置 │ │ └── enter.go.tpl # 包入口 │ └── types/ # 类型定义模板 │ └── request.go.tpl # 请求/响应类型 ├── web/ # 前端模板 │ ├── pages/ # React 页面模板 │ │ ├── index.tsx.tpl # 列表页面 │ │ ├── form.tsx.tpl # 表单组件 │ │ └── detail.tsx.tpl # 详情组件 │ ├── services/ # API 服务模板 │ │ └── api.ts.tpl # TypeScript API │ └── types/ # 类型定义模板 │ └── types.d.ts.tpl # TypeScript 类型 └── readme.txt.tpl # 说明文件 ``` ### 模板语法基础 模板使用 Go 的 `text/template` 语法。以下是常用语法: #### 变量输出 ```go // 输出变量 {{.StructName}} // 输出嵌套变量 {{.PrimaryField.FieldName}} ``` #### 条件判断 ```go {{- if .GvaModel }} // 使用 KRA_MODEL 时的代码 {{- else }} // 不使用 KRA_MODEL 时的代码 {{- end }} // 多条件判断 {{- if and .HasDataSource .Form }} // 同时满足两个条件 {{- end }} {{- if or .IsTree .HasDataSource }} // 满足任一条件 {{- end }} // 非判断 {{- if not .OnlyTemplate }} // 不是仅模板模式 {{- end }} ``` #### 循环遍历 ```go // 遍历字段列表 {{- range .Fields }} {{.FieldName}}: {{.FieldType}} {{- end }} // 带索引的遍历 {{- range $index, $field := .Fields }} // $index 是索引,$field 是字段 {{- end }} // 遍历 Map {{- range $key, $value := .DataSourceMap }} {{$key}}: {{$value.Table}} {{- end }} ``` #### 空白控制 ```go // {{- 去除左侧空白 // -}} 去除右侧空白 {{- if .Condition -}} 内容 {{- end -}} ``` ### 模板变量详解 #### 基础信息变量 | 变量 | 类型 | 说明 | 示例值 | |------|------|------|--------| | `{{.Package}}` | string | 包名(小写) | `example` | | `{{.PackageName}}` | string | 包名(小写) | `example` | | `{{.PackageT}}` | string | 包名(首字母大写) | `Example` | | `{{.StructName}}` | string | 结构体名(大驼峰) | `Article` | | `{{.TableName}}` | string | 数据库表名 | `articles` | | `{{.Description}}` | string | 功能描述 | `文章管理` | | `{{.Abbreviation}}` | string | 缩写(用于路由) | `article` | | `{{.Module}}` | string | Go 模块名 | `github.com/xxx/kra` | | `{{.HumpPackageName}}` | string | 驼峰包名 | `example` | | `{{.BusinessDB}}` | string | 业务数据库名 | `""` | #### 字段相关变量 | 变量 | 类型 | 说明 | |------|------|------| | `{{.Fields}}` | []*AutoCodeField | 字段列表 | | `{{.PrimaryField}}` | *AutoCodeField | 主键字段 | | `{{.DictTypes}}` | []string | 字典类型列表 | | `{{.DataSourceMap}}` | map[string]*DataSource | 数据源映射 | #### 选项变量 | 变量 | 类型 | 说明 | |------|------|------| | `{{.GvaModel}}` | bool | 是否使用 KRA_MODEL | | `{{.AutoMigrate}}` | bool | 是否自动迁移 | | `{{.AutoCreateResource}}` | bool | 是否创建资源标识 | | `{{.AutoCreateApiToSql}}` | bool | 是否自动创建 API 记录 | | `{{.AutoCreateMenuToSql}}` | bool | 是否自动创建菜单 | | `{{.AutoCreateBtnAuth}}` | bool | 是否自动创建按钮权限 | | `{{.OnlyTemplate}}` | bool | 是否仅生成模板 | | `{{.IsAdd}}` | bool | 是否追加模式 | | `{{.IsTree}}` | bool | 是否树形结构 | | `{{.TreeJson}}` | string | 树形展示字段 | | `{{.GenerateWeb}}` | bool | 是否生成前端 | | `{{.GenerateServer}}` | bool | 是否生成后端 | #### 特性标记变量 | 变量 | 类型 | 说明 | |------|------|------| | `{{.HasPic}}` | bool | 是否有图片字段 | | `{{.HasFile}}` | bool | 是否有文件字段 | | `{{.HasTimer}}` | bool | 是否有时间字段 | | `{{.HasRichText}}` | bool | 是否有富文本字段 | | `{{.HasDataSource}}` | bool | 是否有数据源字段 | | `{{.HasSearchTimer}}` | bool | 是否有时间搜索字段 | | `{{.HasArray}}` | bool | 是否有数组字段 | | `{{.HasExcel}}` | bool | 是否有导出字段 | | `{{.NeedSort}}` | bool | 是否需要排序 | | `{{.NeedJSON}}` | bool | 是否需要 JSON 类型 | | `{{.HasCustomMethods}}` | bool | 是否有自定义方法 | #### 字段对象属性 每个字段对象 (`AutoCodeField`) 包含以下属性: | 属性 | 类型 | 说明 | |------|------|------| | `.FieldName` | string | Go 字段名(大驼峰) | | `.FieldDesc` | string | 字段描述 | | `.FieldType` | string | Go 类型 | | `.FieldJson` | string | JSON 字段名(小驼峰) | | `.ColumnName` | string | 数据库列名 | | `.DataTypeLong` | string | 数据库类型 | | `.Comment` | string | 字段注释 | | `.FieldSearchType` | string | 搜索类型 | | `.FieldSearchHide` | bool | 是否隐藏搜索 | | `.DictType` | string | 字典类型 | | `.Form` | bool | 是否显示在表单 | | `.Table` | bool | 是否显示在表格 | | `.Desc` | bool | 是否显示在详情 | | `.Excel` | bool | 是否支持导出 | | `.Require` | bool | 是否必填 | | `.DefaultValue` | string | 默认值 | | `.ErrorText` | string | 校验失败提示 | | `.Clearable` | bool | 是否可清空 | | `.Sort` | bool | 是否支持排序 | | `.PrimaryKey` | bool | 是否主键 | | `.DataSource` | *DataSource | 数据源配置 | | `.CheckDataSource` | bool | 是否有数据源 | | `.FieldIndexType` | string | 索引类型 | ### 模板函数详解 #### 类型转换函数 **GenerateTSType** - Go 类型转 TypeScript 类型 ```go // 用法 {{ GenerateTSType .FieldType }} // 类型映射 // string -> string // int, int64, uint, float64 -> number // bool -> boolean // time.Time -> string // json, array -> object ``` **GenerateModelField** - 生成 GORM Gen 模型字段 ```go // 用法 {{ GenerateModelField . }} // 输出示例 Title string `gorm:"column:title;type:varchar(255);comment:标题" json:"title"` // 标题 ``` #### 代码生成函数 **GenerateGormGenSearchConditions** - 生成 GORM Gen 搜索条件 ```go // 用法 {{ GenerateGormGenSearchConditions .Fields .StructName }} // 输出示例 if req.Title != nil && *req.Title != "" { q = q.Where(t.Title.Like("%" + *req.Title + "%")) } if req.Status != nil { q = q.Where(t.Status.Eq(*req.Status)) } ``` **GenerateReactFormItem** - 生成 React 表单项 ```go // 用法 {{ GenerateReactFormItem . }} // 输出示例(根据字段类型自动生成)