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

相关推荐
颜进强20 小时前
从零搭建私人 RAG 实战:用 Markdown 沉淀技术决策与业务决策
前端·后端·ai编程
用户378998221212820 小时前
别再「凭感觉」写代码了:我用 Qoder 花一天时间,从 0 到 1 真正掌握了 Vibe Coding(附完整踩坑实录)
后端
减瓦20 小时前
Jackson 使用指南
java·spring boot·json
码农进化录20 小时前
Java 程序员的 AI 进化论 | AI 加 Postman 跑接口测试,省了三天活
java·后端·openai
Jeking21720 小时前
unione cloud 低代码平台 快速落地物料送检质检管理场景
低代码·流程引擎·表单设计·流程设计·表单引擎·unione cloud
旺仔学长 哈哈21 小时前
基于SpringBoot的在线招聘测评系统的设计与实现----附源码35253+数据库文档
数据库·spring boot·后端·在线招聘
Ivanqhz21 小时前
Rust #[derive(Serialize)]浅析
开发语言·后端·rust
卷无止境21 小时前
Python的魔术方法:那些藏在双下划线背后的魔法
后端·python
万亿少女的梦16821 小时前
基于Spring Boot的乐助在线助农系统设计与实现
java·spring boot·mysql·敏感词过滤·助农系统
Ivanqhz21 小时前
Rust parse() 浅析
开发语言·后端·rust