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 进行提交保存。

相关推荐
暮色妖娆丶5 分钟前
Spring 源码分析 BeanFactoryPostProcessor
spring boot·spring·源码
神奇小汤圆29 分钟前
浅析二叉树、B树、B+树和MySQL索引底层原理
后端
文艺理科生38 分钟前
Nginx 路径映射深度解析:从本地开发到生产交付的底层哲学
前端·后端·架构
千寻girling39 分钟前
主管:”人家 Node 框架都用 Nest.js 了 , 你怎么还在用 Express ?“
前端·后端·面试
南极企鹅41 分钟前
springBoot项目有几个端口
java·spring boot·后端
Luke君6079743 分钟前
Spring Flux方法总结
后端
define95271 小时前
高版本 MySQL 驱动的 DNS 陷阱
后端
忧郁的Mr.Li1 小时前
SpringBoot中实现多数据源配置
java·spring boot·后端
暮色妖娆丶2 小时前
SpringBoot 启动流程源码分析 ~ 它其实不复杂
spring boot·后端·spring
Coder_Boy_2 小时前
Deeplearning4j+ Spring Boot 电商用户复购预测案例中相关概念
java·人工智能·spring boot·后端·spring