10.6 模板开发
概述
生成器模板在 templates/ 磁盘目录:后端模板用 Go text/template 默认 定界;前端模板因与 Vue 插值冲突改用 [[ ]] 定界。修改模板即改变生成产物风格。
模板清单
text
templates/
├── api.tpl api/v1/{module}.go
├── controller.tpl internal/controller/{module}.go
├── logic.tpl internal/logic/{module}.go(ModuleSpec 基座风格)
├── service.tpl internal/service/{module}.go(接口三件套)
├── dao_index.tpl internal/dao/{module}.go(挂钩子+Ctx 覆写)
├── dao_internal.tpl internal/dao/internal/{module}.go
├── entity.tpl internal/model/entity/{module}.go
├── do.tpl internal/model/do/{module}.go
├── ui/ 前端普通模板(定界符 [[ ]])
│ ├── api.ts.tpl
│ ├── columns.ts.tpl
│ ├── querySchemas.ts.tpl
│ ├── index.vue.tpl
│ ├── edit.vue.tpl
│ └── detail.vue.tpl
└── ui2/ 前端树形模板(无 columns/querySchemas)
├── api.ts.tpl index.vue.tpl edit.vue.tpl detail.vue.tpl两套定界符(关键差异)
| 模板 | 定界符 | 原因 |
|---|---|---|
| 后端 *.tpl | (Go text/template 默认) | 无冲突 |
| templates/ui* | [[ ]](Delims("[[","]]")) | Vue 模板插值也是 ,会冲突 |
text
后端模板片段:{{.Module}} {{range .Fields}}…
前端模板片段:[[.Module]] [[range .Fields]]… ← 生成后再渲染为 Vue 的 {{ }}模板函数
text
containsAny 字符串包含任一子串(字段分类判定)
isUrlField URL 列名判定(website/site/url/link 不作模糊筛选)
(其余上下文:buildVars 产出的 module/Pascal/Fields/Choices/HasStatus…)修改模板的流程
text
1. 编辑 templates/*.tpl(保持定界符约定)
2. 用 -preview 预览渲染结果(不落盘核对)
3. 生成样例表验证(建议用 example 表回归对比)
4. go build 检查产物可编译
5. 注意:overwrite=false 时已存在文件不会更新——
验证用新表或临时开 overwrite与其他"模板"的区分
两套模板互不相干
templates/*.tpl(本节)= 代码生成器渲染模板,随仓库版本管理goframe_file_template表 = 业务功能(在线管理文件/代码片段模板)
修改生成产物风格改 templates/*.tpl;不要去 file_template 表里找。
定制建议
- 团队规范(注释风格/方法命名)可改进模板一次、全组受益
- 新增生成字段类型(如开关列特殊渲染)改 buildVars + 模板两侧
- 模板变更走版本管理 + 团队评审(影响所有新生成模块)
- 已生成模块不会随模板更新(除非 overwrite 重生成并人工合并)
- hack/tpl/dao_index.tpl 是 gf gen dao 的自定义模板(与生成器模板同构但独立)——改一处需评估另一处