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

相关推荐
小枫编程8 小时前
Spring Boot 与微服务网关集成问题:Zuul、Spring Cloud Gateway 与鉴权策略
spring boot
IT_陈寒8 小时前
Python 3.12 新特性实战:10个性能优化技巧让你的代码快如闪电⚡
前端·人工智能·后端
麦兜*9 小时前
MongoDB 与 GraphQL 结合:现代 API 开发新范式
java·数据库·spring boot·mongodb·spring·maven·graphql
绝无仅有9 小时前
前端开发环境搭建:从安装 Node 到成功运行代码
后端·面试·github
yshhuang9 小时前
在Windows上搭建开发环境
前端·后端
绝无仅有9 小时前
某个互联网大厂的Elasticsearch基础面试题与答案
后端·面试·github
无责任此方_修行中10 小时前
AWS IoT Core 成本优化实战:从 PoC 到生产的省钱之旅
后端·架构·aws
ITMan彪叔10 小时前
Java MQTT 主流开发方案对比
java·后端
Cache技术分享10 小时前
188. Java 异常 - Java 异常处理规范
前端·后端
用户40993225021210 小时前
如何用 Git Hook 和 CI 流水线为 FastAPI 项目保驾护航?
后端·ai编程·trae