本文讲解4.0版jxTMS的自动生成代码功能,
整个系列的文章请查看:docker版jxTMS使用指南:4.0版升级内容
docker版本的使用,请参考:docker版jxTMS使用指南
任何一个管理系统都需要对管理对象进行管理,包括最基本的的增删改查,而这每一个功能都需要制作界面、书写代码,由于需要大量设置、修改各种名称【控件名、数据名、变量名等等】,这些工作非常简单却异常繁琐,很容易出错。
所以4.0版jxTMS提供了自动生成代码的功能,通过简单描述管理对象的基本界面,然后就可以自动生成基本的增删改查定制文件。
自动生成代码功能需要在模块所在目录下建立一个codeSource文本文件,其中以分号为分隔符来定义一个个的管理对象的访问界面。其语法为:
VARIABLE VARIABLE 'TITLE' VARIABLE webDivData webDivRow+ webDivSearch?
可参考【/var/chroot/home/demoOrg_2255/codeDefine/demo2/test/codeSource】。
codeSource的语法中所有以单引号括起来的全大写的文字,都是关键字,在语法定义中是需要用单引号括起来的,但实际定义时自然不需要的。
第一个变量是管理对象的类属名【即该管理对象属于哪个门类】,jxTMS会为该管理对象自动生成两个快捷栏中的入口:【添加xx】和【xx查询】。而这两个入口所在的第一级的快捷栏名称,就是此处的类属名。如第一个变量是【演示】,则就会在快捷栏的【演示】菜单中新增两个入口:【添加xx】和【xx查询】。
第二个变量是该管理对象的英文名,笔者习惯以大写字母开头。
第三个变量是该管理对象的中文名。
示例如:
安全管理 User TITLE 用户
即对User的管理,会在快捷栏中生成两个入口:【安全管理->添加用户】、【安全管理->用户查询】。
webDivData是定义本管理对象的访问语义词与保存数据的数据表中列的对应关系的:
webDivData
//变量名就是保存数据的数据表名,也是数据类名
: 'DATA' VARIABLE webDivDataVar+
;
//webDivDataVar的定义是
webDivDataVar
//语义词=数据表中的列名
: VARIABLE ASSIGN VARIABLE
;
示例如:
DATA Auth
userID=ID
userCreateTime=CreateTime
userSpecial=Special
userName=Name
userState=State
userDescr=Descr
意为,User的数据放在数据表Auth中,userID保存在Auth表的ID列、userName保存在Auth表的Name列,等等。
定义完DATA后,以后只需要用语义词来访问数据即可,不再需要直接使用数据字段名,而语义词则绑定到所生成界面的相应控件的bind上。
webDivRow描述了该管理对象的详情界面,而此界面将被新增、查看、修改三界面所复用:
webDivRow
//描述了一行,由多个表意格组成
: 'ROW' webDivCol+
;
webDivCol
//每个表意格包括两个控件:文本提示、输入输出数据【新增、修改时是输入,查看、修改时是输出】
: VARIABLE STRING webDivColTitleAttr? VARIABLE? TYPE type webDivColAttr
;
webDivColTitleAttr
: webControlAttr (Comma webControlAttr)*
;
webDivColAttr
: webControlAttr (Comma webControlAttr)*
;
webControlAttr
//属性名=属性值
: name ASSIGN value
;
value
: NUMBER #numberValue
| STRING #stringValue
| (TRUE | FALSE) #booleanValue
| VARIABLE #variableValue
| json #jsonValue
;
jxTMS将根据webDivRow中的定义,自动生成一个详情界面,然后被新增、查看、修改三界面所引用,然后再分别为新增界面增加【增加】按钮、为编辑界面增加【修改】按钮。
示例如:
ROW
userSpecial '标识号:' type input width=150
userName '名称:' type input width=150
ROW
userState '状态:' type combobox values=[{'text':'正常'},{'text':'停用'},{'text':'异常'}],useText=true,width=150
onLineState '实时状态:' type text width=150
ROW
userDescr '说明:' type textarea width=750
就定义了一个三行的详情界面,其生成的界面为:
//基本信息
web UserInfo type div;
web UserInfo_T1 parent UserInfo type table title='用户信息',width=900,alone=true;
with UserInfo_T1 row 0 col c0 web n type text text='标识号:',width=150;
with UserInfo_T1 row 0 col c1 web n bind userSpecial type input width=150;
with UserInfo_T1 row 0 col c2 web n type text text='名称:',width=150;
with UserInfo_T1 row 0 col c3 web n bind userName type input width=150;
with UserInfo_T1 row 1 col c0 web n type text text='状态:',width=150;
with UserInfo_T1 row 1 col c1 web n bind userState type combobox values=[{'text':'正常'},{'text':'停用'},{'text':'异常'}],useText=true,width=150;
with UserInfo_T1 row 1 col c2 web n type text text='实时状态:',width=150;
with UserInfo_T1 row 1 col c3 web n bind onLineState type text width=150;
with UserInfo_T1 row 2 col c0 web n type text text='说明:',width=150;
with UserInfo_T1 row 2 col c1 web n bind userDescr type textarea width=150;
同时还创建了三个界面:
//查看
web viewUser type div;
web viewUser_D1 parent viewUser ref UserInfo width=900;
//新增
web newUser type div;
web newUser_D1 parent newUser ref UserInfo width=900;
web newUser_D2 parent newUser type div width=900;
web newUser_OPBtn parent newUser_D2 type button width=150,text='增加',motion=cmd,demand=newUser;
//编辑
web editUser type div;
web editUser_D1 parent editUser ref UserInfo width=900;
web editUser_D2 parent editUser type div width=900;
web editUser_OPBtn parent editUser_D2 type button width=150,text='修改',motion=cmd,demand=editUser;
大家对照看一下就能理解了。
webDivSearch是可选的带条件的分页查询表。其语法为:
webDivSearch
//VARIABLE是查询的条件的语义词,必须在ROW中定义过,jxTMS会使用这些定义来生成查询条件
: 'SEARCH' VARIABLE (Comma VARIABLE)* webDivList
;
webDivList
: 'LIST' webDivListCol+
;
webDivListCol
//bind的语义词、head
: 'COL' VARIABLE VARIABLE? webDivColAttr
;
大家可以对照【/var/chroot/home/demoOrg_2255/codeDefine/demo2/demo/codeSource】文件,以及其所生成的代码文件,同时运行一下查看相关界面来理解上述语法的效果。
参考资料:
jxTMS设计思想
jxTMS编程手册
下面的系列文章讲述了如何用jxTMS开发一个实用的业务功能:
如何用jxTMS开发一个功能
下面的系列文章讲述了jxTMS的一些基本开发能力:
jxTMS的HelloWorld