.net core研发的自定义表单引擎,采用强大的规则引擎将所有的业务串联起来的,和其他低代码平台是有本质的区别的,目标是完全解放繁琐的CRUD工作。
规则引擎是自定义表单最为核心的内容,也是与其他低代码工具最为本质的区别,非常重要的内容,对于读者来说也是最难理解内容。
没有规则引擎的低代码工具,即使前端做得再花哨,也仅仅是解决了一些复制粘贴的问题
视图和表单都可以定义规则,规则将所有业务串联起来,至关重要。
内容比较多,分两篇文章介绍。
对象树
进行自定义表单页面,都会定义唯一一个最外层的表单,表单里面可以定义子表单、子视图(视图里面也可以定义子表单和子视图),视图或者表单里面会定义各种对象(可以是控件、弹框、行列信息等),整体构造一棵树,每一个节点都有唯一的编码,编码是根据树的每一个节点的Id组成,通过编码就可以找到唯一的对象。比如界面上的新增按钮的编码为“表单Id.列表视图Id.新增按钮控件Id”。
视图和表单Wrap、表单的表单列、ItemView的列,这几个地方可以定义子表单和子视图。
规则管理
表单、视图、控件都会触发各种事件,表单或视图对父表单或父视图一无所知,且只能控制操作直接子表单或子视图的对象,事件规则查找逻辑为:
- 如果是表单触发的事件,系统会查找本表单触发的规则(子表单Id、子视图Id、对象Id都为空)和父级(父表单或者父视图)定义的规则(子表单Id为触发事件的表单Id,子视图Id为空,对象Id为空)
- 如果是视图触发的事件,系统会查找本视图触发的规则(子表单Id、子视图Id、对象Id都为空)和父级(父表单或者父视图)定义的规则(子表单Id为空,子视图Id为触发事件的视图Id,对象Id为空)以及当父级为表单时,查找父级的父级定义的规则(子表单Id为父级表单Id,子视图为触发事件的视图Id,对象Id为空)
- 如果是对象触发的事件,系统直接查找父级规则(子表单Id为空、子视图Id为空、对象Id为对象Id)和父级的父级规则(子表单Id为空或者子视图Id为空(取决于父级的类型)、子表单Id为空或者子视图Id为父级Id(取决于父级的类型)、对象Id为对象Id)和父级的父级的父级(触发事件的对象的父级为视图,父级的父级为表单,且还会继续网上查找一级的规则,查找逻辑与其他情况类似)
上述描述不好理解,可以结合到体验网站各种配置好的表单查看,多看一些规则就能理解清楚。
- 业务分类
只能是View或Form,系统自动选择 - 子表单Id
子表单Id - 子视图Id
子视图Id - 对象Id
表单或者视图内不同控件的Id,注意:Wrap对象的Id为:Wrap包裹的表单或视图Id_Wrap配置id - 事件名称
基础控件的使用参见不同控件的ant的事件,自定义表单会将所有ant控件的事件抛出,可以定义规则进行拦截,其他自定义事件参考如下
另外,还可以自己定义一些事件,并配置执行规则,这些事件不是由系统自动触发,而是在需要的时候,可以在其他规则执行中选择执行其他规则,事件名称选择自定义的事件名称即可,这样就可以触发执行自定义的事件规则。比如在列表视图中,多个地方都会触发查询列表数据并绑定到表格中,此时就可以定义一个自定义的事件及规则,其他地方直接使用即可。
规则执行管理
一个事件会触发一系列的规则执行,每个规则执行都会有一个规则执行所在的宿主对象,宿主对象为事件所属的视图或者表单,规则执行都在相对宿主对象来定义执行的。
子表单、子视图、对象Id:这几个字段都是相对宿主对象来说有,某些规则执行需要指定规则执行的目标对象,比如绑定数据,需要知道将数据绑定到哪个目标对象上,比如可以绑定到本视图的某个按钮或者子表单的子视图的某个对象上。
- 子表单Id
子表单Id - 子视图Id
子视图Id - 对象Id
- 排序
定义规则执行的先后顺序 - 执行类型和执行配置
不同的执行类型定义不同的配置支持,具体规则如下:
- 设置属性(actionType=1)
设置目标对象的自定义属性,比如点击新增按钮弹出对话框,参考前端组件的属性,则设置对象为对话框Id(参见【Wrap对象定义】):66e68bf9-8e05-4691-bf99-ed95c820260d_modal1,执行设置为:{"visible":true}
特殊属性设置
- 执行方法(actionType=2)
执行后端服务器方法,自定义表单默认了一系列默认方法执行,默认情况下满足绝大多数业务场景,默认方法不满足的情况下,可以定义Object对象方法,自定义执行逻辑,自定义方法的执行参考【方法管理】
方法执行配置结构:
- Get、Fact方法:
Get方法可以传递paramValues和sqlFields参数,paramValues只需定义主键信息,sqlFields可以定义查询的哪些列,Fact方法同Get完全一致,流程引擎执行Fact方法获取表单实体对象
例:
- CreateOrUpdate、Create、Update方法
三个方法参数相同,一般情况调用CreateOrUpdate方法即可,新增或者修改数据库表数据,当id字段为空时,执行新增Create方法,当id字段不为空时,执行修改Update方法
例:
- Delete方法
删除数据库一条数据
例:
- DeleteWhere方法
按照自定义条件批量删除数据,比如ListView的批量选择删除功能,自定义条件参见附录【自定义查询条件】
例:
- GetWhere方法
同Get方法,只是查询条件不是以id查询,是自定义的sqlWhere查询条件 - UpdateWhere方法
同Update方法,只是查询条件是自定义的sqlWhere查询条件 - PageList方法
ListView视图列表数据分页查询,将查询数据构造为查询条件参数,执行后端分页查询获取数据库数据,参见附录【自定义查询条件】
例:
- ListWhere方法
与PageList方法类似,只是去掉了分页功能,可以用在导出Excel等不需要分页获取数据集合的地方
例:
- MultiPageList方法
与PageList方法类似,PageList只能处理单表数据,对于多表关联处理无能为力(最多只显示关联表一个字段显示),此方法专门用于多表关联处理
例:
- MultiListWhere
与ListWhere方法类似,ListWhere只能处理单表数据,对于多表关联处理无能为力(只多只显示关联表一个字段显示),此方法专门用于多表关联处理
说明:特殊使用参见【外键关联处理】,其他同ListWhere方法 - TreeListWhere
与ListWhere方法类似,此方法主要是针对树结构的数据库表进行查询,查询逻辑: 先根据查询条件查询出满足条件的数据,再把所有节点的祖先节点查询出来,构造为一树完整的树。
例:
- BatchCreate方法
批量新增数据,比如导入Excel,获取一对多关系,批量添加子表数据等场景。
例:
wike文档地址:https://gitee.com/kuangqifu/sprite/wikis/pages
开源地址:https://gitee.com/kuangqifu/sprite
体验地址:http://47.108.141.193:8031 (首次加载可能有点慢,用的阿里云最差的服务器)
自定义表单文章地址:https://www.cnblogs.com/spritekuang/
流程引擎文章地址:https://www.cnblogs.com/spritekuang/category/834975.html (采用WWF开发,已过时,已改用Elsa实现,https://www.cnblogs.com/spritekuang/p/14970992.html )