动态数据集扩展
场景描述
前UI低代码开发功能支持的数据来源:
- 动态数据集,使用两种后端数据源: 表,视图。对应前端UI组件分别是: restData , viewData,调用dbservice获得数据数据。
- 通过 serviceRequest / serviceData 以数据集的方式使用gox5服务返回的数据
为了让低代码开发模式支持更多的数据来源,因此扩展动态数据集支持的后端数据源,包括如下sql、存储过程、服务数据集
不同数据源对动态数据集功能的支持
表 | 视图 | sql | 存储过程 | 服务 | |
---|---|---|---|---|---|
指定返回列 | Y | Y | Y | Y | Y |
去重 | Y | Y | Y | Y | Y |
字段过滤 | Y | Y | Y | N | N |
字段排序 | Y | Y | Y | Y | Y |
数据分页 | Y | Y | Y | Y | Y |
关联查询 | Y | Y | Y | N | N |
子查询 | Y | Y | Y | N | N |
参数定义说明
对于这些数据源定义的时候都可以设置参数
label: 显示名 name: 参数名 dataType: 数据类型 defaultValue: 参数默认值,可以使用常量或者表达式。defaultValue使用的表达式不可以依赖其它参数。参数的输入值或者defaultValue计算生成参数的 inputValue value: 参数计算表达式, value 使用的表达式可以依赖所有参数的 inputValue值 private: 向dbservice请求时,是否需要包含此参数。 private=true , 表示此参数不可输入。 constraint: 参数约束,参数约束是一个值为boolean类型的表达式,用于验证参数. error: 参数验证错误消息
参数表达式
数据集参数的默认值可以是一个服务器端解析的表达式,参数表达式语法使用SpringExpression
参数访问表达式 每个参数都有两个值 inputValue: 从前端传入或者defaultValue的值, inputValue 的值可以是表达式计算的结果。 value: 如果定义了 计算表达式,使用表达式计算的结果,否则 value = inputValue
#param['arg1'].inputValue 访问名为 'arg1'的 inputValue
#param['arg1'].value 访问名为 'arg1'的 value
#self.inputValue 访问当前参数的 inputValue
#self.value 访问当前参数的 value
数据集标准参数表达式
#query['fields'] 字段列表
#query['distinct'] 去重
#query['sort'] 排序
#query['offset'] 分页(offset)
#query['limit'] 分页(limit)
参数约束表达式 参数约束是一个值为boolean的参数表达式,如果表达式执行结果=true,参数验证通过,否则参数验证不通过。 参数约束存储在参数的 'constraint' attribute中。 参数约束表达式中可访问所有参数的 inputValue 和 value
例如验证一个字符串类型的参数不为空:
T(org.apache.commons.lang.StringUtils).isNotBlank(#self.value)
多个验证条件可通过布尔运算符组合,例如
T(org.apache.commons.lang.StringUtils).isNotBlank(#self.value) && T(org.apache.commons.lang.math.NumberUtils).isNumber(#self.value)
服务器端在一次请求中处理所有参数的验证并返回所有的错误。
参数定义例子
<param>
<field label="参数1" name="arg1" dataType="String" private="false" defaultValue="'abc'"
value="self.inputValue+'123'" constraint="T(org.apache.commons.lang.StringUtils).isNotBlank(#self.value)" error="'参数: arg1 不能为空'"/>
<field label="参数2" name="arg2" dataType="String" private="true" defaultValue="#query['fields']"/>
</param>
sql数据集
sql,在动态数据集定义中直接写sql查询数据. 与视图类似,视图能支持的功能sql也能支持。 sql数据源可定义参数,在执行sql时,通过命名参数的形式绑定到要执行的sql
定义sql数据集
- 创建sql数据集
- 在定义中直接sql语句
- 相同服务器上数据库跨库关联,只要在关联表前加上数据库名.实例名、表名即可
生成对应data.m代码
<data filepath="service/main/sqlglzx.data.m"> <class entity="false" type="sql" _version="2.0.27"> <label>SQL关联查询</label> <property xmlns="http://www.justep.com/model" did="C996CA7BDFA00001B12BA50111FBDC70" dataType="String" extType="String" name="fmingcheng"> <label>a</label> </property> <property xmlns="http://www.justep.com/model" did="C996CA7C0C20000168201E401B821C23" dataType="Double" extType="Double" name="fdanjia" length=""> <label>b</label> </property> <property xmlns="http://www.justep.com/model" did="C996CA8081D00001367458041CA3E0B0" dataType="String" extType="String" name="fenlei1018_fmingcheng"> <label>c</label> </property> <property xmlns="http://www.justep.com/model" did="C996CA813F900001954F19B0FB6057C0" dataType="String" extType="String" name="fenlei1018_fbianma"> <label>d</label> </property> </class> <sql> <!-- sql 参数定义 private=true|false , 如果 private=true,在dbserver接口请求不可输入 --> <param> <field label="参数1" name="arg1" dataType="String" private="true" defaultValue=""/> </param> <!-- sql 语句定义,sql语句使用命名参数 --> <sql xmlns="http://www.justep.com/model"> <default>SELECT sp1018.fmingcheng, sp1018.fdanjia, fenlei1018.fmingcheng AS fenlei1018_fmingcheng, fenlei1018.fbianma AS fenlei1018_fbianma FROM sp1018 LEFT JOIN fenlei1018 ON sp1018.fenlei1018 = fenlei1018.fid where field1=:arg1</default> </sql> </sql> </data>
- 维护sql数据集结构,列名称、列标识需要自己维护添加,添加的列标识在查询结果中要定义,
- 数据集更新:当前数据集有修改更新操作,可以设置更新目标数据集并且设置字段映射进行同步更新(注:目前仅支持更新单表动态数据数据表,不支持视图)
- 创建sql数据集
- 页面中调用,数据集定义完成后,则直接引入到页面中使用即可
存储过程数据集
存储过程,调用存储过程获得数据。存储过程数据源可定义调用参数,并且可将restData上的配置映射到调用参数(例如去重,分页等)
定义存储过程数据集
- 创建存储过程数据集
- 在定义中直接输入存储过程名,相同服务器上数据库存储过程跨库调用时,存储过程名称加上数据库.实例名.存储过程名即可
- 存储过程可以定义输出参数,输出参数仅支持数据集和记录数
对应生成的data.m文件
<data filepath="service/main/dbstoredProcedure.data.m"> <class entity="false" type="storedProcedure" _version="2.0.27"> <label>存储过程数据集</label> <property xmlns="http://www.justep.com/model" did="C9900CABB8300001341239BE44009930" dataType="String" extType="String" name="fid"> <label>id</label> </property> <property xmlns="http://www.justep.com/model" did="C9900CADAAC000012C371F90165F134E" dataType="String" extType="String" name="fmingcheng"> <label>名称</label> </property> <property xmlns="http://www.justep.com/model" did="C9900CAF13E0000194ED9489C6E71462" dataType="String" extType="String" name="fdanjia"> <label>单价</label> </property> </class> <storedProcedure> <!-- 存储过程输出参数定义,如果定义了数据集输出参数,此参数的值作为数据集数据返回 否则将输出参数的值在header中返回 name: 存储过程输出参数名 dataset: 是否数据集输出参数,默认 false total: 是否数据集总记录数,默认 false dataType: 对于数据集输出参数,表示输出参数的类型.支持的类型和数据集支持的基本类型保持一致,并映射到 jdbc Types定义: String: Types.VARCHAR Integer: Types.INTEGER Double: Types.DOUBLE Decimal: Types.NUMERIC Date: Types.DATE DateTime: Types.TIMESTAMP DateTimeTZ: Types.TIMESTAMP_WITH_TIMEZONE LongText: Types.LONGVARCHAR --> <proc xmlns="http://www.justep.com/model" name="qytest1.dbo.get_main_g1018sp"> <output name="total" dataset="false" total="true" dataType="Integer"/> <out name="total" dataset="false" total="true" dataType="Integer"/> </proc> <!-- 数据集参数定义 --> <param xmlns="http://www.justep.com/model"> <field label="pageIndex" name="pageIndex" dataType="Integer" private="false" defaultValue="expr:#query['offset']" value="" constraint="" error=""/> <field label="pageSize" name="pageSize" dataType="Integer" private="false" defaultValue="expr:#query['limit']" value="" constraint="" error=""/> </param> </storedProcedure> </data>
- 维护存储过程数据集结构,列名称、列标识需要自己维护添加,添加的列标识在查询结果中要定义,
- 数据集更新:当前数据集有修改更新操作,可以设置更新目标数据集并且设置字段映射进行同步更新(注:目前仅支持更新单表动态数据数据表,不支持视图)
- 维护存储过程数据集结构,列名称、列标识需要自己维护添加,添加的列标识在查询结果中要定义,
- 创建存储过程数据集
- 页面中调用,数据集定义完成后,则直接引入到页面中使用即可
服务数据集
服务, 支持通过调用gox5服务和openapi服务获取数据.服务数据源可定义参数,并且可将restData上的配置映射到调用参数(例如去重,分页等)
- 定义服务数据集
- 创建服务数据集
- 在定义中服务调用说明如下
- 创建服务数据集
服务名:有3种类型,为空"" 表示调用的是当前服务的api,服务名: "entry","wf"等表示调用的是当前租户内的其他服务
请求路径:服务调用的路径
HTTP方法:服务调用的http 方法
API文档:服务定义文档 ,有两种形式: "/{module}/{name}.service.m 对应服务的某个模块下的 service.m文件,如果上传json文件,需要通过 service.m 文件引用
url: http://host/oenapi.json ,通过url获取一个openapi的json定义。
- 可以定义服务返回设置
服务返回配置说明如下:
数据集(total): 数据集总记录数。 header: 使用指定名称的header返回总记录数,body: 使用jsonpath表达式从返回的body中提取总记录数 数据集(dataset): 使用jsonpath表达式访问数据集,如果未定义或者 jsonpath表达式为空,表示以默认的格式返回数据集(body是一个json数组,每个元素是数据集的一行) 错误(error): 使用jsonpath表达式访问服务的错误信息
- 生成对应data.m代码如下
<data filepath="service/main/shangpinfwsjj.data.m"> <class entity="false" type="service" _version="2.0.27"> <label>商品服务数据集</label> <property xmlns="http://www.justep.com/model" did="C9C05FEBE87000012DFC13D02A001F92" dataType="String" extType="String" name="fmingcheng"> <label>名称</label> </property> <property xmlns="http://www.justep.com/model" did="C9C05FEF1A900001CB2D9E301DD13E30" dataType="String" extType="String" name="fdanjia"> <label>单价</label> </property> </class> <service> <api xmlns="http://www.justep.com/model" path="/main/wodifw/mingchengzx" method="GET" doc="/main/wodifw.service.m" service="g39"> <response> <total header="Content-Range" body="jsonpath"> <!-- 如果通过header中返回的分页信息是格式化字符串,可使用正则表达式提取其中的total --> <expr type="regex"> <![CDATA[.*/(\d+)]]> </expr> </total> <dataset body="jsonpath></dataset> <error body="jsonpath></dataset> </response> </api> <param xmlns="http://www.justep.com/model"> <field label="name" name="name" kind="in" editor="" dataType="String" private="true" defaultValue="expr:'玫瑰'" value="" constraint="" error=""/> </param> </service> </data>
- 维护服务数据集结构,列名称、列标识需要自己维护添加,添加的列标识在查询结果中要定义,
- 数据集更新:当前数据集有修改更新操作,可以设置更新目标数据集并且设置字段映射进行同步更新(注:目前仅支持更新单表动态数据数据表,不支持视图)
- 页面中调用,数据集定义完成后,则直接引入到页面中使用即可
- 页面中调用,数据集定义完成后,则直接引入到页面中使用即可
39版本后增加特性补充说明
- 原创建的视图、sql、存储过程、服务数据集后,返回的列要结构中显示需要手工添加列名称及列标识,39版本后增加支持反向生成数据字段能力,创建对应数据集保存后,点击“自动同步”按钮,即可完成对应返回列自动生成操作,如图
- 当原始表数据字段更新后,同样击自动同步,即可完成字段标识更新操作