代码生成
前言
本框架的前端代码生成机制独具特色,与其他框架显著不同。它并未依赖于后端模板引擎与模板的生成方式,而是构筑了一个独立完整的体系,充分运用了前端的技术栈来实现代码生成的流程。具体而言,它主要包含两大核心部分:一是可视化的前端代码生成元数据管理系统,二是前端代码生成命令行界面(CLI)。其中,CLI能够接收特定指令,通过调用后端接口来获取元数据,进而利用art-template模板引擎进行渲染,最终生成与指令相对应的模板代码。这一设计不仅提高了代码生成的灵活性和效率,还确保了生成的代码质量符合前端开发的最佳实践。
元数据管理
元数据管理对应于我们的在线开发模块,这一模块设计精巧,主要包含两大核心菜单:模型分组和数据模型管理。下面,我将对这两个菜单进行简要的介绍。
模型分组
模型分组功能是对数据模型进行有序分类和组织的关键环节,其在前端代码生成中占据重要地位。作为左侧菜单的一级选项,它使用户能够直观地浏览和管理各分组下的数据模型。更值得一提的是,模型分组的唯一编码能够自动对应生成前端路由文件,从而简化了开发流程,提升了代码生成的效率与准确性。通过这一功能,我们不仅能够构建清晰、有条理的数据模型结构,还实现了数据模型与前端界面的无缝对接,为前端开发带来了极大的便利。
列表
新增/编辑
字段说明:
- 分组名称 对应前端一级菜单的名称
- 唯一编码 对应前端路由文件名称
- 图标 对应前端一级菜单图标
- 排序 对应前端一级菜单排序
- 备注
数据模型
数据模型管理菜单致力于实现对数据模型本身的深入且细致的管理,其核心关注于如何将某一张数据库表的信息精准地呈现在前端界面,并优化其交互体验。这包括但不限于设置所属分组的表单弹窗展示方式、调整菜单项的顺序、以及为菜单项选择或设计图标等。此外,该菜单还提供了对数据库表对应属性字段信息的全面维护功能,用户可以轻松管理字段的增减、属性的设定,以及字段之间的逻辑关系。为进一步减轻前端在维护数据模型时的负担,我们特别设计了一键导入数据库表的功能。用户通过简单的操作,即可将后端已经创建好的数据库表导入到前端,避免了繁琐的手动创建和配置过程。导入后,用户还可以基于该表进行二次的完善工作,根据前端的具体需求,进一步扩展和完善元数据,确保前端界面能够完美呈现数据库表的信息,并提供流畅的交互体验。
列表
新增/编辑
导入
模型字段管理
元数据
经过一系列精心配置,我们将生成相应的元数据,这些元数据是前端进行代码生成和模板制作的关键依据。前端将充分利用这些元数据,自动化地生成所需的代码和模板,从而极大地提高了开发效率和质量。通过这一流程,我们确保了代码生成的准确性和一致性,为前端开发者提供了强大的支持。
代码生成工具
目录结构
├── config
└── default.json 配置文件
└── generate
└── templates 模板目录
├── blank 空白模板 对应的是default.json的theme
└── index.art
└── default 默认模板 对应的是default.json的theme(当前框架以该模板为主)
├── add.art 新增/编辑表单模板
├── api.art 接口模板
├── customFormComponent.art 自定义表单组件模板
├── customViewComponent.art 自定义回显组件模板
├── detail.art 详情页模板
├── formComponents.art 自动注册自定义表单组件入口模板
├── index.art 首页模板
├── route.art 路由文件模拟
├── schemas.art 元数据模板
└── viewComponents.art 自动注册自定义回显组件入口模板
配置文件
config/default.json
{
"apiUrl": "http://localhost:18080/dev/schema/getByTableName",
"theme": "default",
"appId": "admin",
"appSecret": "123456",
"templates": [
{
"name": "接口模板",
"selected": true,
"templateFile": "api.art",
"targetPath": "src/api/<{moduleName}>",
"targetFileName": "<{tableCamelName}>.ts"
},
{
"name": "首页模板",
"selected": true,
"templateFile": "index.art",
"targetPath": "src/views/<{moduleName}>/<{tableCamelName}>",
"targetFileName": "index.vue"
},
{
"name": "元数据",
"selected": true,
"templateFile": "schemas.art",
"targetPath": "src/views/<{moduleName}>/<{tableCamelName}>/schemas",
"targetFileName": "index.ts",
"data": true
},
{
"name": "表单页",
"selected": true,
"templateFile": "add.art",
"targetPath": "src/views/<{moduleName}>/<{tableCamelName}>",
"targetFileName": "add.vue"
},
{
"name": "详情页",
"selected": true,
"templateFile": "detail.art",
"targetPath": "src/views/<{moduleName}>/<{tableCamelName}>",
"targetFileName": "detail.vue"
},
{
"name": "路由文件",
"selected": true,
"templateFile": "route.art",
"targetPath": "src/router/routes/modules",
"targetFileName": "<{schemaGroup.code}>.ts"
},
{
"name": "表单自定义组件入口文件",
"selected": true,
"templateFile": "formComponents.art",
"targetPath": "src/views/<{moduleName}>/<{tableCamelName}>/components/form",
"targetFileName": "index.ts"
},
{
"name": "列表自定义组件入口文件",
"selected": true,
"templateFile": "viewComponents.art",
"targetPath": "src/views/<{moduleName}>/<{tableCamelName}>/components/view",
"targetFileName": "index.ts"
},
{
"name": "表单自定义组件",
"selected": false,
"templateFile": "customFormComponent.art",
"targetPath": "src/views/<{moduleName}>/<{tableCamelName}>/components/form",
"targetFileName": "*.vue"
},
{
"name": "列表/详情自定义组件",
"selected": false,
"templateFile": "customViewComponent.art",
"targetPath": "src/views/<{moduleName}>/<{tableCamelName}>/components/view",
"targetFileName": "*.vue"
}
]
}
配置说明:
- apiUrl 获取元数据接口地址
- appId 获取元数据应用id
- appSecret 获取元数据应用密钥
- templates[0].name 模板名称
- templates[0].selected 是否选中,选中才会生成代码
- templates[0].templateFile 对应的模板名称
- templates[0].targetPath 生成的目标文件路径
- templates[0].targetFileName 生成的目标文件名称
代码生成样例结构
└── src
├── api 接口目录
└── biz biz模块
└── demo.ts demo相关接口
└── views 页面目录
└── biz/demo demo相关页面
├── components 组件目录
├── form 自定义表单组件目录
├── DemoCustomInput.vue 自定义表单组件,根据元数据配置生成的,不一定会有
└── index.ts 自动注册表单组件入口,默认将当前目录下的.vue注册
├── view 自定义回显组件目录
├── DemoCustomInput.vue 自定义回显组件,根据元数据配置生成的,不一定会有
└── index.ts 自动注册回显组件入口,默认将当前目录下的.vue注册
├── schemas
└── index.ts
├── add.vue
├── detail.vue
└── index.vue
代码生成命令说明
查看帮助
node generate/main.cjs --help
选项:
--version 显示版本号 [布尔]
-t, --tableName 表名称 [字符串] [必需]
-c, --cover 是否覆盖 [数字] [默认值: 0]
-d, --data 是否仅生成元数据 [数字] [默认值: 0]
-h, --help 显示帮助信息 [布尔]
代码生成配置文件
config/default.json
指定某个元数据生成代码
node generate/main.cjs -t biz_demo
指定某个元数据生成代码-覆盖式
node generate/main.cjs -t biz_demo -c 1
指定某个元数据生成代码-仅覆盖元数据文件
node generate/main.cjs -t biz_demo -d 1
模板语法
前端模板引擎使用的是art-template,下面对语法进行简单的说明。
输出
标准语法
<{value}>
<{data.key}>
<{data['key']}>
<{a ? b : c}>
<{a || b}>
<{a + b}>
原始语法
<%= value %>
<%= data.key %>
<%= data['key'] %>
<%= a ? b : c %>
<%= a || b %>
<%= a + b %>
原文输出,不转义
标准语法
<{@ value }>
原始语法
<%- value %>
条件
标准语法
<{if value}> ... <{/if}>
<{if value}> ... <{else}> ... <{/if}>
<{if v1}> ... <{else if v2}> ... <{/if>}
<{if v1}> ... <{else if v2}> ... <{else}> ... <{/if}>
原始语法
<% if (value) { %> ... <% } %>
<% if (value) { %> ... <% } else { %>... <% } %>
<% if (v1) { %> ... <% } else if (v2) { %> ... <% } %>
<% if (v1) { %> ... <% } else if (v2) { %> ... <% } else { %>... <% } %>
循环
标准语法
隐式定义,默认$value/$index
<{each target}>
<{$index}} <{$value>}>
<{/each}>
显示定义
<{each target val index}>
<{index}> <{val>}>
<{/each}>
原始语法
<% for(var i = 0; i < target.length; i++){ %>
<%= i %> <%= target[i] %>
<% } %>
变量
标准语法
<{set temp = data.sub.content}>
原始语法
<% var temp = data.sub.content; %>
关于元数据文档
由于字段的设置和描述均十分明确清晰,此处不再逐一展开详细说明。您可以随时查阅配置页面和元数据,以便更直观地了解各个字段的用途和配置方式,从而轻松实现对号入座。我们建议您仔细查阅相关资料,以便更好地利用这些字段进行代码生成和模板制作。