# 10.1 概述与架构 :::tip 概述 代码生成器可根据数据库表结构一键生成 CRUD 模块的全部代码,包括后端 Controller/Service/Model/FormRequest 和前端 API/View。支持 MySQL、PostgreSQL、SQL Server、Oracle、SQLite 五种数据库。 ::: ## 使用方式 ### 方式一:CLI 命令行 ```bash # ----------------------------------------------------------------------------- # 代码生成器 CLI 命令 # ----------------------------------------------------------------------------- # php artisan generate:code → 调用 Artisan 的代码生成器 # laravel_example|案例演示 → 表名与注释(用 | 分隔,注释用于菜单标题) # --dry-run → 仅预览,不写入文件 php artisan generate:code "laravel_example|案例演示" --dry-run ``` 详见 [CLI 命令行使用](/zh/generator/cli.html)。 ### 方式二:Web 管理界面 进入「开发工具 → 代码生成」菜单,可视化操作。 详见 [Web 管理界面](/zh/generator/web-ui.html)。 ## 生成流程 ```text ┌──────────────┐ │ 数据库表 │ 如 laravel_example └──────┬───────┘ │ ▼ ┌──────────────┐ │ GeneratorService│ 读取表字段信息(多数据库适配) │ ::getTableList()│ └──────┬───────┘ │ ▼ ┌──────────────┐ │ GeneratorService│ 字段类型归一化 + 属性分析 │ (表结构解析) │ (图片、富文本、筛选项、唯一等) └──────┬───────┘ │ ▼ ┌──────────────┐ │ GeneratorLogic │ 模板变量构建 + 模板渲染 │ ::preview() │ └──────┬───────┘ │ ▼ ┌──────────────┐ │ GeneratorLogic │ 文件生成 + 菜单/字典/路由创建 │ ::generate() │ └──────┬───────┘ │ ┌────┼────┬────┬────┐ ▼ ▼ ▼ ▼ ▼ ┌────┐┌────┐┌────┐┌────┐┌────┐ │Ctrl││Serv││Mode││Req ││API │ │ . ││ ice││ l ││ est││+Vue│ │php ││ .php││php ││php ││ │ └────┘└────┘└────┘└────┘└────┘ ``` ## 核心能力 | 能力 | 说明 | |------|------| | 多数据库适配 | MySQL / PostgreSQL / SQL Server / Oracle / SQLite | | 字段分析 | 自动识别图片字段、富文本字段、筛选字段、唯一字段 | | 模板渲染 | 基于 PHP 模板引擎(`resources/templates/`),支持自定义模板 | | 菜单创建 | 自动生成菜单和权限节点(挂载位置由 `GENERATOR_PARENT_MENU_ID` 决定) | | 字典创建 | 自动创建关联字典(含字典项),幂等不重复 | | 路由注册 | 自动在 `routes/api.php` 中插入 CRUD 路由组 | | 安全校验 | 表名合法性校验,防止 SQL 注入 | | CLI 命令行 | `php artisan generate:code`,支持预览、导出配置、批量生成 | ## API 接口 | 方法 | 路径 | 权限码 | 说明 | |------|------|--------|------| | GET | `/api/generator/page` | sys:generator:page | 获取可生成的表列表 | | GET | `/api/generator/preview` | sys:generator:generate | 预览生成代码(不写入文件) | | POST | `/api/generator/generate` | sys:generator:generate | 一键生成 | | POST | `/api/generator/batchGenerate` | sys:generator:generate | 批量生成 | ## CLI 命令行 除 Web 接口外,还提供 CLI 命令行工具,适合开发环境和批量操作: ```bash # ----------------------------------------------------------------------------- # 列出所有可生成的数据库表 # ----------------------------------------------------------------------------- php artisan generate:code # ----------------------------------------------------------------------------- # 预览生成代码(不写入文件,仅输出到终端) # ----------------------------------------------------------------------------- php artisan generate:code laravel_example --dry-run # ----------------------------------------------------------------------------- # 一键生成(实际写入文件到 app/ 和 ui/src/) # ----------------------------------------------------------------------------- php artisan generate:code laravel_example # ----------------------------------------------------------------------------- # 导出配置(将生成参数保存为 JSON,便于重复使用) # ----------------------------------------------------------------------------- php artisan generate:code laravel_example --output config.json # ----------------------------------------------------------------------------- # 从配置生成(读取之前导出的配置文件) # ----------------------------------------------------------------------------- php artisan generate:code --config config.json ``` 详见 [10.2 CLI 命令行使用](/zh/generator/cli.html) :::tip 演示模式 preview 接口标注了 `#[DemoAllow]`,演示环境下也可使用。generate 和 batchGenerate 在演示环境下会被拦截。 ::: ## 核心代码 ```php // app/Http/Controllers/Api/GeneratorController.php — 代码生成器控制器(形态示例) class GeneratorController extends Controller { public function __construct(protected GeneratorLogic $logic) {} // 预览生成代码(不写入文件,仅返回渲染结果) #[OperationLog('代码生成-预览代码', OperationLog::TYPE_QUERY)] #[Permission('sys:generator:generate', '代码生成')] #[DemoAllow] // 演示模式允许(只读操作) public function preview(): JsonResponse { try { $params = $this->getJsonBody(); // 获取前端传入的 JSON 参数 $result = $this->logic->preview($params); // 调用逻辑层预览方法 return $this->success($result); } catch (\Throwable $e) { // 返回详细错误信息(包含文件名和行号,便于调试) return $this->fail($e->getMessage() . ' [File: ' . $e->getFile() . ', Line: ' . $e->getLine() . ']'); } } // 一键生成(实际写入文件到 app/ 和 ui/src/ 目录) #[OperationLog('代码生成-一键生成', OperationLog::TYPE_GENERATE)] #[Permission('sys:generator:generate', '代码生成')] public function generate(): JsonResponse { try { $params = $this->getJsonBody(); $result = $this->logic->generate($params); $generated = count($result['generated']); // 成功生成的文件数 $skipped = count($result['skipped']); // 跳过的文件数(已存在) $msg = "生成完成:成功 {$generated} 个文件"; if ($skipped > 0) { $msg .= ",跳过 {$skipped} 个文件"; } return $this->success($result, $msg); } catch (\Throwable $e) { return $this->fail($e->getMessage()); } } } ``` ## 模板文件 ```text resources/templates/ # 代码生成器模板目录 ├── controller.php.tpl # 控制器模板 ├── service.php.tpl # 服务层模板(含 serializeMaps、导入导出) ├── model.php.tpl # 数据模型模板 ├── request.php.tpl # FormRequest 模板 ├── ui/ # 普通列表模板(6 个前端文件) │ ├── api.ts.tpl # API 接口模块 │ ├── index.vue.tpl # 列表页 │ ├── edit.vue.tpl # 编辑弹窗 │ ├── detail.vue.tpl # 详情弹窗 │ ├── columns.ts.tpl # 表格列配置 │ └── querySchemas.ts.tpl # 查询表单配置 └── ui2/ # 树形结构模板(前端文件) ``` 模板与输出路径的映射关系见 [10.7 配置文件详解](/zh/generator/config.html),自定义模板见 [10.6 自定义模板开发](/zh/generator/templates.html)。 ## 生成流程时序(从建表到可用) ```text 1. 数据库建表(含公共字段,见 3.2) 2. 生成(Web 或 CLI) ├─ 后端 4 文件:Model / FormRequest / Service / Controller ├─ 前端文件:api.ts + views(index/edit/detail/columns/querySchemas) ├─ routes/api.php 自动插入 CRUD 路由组 ├─ laravel_menu 自动创建菜单 + 权限节点(挂 GENERATOR_PARENT_MENU_ID 下) └─ 字典自动创建(带选项字段,幂等) 3. 调整(Service 属性 / 钩子 / 菜单图标排序) 4. 为角色分配菜单权限 5. 前端刷新(重新登录使动态路由生效)→ 测试 ``` (完整实战见 [10.8 实战案例](/zh/generator/demo.html),手动开发流程见 [第 3 章 模块开发实战](/zh/guide/overview.html)。)