docker版jxTMS使用指南:helloWorld!代码讲解

本文讲解docker版jxTMS的helloWorld!是如何定制的,整个系列的文章请查看:docker版jxTMS使用指南

在上文中,我们上传了三个文件,分别是:

  • web:界面的文本描述,按一行一个控件的形式进行描述

  • capa.py:本模块的处理代码,python 2.7,不需要安装任何额外的模块

  • op.py:入口定义文件

web界面

我们先看一下web文件:

//helloWorld的界面
web helloWorld type div;
web helloWorldt1 parent helloWorld type table title="世界,你好",width=900;
with helloWorldt1 row 0 col c0 web n type text text='说点啥:',width=200;
with helloWorldt1 row 0 col c1 web n bind outText type text width=700;

with helloWorldt1 row 1 col c0 web n type button width=80,text='点我',motion=cmd,demand=sayHello,confirm='确认要执行吗!!',onlyOnce=false;

其定义了一个helloWorld的div,显示效果:

helloWorld

所有的界面都必须是一个div,jxTMS中称为组容器,用来成组显示。div可以显示在主界面中,也可以显示在右侧的辅助界面中,当然也可以作为一个子界面嵌入到其它div中。甚至还可以被引用给另一个div,如某个对象的详情div,可以被新增div引用,也可以被修改div引用,还可以被查看div引用,这就避免了详情界面的修改而不得不修改新增、修改、查看等多个界面的问题,从而大大降低了开发的工作量以及bug率。

helloWorld包含了一个helloWorldt1的表,jxTMS中的表有两种,一种是数据表,用来分页显示数据的;一种是容器表,如此处的helloWorldt1,是用来行列对齐其它控件的。

helloWorldt1包含了两行,0行又分为了两列,分别放置了一个text控件,两者除宽度外有两个区别:

  • c0列的text控件带有text属性,所以它就是一个用于提示的文本

  • c1列的text控件用【bind outText】绑定了一个数据别名:outText。然后就可以用outText为名字来向该控件输出了,所以它是一个用于输出的文本控件

1行只定义了一个c0列,放了一个【点我】的按钮。由于两行同有一个c0列,所以两个c0列的控件做了对齐,大家可以将【点我】的按钮的col修改为c1、甚至是c2,然后做个热机更新,看看是什么样的效果。

注:修改完记得要先保存、上传啊!别问为什么我非要提醒一下

【点我】的按钮有四个属性大家可能有点不太明白,我简单解释一下:

  • motion和demand,点击了该按钮,将触发一个事件,该事件就是由这两个属性指定的:【cmd.sayHello】

  • confirm,会弹出一个提示框,要求用户确认点击事件,提示内容即是confirm的属性值

  • onlyOnce,默认是true,即按钮默认只能点击一次,如果需要反复点击,则应设置本属性并赋予false

注:不管onlyOnce设置为何值,按钮点击后都会短暂的失能,这主要是防止有的同学手速太快,不象我这么老实的人,按按钮从来都是小心翼翼的、谨慎的、郑重的只点一下的!

处理逻辑

处理都写在capa.py文件中,由于我已经加了注释,就不水字数了,大家打开该文件,先看看我在其中所加的注释。我做一点额外的讲解。

1、capa.py中先定义了一个demo1类,该类继承自affairMgr。大家以后写新的功能模块,一般都是复制本capa.py,如果修改了类名,要记得还有两处类名要一起修改:

  • New函数中

  • 定义完一定要立刻生成一个所定义的类,所以最后的那个生成语句处也要改

否则,jxTMS会报相应的模块未定义的错误或进行了错误的调用。

2、module、name函数,分别指定了本功能模块所在的代码空间名和模块名

注:别问为什么module是代码空间名,name却叫模块名

jxTMS的代码是分为两层进行组织的,第一层是代码空间,包含了若干模块;第二层是模块,每个模块可以包含5个文件:capa.py、web、op.py、sql、data。代码空间名必须是codeDefine目录下的子目录名,模块名又必须是所在代码空间目录中的子目录名。

注:别问名字不一样会如何,因为这个错误我从没犯过:)

我们重点讲一下sayHello函数,大家看到其做了一个修饰:

@myModule.event('cmd', 'sayHello')
def sayHello(self, db, ctx):
    self.setOutput('outText','你好!'.decode('utf-8'))
    #请在日志中查看。python中的字符集和java的字符集是不一样的
    #所以中文得先解码成uft8,所以中文字符串必须跟一个decode函数
    jx.log("from sayHello-2:{}",'日志,你好!'.decode('utf-8'))
    jx.log("from sayHello-1:{}/{}-->{} ok",123,'yes',True)

myModule.event修饰函数有两个参数:cmd、sayHello。正好和web文件中【点我】按钮的motion和demand属性吻合,所以大家就知道了,sayHello就是用来处理【点我】按钮的点击事件的事件响应函数。

所有的事件响应函数都必须和sayHello函数的签名一样,接受两个参数:

  • db:jxTMS提供的数据库访问接口,带事务。本函数出现错误,则整个事务会回滚,不影响数据库的任何内容;同样,本函数对数据库所做的修改不会立刻更新到数据库中

  • ctx:本函数执行时的上下文环境,包括所在组织、当前用户等

只要符合该签名的函数,用myModule.event进行了修饰,jxTMS会自动为其和相应的事件进行绑定,不需要开发者做任何额外的处理。

sayHello函数就三行代码,第一行:

self.setOutput('outText','你好!'.decode('utf-8'))

大家回想上面说到helloWorldt1表的0行c1列的文本控件时,指出其绑定了一个outText数据名,这里就是用setOutput向其进行赋值。

web控件只要绑定一个数据名,然后事件响应函数中就可以直接用setOutput向其进行输出了,中间的千山万水是如何跨越的开发者都不必关心。

注1:注释里已经说明了,由于python和java的编码不同,所以中文字符串必须用decode进行解码,否则用户看到的就会是乱码。

注2:jxTMS高度集成以尽可能的减少开发者的工作量、降低开发者的学习成本和门槛,所以涉及到web端的javaScript、平台开发用的java、用户逻辑处理用的python、数据库用的mysql,笔者已经尽最大努力来避免乱码问题了,但依然郑重建议:尽量少用中文作为变量名、属性名、字段名、表名等等一切名字!!!

sayHello函数的第二、三两行是输出到日志中,其函数签名是:

jx.log(msg模板,可变长参数数组)

msg模板中如果含有花括号,则依次用参数数组中的值进行替换。大家观察一下两个日志输出语句以及日志中的实际输出就可以理解了。去掉其它信息后的日志输出是:

from sayHello-2:日志,你好!
from sayHello-1:123/yes-->true ok

有熟悉python的同学应该会奇怪了,capa.py这段代码中出现了四个名字:affairMgr、myModule、jx、biz。这都是哪来的呢?!

myModule、jx、biz这三个都是jxTMS在加载时设置的全局变量,大家现在就这么用就好,等以后熟悉了,再来详细解说。

affairMgr是jxTMS平台所提供的java类,是所有用户定制的capa【jxTMS术语:功能点】的父类,只有继承了affairMgr类,用户自定义的类才具备种种神奇功能。

那就奇怪了,affairMgr不应该用import语句加以导入吗?!当然,jxTMS替大家导入了。而且,大家也不要想着自己import什么类,jxTMS会删除所有imort语句,具体原因请阅读:jxTMS设计思想中的安全一章。

注:说到安全,docker版本的jxTMS中取消了死锁检测,所以万勿将代码管理权共享给他人!

入口

我们现在有了界面,也有了界面相对应的处理逻辑,可怎么访问使用呢?!

在jxTMS中,访问我们定义的功能有一个术语:入口。入口有菜单、快捷栏、按钮、工具条等等,详细的还是阅读我的相关文章。这里我们设置的是一个快捷栏的入口。

在op.py文件中,我们定义了:

@biz.Demand('disp','helloWorld')
@biz.OPDescr
def op1(json):
    json.setShortcut('演示'.decode('utf-8'),'helloWorld')

入口是一个带json参数的函数,用biz.OPDescr和biz.Demand依次进行了修饰。其中:

  • biz.OPDescr修饰符指示这是一个入口的定义

  • biz.Demand修饰符指示该入口对应的事件响应函数是demo.demo1.disp.helloWorld,其格式为:【代码空间名.模块名.motion.demand】,其中的代码空间名和模块名由jxTMS自动补足

经过修饰,该入口将打开demo.demo1模块中名为helloWorld的div。而:

json.setShortcut('演示'.decode('utf-8'),'helloWorld')

则将该入口设置为快捷栏:演示->helloWorld。

jxTMS在加载模块时,会调用用biz.OPDescr修饰过的函数,并送入一个json描述对象,我们通过对该json的各种操作,就完成了对该入口的设置。

OK!我们讲解了helloWorld的定制,大家可以阅读参考资料,根据其中的讲述随便改,来看看jxTMS都是如何定制的,反正大不了将不工作、出错的代码删掉,然后做一次热机刷新即可。

参考资料:

jxTMS设计思想

jxTMS编程手册

下面的系列文章讲述了如何用jxTMS开发一个实用的业务功能:

如何用jxTMS开发一个功能

下面的系列文章讲述了jxTMS的一些基本开发能力:

jxTMS的HelloWorld

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值