EZDML 数据建模

超轻量级的免费数据建模工具

0%

手把手教你用EZDML批量生成vue-element-admin前端页面代码

EZDML 3.26起增加了vue-element-admin示例生成模板,本文就以它来讲解示范,如何从零开始用EZDML批量生成代码。

先说下,本文非常的长,内容非常的枯燥,仅适合想自己用EZDML生成框架的前端程序员,其他同学没必要浪费时间围观。

本文大概分两部分,前半部分探索以人肉方式生成一个表的结果,后半部分是把人工单个的操作结果转成批量自动。本人较少写文章,字少,图多,有时比较啰嗦,大家多包涵。

EZDML具有强大的脚本模板引擎功能,支持pascal和javascript脚本。EZDML新版默认就已经能生成vue-element-admin模板了,不过为了方便理解,我们在这里要假装还没有这个功能。

第一个前提当然是已经下载安装EZDML了,可从ezdml.com官网下载,需要3.26以上的版本。EZDML是easy DML的简写,目前有win32/win64/mac64/linux64四种系统版本,win32和win64版唯一的区别是数据库驱动,一个需要32位另一个需要64位的,这里以常用的win64为例。

要想批量生成,先要有单个生成,因此首先要有通过一个表生成一个vue-element界面的基本脚本模板,这个EZDML已经有现成的。比如我们新建一个Area地区表,点工具栏按钮“新增表”,在描述字输入以下内容:

1
2
3
4
5
6
7
8
9
10
11
area 地区
------
id(ID) PKI
name 名称 String
fullName 全称 S
createDate 创建日期 Date
modifyDate 最后修改日期 D
orders 排序 I
grade 层级 I
treePath 树路径 S
parent_id 上级地区 FKI

嗯,EZDML建表的标准姿势就是用键盘输入类似的文本内容(或从其它现有表复制粘贴)。

确定,并把模型改名为user(用户):

双击area表打开属性,切到界面页,点“表单”,这里会显示界面和数据的预览。按Ctrl键选中除“orders(排序)”外的所有字段,将它们设置为“必填”:

选中“name(名称)”,设置其数据生成类型为“city_cn:城市(中国,中文)”:

选中“fulleName(全称)”,设置其“数据生成规则”为“中国%FIELD(name)%市”:

切换到生成页,可以看到三个vue的生成模板:

点右上角的浏览器打开可以预览:

这里我们只关注Form表单和List列表两个生成模型,后面要用到:

可点编辑脚本看看,这个是JS脚本:

核心代码在include的那个VueElementLib.js_里,执行菜单“运行|编译检查”,会将include的代码全显示出来,基本原理就是用JS遍历curTable的字段属性输出内容,代码不多,带有注释,应该基本都能看懂,不看也没什么问题,具体这里就不展开讲了:

保存模型文件备用。

顺便说下这个脚本调试器,EZDML原来只支持pascal脚本,后来才加的JS,这个编辑器原本是给Pascal脚本用的,并不支持JS调试,所以对JS来说,只有执行成功或失败,没法下断点看变量之类的,可调试功能基本为0,用它调JS只能凭各自本事了。

单个表的脚本模板有了,接下来我们基于vue-element-admin的基础进行生成。

vue-element-admin 是一个后台前端解决方案,基于 vue 和 element-ui实现,作者为PanJiaChen(花裤衩 https://panjiachen.gitee.io/vue-element-admin-site/zh/ )。它有几个版本,为了方便示范,我们选取比较简单的基础模板vue-admin-template来操作。

首先是下载源码安装运行,我用git拉取,本机要安装git和NodeJs,执行的命令如下:

1
2
3
4
5
D:
cd D:\temp
git clone https://gitee.com/panjiachen/vue-admin-template
npm install
npm run dev

直接npm install可能较慢,可加参数使用阿里数据源:npm install –registry=https://registry.npm.taobao.org

安装完成,运行npm run dev:

编译成功:

自动打开浏览器:

默认是英文界面:

英文看着不舒服,我改成中文了,具体过程就不细述了:

接着,我在src目录下,创建ez_views\user\area子目录,并将刚才EZDML生成的Form和List两个内容分别保存到这个子目录,取名detail.vue和list.vue:

接着,打开router/index.js,添加/ez_user/area_list和/ez_user/area_detail/:id两个路由,当然是指向刚才那两个vue了:

保存运行,效果如下:

表单是弹出的,还关不掉,不要紧,先放着:

打开list.vue和detail.vue,我们会发现,生成的数据也在里面,这个显然要转移到mock里:

在mock目录下创建子目录ez_mock/user,并新建area.js,将list.vue和detail.vue的数据转移到这里来:

并输出/vue-admin-template/ez_user/area/list和detail两个API接口:

补充:不知什么时候手残把ID的数据生成改了下,导致截图的ID不是数字了,这个不影响流程,大家假装没看到就好。

然后再修改list.vue和detail.vue,增加fetchData方法,让它们从mock接口获取数据:

保存再跑,页面看起来没变化,但跟踪网络请求会发现会从后端请求数据了:

至此为止,我们已经有一个模板工程了。这个工程我提交到了gitee(我在gitee上Fork了原作者的vue-element-template工程,并将改过的内容提交):

https://gitee.com/huzgd/vue-admin-template

目前为止大概我们已经知道手工生成一个表对象节点的流程了,人肉单个的模板工程做好后,接下来准备批量自动生成,基本上就是批量模拟人肉流程了。批量生成要用到_dml_config.INI配置文件,这个文件格式很简单,可以在任何目录上创建,每个文件为一节,一般只有几行,告诉EZDML要如何对待每个模板文件,我们直接实际演示如何操作。

打开EZDML的脚本模板文件夹(我机上是D:\EZDML\Templates),创建helloVueAdmin子目录:

并将刚才改过的vue-admin-template整个目录文件拷过来(.git、node_modules目录和package-lock.json除外):

用EZDML打开演示文件demo_ch.dmj,切到store(店铺)模型,执行菜单“模型|生成代码”命令,这时也是可以生成的:

我机上默认是生成到D:\EZDML\temp\ezdml\helloVueAdmin,不过打开目标文件夹,你会发现生成只是机械地把所有文件拷到目录路径下,应该说这个生成是假的:

打开终端执行安装运行,当然也是可以运行的,只不过运行还是只有用户|地区模块而已:

接下来我们配置批量输出,回到模板文件夹D:\EZDML\Templates\helloVueAdmin,打开src\ez_views目录:

将子目录user改名为ezmodel,并创建_dml_config.INI文件:

_dml_config.INI文件内容只有两行,意思是生成时将ezmodel文件夹改名为真正的模型名(如有汉字则转成拼音):

[ezmodel]
rename=#curmodel_name:ChnToPY#

然后进入ezmodel目录:

同样将area改名为eztable,同样也创建一个_dml_config.INI文件:

这回我们多写一行,大概意思是遍历所有表,对每个表都将eztable复制一份,并改名为表名(汉字转拼音):

[eztable]
rename=#curtable_name:ChnToPY#
loop_each_table=1

再次执行代码生成,这时会发现有批量生成内容的日志了:

打开目标目录,刚才生成的user还在(嗯,默认不会删除的),旁边多了个store:

打开store子目录,确实为每个表都生成了目录:

当然了,目前所有目录的文件都是一样的,这个我们就需要进一步处理了。

打开模板的EZDML\Templates\helloVueAdmin\src\ez_views\ezmodel\eztable目录:

同样创建一个_dml_config.INI文件,内容如下:

[list.vue]
run_as_script=js

[detail.vue]
run_as_script=js

意思很明确,就是把这两个文件当JS脚本模板执行,输出的结果写到目标文件里。

接下来就是把list.vue和detail.vue改造成JS模板。这两文件本来就是用JS生成的,现在只是还原回去,就是把template下的VueElementList_vue.js内容拷到list.vue里,把VueElementForm_vue.js的内容拷到detail.js里,并稍作修改,让#include “VueElementLib.js_”路径指向template:

重新生成代码,会发现生成内容确实变了:

为了能在界面上看到效果,我们还需要生成路由。在src\router下创建_dml_config.INI,内容就是让index.js变为一个JS模板:

[index.js]
run_as_script=js

然后修改router/index.js,首先是加个<% %>头,以<%开头的会被识别为模板格式:

要把原来写死的路由改掉,找到原来的内容:

改成动态的,大概就是遍历当前模型的所有选中的表,生成路由配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
  {
path: '/ez_${ChnToPY(curModel.name)}',
component: Layout,
redirect: '/ez_${ChnToPY(curModel.name)}/area_list',
meta: { title: '${curModel.displayName}', icon: 'el-icon-menu' },
children: [
<%
var md=curModel;
for(var j=0; j<md.tables.count; j++)
{
var tb = md.tables.getItem(j);
if(!tb.isChecked || (tb.typeName == 'TEXT') )
continue;
%>
{
path: '${ChnToPY(tb.name)}_list',
name: 'Ez${ChnToPY(tb.name)}List',
component: () => import('@/ez_views/${ChnToPY(curModel.name)}/${ChnToPY(tb.name)}/list'),
meta: { title: '${tb.UIDisplayName}列表', icon: 'el-icon-document' }
},
{
path: '${ChnToPY(tb.name)}_form',
name: 'Ez${ChnToPY(tb.name)}Form',
component: () => import('@/ez_views/${ChnToPY(curModel.name)}/${ChnToPY(tb.name)}/detail'),
meta: { title: '${tb.UIDisplayName}表单', icon: 'el-icon-document' }
},
<%
}
%>
]
},

生成结果:

这时运行能看到菜单了:

至此我们已经完成了批量生成路由、列表、表单功能了。接下来照着套路把mock里的内容也处理一遍,就是目录文件改名,加_dml_config.INI配置:

对每个表循环生成mock数据脚本:

再修改list/detail改用mock数据请求,并把表单做成组件放入列表中:

加个完成后的shell启动命令(在根目录下_dml_config.INI里配置auto_open_on_finished),就是EZDML自带的vueElemeAdmin模板了。

写得有点疲了,后面偷懒简化了,反正最后结果大概就是这样了:

最终的工程文件,大家可以在EZDML安装目录下的Templates\vueElemeAdmin\ez-vue-eleme-admin里找到,这里就不另行上传了。

生成的过程有点曲折,不过一旦写好就可以哗哗地大量制造代码了,能省事不少。程序员嘛,就是喜欢把重复的劳动自动化。

补充一下_dml_config.INI配置的说明,其实就是在需要EZDML处理的文件或文件夹旁边创建,告诉EZDML哪些文件或文件夹要复制多份,哪些文件是脚本模板:

对子目录生成代码时,程序会读取_dml_config.INI这个生成配置文件,此文件告诉程序要如何执行生成操作,不在这个文件里的文件和文件夹默认就是直接复制了。示例如下:

[start.html]——对于start.html这个文件的配置

run_as_script=pas——该文件其实是一个PAS脚本文件,要作为PAS脚本加载执行,生成最终结果。可选值:pas js

encoding=ansi——该文件输出时转为ANSI编码,默认utf8,可选值:空,utf8,ansi

20200310:注意仅控制输出文件编码,输入脚本文件必须为utf8编码

[index_top.html]——对于index_top.html这个文件的配置

rename=#curmodel_name#_index_top.html——该文件生成时要重命名,前面加当前模型名

run_as_script=js——该文件其实是一个JavaScript脚本文件,要作为JS脚本加载执行,生成最终结果

encoding=ansi——该文件输出时转为ANSI编码,默认utf8,可选值:空,utf8,ansi

[table_ui] ——对于table_ui这个目录的配置

rename=ui_#curtable_name:LowerCase#——该目录生成时要重命名,新文件名为ui_加当前表名的小写

loop_each_table=1——该目录下的文件、脚本需要对每一个表都执行一遍生成过程,该子目录下应该也要有一个_dml_config.INI来控制生成过程

skip_exists=1——不覆盖已经存在的目标文件,避免重复生成

[dml_settings]

auto_open_on_finished=start.html——生成结束时打开这个文件,仅用于根目录

auto_open_on_finished_mac=start.html——生成结束时打开这个文件,仅用于根目录苹果MACOS系统

生成代码文件名或目录名支持一些简单运算,如:
[CSharp.pas]
rename=#curmodel_name:UpperCase#to#curtable_name:AutoCapitalize:CamelCaseToUnderline:UpperCase#.cs

冒号后的运算符可以连续多个,表示连续进行多次运算。

目前支持的运算符有:

  1. AutoCapitalize——自动大小写
  2. UpperCase——大写
  3. LowerCase——小写
  4. CamelCaseToUnderline——驼峰命名转下划线命名
  5. UnderlineToCamelCase——下划线命名转驼峰命名
  6. ChnToPY——中文转拼音

更复杂的输出需求,可以自己在脚本里控制,参考官网《EZDML脚本参考》。

有任何问题可加Q群沟通(见软件的帮助、关于),可能回复不及时,但一般都会回复。