jeecgboot 新增Online表单流程及代码

jeecgboot 框架提供了一个在线表单开发功能,开发者可以通过快速创建数据表。

在新增页面,用户只需要添加对应的表信息和表字段,点击保存,即可创建表单。

该过程系统调用了两个接口,这两个接口意思大概就是校验和添加了,接下来看看在jeecgboot中,这两个接口是怎么封装和实现的。

一、校验表单

1、查看控制器的代码

如上图,通过该类可以看到,该方法返回类型是Result,通过 DuplicateCheckVo 这个vo类来映射前端传递参数。第一步判空,如果前端传递的表名字参数为空,则通过Result封装一个包返回给前端,告诉前端 "数据为空,不作处理" ;第二步如果不为空,则进行下一步(2)操作确定该新增表名是否已经存在,并且通过Result封装一个包返回给前端。

2、查询是否已经存在该表名字

2.1、查看 sysDictService 接口中的 duplicateCheckData 方法。

如上图,这个方法还是比较简单的,以一个 DuplicateCheckVo 类做参数,第一步定义一个count变量保存查询结果,定义table、和fieldName来获取DuplicateCheckVo 中的数据,其中table属性表示系统表名onl_cgform_head,fieldName 表示 onl_cgform_head 中的 table_name 字段;之后通过 SqlInjectionUtil.filterContent() 进行sql注入过滤处理;定义变量 checkSql 保存一个拼接的属性值,该值为 " onl_cgform_head,table_name, " 。

scss 复制代码
onl_cgform_head 是系统表,表中 table_name 字段用于记录新增的表名。用户新增表单后,会在 onl_cgform_head 系统表中新增一条记录,这条记录记录了用户创建的表名。
SqlInjectionUtil.filterContent() 方法进行sql注入过滤处理,对遇到注入关键字抛异常。
2.2、进行表字典白名单check和表字典黑名单check。
2.2.1、表字典白名单check

进入到 sysBaseAPI 接口 dictTableWhiteListCheckByDict 方法,两个参数值分别为 onl_cgform_head 和 table_name 。

如上图,该实现类中调用了 dictTableWhiteListHandler 接口的 isPassByDict 方法(不满足条件,走 else 分支),进入 IsPasssByDict 方法。

上图该类中,如果 tableName 不为空(fields 为空则用 * 替换),则拼接sql = " select fields from tableName ";而我们通过接口过来,tableName = onl_cgform_head , fields = table_name,最终sql表现为 sql = " select onl_cgform_head from table_name "。 通过调用 JSqlParserUtils.parseSelectSqlInfo() 方法进行SQL解析 select 新增表名 from 表。

如上图,进入该类后,可以明确地看到作者已经给出了明确的注释了,通过 new CCJSqlParserManager() 创建解析器,使用 parseBySelectBody() 方法解析sql生成具有层次结构的java类。

2.2.2、表字典黑名单check

调用了 dictQueryBlackListHandler 接口的 isPass 方法,并且以 checkSql = "onl_cgform_head,table_name," 作为参数,进入该接口实现类,查看该方法代码。(因为调用该方法时并没有接收返回值,这里不对返回值做处理,只了解该方法内部做了什么工作)

如上图,该方法其实就是校验 onl_cgform_head 和 table_name 字段有没有被加入到黑名单,如果加入到黑名单,则用户没有权限进行操作,否则才可以继续。但是我发现在新增表单阶段,并没有走完这个流程,getQueryTableInfo()方法是本类的一个抽象方法,所以在 if(list==null)的时候就已经结束了。

2.3、执行sql,查看新增表是否存在onl_cgform_head表中。

如上图,在try中,共有两个分支语句,新增走第二个,这里调用了 sysDictMapper 接口的 duplicateCheckCountSqlNoDataId,追溯到该方法上,发现是mybatis模式的一个 SysDictMapper.xml 配置文件。

如上图,通过上述sql语句,可以拼接出sql语句为" select count(1) from onl_cgform_head where table_name = {新增表名字} "

2.4、返回结果

如上图,如果在2.3中没查到数据(count == null || count == 0),返回true ,否则返回 false ,控制器根据该值返回对应的 Result 结果。

二、添加表单

如上图,在填写表单信息和添加需要的字段后点击保存,会调用接口 /online/cgform/api/addAll 进行提交保存。

相关推荐
Asthenia04123 小时前
浏览器缓存机制深度解析:电商场景下的性能优化实践
后端
databook4 小时前
『Python底层原理』--Python对象系统探秘
后端·python
超爱吃士力架5 小时前
MySQL 中的回表是什么?
java·后端·面试
追逐时光者6 小时前
Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
后端·.net
典龙3306 小时前
如何使用springboot项目如何实现小程序里面商品的浏览记录功能案例
spring boot
苏三说技术6 小时前
10亿数据,如何迁移?
后端
bobz9656 小时前
openvpn 显示已经建立,但是 ping 不通
后端
customer087 小时前
【开源免费】基于SpringBoot+Vue.JS个人博客系统(JAVA毕业设计)
java·vue.js·spring boot·后端·开源
qq_459238497 小时前
SpringBoot整合Redis和Redision锁
spring boot·redis·后端
灰色人生qwer7 小时前
SpringBoot 项目配置日志输出
java·spring boot·后端