签入版本
This commit is contained in:
@@ -0,0 +1,215 @@
|
||||
# 10.4 表结构解析引擎
|
||||
|
||||
:::tip 概述
|
||||
解析引擎读取数据库表的字段信息(名称、类型、注释、是否必填等),并自动分析字段属性(图片、富文本、选项、外键等),作为代码生成的数据源。支持 MySQL、PostgreSQL、SQL Server、Oracle、SQLite 五种数据库。
|
||||
:::
|
||||
|
||||
## 多数据库适配
|
||||
|
||||
```php
|
||||
// app/service/GeneratorService.php
|
||||
|
||||
// 获取当前数据库驱动类型
|
||||
protected function getDbDriver(): string
|
||||
{
|
||||
$default = config('database.default', 'mysql');
|
||||
return strtolower(config("database.connections.{$default}.type", $default));
|
||||
}
|
||||
|
||||
// 根据驱动分发到对应的查询实现
|
||||
public function getTableList(): array
|
||||
{
|
||||
$driver = $this->getDbDriver();
|
||||
// MySQL: SHOW TABLE STATUS
|
||||
// PostgreSQL: information_schema.tables
|
||||
// SQL Server: sys.tables
|
||||
// Oracle: all_tables
|
||||
// SQLite: sqlite_master
|
||||
}
|
||||
```
|
||||
|
||||
## 基础解析内容
|
||||
|
||||
| 信息 | 用途 |
|
||||
|------|------|
|
||||
| 字段名 | 生成属性名、查询条件 |
|
||||
| 字段类型 | 生成验证规则、表单组件 |
|
||||
| 字段注释 | 生成标签名、注释 |
|
||||
| 是否必填 | 生成 require 验证规则 |
|
||||
| 默认值 | 生成默认值配置 |
|
||||
| 索引信息 | 判断是否唯一校验 |
|
||||
|
||||
## 字段类型映射
|
||||
|
||||
| 数据库类型 | 归一化类型 | 表单组件 | 验证规则 |
|
||||
|-----------|---------|---------|---------|
|
||||
| VARCHAR | CharField | Input | max:N |
|
||||
| TEXT | TextField | Editor | - |
|
||||
| INT | IntegerField | InputNumber | number |
|
||||
| TINYINT | IntegerField | Select / Radio | in:0,1 |
|
||||
| DECIMAL | DecimalField | InputNumber | float |
|
||||
| DATETIME | DateTimeField | DatePicker | date |
|
||||
| DATE | DateField | DatePicker | date |
|
||||
| TIME | TimeField | TimePicker | - |
|
||||
| BOOLEAN | BooleanField | Switch | - |
|
||||
|
||||
## 字段自动识别规则
|
||||
|
||||
解析引擎会自动分析每个字段的属性,识别规则如下:
|
||||
|
||||
### 图片字段
|
||||
|
||||
| 条件 | 规则 |
|
||||
|------|------|
|
||||
| 类型 | VARCHAR |
|
||||
| 匹配 | 注释或字段名匹配 `/图片\|封面\|头像\|logo\|icon\|image\|avatar\|photo/i` |
|
||||
|
||||
识别后:`is_image = true`,归入 `file_fields`,前端用 ElAvatar 渲染。
|
||||
|
||||
### 富文本字段
|
||||
|
||||
| 条件 | 规则 |
|
||||
|------|------|
|
||||
| 类型 | TEXT |
|
||||
| 匹配 | 注释匹配 `/内容\|详情\|正文/i` |
|
||||
|
||||
识别后:`is_rich_text = true`,归入 `content_fields`,自动处理临时文件和图片占位符。
|
||||
|
||||
### 多行文本字段
|
||||
|
||||
| 条件 | 规则 |
|
||||
|------|------|
|
||||
| 类型 | VARCHAR |
|
||||
| 匹配 | 注释匹配 `/备注\|说明\|描述\|介绍\|简介/i` |
|
||||
|
||||
识别后:`is_textarea = true`,前端用 textarea 组件渲染。
|
||||
|
||||
### 选项字段(枚举)
|
||||
|
||||
解析引擎从字段注释中自动解析选项,支持以下注释格式:
|
||||
|
||||
```text
|
||||
状态:1-启用 2-停用 ← 中文冒号 + 数字-文字
|
||||
状态:1-启用 2-停用 ← 英文冒号 + 数字-文字
|
||||
类型:1:制造业 2:旅游业 ← 中文冒号 + 数字:文字
|
||||
执行策略:1-立即执行 2-执行一次 3-放弃执行
|
||||
```
|
||||
|
||||
解析规则:
|
||||
1. 以冒号(中文 `:` 或英文 `:`)分割,取冒号后面的部分
|
||||
2. 匹配 `数字-文字` 或 `数字:文字` 格式
|
||||
3. 每个匹配项生成一个选项:`{value: 数字, label: 文字, type: 标签颜色}`
|
||||
|
||||
标签颜色映射:
|
||||
|
||||
| 选项值 | 标签颜色 | ElementPlus type |
|
||||
|--------|---------|-------------------|
|
||||
| 1 | 绿色 | `success` |
|
||||
| 2 | 红色 | `danger` |
|
||||
| 3 | 橙色 | `warning` |
|
||||
| 其他 | 灰色 | `info` |
|
||||
|
||||
识别后:`choices` 数组非空,自动归入 `eq_fields`(精确匹配)和 `serialize_maps`(字典映射)。
|
||||
|
||||
### 状态字段自动补全
|
||||
|
||||
| 条件 | 规则 |
|
||||
|------|------|
|
||||
| 字段名 | `status` |
|
||||
| 类型 | INT |
|
||||
| 前提 | 注释中未解析出选项 |
|
||||
|
||||
自动生成默认选项:
|
||||
|
||||
| 值 | 标签 | 颜色 |
|
||||
|----|------|------|
|
||||
| 0 | 正常 | success |
|
||||
| 1 | 停用 | danger |
|
||||
|
||||
### 模糊搜索字段
|
||||
|
||||
| 条件 | 规则 |
|
||||
|------|------|
|
||||
| 类型 | VARCHAR |
|
||||
| 匹配 | 字段名匹配 `/名称\|标题\|name\|title\|username\|realname\|nickname\|job_name\|category_name\|dept_name\|role_name/i` |
|
||||
|
||||
识别后:归入 `like_fields`,分页查询时 LIKE 匹配,同时加入筛选表单。
|
||||
|
||||
### 唯一字段
|
||||
|
||||
| 条件 | 规则 |
|
||||
|------|------|
|
||||
| 匹配 | 字段名匹配 `/编码\|code\|username\|mobile\|email\|account/i` |
|
||||
|
||||
识别后:归入 `unique_fields`,新增/修改时自动校验唯一性。
|
||||
|
||||
### 外键字段
|
||||
|
||||
| 条件 | 规则 |
|
||||
|------|------|
|
||||
| 匹配 | 字段名以 `_id` 或 `_ids` 结尾(排除 `id` 本身) |
|
||||
|
||||
识别后:`is_foreign_key = true`,记录 `fk_target`(如 `dept_id` → `dept`),供模板渲染下拉选择使用。
|
||||
|
||||
### 排序字段
|
||||
|
||||
| 条件 | 规则 |
|
||||
|------|------|
|
||||
| 字段名 | `sort` |
|
||||
|
||||
识别后:`has_sort = true`,默认排序改为 `sort asc`(而非 `id desc`)。
|
||||
|
||||
### 系统字段排除
|
||||
|
||||
以下字段自动从表单和列表中排除:
|
||||
|
||||
`id`、`tenant_id`、`create_user`、`create_time`、`update_user`、`update_time`、`is_delete`
|
||||
|
||||
### 字段注释清洗
|
||||
|
||||
注释中的选项部分会被自动移除,只保留中文名称:
|
||||
|
||||
```text
|
||||
"案例状态:1-正常 2-禁用" → "案例状态"
|
||||
"执行策略:1-立即执行 2-执行一次 3-放弃执行" → "执行策略"
|
||||
```
|
||||
|
||||
## 安全校验
|
||||
|
||||
```php
|
||||
// 表名合法性校验(防 SQL 注入)
|
||||
protected function validateTableName(string $tableName): string
|
||||
{
|
||||
if (!preg_match('/^[a-zA-Z_][a-zA-Z0-9_]*$/', $tableName)) {
|
||||
throw new \Exception('表名格式不合法: ' . $tableName);
|
||||
}
|
||||
return $tableName;
|
||||
}
|
||||
```
|
||||
|
||||
:::warning 安全提示
|
||||
涉及表名拼接的 SQL 一律先经 `validateTableName` 校验,只允许字母、数字、下划线,防止 SQL 注入。
|
||||
:::
|
||||
|
||||
## 自动创建的权限节点
|
||||
|
||||
生成菜单时,自动创建以下 10 个权限节点:
|
||||
|
||||
| 权限码 | 说明 |
|
||||
|--------|------|
|
||||
| `sys:{模块名}:page` | 分页查询 |
|
||||
| `sys:{模块名}:list` | 列表查询 |
|
||||
| `sys:{模块名}:detail` | 详情查询 |
|
||||
| `sys:{模块名}:add` | 新增 |
|
||||
| `sys:{模块名}:update` | 编辑 |
|
||||
| `sys:{模块名}:delete` | 删除 |
|
||||
| `sys:{模块名}:batchDelete` | 批量删除 |
|
||||
| `sys:{模块名}:status` | 状态管理 |
|
||||
| `sys:{模块名}:import` | 导入 |
|
||||
| `sys:{模块名}:export` | 导出 |
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [10.5 代码生成引擎](/zh/generator/code-engine.html)
|
||||
- [10.6 自定义模板开发](/zh/generator/templates.html)
|
||||
- [10.7 配置文件详解](/zh/generator/config.html)
|
||||
Reference in New Issue
Block a user