docker版jxTMS使用指南:helloWorld!代码讲解
创始人
2025-05-30 23:09:25

本文讲解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

相关内容

热门资讯

“代抢票”背后的灰色产业链 抢... “演出经济”蓬勃发展,举办各类演唱会、音乐节等成为各地提升旅游收入、提振消费的“新密码”,热门艺人演...
Vue入门+DRF项目实战-0... 1. 引入Django REST framework 在本章中,我们要大家介绍为什么学习Django...
「VScode」通过VScod... 前言 之前在git的版本管理上,我使用的是sourcetree,说实话...
油价继续下跌?欧佩克宣布将再度... 5月31日,欧佩克线上会议讨论7月增产事宜,同意41.1万桶/日的大规模增产计划。当前,国内化工产业...
在生产计划项目中使用甘特图的5... 在生产计划中,会不断接收很多的订单项目,这时候就需要能够合理安排时间、资...
NOA渗透率超5%?智能汽车赛... 从L2到高速NOA(导航辅助驾驶),再到城区NOA...
赴港上市再添“新军”,背后有茅... 近日,资本市场再度迎来新动态,两家新三板摘牌公司 —— 先通医药与华曦达先后迈向港交所递表,计划转道...
小小科技八年磨剑IPO 第一个... 《投资者网》张伟5月,汽车零部件生产商安徽省小小科技股份有限公司(下称“小小科技”或“公司”)披露了...
精测转2上市价格预测 精测转2基本信息转债名称:精测转2,评级:AA-ÿ...
欧佩克宣布,再度增产! 5月31日,欧佩克线上会议讨论7月增产事宜,同意41.1万桶/日的大规模增产计划。 据新华财经5月3...
js常用循环方式 let list = [{name:'张三',age:22},{name:'李四',age:...
nvmf代码分析 nvmf代码分析NVMf RPC接口文件1、创建RDMA Port监听2、创建NVMf链接nvmf_...
【微服务】—— Nacos设计... 文章目录一、简介Nacos起源Nacos 定位Nacos 优势二、Nacos 总体设计1࿰...
axios 请求其他服务器地址... 场景还原: Vue2项目中在生产环境调用其他服务器请求地址时候会在请求地址默认加上一串当前浏览器域...
一斤便宜10元还要降?榴莲可以... 最近几年,各种知名水果的价格可以说都出现了比较大的变化,特别是最近榴莲的价格持续下降,甚至还有降价的...
图解redis对象(hash ... 哈希表 哈希对象的编码可以是ziplist或者hashtable 条件 ·哈希对象保存的所有键值对的...
C语言再学习 -- C 标准库... 参看:C 标准库 - stdlib.h C 标准库 - 简介 stdlib .h 头...
欧佩克+连续第三次大幅增产,油... 欧佩克连续第三次大幅增产,这一举措无疑给油价带来了巨大压力,恐使其承压下跌。欧佩克作为全球重要的石油...
python 安装包相关命令 查看匹配的版本(大小写敏感)pip -V 查询已经安装了的包,并可以显示相应的版本&...
“2025外贸优品中华行——天... 中新网天津5月31日电 (记者 王君妍)31日,“2025外贸优品中华行—天津站”活动正式启幕。本次...
基于SpringBoot+Vu... 您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦。 &#...
网络技巧|远程桌面连接不上的多... 写在前面的话专注于网络各种技巧和实用工具的分享,都是日常工作中遇到的大大小小问题记录下...
IM即时通讯软件系统源码安卓、... demo软件园每日更新资源,请看到最后就能获取你想要的: ​ 1.《计算机系统结构:解...
讲解一下关于MySQL数据库的... 对于数据库,市面上有着不少的数据库!比如:Oracle数据...
3.1.2数据库体系结构:分布... 3.1.2数据库体系结构:分布式数据库、分布式数据库特点、分布式数据库结构、数据分片、...
学习streamlit-6 系列目录 学习streamlit-1,简介学习streamlit-2,s...
冒泡 VS 插入 VS 选择—... 文章目录什么样的“排序算法”更加优质?排序算法的执行效率排序算法的内存消耗排序算法的稳...
Python 多线程 文章目录一、简介1.1 多线程的特性1.2 GIL二、线程1.2 单线程1.3 多线程三、线程池3....
基于树莓派实现超声波测距 目录 一,写在前面 二,超声波模块说明 ● 模块基本参数 ● IO口接线...
Linux(网络基础---数据... 文章目录0. 前言1. 以太网的帧格式2. 再谈局域网原理3. 汇总整体通信流程,补全...