使用本示例需通过docker容器,请先下拉jxTMS的docker镜像并按说明启动tms容器,并从helloWorld开始尝试。
使用静态web界面
到目前为止,我们所演示的界面都是在web文件定义的,jxTMS会根据这些定义动态的创建界面,这种方式称为动态界面。显然,动态界面的控件都是根据参数动态生成的而且布局非常单一,也不支持图像、色彩等,所以其界面的美学肯定是不高的,这对于内部使用的业务系统来说,不是问题,还有成本低、制作快的优势。但如果面向较大范围的应用来说,可能就无法接受了。
所以,jxTMS在默认的动态界面模式之外,还支持静态界面,即web界面显示的是美工和前端制作好的html、js、css等文件,而jxTMS则只提供后台业务逻辑。
注:jxTMS在web处理上采用了自己的会话管理机制,所以如果开发者想采用静态界面,则必须自己处理登录和会话管理
登录
登录的接口是:
方法:post
uri:/ui/login
参数:
Type:字符串,默认按登录名登录,【contact】则按通信号码登录
Name:字符串,登录名
Passwd:字符串,密码
useCDS:必须是true,指示本次登录工作在静态界面模式,否则无法接收到jxTMS发送的数据
如:
http://127.0.0.1:10018/ui/login?Name=manager&Passwd=123456&useCDS=true
参数还可以是加密的,以json格式传递给jxTMS。
注:加密的js请按jxTMS的docker镜像最下方的方式向笔者索取
如果登录成功,则返回一个json对象:
{
meta:{
type:"obj",//返回的数据类型,可以忽略
rc:200,//http返回代码,成功为200,重定向为304,内部错误401,未找到404
msg:"返回的消息"
},
data:{
jxSessionID:xxxxxxx,//返回的会话号,以后每次和jxTMS通信都必须附加此会话号
peopleName:nnnnn,//用户的登录名
orgFullName:nnnnn,//登录到的组织全名
orgAbbr:nnnnn,//登录到的组织简称
}
}
会话管理
登录后,以后每次请求jxTMS时,都应在url中添加会话号:
//xxxxxxx是登录成功后所获取到的jxSessionID值
/apiv2/ping/?SessionID=xxxxxxx
给静态界面增加接口
想访问jxTMS的某个接口,必须通过授权。而接口的授权,jxTMS是通过在op.py中以role的形式授予的。
所以,如果我们想让静态web界面访问某功能模块的某事件响应函数,必须在op.py文件中定义入口并授权。大家可以打开codeDefine目录下的manager/op目录,看一下op.py文件:
@biz.OPDescr
def op(json):
json.setA().text('前端用于测试-ping'.decode('utf-8'))
json.module('manager').capaname('op')
json.cmd('ping')
也就是授权manager.op.cmd.ping谁都可以访问
然后再看capa.py文件中的ping函数:
@myModule.OutDescr('execResult','bool','true:执行正确'.decode('utf-8'))
@myModule.OutDescr('pong','string、int等基础类型都可以','送入的参数'.decode('utf-8'))
@myModule.InDescr('p','string、int等基础类型都可以','送入的任意参数'.decode('utf-8'))
@myModule.MotionDescr('系统是否存活'.decode('utf-8'))
@myModule.api('apiv2')
@myModule.event('cmd', 'ping')
def ping(self, db, ctx):
p = self.getInput('p')
jx.log("p:{}",p)
jx.log("ap:{}",self.getInput('ap'))
self.setOutput('pong',p)
self.setOutput('execResult',True)
#self.delayExec(1000,self.test,self.getInput('apiKey'))
return False
注意其中的@myModule.api(‘apiv2’),这是为其指定了一个uri形式的访问接口,前端即可通过访问:
http://127.0.0.1:10018/apiv2/ping?SessionID=1664658381471760
来调用ping函数了。即在用@myModule.api(‘pathName’)修饰了某个函数后,该函数的uri即为:
/pathName/函数名
给其拼接上SessionID,jxTMS即会调用相应的函数。
我们在post该uri时,以json格式传递:
{'p':'t123',ap:23.45}
jxTMS即会为ping函数准备好输入p和ap。大家可以在日志中看到这两个参数的显示。
ping函数执行后,会返回执行结果如下:
{"meta":{"rc":200,"msg":"OK"},"data":{"capaid":"ca_1664658394054673","pong":"t123","execResult":true}}"
data节点中的pong和execResult就是我们在ping函数中调用self.setOutput所返回的值。