Files
rxthinkcmf-wiki/RXThinkCMF_Laravel13_NaiveVue/zh/generator/parser.md
T
2026-09-29 10:14:04 +08:00

216 lines
6.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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: 标签颜色}`
标签颜色映射:
| 选项值 | 标签颜色 | Element Plus 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)