动态数据集扩展

场景描述

前UI低代码开发功能支持的数据来源:

  1. 动态数据集,使用两种后端数据源: 表,视图。对应前端UI组件分别是: restData , viewData,调用dbservice获得数据数据。
  2. 通过 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

  1. 定义sql数据集

    1. 创建sql数据集
    2. 在定义中直接sql语句
    3. 相同服务器上数据库跨库关联,只要在关联表前加上数据库名.实例名、表名即可
    4. 生成对应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>
      
    5. 维护sql数据集结构,列名称、列标识需要自己维护添加,添加的列标识在查询结果中要定义,
    6. 数据集更新:当前数据集有修改更新操作,可以设置更新目标数据集并且设置字段映射进行同步更新(注:目前仅支持更新单表动态数据数据表,不支持视图)
  1. 页面中调用,数据集定义完成后,则直接引入到页面中使用即可

存储过程数据集

存储过程,调用存储过程获得数据。存储过程数据源可定义调用参数,并且可将restData上的配置映射到调用参数(例如去重,分页等)

  1. 定义存储过程数据集

    1. 创建存储过程数据集
    2. 在定义中直接输入存储过程名,相同服务器上数据库存储过程跨库调用时,存储过程名称加上数据库.实例名.存储过程名即可
    3. 存储过程可以定义输出参数,输出参数仅支持数据集和记录数
    4. 对应生成的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>
      
      1. 维护存储过程数据集结构,列名称、列标识需要自己维护添加,添加的列标识在查询结果中要定义,
      2. 数据集更新:当前数据集有修改更新操作,可以设置更新目标数据集并且设置字段映射进行同步更新(注:目前仅支持更新单表动态数据数据表,不支持视图)
  1. 页面中调用,数据集定义完成后,则直接引入到页面中使用即可

服务数据集

服务, 支持通过调用gox5服务和openapi服务获取数据.服务数据源可定义参数,并且可将restData上的配置映射到调用参数(例如去重,分页等)

  1. 定义服务数据集
    1. 创建服务数据集
    2. 在定义中服务调用说明如下
  服务名:有3种类型,为空"" 表示调用的是当前服务的api,服务名: "entry","wf"等表示调用的是当前租户内的其他服务
  请求路径:服务调用的路径
 HTTP方法:服务调用的http 方法
 API文档:服务定义文档 ,有两种形式: "/{module}/{name}.service.m 对应服务的某个模块下的 service.m文件,如果上传json文件,需要通过 service.m 文件引用 
 url: http://host/oenapi.json ,通过url获取一个openapi的json定义。
  1. 可以定义服务返回设置 服务返回配置说明如下:
        数据集(total): 数据集总记录数。 header: 使用指定名称的header返回总记录数,body: 使用jsonpath表达式从返回的body中提取总记录数
        数据集(dataset): 使用jsonpath表达式访问数据集,如果未定义或者 jsonpath表达式为空,表示以默认的格式返回数据集(body是一个json数组,每个元素是数据集的一行)
        错误(error): 使用jsonpath表达式访问服务的错误信息
    
  2. 生成对应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>
    
  3. 维护服务数据集结构,列名称、列标识需要自己维护添加,添加的列标识在查询结果中要定义,
  4. 数据集更新:当前数据集有修改更新操作,可以设置更新目标数据集并且设置字段映射进行同步更新(注:目前仅支持更新单表动态数据数据表,不支持视图)
    1. 页面中调用,数据集定义完成后,则直接引入到页面中使用即可

39版本后增加特性补充说明

  1. 原创建的视图、sql、存储过程、服务数据集后,返回的列要结构中显示需要手工添加列名称及列标识,39版本后增加支持反向生成数据字段能力,创建对应数据集保存后,点击“自动同步”按钮,即可完成对应返回列自动生成操作,如图
  2. 当原始表数据字段更新后,同样击自动同步,即可完成字段标识更新操作

results matching ""

    No results matching ""

    results matching ""

      No results matching ""