Files
rxthinkcmf-wiki/RXThinkCMF_Laravel13_EleVue/zh/generator/overview.md
T
2026-10-08 17:50:29 +08:00

8.9 KiB
Raw Blame History

10.1 概述与架构

:::tip 概述 代码生成器可根据数据库表结构一键生成 CRUD 模块的全部代码,包括后端 Controller/Service/Model/FormRequest 和前端 API/View。支持 MySQL、PostgreSQL、SQL Server、Oracle、SQLite 五种数据库。 :::

使用方式

方式一:CLI 命令行

# -----------------------------------------------------------------------------
# 代码生成器 CLI 命令
# -----------------------------------------------------------------------------
# php artisan generate:code → 调用 Artisan 的代码生成器
# laravel_example|案例演示   → 表名与注释(用 | 分隔,注释用于菜单标题)
# --dry-run                 → 仅预览,不写入文件
php artisan generate:code "laravel_example|案例演示" --dry-run

详见 CLI 命令行使用。

方式二:Web 管理界面

进入「开发工具 → 代码生成」菜单,可视化操作。

详见 Web 管理界面。

生成流程

┌──────────────┐
│ 数据库表      │  如 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 命令行工具,适合开发环境和批量操作:

# -----------------------------------------------------------------------------
# 列出所有可生成的数据库表
# -----------------------------------------------------------------------------
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 命令行使用

:::tip 演示模式 preview 接口标注了 #[DemoAllow],演示环境下也可使用。generate 和 batchGenerate 在演示环境下会被拦截。 :::

核心代码

// 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());
        }
    }
}

模板文件

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 配置文件详解,自定义模板见 10.6 自定义模板开发。

生成流程时序(从建表到可用)

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 实战案例,手动开发流程见 第 3 章 模块开发实战。)