## 代码生成原理
当开发者选中某张表进行代码生成时,如下图所示,首先会注入 PIGX 定义好的 Velocity 模板(开发平台 > 模板管理)。然后查询此表的相关元信息(字段、注释)并注入。最终使用 Velocity 渲染出相关文本。
## Velocity 模板基础
参考 Velocity 基本语法说明 了解模板语法。
Entity 实体生成的模板代码:
```java
public class ${ClassName}Entity extends Model<${ClassName}Entity> {
#foreach ($field in $fieldList)
#if($field.primaryPk)
@TableId(type = IdType.ASSIGN_ID)
#end
@Schema(description="$comment"#if($field.hidden),hidden=$field.hidden#end)
private $field.attrType $field.attrName;
#end
}
```
## 上下文元信息
如下属性可在 Velocity 模板中直接使用相关语法进行取值。
### 模板基本属性
| Key | Description |
| -------------- | ------------------ |
| dbType | 数据库类型 |
| package | 包名 |
| packagePath | 包路径 |
| version | 版本 |
| moduleName | 模块名 |
| ModuleName | 模块名首字母大写 |
| functionName | 功能名 |
| FunctionName | 功能名首字母大写 |
| formLayout | 表单布局 |
| style | 样式,对应的模板组 |
| author | 作者 |
| datetime | 当前日期和时间 |
| date | 当前日期 |
| importList | 导入列表 |
| tableName | 数据库表名 |
| tableComment | 数据库表注释 |
| className | 类名的小写形式 |
| ClassName | 类名 |
| fieldList | 字段列表 |
| backendPath | 后端路径 |
| frontendPath | 前端路径 |
| childFieldList | 子表字段列表 |
| childTableName | 子表名 |
| mainField | 主表关联字段名称 |
| childField | 子表关联字段名称 |
| ChildClassName | 子类名首字母大写 |
| childClassName | 子类名的小写形式 |
| primaryList | 主键字段列表 |
| formList | 表单字段列表 |
| gridList | 表格字段列表 |
| queryList | 查询字段列表 |
| pk | 主键字段 |
### 模板字段属性
| Key | Description |
| ------------- | -------------- |
| dsName | 数据源名 |
| tableName | 表名称 |
| fieldName | SQL 字段名称 |
| fieldType | SQL 字段类型 |
| attrName | Java 属性名 |
| attrType | Java 属性类型 |
| fieldComment | 字段说明 |
| sort | 排序 |
| packageName | 属性包名 |
| autoFill | 自动填充 |
| primaryPk | 是否为主键 |
| baseField | 是否为基类字段 |
| formItem | 是否为表单项 |
| formRequired | 表单必填 |
| formType | 表单类型 |
| formValidator | 表单效验 |
| gridItem | 是否为列表项 |
| gridSort | 列表排序 |
| queryItem | 是否为查询项 |
| queryType | 查询方式 |
| queryFormType | 查询表单类型 |
| fieldDict | 字段字典类型 |
### 环境判断属性
| Key | Description |
| ------------- | ------------------ |
| isSpringBoot3 | 是否是 springboot3 |
| isTenant | 是否支持多租户 |
## 左树右表模板约定
新增模板组:`左树右表增删改查`
该模板组用于生成“左侧树节点 + 右侧主表”的标准 CRUD 页面,关系方向为:
- 左侧树使用子表元信息
- 右侧列表和表单使用主表元信息
- 左树内部层级关系使用 `parentField`
- 主表通过 `childField` 指向左树节点主键
### 变量来源
右侧主表继续使用现有主表变量:
- `fieldList`
- `formList`
- `gridList`
- `queryList`
- `pk`
- `ClassName`
- `className`
左侧树继续复用主子表变量:
- `childFieldList`
- `childTableName`
- `ChildClassName`
- `childClassName`
### 新增约定
左树子表还需要额外提供两个字段约定:
- `parentField`:树节点父级字段
- `nameField`:树节点显示名称字段
主表与左树关联继续复用现有变量:
- `childField`:主表中关联左树节点的外键字段
### 页面行为
- 页面初始化时,左树加载全部节点,右表默认展示全部数据
- 选中左树节点后,右表按 `childField` 过滤
- 删除左树节点时,只允许删除没有子节点且没有关联主表数据的空节点