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

相关推荐
小江的记录本9 分钟前
【Spring注解】Spring生态常见注解——面试高频考点总结
java·spring boot·后端·spring·面试·架构·mvc
踩着两条虫14 分钟前
VTJ.PRO 在线应用开发平台的LLM服务、缓存与AI Agent工作流
低代码·agent·ai编程
计算机学姐21 分钟前
基于SpringBoot的奶茶店点餐系统【协同过滤推荐算法+数据可视化统计】
java·vue.js·spring boot·mysql·信息可视化·tomcat·推荐算法
程序员cxuan24 分钟前
来了来了,Claude Code 全架构解析 !!!
人工智能·后端·claude
麦聪聊数据27 分钟前
电商数据运营的最佳实践:WebSQL 如何兼顾数据分析效率与生产库安全
数据库·sql·低代码·restful
艾莉丝努力练剑30 分钟前
【Linux信号】Linux进程信号(下):可重入函数、Volatile关键字、SIGCHLD信号
linux·运维·服务器·c++·人工智能·后端·学习
常利兵39 分钟前
Spring Boot 实现网络限速:让流量“收放自如”
网络·spring boot·后端
掘金者阿豪1 小时前
Claude Code“泄漏源码”曝光:Anthropic 最强终端 AI,原来早就不是聊天工具了
后端
无籽西瓜a1 小时前
【西瓜带你学设计模式 | 第七期 - 适配器模式】适配器模式 —— 类适配器与对象适配器实现、优缺点与适用场景
java·后端·设计模式·软件工程·适配器模式
前端付豪1 小时前
实现消息级操作栏
前端·人工智能·后端