关于WebPaaS

    WebPaaS是北京智友信诚科技有限公司开发的在线开发平台,用于企业在线开发管理软件,结合在线APP开发功能,企业在一个平台开发,可在PC端、智能设备上同时使用;开发程序可共享,一次开发,多企业可使用,并可以根据各自企业需求情况单独修改。

1.1. WebPaaS运行原理

WebPaaS使用可视化的、在浏览器上运行的集成开发环境,开发专用json格式文件(为了便于网络传输,参数尽可能简化,所以设置了“z”参数名为专用文件的定位参数,下称z文件),存储在服务器端的MongoDB数据库中,运行时服务器解析运行z文件,开发出的z文件类似于jsp文件。

通过使用集成开发环境,可视化地设计应用的前后台组件、属性、方法和事件,来构建整个应用的大部份功能和框架,可以通过编写前台html/JavaScript脚本和可在后台运行的JavaScript代码来扩充业务功能的开发。

z文件内的组件是有先后顺序的,服务器解析z文件时,会根据组件的先后顺序来执行。比如z文件内包含store组件和grid组件,其中grid组件引用了store组件,那么store组件必须在grid组件之前定义,原因是服务器生成的客户端JavaScript代码是在浏览器上运行,而浏览器的js是顺序的、单线程的运行;可通过编辑器拖动组件来调整同一层次上组件的先后顺序。

开发完成的z文件为公用文件,但数据访问层进行了转义,除非系统管理员审核了此z文件,否则不同企业间的数据不能互通;由于采用了文档型数据库,保证了数据集合的按需使用,使用时动态建立文档,不产生多余的文档库。

集成开发环境的使用

集成开发环境是开发WebPaaS应用模块z文件的工具,由工具及菜单区、功能面板区和设计及开发区构成。系统采用动态可扩展的插件技术来配置系统,可通过组件管理器的配置来扩充组件库。

2.1. 编辑器的使用

编辑器是设计z文件的工具,通过配置属性和事件来描述应用功能。编辑器的右侧视图为组件树,以树状结构的形式来展现z文件内的所有组件。左侧的属性和事件编辑器显示当前选择的组件的属性和事件。

在右侧组件树中,可复制、剪切和粘贴所选择的组件,也可在有关联性的组件之间相互拖动。

双击组件库中的组件,能在当前选择的组件下创建新的指定组件,如需创建下一层级的组件,可通过按Ctrl+双击组件来实现。

模块的编辑可通过IDE中的模块树来进行管理,双击模块即可打开指定的模块。

2.2. 表单设计器的使用

表单设计器是设计容器组件内的组件绝对坐标位置的工具。当容器的布局为绝对位置布局时,表单设计器设计的组件位置才有效。

当容器未显式指定layout布局属性时,启用表单设计器将会提示layout属性未设置为absolute。表单设计器仅适用于指定的容器为absolute布局,否则设计的布局将无效。

表单设计器的打开,可通过选择指定的容器组件,然后点击工具条上的Form Designer按钮。

提示:在使用表单设计器设计时,界面元素之间可适当间隔(设置paddingmargin),避免过于紧凑。这样的设计,一方面保持了界面的美观,另外也屏蔽了不同浏览器之间的细微差异。

WebPaaS开发基础

3.1. WebPaaS中的参数机制

WebPaaS中的参数分为两种,包括外部参数和内部参数。

外部参数:外部参数存储于request对象的Parameters中,可通过requestgetParameter方法获取。

内部参数:内部参数存储于request对象的Attributes中,内部参数可通过requestgetAttribute方法获取。

WebPaaSz文件的任何除服务器端外的位置,包括任何属性和事件中,都可通过{#变量名#}直接获取内部或外部变量,系统优先从内部变量取值,内部变量值为null时取外部变量,均无值返回空字符,如果变量为对象,将返回变量的toString()方法返回值;服务器端可以直接访问request获取或通过req对象获取;如果需要对获取的参数进行类型格式化,可通过req内的方法实现,如req.gs可获取字符串的变量,req.gb获取布尔型的变量,此方法在存储MongoDB数据时非常有效,避免因存储的类型不一造成数据检索错误,特别是数字与字符的类型不一造成的错误。

3.2. 系统运行关键变量的配置

WebPaaS服务器运行的重要参数配置保存在系统变量库中。系统运行时会自动把这些变量加载,系统通过Var对象实现设置及获取。如title变量的值为“北京智友信诚科技有限公司”,则“{#Var.zhiyou.title#}”的值为“北京智友信诚科技有限公司”,注意引用时在变量名称前加“Var.”。

运行时变量请参考“变量配置”功能节点树。

3.3. 运行时变量

系统运行时的变量是系统运行期间自动生成的变量,通过读取这些变量的值,能方便系统的开发。这些运行时的变量存储在系统的内部变量当中。

运行时变量包括以下一些常用的变量:

sys.ip:当前请求的客户端ip地址;

sys.now:当前请求的日期和时间,包括时间部分;

sys.id:根据时间序生成的唯一编码;

sys.user:当前请求用户的用户名称;

sys.role:当前请求用户的角色;

3.4. 变量的缓存

为了在企业内部共享设置,可以通过“系统运行关键变量”来配置,但如果此变量是对象或只是临时需要缓存的数据(并非设置类的),或企业内部的数据需要某种共享,那么缓存变量就很有意义,系统提供两种形式的变量缓存:

3.4.1. 数据库存储缓存

数据库缓存封装的是MongoDB的二进制存储方法,被存储的对象必须支持序列化,否则将出错,代码示例:

Zy.Resource.setObject('变量名',obj);//设置变量

数据库缓存一旦建立,除非再次对此变量进行上述操作,否则将一直保存在MongoDB数据库内。

获取变量示例:

var obj=Zy.Resource.getObject('变量名');//获取变量

设置用户变量:

Zy.Resource.setUserObject('变量名',obj);//设置调用到此代码的用户的变量

此变量与setObject的变量类似,只是它只供用户获取,获取用户变量示例:

var obj=Zy.Resource.getUserObject('变量名');

注意:数据库缓存的对象已经经过序列化,缓存后对象的修改不影响缓存数据,序列化后的对象获取时,内存内将新增此对象序列化前的复制版本。

3.4.2. 内存缓存

内存缓存是临时存储与服务器内存内的信息,相比数据库缓存,因为没有数据存储环节,效率更高,但在web服务重启后、或30分钟没有用户访问此缓存,数据将清空消失。

内存缓存封装于服务器端脚本内的Zy.getCache()方法内,获取的返回值为ConcurrentHashMap类型,代码示例:

var map=Zy.getCache();

map.put('变量名',obj);

只要设置,在任何本企业的z文件的服务器端代码内,可通过如下方法获取对象:

var map=Zy.getCache();

var obj=map.get('变量名');

obj对象存储的就是变量的对象。

3.5. z文件的module描述

每个z文件都具有一个默认的根节点modulemodule是对z文件的整体信息的描述。

z文件作为前台页面文件时module可以对页面的文档体进行描述,比如引用指定的js文件、css文件,创建页面的框架html脚本,声明全局的js变量和函数等。

另外,也可设置module其他一些属性来设置z文件的行为,比如是否需要登录,是否需要记录日志,初始化时执行的方法。

系统默认z文件的body是自动创建的,当指定的z文件不需要生成body时,可以设置createBody属性为false。此种情况往往用于返回jsonxml、图片或纯文本的内容。比如z需要返回json{para1:123,para2:’abc’},系统默认是创建body的,返回的内容可能包含htmlbody信息,为了返回纯json脚本,可设置createBody属性为false

如果为页面文件,可在head属性或initialize事件中定义全局的函数和变量,在finalize事件中定义页面加载完成之后执行的JavaScript脚本。

页面的布局和容器组件

页面的布局是指整个页面框架的划分和设计,良好的布局不仅能美化页面,还能使页面自适应客户端的不同分辨率。可使用页面容器组件来实现对页面的布局。常用的页面容器组件包括viewPort(显示容器)、panel(面板)、Window(窗口)、Form(表单)、tabTab页)、fieldSet(字段集)。

页面的布局通过设置容器的layout属性来指定容器内组件的布局。

4.1. 容器组件

容器组件不仅能放置和容纳其他页面组件,还能实现布局、美化和方便管理的效果。

4.1.1. viewPort显示容器

基于浏览器对象的显示容器,显示区域为整个浏览器客户区。ViewPort组件是对Ext中的Viewport组件的封装。

该组件不能嵌套使用,如需嵌套布局,请使用panel组件。

4.1.2. panel面板

面板是最常用的容器,用于构建面向应用的用户界面。面板的作用非常广泛:可作为组件的容器;可以作为布局容器使用;可以作为装饰或功能性地使用,比如在tbar添加工具条等。

panel组件包含tbar顶部条、body面板体和bbar底部条3部分。在tbarbbar中可关联菜单工具条组件。

可以设置paneltitle属性来指定标题,frame属性来指定是否生成背景色,border属性来指定是否生成边框,collapsible来指定是否可收缩。

4.1.3. Window窗口

窗口继承自panel面板组件,提供可拖动的交互式界面。

可通过设置窗口的dialog属性来指定窗口是否为对话框模式,默认窗口为对话框模式。窗口为对话框时,可编写clickOk事件来表示点击确定按钮执行的事件。

窗口即可以用作对话框,也可以用作显示的容器。通常窗口以模态对话框使用,系统默认的窗口样式为隐藏的模态对话框。

如果要自动显示窗口,设置autoShow属性为true;如果设置为非对话框,设置dialogfalse

窗口为对话框时,可编写clickOk事件来表示点击确定按钮执行的事件。

show事件为窗口显示时的事件,可在该事件中初始化窗口或设置焦点等。

可以在窗口的hide事件使用Zy.reset(window)来重置窗口内组件的值。

4.1.4. Form表单

带有默认form布局及文件提交功能的面板容器。

通常情况下在WebPaaS内对于数据的提交可使用Ajax组件,因此使用表单组件提交数据不常用。例外情况是提交带有上传文件的数据必须采用Form表单组件。

上传文件时,需要在表单组件下添加text编辑框组件(或者使用5.2.1中描述的js库调用方法,最终仍通过form实现提交),并设置text组件的inputType属性为file;然后使用APIZy.upload函数来提交表单;在后台可使用request.getAttribute函数(注:文件流不是使用request.getParameter)来获取提交的参数和文件流值。

使用request.getAttribute(“fileText”)获取的对象是InpuStream对象。

4.1.5. tab

分页显示内容的容器。

通过在tab页组件下添加panel面板组件,来实现Tab控件的各页,每个panel即为每个页。通过设置panel组件的caption属性来设置各页的标题。

4.1.6. fieldSet字段集

归纳组件的容器,可用于把业务功能相近的一组组件放在一个容器中。容器会生成边框及控制伸缩的按钮。

4.2. border边界布局

边界面局是一种将页面划分为若干个区的布局方式,一个页面可划分为东、南、西、北和中5个区域。其中,中间区域是必须包含的,其他区域可根据需要选择划分。

除中间区外,其他各个区可设置默认的宽度或高度,中间区是自动适配的。同时可设置除中间区之外的其他区容器组件的split属性为true,来生成指定区域可拖拉的分割条。

每个被划分的区可以单独设置包含border边界布局在内的任意布局,从而实现布局的嵌套设计。

示例:

    • ¬ 新建z文件,添加viewPort显示容器组件;
    • ¬ viewPort组件下添加3panel面板组件,设置name属性分别为northPanelwestPanelcenterPanel;设置caption属性分别为北、西和中;设置region属性分别为northwestcenter;设置frame属性都为true;设置northPanelwestPanelsplit属性为truecollapsible属性为true
    • ¬ 点击保存按钮,然后点击运行按钮。
4.3. fit适配布局

适配布局指定子组件布满整个容器,通常此布局下的子组件仅有一个。可通过设置容器的layout属性为fit,指定首个子组件布满容器。

示例:

    • ¬ 新建z文件,添加viewPort显示容器组件,设置layout属性为fit
    • ¬ viewPort组件下添加panel面板组件,设置panelcaption属性分“fit布局”,设置frame属性为true 
    • ¬ 点击保存按钮,然后点击运行按钮。
4.4. absolute绝对位置布局

该布局指定容器的子组件通过坐标来定位,并可指定各个子组件的宽度和高度。当设置容器的layout属性为absolute时,可通过表单设计器来调整子组件的位置和大小。

示例:

    • ¬ 新建z文件,添加panel面板组件;
    • ¬ 点击panel右键,选择表单设计器(如未设置layout属性,系统将自动设置layoutabsolute);
    • ¬ 通过表单设计器,调整panel至合适大小,并添加标签和编辑框至表单设计器(点击要添加的组件再在表单设计器的任意位置点击即可添加); 
    • ¬ 点击保存按钮,然后点击运行按钮。
4.5. accordion折叠布局

折叠布局类似于outlook中的功能条面板,通过点击来展开其中的一个面板,并折叠其他面板。

示例:

  • ¬ 打开前例的border.z文件;
  • ¬ 选择westPanel,设置layout属性为accordion,在westPanel下添加3个面板组件,分别设置标题为面板1、面板2和面板3 
  • ¬ 点击保存按钮,然后点击运行按钮。

数据库的访问

WebPaaS中可通过DbUtil类或SqlUtil类来提供对数据库的快速访问;SqlUtil类在Pass服务器上不支持,仅当Paas私有化在企业内部时可用,可用来实现与关系型数据库的数据访问及数据共享。

    智友Paas默认使用MongoDB来存储数据,DbUtil中对MongoDB常用功能的数据访问进行了封装。

5.1. 数据查询

var col=DbUtil.getCollection('test');//获取数据库文档集

//设置查询对象,类是sql中查询语句

var findObj=DBObject().append('COMPANY','admin');

var rs=col.find(findObj);//执行MongoDB查询

while(rs.hasNext()){//循环获取查询结果行

  var r=rs.next();//将行赋值给对象

  Zy.print(r);//打印对象

}

5.1.1. 内外部参数的使用

获取外部参数:request.getParameter(外部参数名);

获取内部参数:request.getAttribute(内部参数名);

优先获取内部参数,再获取外部参数:req.go(参数名)

获取参数并进行字符类格式化:req.gs(参数名); 

获取参数并进行布尔型格式化:req.gb(参数名); 

获取参数并进行日期格式化:req.gd(参数名);

获取参数并进行整数格式化:req.gi(参数名);

更多格式化请参考req类对象智能提示:

5.1.2. 文档的子集及对象的获取

类似5.1查询语句,通过r.get可获取子集,通过r.getString获取文档属性,更多功能请参考MongoDBjava驱动调用。

5.2. 数据生成


通过req.getPagedString直接获取已经排序的记录输出。


输出结果

5.2.1. 上传文件

首先在moduleinitModules中引用#getFileWin,如下图:

客户端js代码中执行如下方法:

其中,uploadFile为提交数据的js调用方法,系统在调用后将弹出如下提示:

选择完文件“确认”后,将自动执行文件上传,上传完成执行回调方法callBackFn,回调函数的file参数即服务器端保存后的文件相关信息,返回的格式为js对象。

5.2.2. 文件下载及图片文件显示

文件下载:使用客户端js调用Zy.downloadFile(id)将获取id对应的文件,此id存储在5.2.1中的file.value.id中;

图片显示:图片显示调用urlmain?z=getImage&id=id

5.2.3. 获取Excel的数据

与上传文件类似,首先在moduleinitModules中引用#getFileWin,客户端调用如下代码:

获取的数据为Excel的第一个工作表内信息,返回值file内存储的是exceljs对象。

注意:Excel的第一个工作表的第一行为列名,任何列内如果包含数据,列明必不为空。

组件的使用

常规组件中的一些组件是对ExtJs组件的封装,在组件的tag属性中可根据ExtJs API添加更多的属性或事件。详细的属性、方法和事件请参考ExtJs API手册。

6.1. 目录 folder

目录组件的作用是为z文件中的组件进行分类,目录组件的名称可以为中文并允许嵌套使用。

6.2. 标签 label 

标签组件的作用是显示文本,可通过设置caption属性来设置原始文本,html属性来设置html文本。

6.3. 编辑框、数字框和按钮 text number button

WebPaaS中,编辑框封装了textEdit、、passwordEdithiddenFieldfileUpload组件,可实现文本编辑、密码输入、隐藏字段赋值和文件上传等功能。

默认组件可作为文本框输入;设置inputType属性为hidden可作为隐藏字段使用,隐藏字段一般用于赋值并提交使用,使用该字段时请使用xvalue属性赋值,如:hiddenField1.xvalue=’foo’;设置inputType属性为file,可作为文件上传组件使用。

数字框组件仅允许输入数字,可设置allowDecimalsdecimalPrecision来控制是否允许输入小数和小数的精度。

按钮用于触发点击事件,可设置clickOk事件来编写当点击时执行的JavaScript代码。caption属性为按钮的标签,iconCls为按钮带的图标样式。

6.4. 菜单及工具条

封装了菜单及工具条的组件,用于条目的选择,是菜单项、工具按钮及其它组件的容器;菜单工具条内也可内置编辑框、组合框和标签等。

6.4.1. 菜单制作

菜单的创建必须先添加菜单容器组件,然后在菜单容器组件下可以添加菜单选择项,编辑框、组合框或标签等。

菜单容器下的子菜单项可以多级添加,即在菜单项下可添加不限层次的菜单项。

子菜单项的属性

caption:菜单项的标题,[-]表示显示分隔线,[->]表示空条使菜单项右对齐;

type:菜单类型,datePicker表示日期选择菜单, colorPicker表示颜色选择菜单,split表示按钮分割菜单,textItem表示纯文本标签;

icon:图标文件,通常使用iconCls属性替代; 

iconCls:图标的样式类名,iconCls预置了大量的图标,可选择或自定义一种图标类型;自定义图标类型可通过配置WebPaaS/css/style.css实现;

enableToggle:是否允许切换,可在事件toggle中响应;

group:指定组名,把一组单选的菜单项归为一组;

6.4.2. 制作面板嵌入式菜单

系统默认创建的菜单是隐藏的,可通过关联容器类组件如paneltbarbbar属性来生成嵌入式菜单。

面板嵌入式菜单是推荐的一种菜单方式,建议使用此类方式生成菜单。

6.4.3. 制作常规菜单

设置菜单容器的autoShow属性为true,即可把菜单作为普通的组件使用,可添加至任意容器组件下面使用。

6.4.4. 制作内置工具条菜单

内置工具条是指面板类容器标题中内置的工具条。内置工具条菜单的创建方式如下:

      • ¬ 设置工具条容器的titleToolbar属性为true
      • ¬ 设置菜单项的toolType属性为指定的预置按钮的类型;
      • ¬ 设置菜单项的tooltip属性为提示文本;
      • ¬ 编写菜单项的click事件;
      • ¬ 设置容器如paneltools属性为工具条。
6.5. 日期和时间

日期和时间组件提供了日期和时间的快速选择。

组件的getValue()方法,获得日期对象,如果需要获得字符串,可通过dateControl.getValue().format('Y-m-d')来获得。

6.6. 单选框和复选框

单选框是一组单选按钮的集合。

当数据源来自data时,选项条目数据格式为string1,value1,1;string2,value2,0;每个选项之间用分号分隔;选项属性之间用逗号分隔,第1个属性为标签,第2个属性为值,第3个属性指定是否选中选择项,后两个属性可选。

通过指定columns属性来指定单选框的列数。

复选框是一组多选按钮的集合,生成方式同单选框。可设置复选框的boxLabelinputValue值来生成单个复选框。

6.7. ajaxstore组件 

6.7.1. ajax组件

ajax组件是对服务器数据异步发送和请求操作的封装。ajax组件的请求地址由url属性指定,提交的参数由params属性指定。

WebPaaS中封装了参数的输出和输入操作,参数的输出由属性out指定,参数的输入由属性input指定。

ajax组件可通过JavaScript代码name()调用,nameajax组件的名称。

参数输出

当需要对指定的组件提交值时,可通过设置out属性来实现。out属性为需要提交的组件名称,多个组件之间以逗号分隔。如果out指定的组件为容器,那么该之容器下的所有子组件的值也将被提交。

参数输入

ajax请求返回json格式的数据时,可设置in属性来快速赋值。比如返回json数据为:{a:’abc’,b:123},那么设置in属性为true,将设置ab组件的值分别为abc123

事件

success:请求成功之后的事件,可用参数response,options,分别表示响应对象和选项,比如alert(response.responseText)

failure :请求失败之后的事件,可用参数response,options,分别表示响应对象和选项,比如alert(response.responseText)

responseText返回json格式的字符串时,可以使用Ext.decode方法生成json对象。

6.7.2. store组件

store组件是对ajax访问数据的封装,用于对ajax请求返回特定格式的文本生成数据集。该数据集可应用于表格和下拉框等组件,为这些组件提供异步的数据源。

store参数由params属性指定,也可使用Zy.load(store,params)来动态设置参数。WebPaaS提供Zy.getValue函数来获取指定组件的参数,比如Zy.load(store,Zy.getValue(window));方法将把window及其子组件的值作为参数赋给store

6.8. 下拉框

通过下拉方式进行编辑和选择的组件。下拉框值的获取可通过使用combo.getValue()方法,显示值的获取可通过读取combo.getRawValue()获得。

6.8.1. 通过预置的下拉项使用

设置keyName属性为指定的键名,比如设置为sex,即可出现性别下拉项。自定义预置项的配置信息在键值编辑器中。

6.8.2. 通过关联store的方式异步引用下拉项

设置store属性为下拉数据源,设置displayField属性为显示字段,valueField属性为值字段。

6.8.3. 类似于google的异步搜索提示下拉项

设置store属性为下拉数据源,设置displayField属性为显示字段,valueField属性为值字段,设置mode=remotepageSize=10typeAhead=falseminChars=0showMask=false;在store指向的url模块中添加MongoDB的数据访问及输出功能。

6.9. 树组件

用于以条目分层的树状结构形式显示数据。根据树数据源的不同,树的使用可分为同步和异步两种:

使用树时需要使用treeStore控件为树提供数据源;静态树的节点可通过配置root属性实现。

6.10. 表格

以表格的形式显示数据。表格具有丰富的呈现能力,可以自定义各列的输出以及任意的html输出。根据表格中数据的来源不同,表格的使用分为同步和异步两种。

表格是否分页由关联的store属性pageSize指定,pageSize表示每页显示几条记录,如果设置为-1,将取消分页。

6.10.1. 表格列的定义

表格列的定义使用数组组件,并在数组下面添加多个列。

设置列的dataIndex为关联的字段名,设置text为显示的标题。如果需要映射,比如1显示为男,2显示为女等,可设置keyNamesex,自定义的映射信息请在键值编辑器中配置。如果列关联的数据为日期或数字类型,可设置format属性或在renderer属性中进行格式化。

如果需要显示自定义的html输出,比如指定输出的颜色等,可在renderer中定义自定义输出函数,rendererreturn值为表格内显示值,支持Html的返回值。

6.10.2. 可编辑表格

通过设置表格的pluginspluginType属性即可生成可编辑的表格,具体步骤如下:

      • ¬ 添加所有列关联的编辑控件,比如textcomboBox等,并设置这些组件的autoCreate属性为false
      • ¬ 添加数组组件,并在数组组件下添加column组件,设置column相关属性及editor属性;
      • ¬ 添加grid组件,设置pluginTypecellediting,设置columnModel为上述添加的columnModel组件。
6.11. 图表

图表组件由图表容器和图表内容构成。图表容器是显示图表内容的组件,图表内容用于生成指定格式图表数据提供给图表容器。图表容器可直接添加在容器组件下面。

图表的生成步骤如下:

1 添加图表控件作为图表的展现容器;

2 添加SeriesSeries为图表的图例,其数据源可以通过关联store获取;

3 添加axisaxis指定的轴的信息。

6.11.1. keyMap按键映射

用于在特定范围内按指定的键触发运行JavaScript脚本。key属性指定所按的键,是否同时按CTRLALTSHIFT键由属性ctrlaltshift指定。scope属性指定按键触发的范围,比如设置为panel,那么在panel内的按键都将触发。运行的JavaScript脚本在onKeyPress事件中设置。

手持设备功能开发

由于手持设备与pc端程序使用不同的js库,所以在module中加入了touchMode属性,用来区分手机端程序与pc端程序的js库。

除了服务器z文件,storeajax等客户端后台js控件可以通用,其他touch的显示控件与普通浏览器控件不同,所以控件都存放在Touch节点,如下图:

Touch内支持的客户端方法与Pc端也不尽相同,详细方法请参考SenchaTouch

为了便于智能设备开发,本平台加入了智能设备特有的调用方法,如获取通讯录、获取地理位置、拍照等功能:

此功能封装了PhoneGap的常用操作,db为智能设备离线缓存数据库。

开发完成的App可在支持Html5的浏览器中在线预览:

注意:封装在Zy.client内的方法只能在智能设备上使用。

7.1. 智能设备的消息机制

智能设置的消息通知是基于服务器端完成的,封装在服务器端的Zy.pushN对象内,系统提供getsend方法,get获取类构造,经赋值后,回传send完成发送动作:示例代码如下:

打印

8.1. 数据打印模版

打印在WebPaaS中使用了模版的概念,封装了Ext.XTemplate方法,设置界面如下:


打印预览效果:


js调用打印模版示例:Zy.printData('demo',obj);

obj为被打印的数据js对象;行循环与obj对象内的数组对应设置。

8.2. 条码打印

条码作为数据的快速输入工具,在智友Paas中也被支持,系统目前采用一唯码,条码通过url获取,如: main?z=barcode&msg=123456urlmsg参数为条码的数值(支持数据、英文字母、符号),条码可结合打印功能,实现条码打印、单据传递等业务逻辑。

日志管理

通过日志管理,可分析每个功能模块的访问、执行情况,同时,便于开发人员监控代码质量。

可以分析的主要内容有:

1 选择左侧节点,可以过滤查看本功能节点及下级节点的访问情况,包括访问日期、用户等;

2 通过日期的过滤及执行效率的排序,可以查看一段时间内,执行效率不高的程序节点,便于开发人员进行调优;

3 通过类型选择“错误”,可以查看节点的报错情况,便于修正功能代码的bug,省去了功能测试人员的测试工作;

4 通过点击“详情”,可查看访问时的post/get参数情况,参数为json格式。

WebPaaS安全机制

WebPaaS作为在线开发平台,目前系统采用如下几层安全机制:

1 用户输入用户名或密码不正确,超过3次,需要输入验证码;

2 一个ip地址,每个小时,只允许访问不超过6000次(目前设置,后续可能会根据情况修改),此次数设置为全局控制;

3 异常客户端,如输入密码错误、访问过于频繁等,均在服务器端基于客户端ip定位控制,即使客户端注销cookies,换局域网内其他电脑,也无法逃过此控制,防止恶意访问;

4 如果存在恶意访问,通过系统日志功能可跟踪到报错信息,可即使发现;

5 采用https安全访问机制,保证服务器至客户端数据传输安全。

程序的国际化支持

在集成开发环境中,可直接使用“@Str.关键字”(通过js模式获取)或{#Str.关键字#}(通过服务器的Str对象获取)来获取国际化的语言文字,目前支持中文及英文,使用客户端方法可减少服务器负荷,但如果没有在国际化中定义,将无法显示;使用服务器端方法获取国际化文字时,如果没有此关键字的支持,系统将自动按关键字在国际化中新增记录,用户可之后到国际化中维护。

只有当Paas管理人员审核或弃审了某个关键字,才会触发客户端文件的重新下载(此特性为了保证Paas平台用户对Str对象的修改不会轻易被其他用户加载,造成流量浪费及效率下降),也就是说,在Pass管理人员操作国际化审核或弃审之前,通过客户端“@Str.关键字”将获取不到任何国际化文字。

定时任务

系统提供定时执行任务功能,执行的名称以#开头,执行名称对应模块的initScriptfinalScript脚本。定时任务由于是后台执行,不支持requestresponse的访问,否则将出现null错误。

流程管理

企业流程采用服务器端javaScript脚本编程;通过前台绘制的流程图,可形象描述流程情况;流程内可设置流程的相关数据,便于下次流程执行时校验或判断。

脚本定义及智能提示

14.1. 服务器端脚本定义

服务器端脚本定义用来满足企业存储企业自行开发的服务器端js库;在服务器端定义的脚本,可在任何服务器端脚本编程中使用,服务器端脚本定义界面:


保存后的脚本立即可在服务器编程环境使用:

14.2. 客户端脚本定义

客户端脚本与服务器端脚本类是原理,是用来在客户端调用的js库,语法与服务器端一致,只是不能访问服务器端的对象,另外系统会加入一些常用的js属性及方法,如下图:

14.3. 客户端脚本智能提示的使用

除了服务器端、客户端自定义的脚本,系统可直接使用Ext对象及使用控件id来获取对象的智能提示,甚至在控件的事件里,可以使用this来调用,如下图:

Java与JavaScript的使用

15.1. 调用后台Java类方法

WebPaaS中可通过javascriptmethod来实现对java类方法的调用。

15.1.1. Request使用

可以通过request.getParameterrequest.getAttribute获取参数,通过request.setAttribute设置参数;比如:

request.getParameter("controlName")
request.getAttribute("sys.company")

15.1.2. Response使用

访问response,以直接设置输出的内容,比如:

response.reset();
response.getOutputStream().write(data);

15.1.3.Serverjavascript使用

通过使用JavaScript语法来实现Java的编程,在Java8以下使用Rhino引擎,Java8以上使用Nashorn引擎。

可以在moduleinitScriptfinalScript或添加serverScript控件来编写serverScript代码。

15.1.4.编写JavaScriptHTML脚本

页面JavaScript的编写可通过脚本组件和bodyscript系例属性的设置来实现。脚本用于运行期间对组件进行访问。组件对象可通过Zy.get (name)来获得,当初始化完成整个页面后,系统将创建组件对象变量,可通过名称直接访问组件。

15.1.5.WebPaaS提供一些实用的JavaScript函数,这些函数定义在WebPaaS/script/zy.js文件中。部分函数功能描述如下:

      • ¬ Zy.dom 

通过domid获得dom对象。

      • ¬ Zy.Format

用于格式化数字,num为需要格式化的数字,pattern为样式。

      • ¬ Zy.isEmpty

判断变量val是否为空、null或未定义。

      • ¬ Zy.getValue

获取指定控件列表的值,并生成json对象的值对象。controlList指定的多个组件名称使用逗号分隔。使用该方法后将返回controlList列表中的所有组件及其子组件的值。

      • ¬ Zy.setValue

json对象指定的名称和值对应信息设置到指定的各个组件。

      • ¬ Zy.reset

重置指定控件的所有组件及其子组件的值。

      • ¬ Zy.message

显示文本信息对话框。

      • ¬ Zy.error

显示异常信息。

      • ¬ Zy.warning 

显示警告信息。

      • ¬ Zy.confirm

显示提示确认对话框。