签入版本
This commit is contained in:
@@ -1,29 +1,29 @@
|
||||
# 10.3 Web 管理界面
|
||||
|
||||
:::tip 概述
|
||||
代码生成器提供 Web 管理界面,通过可视化操作完成代码生成,无需命令行。支持表选择、配置生成选项、预览代码和一键生成。界面位于「工具管理 → 代码生成」菜单。
|
||||
代码生成器提供 Web 管理界面,通过可视化操作完成代码生成,无需命令行。支持表选择、配置生成选项、预览代码和一键生成。界面位于「开发工具 → 代码生成」菜单。
|
||||
:::
|
||||
|
||||
## 操作流程
|
||||
|
||||
```text
|
||||
1. 登录管理后台
|
||||
2. 进入「工具管理 → 代码生成」菜单
|
||||
2. 进入「开发工具 → 代码生成」菜单
|
||||
3. 查看可生成的数据库表列表(自动读取当前数据库的所有表)
|
||||
4. 选择目标表,点击「配置」
|
||||
5. 配置生成选项(模块名、功能名、作者等)
|
||||
5. 配置生成选项(模板类型、生成菜单、覆盖文件等)
|
||||
6. 点击「预览」查看生成代码(不写入文件,可安全查看)
|
||||
7. 确认无误后点击「生成」创建文件
|
||||
8. 在 route/app.php 中添加路由(通常已自动生成)
|
||||
8. 检查 routes/api.php 中的路由(通常已自动插入)
|
||||
9. 在菜单管理中配置菜单权限
|
||||
10. 刷新前端页面,新模块即可使用
|
||||
10. 重新登录或刷新前端动态菜单,新模块即可使用
|
||||
```
|
||||
|
||||
## 界面说明
|
||||
|
||||
### 表列表页
|
||||
|
||||
进入「工具管理 → 代码生成」后,首先进入表列表页:
|
||||
进入「开发工具 → 代码生成」后,首先进入表列表页:
|
||||
|
||||
| 列 | 说明 |
|
||||
|----|------|
|
||||
@@ -31,8 +31,7 @@
|
||||
| 表注释 | 表的 COMMENT 字段(显示为中文说明) |
|
||||
| 引擎 | 存储引擎(InnoDB / MyISAM) |
|
||||
| 行数 | 表中的数据行数 |
|
||||
| 创建时间 | 表的创建时间 |
|
||||
| 操作 | 配置 / 预览 / 生成 / 删除 |
|
||||
| 操作 | 配置 / 预览 / 生成 |
|
||||
|
||||
### 配置弹窗
|
||||
|
||||
@@ -40,7 +39,7 @@
|
||||
|
||||
| 配置项 | 参数名 | 说明 | 示例 |
|
||||
|--------|--------|------|------|
|
||||
| 表名 | `tableNames` | 选择要生成的表(自动带入,格式 `"表名\|注释"`) | `["think_example\|案例演示"]` |
|
||||
| 表名 | `tableNames` | 选择要生成的表(自动带入,格式 `"表名\|注释"`) | `["laravel_example\|案例演示"]` |
|
||||
| 模板类型 | `templateType` | `ui` 普通列表 或 `ui2` 树形(含 parent_id 时自动切换) | `ui` |
|
||||
| 生成菜单 | `generateMenu` | 是否自动创建菜单和权限节点 | `true` |
|
||||
| 覆盖文件 | `overwrite` | 是否覆盖已存在的文件 | `false` |
|
||||
@@ -50,7 +49,7 @@
|
||||
点击「预览」按钮,可查看即将生成的所有文件代码:
|
||||
|
||||
- 预览模式**不会写入文件**,可安全查看
|
||||
- 支持切换查看不同文件(Controller / Logic / Model / Validate / API / Vue / columns.ts / querySchemas.ts)
|
||||
- 支持切换查看不同文件(Controller / Service / Model / Request / API / Vue / columns.ts / querySchemas.ts)
|
||||
- 确认无误后再点击「生成」实际创建文件
|
||||
|
||||
### 批量生成
|
||||
@@ -83,51 +82,52 @@
|
||||
- 支持拖拽排序、展开/折叠
|
||||
- 自动处理父子关系的新增和编辑
|
||||
- 树形模板不生成 `columns.ts` 和 `querySchemas.ts`
|
||||
- Controller 中不生成 `page()` 方法
|
||||
- 注册路由时不含 `page` 路由
|
||||
|
||||
### 导入导出(默认生成)
|
||||
|
||||
默认生成 `import()` 和 `export()` 方法:
|
||||
|
||||
- 后端基于 `ExcelService` 实现分批导入导出
|
||||
- 枚举字段自动做正向/反向映射(值 ↔ 文本)
|
||||
- 枚举字段自动做正向/反向映射(值 ↔ 文本,反向映射用 `DictCacheService::getValue()`)
|
||||
- 前端生成导入/导出按钮
|
||||
|
||||
### 字典自动创建
|
||||
|
||||
带选项(choices)的字段会自动创建字典:
|
||||
|
||||
- 在 `think_dict` 和 `think_dict_item` 表中创建记录
|
||||
- Logic 中自动生成 `$serializeMaps` 映射
|
||||
- 查询时自动补 `{字段名}Text` 翻译字段
|
||||
- 在 `laravel_dict` 和 `laravel_dict_item` 表中创建记录(`create_user = 'system'`)
|
||||
- Service 中自动生成 `$serializeMaps` 映射
|
||||
- 查询时自动补 `{字段名}Text` 翻译字段(`HasSerializeMaps` Trait)
|
||||
- 幂等:字典编码已存在则跳过
|
||||
|
||||
### 路由自动注册
|
||||
|
||||
在 `route/app.php` 中自动插入 CRUD 路由组:
|
||||
在 `routes/api.php` 中自动插入 CRUD 路由组(`GeneratorService::registerRoute()`):
|
||||
|
||||
- 包含 list / detail / add / update / delete / batchDelete / import / export
|
||||
- 非树形结构额外包含 page 路由
|
||||
- 幂等:路由组已存在则跳过
|
||||
- 插入位置为文件末尾中间件组闭合 `});` 之前,分组注释取表注释(如 `// --- 案例演示 ---`),表注释为空时回退模块名
|
||||
- 幂等:同模块路由已存在则跳过(以路由路径判断)
|
||||
|
||||
## API 接口
|
||||
|
||||
| 方法 | 路径 | 权限码 | 说明 |
|
||||
|------|------|--------|------|
|
||||
| GET | `/api/generator/page` | sys:generator:page | 获取可生成的表列表(分页) |
|
||||
| POST | `/api/generator/preview` | sys:generator:generate | 预览生成代码(不写入文件) |
|
||||
| GET | `/api/generator/preview` | sys:generator:generate | 预览生成代码(不写入文件) |
|
||||
| POST | `/api/generator/generate` | sys:generator:generate | 一键生成(写入文件) |
|
||||
| POST | `/api/generator/batchGenerate` | sys:generator:generate | 批量生成(多表) |
|
||||
|
||||
:::tip 演示模式
|
||||
预览接口(preview)标注了 `#[DemoAllow]`,演示环境下也可使用。生成接口(generate / batchGenerate)在演示环境下会被拦截。
|
||||
预览接口(preview)标注了 `#[DemoAllow]`,演示环境下也可使用(且本身是 GET 请求)。生成接口(generate / batchGenerate)为写操作,演示环境下会被 `DemoMiddleware` 拦截(`config('app.demo_mode')` 开启时)。
|
||||
:::
|
||||
|
||||
### 请求参数
|
||||
|
||||
```json
|
||||
{
|
||||
"tableNames": ["think_example|案例演示"],
|
||||
"tableNames": ["laravel_example|案例演示"],
|
||||
"templateType": "ui",
|
||||
"generateMenu": true,
|
||||
"overwrite": false
|
||||
@@ -151,14 +151,14 @@
|
||||
# -----------------------------------------------------------------------------
|
||||
# 预览生成代码(不写入文件)
|
||||
# -----------------------------------------------------------------------------
|
||||
# POST /api/generator/preview
|
||||
# GET /api/generator/preview
|
||||
# Content-Type: application/json
|
||||
# Authorization: Bearer <token>
|
||||
curl -X POST http://localhost:8000/api/generator/preview \
|
||||
curl -X GET http://localhost:8000/api/generator/preview \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "Authorization: Bearer <token>" \
|
||||
-d '{
|
||||
"tableNames": ["think_example|案例演示"],
|
||||
"tableNames": ["laravel_example|案例演示"],
|
||||
"templateType": "ui"
|
||||
}'
|
||||
```
|
||||
@@ -173,14 +173,14 @@ curl -X POST http://localhost:8000/api/generator/preview \
|
||||
"data": {
|
||||
"files": [
|
||||
{
|
||||
"path": "app/controller/ExampleController.php",
|
||||
"content": "<?php\nnamespace app\\controller;\n// ...",
|
||||
"path": "app/Http/Controllers/Api/ExampleController.php",
|
||||
"content": "<?php\nnamespace App\\Http\\Controllers\\Api;\n// ...",
|
||||
"exists": false,
|
||||
"type": "backend"
|
||||
},
|
||||
{
|
||||
"path": "app/logic/ExampleLogic.php",
|
||||
"content": "<?php\nnamespace app\\logic;\n// ...",
|
||||
"path": "app/Services/ExampleService.php",
|
||||
"content": "<?php\nnamespace App\\Services;\n// ...",
|
||||
"exists": false,
|
||||
"type": "backend"
|
||||
},
|
||||
@@ -192,16 +192,12 @@ curl -X POST http://localhost:8000/api/generator/preview \
|
||||
}
|
||||
],
|
||||
"vars": {
|
||||
"app_name": "tool",
|
||||
"module_name": "example",
|
||||
"module_comment": "案例",
|
||||
"model_class_name": "Example",
|
||||
"template_type": "ui",
|
||||
"is_tree": false
|
||||
},
|
||||
"menu_info": {
|
||||
"name": "案例",
|
||||
"path": "/tool/example",
|
||||
"component": "tool/example/index"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -210,7 +206,7 @@ curl -X POST http://localhost:8000/api/generator/preview \
|
||||
:::tip 响应结构说明
|
||||
- `files`:待生成文件数组,每项含 `path`(相对路径)、`content`(渲染后内容)、`exists`(是否已存在)、`type`(backend/frontend)
|
||||
- `vars`:模板变量,供调试和导出配置使用
|
||||
- `menu_info`:将要创建的菜单信息
|
||||
- 一键生成接口的 `msg` 为多行统计消息:📄 文件(生成/跳过/失败数量)、📋 菜单、📖 字典、🔀 路由
|
||||
:::
|
||||
|
||||
## 生成后操作清单
|
||||
@@ -219,29 +215,37 @@ curl -X POST http://localhost:8000/api/generator/preview \
|
||||
# -----------------------------------------------------------------------------
|
||||
# 第 1 步:检查生成的文件
|
||||
# -----------------------------------------------------------------------------
|
||||
ls app/controller/Example* # 控制器
|
||||
ls app/logic/Example* # 业务逻辑
|
||||
ls app/model/Example* # 数据模型
|
||||
ls app/validate/Example* # 验证器
|
||||
ls ui/src/api/tool/example* # 前端 API
|
||||
ls ui/src/views/tool/example/ # 前端页面(含 index.vue / edit.vue / detail.vue / columns.ts / querySchemas.ts)
|
||||
ls app/Http/Controllers/Api/Example* # 控制器
|
||||
ls app/Services/Example* # 业务服务
|
||||
ls app/Models/Example* # 数据模型
|
||||
ls app/Http/Requests/Example* # FormRequest 验证器
|
||||
ls ui/src/api/tool/example* # 前端 API
|
||||
ls ui/src/views/tool/example/ # 前端页面(含 index.vue / edit.vue / detail.vue / columns.ts / querySchemas.ts)
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# 第 2 步:在 route/app.php 中添加路由(通常已自动生成)
|
||||
# 第 2 步:检查 routes/api.php 中的路由(通常已自动插入,带 // --- 案例演示 --- 表注释)
|
||||
# -----------------------------------------------------------------------------
|
||||
grep -n "// --- 案例演示 ---" routes/api.php
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# 第 3 步:在菜单管理中配置菜单权限
|
||||
# -----------------------------------------------------------------------------
|
||||
# 新增菜单:案例演示(路径:/example,组件:tool/example/index)
|
||||
# 新增按钮权限:sys:example:page / sys:example:add / sys:example:update / sys:example:delete
|
||||
# 菜单已自动创建:案例(路径:/tool/example,组件:tool/example/index)
|
||||
# 权限节点已自动创建:sys:example:page / list / detail / add / update / delete / batchDelete / import / export
|
||||
# 只需为角色勾选相应权限
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# 第 4 步:根据业务需求调整 Logic 属性配置
|
||||
# 第 4 步:根据业务需求调整 Service 属性配置
|
||||
# -----------------------------------------------------------------------------
|
||||
# 可调整:fileFields(文件字段)、serializeMaps(字典映射)、pageLikeFields(模糊查询)等
|
||||
# 可调整:fileFields(文件字段)、serializeMaps(字典映射)、
|
||||
# pageLikeFields(模糊查询)、uniqueFields(唯一校验)等
|
||||
```
|
||||
|
||||
:::warning 生产环境注意
|
||||
- 路由写入后,若执行过 `php artisan route:cache`,需重新缓存
|
||||
- 新菜单需重新登录(刷新 Redis 中的 JWT 权限缓存)或刷新动态菜单后生效
|
||||
:::
|
||||
|
||||
## 与 CLI 命令对比
|
||||
|
||||
| 特性 | Web 界面 | CLI 命令 |
|
||||
|
||||
Reference in New Issue
Block a user