diff --git a/.gitattributes b/.gitattributes
index 83774981ef15e21d196d0529f8eb1b67b67d8042..545ae0a717bbf4008243f0ecb8e6114a99bdece5 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,4 +1,5 @@
*.html linguist-language=java
*.css linguist-language=java
*.js linguist-language=java
-*.vue linguist-language=java
\ No newline at end of file
+*.vue linguist-language=java
+
diff --git a/.gitignore b/.gitignore
index 09ec36308fb362dcdb21fe32d81d28092e9c9e8f..1fec123e64c02dd520cea7542ac9745b13c276f0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -51,3 +51,4 @@ rebel.xml
application-my.yaml
/yudao-ui-app/unpackage/
+
diff --git a/README.md b/README.md
index 80831bbd7298a28d5f57d2840a9ae066450fe3a3..808f8b0710cf1c28ba243b2782a8df5dbbf9726b 100644
--- a/README.md
+++ b/README.md
@@ -1,11 +1,6 @@
-
-
-
-
-
-
-[点击前往查看:https://doc.jeelowcode.com/app/1](https://doc.jeelowcode.com/app/1)
-
+## 年度开源项目评选
+感谢您对 JeeLowCode 开源项目的支持,诚邀您投出宝贵一票!
+投票链接:https://gitee.com/activity/2025opensource?ident=IZQSAP
@@ -21,19 +16,27 @@
-## 1.项目简介
+
+
+## 📱 项目简介
-**JeeLowCode** 是一款专为企业打造的低代码开发框架,以低代码为核心,实现快速开发。它提供可视化界面,拖拽组件即可搭建应用,无需复杂代码编写,极大提升开发效率。企业可免费使用,灵活适配业务需求,助力高效数字化转型,是企业降本增效的利器。
+**JeeLowCode** 是一款基于SpringBoot专为企业打造的低代码开发框架,以低代码为核心,实现快速开发。提供可视化界面,拖拽组件即可搭建应用,无需复杂代码编写,极大提升开发效率。企业可免费使用,灵活适配业务需求,助力高效数字化转型,是企业降本增效的利器。
-## 2.在线体验
-[体验地址:http://demo.jeelowcode.com](http://demo.jeelowcode.com)
+| 分支 | 简介 |
+|--------------|----------------------------|
+| master | 使用jdk8 + SpringBoot2.7.18 |
+| master_jdk17 | 使用jdk17 + SpringBoot3.3.1 |
-[社区/文档地址:http://doc.jeelowcode.com](http://doc.jeelowcode.com/)
-
-## 3.代码架构
+## 💻 代码架构
```
com.jeelowcode
├── jeelowcode-admin // 启动模块
@@ -42,35 +45,28 @@ com.jeelowcode
├── jeelowcode-framework // 功能模块
│ └── jeelowcode-excel // Excel导入导出模块
│ └── jeelowcode-exception // 自定义异常模块
+ │ └── jeelowcode-global // 全局配置模块
│ └── jeelowcode-plus // SQL/DDL 语构建模块
│ └── jeelowcode-tenant // 租户模块
│ └── jeelowcode-utils // 工具类模块
- ├── jeelowcode-module // 个人业务相关
+ ├── jeelowcode-module // 个人业务相关(写在这个模块)
│ └── jeelowcode-module-api // 个人业务模块API
│ └── jeelowcode-module-biz // 个人业务业务
- ├── yudao-framework // 芋道核心模块
- ├── yudao-module // 芋道核心模块
```
-## 4.项目关系
-**后端项目**
+## 👥 项目关系
| 项目 | Star | 简介 |
|--|--|---------|
| [JeeLowCode](https://gitcode.com/jeelowcode/jeelowcode)| [](https://gitee.com/jeelowecode/JeeLowCode) [](https://github.com/jeelowcode/jeelowcode) [](https://gitcode.com/jeelowcode/jeelowcode) | 基于 Spring Boot 多模块架构 |
-
-**前端项目**
-
-| 项目 | Star | 简介 |
-|--|--|---------------------------------------|
| [jeelowcode-ui-admin-vue3](https://gitcode.com/jeelowcode/jeelowcode-ui-admin-vue3)| [](https://gitee.com/jeelowecode/jeelowcode-ui-admin-vue3) [](https://github.com/jeelowcode/jeelowcode-ui-admin-vue3) [](https://gitcode.com/jeelowcode/jeelowcode-ui-admin-vue3) | 基于 Vue3 + Element Plus + Avue 实现的后台管理 |
-## 5.系统架构图
+## 🖼️ 系统架构图
-## 6.Hello World入门
+## 🐛 Hello World入门
只需要**4步** 带你了解低代码JeeLowCode
@@ -88,9 +84,9 @@ com.jeelowcode
-## 7.演示效果图
+## 💻 演示效果图
-### 7.1 手机端效果图:
+### 1. 手机端效果图:
 |
@@ -104,7 +100,7 @@ com.jeelowcode
-### 7.2 电脑端效果图:
+### 2. 电脑端效果图:
 |
@@ -118,7 +114,7 @@ com.jeelowcode
-### 7.3 动态效果图:
+### 3. 动态效果图:
 |
@@ -128,9 +124,9 @@ com.jeelowcode
-## 8.框架核心亮点
+## 🌟 框架核心亮点
-### 8.1 首页:
+### 1. 首页:
@@ -138,7 +134,7 @@ com.jeelowcode
-### 8.2 在线表构建:
+### 2. 在线表构建:
通过图形用户界面直观地创建数据表,一旦创建完成,即刻享有增、删、改、查、数据导入和导出的全面功能,操作简便,效率倍增。
@@ -151,7 +147,7 @@ com.jeelowcode
-### 8.3 在线统计报表:
+### 3. 在线统计报表:
只需配置简单的SQL语句,即可迅速生成包括柱状图、折线图、饼图以及卡片视图在内的多样化统计报表,直观展现数据分析结果。
@@ -164,7 +160,7 @@ com.jeelowcode
-### 8.4 在线多表关联:
+### 4. 在线多表关联:
利用界面化的灵活配置,实现多表关联的直观展示,确保所见即所得的数据处理体验。
@@ -180,7 +176,7 @@ com.jeelowcode
-### 8.5 在线格式化字段显示:
+### 5. 在线格式化字段显示:
为满足界面字段合并显示需求,提供三种简捷处理方法:数据库层面的SQL函数拼接,查询时的SQL字符串合并,以及应用层的Java代码处理。选择适合的方法以优化性能和灵活性。
@@ -193,7 +189,7 @@ com.jeelowcode
-### 8.6 在线排序设置:
+### 6. 在线排序设置:
通过拖放操作,用户可以直观地设置初始化数据的排序规则。
@@ -203,7 +199,7 @@ com.jeelowcode
-### 8.7 在线租户数据权限配置:
+### 7. 在线租户数据权限配置:
提供在线配置工具,轻松实现租户级别的数据权限设定,确保数据访问的安全性和合规性,提升**多租户**场景下的应用灵活性。**JeeLowCode**以其卓越的灵活性、高效性和易用性,成为加速数字化转型、驱动业务创新的理想选择。
@@ -213,7 +209,7 @@ com.jeelowcode
-### 8.8 广泛数据库兼容:
+### 8. 广泛数据库兼容:
@@ -238,7 +234,7 @@ com.jeelowcode
-### 8.9 在线表单设计:
+### 9. 在线表单设计:
提供丰富多样的控件,全面支持各类页面的开发需求。
@@ -248,7 +244,7 @@ com.jeelowcode
-### 8.10 丰富完善的示例:
+### 10. 丰富完善的示例:
丰富完善的示例,便于用户快速学习和上手
@@ -267,7 +263,7 @@ com.jeelowcode
-### 8.11 100+常用模板:
+### 11. 100+常用模板:
提供了丰富多样的常用页面模板,以便开发者能够迅速采纳和应用。
@@ -286,13 +282,13 @@ com.jeelowcode
-## 9.启动步骤
+## 📥 启动步骤
**温馨提示:** JDK、Maven、Node等可以从网盘下载
-[百度网盘地址:https://pan.baidu.com/s/1ICmHRlrRYzBkx87zoRuqvQ?pwd=1234](https://pan.baidu.com/s/1ICmHRlrRYzBkx87zoRuqvQ?pwd=1234)
+[百度网盘地址:https://pan.baidu.com/s/158EwoXY7nvBvm_P1JKnvZQ?pwd=1234](https://pan.baidu.com/s/158EwoXY7nvBvm_P1JKnvZQ?pwd=1234)
[阿里云盘地址:https://www.alipan.com/s/X4kF7Hshuc2](https://www.alipan.com/s/X4kF7Hshuc2)
-### 9.1 后台JAVA代码运行步骤
+### 1. 后台JAVA代码运行步骤
**环境配置**
@@ -326,7 +322,7 @@ com.jeelowcode
-### 9.2 前端VUE代码运行步骤:
+### 2. 前端VUE代码运行步骤:
**后台运行环境:** node18.0.0
@@ -421,7 +417,7 @@ pnpm run dev-server
-## 10.微信交流群
+## 👏 微信交流群/合作
@@ -432,4 +428,18 @@ pnpm run dev-server
 |
 |
-
\ No newline at end of file
+
+
+
+
+## 🔗 文章收录
+- [开源|写代码太累?这款低代码平台,拖拖拽拽就能上线业务系统](https://mp.weixin.qq.com/s/YW5HI0sucGqLzEIUrpr1Kw)
+- [Java低代码快速开发框架JeeLowCode,助你快速实现业务系统开发](https://mp.weixin.qq.com/s/vtubg0xSnxXO8vjLiY3r4w)
+- [免费商用 + 全功能覆盖!JeeLowCode:企业数字化的性价比之选](https://mp.weixin.qq.com/s/XaqEaH_U_ep1c3HoOE0_uQ)
+- [一款开源低代码王炸!企业级功能全免费,小白也能快速上手!](https://mp.weixin.qq.com/s/BE5FB40uFWtItFxJ7R6Nfw)
+- [零代码基础也能快速上手,JeeLowCode助力企业数字化转型](https://mp.weixin.qq.com/s/soUA7qK6xt0p6SXD9yy8Zg)
+- [企业级低代码平台,轻松应对99.99%编程挑战](https://mp.weixin.qq.com/s/M4h9wiZ1U7Fd3E4Ze4Yq_A)
+- [[开源]精心二次封装的企业级低代码开发框架,全开源低代码开发平台,在线轻松驾驭99.99%编程挑战](https://mp.weixin.qq.com/s/TZ094u7jm4wq3tacjPEExQ)
+- [无需编码,JeeLowCode 助你轻松构建强大应用!-JeeLowCode](https://mp.weixin.qq.com/s/h4jVs8DBAzaeSWKpDVo0xw)
+- [体验JeeLowCode,感受低代码开发的魅力与高效!](https://mp.weixin.qq.com/s/JNwFWHRPFwcEIE5JV5xT3A)
+
diff --git a/jeelowcode-core/src/main/java/com/jeelowcode/core/framework/service/impl/ExcelServiceImpl.java b/jeelowcode-core/src/main/java/com/jeelowcode/core/framework/service/impl/ExcelServiceImpl.java
index 6a7870e96af735e04ca3e4de91dfeb865a7a88cc..576df629f39ca2384631eccd48acaa7294cc7fd2 100644
--- a/jeelowcode-core/src/main/java/com/jeelowcode/core/framework/service/impl/ExcelServiceImpl.java
+++ b/jeelowcode-core/src/main/java/com/jeelowcode/core/framework/service/impl/ExcelServiceImpl.java
@@ -13,31 +13,25 @@ http://www.apache.org/licenses/
*/
package com.jeelowcode.core.framework.service.impl;
-import cn.hutool.core.date.DateUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jeelowcode.core.framework.entity.*;
import com.jeelowcode.core.framework.mapper.JeeLowCodeMapper;
import com.jeelowcode.core.framework.mapper.ReportFieldMapper;
import com.jeelowcode.core.framework.params.SaveImportDataParam;
+import com.jeelowcode.core.framework.params.model.ExcelImportDataDictModel;
+import com.jeelowcode.core.framework.params.model.ExcelModel;
+import com.jeelowcode.core.framework.params.model.ExcelTemplateModel;
import com.jeelowcode.core.framework.service.*;
import com.jeelowcode.core.framework.utils.Func;
import com.jeelowcode.framework.excel.model.ExcelTitleModel;
-import com.jeelowcode.framework.exception.JeeLowCodeException;
-import com.jeelowcode.framework.utils.component.redis.JeeLowCodeRedisUtils;
import com.jeelowcode.framework.utils.enums.YNEnum;
-import com.jeelowcode.framework.utils.model.ExecuteEnhanceModel;
-import com.jeelowcode.framework.utils.tool.spring.SpringUtils;
import com.jeelowcode.framework.utils.utils.FuncBase;
import com.jeelowcode.framework.utils.utils.JeeLowCodeUtils;
-import com.jeelowcode.core.framework.params.model.ExcelImportDataDictModel;
-import com.jeelowcode.core.framework.params.model.ExcelModel;
-import com.jeelowcode.core.framework.params.model.ExcelTemplateModel;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.map.LinkedMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
@@ -45,8 +39,6 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
/**
@@ -68,12 +60,6 @@ public class ExcelServiceImpl implements IExcelService {
@Autowired
private IExcelFileDataService excelDataService;
- @Autowired
- private JeeLowCodeRedisUtils jeeLowCodeRedisUtils;
-
- @Autowired
- private IExcelFileService excelFileService;
-
@Autowired
private IReportService reportService;
@@ -169,7 +155,6 @@ public class ExcelServiceImpl implements IExcelService {
/**
* 获取导出基本信息
- *
*/
@Override
public ExcelModel getExcelReportModel(String reportCode) {
@@ -177,8 +162,8 @@ public class ExcelServiceImpl implements IExcelService {
String sheetName = reportEntity.getReportName();//表描述
- LambdaQueryWrapper wrapper=new LambdaQueryWrapper<>();
- wrapper.eq(ReportFieldEntity::getReportId,reportEntity.getId());
+ LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
+ wrapper.eq(ReportFieldEntity::getReportId, reportEntity.getId());
wrapper.eq(ReportFieldEntity::getIsExport, YNEnum.Y.getCode());
List fieldEntityList = reportFieldMapper.selectList(wrapper);
@@ -222,11 +207,11 @@ public class ExcelServiceImpl implements IExcelService {
//获取字典
ExcelImportDataDictModel dictModel = this.formatExcelImportDataList(dbFormId);
//处理导入
- SaveImportDataParam param=new SaveImportDataParam();
+ SaveImportDataParam param = new SaveImportDataParam();
param.setFieldId(fieldId);
param.setEntityList(entityList);
param.setDictModel(dictModel);
- frameService.handleImportData(dbFormId,param);
+ frameService.handleImportData(dbFormId, param);
}
diff --git a/jeelowcode-core/src/main/java/com/jeelowcode/core/framework/service/impl/FrameServiceImpl.java b/jeelowcode-core/src/main/java/com/jeelowcode/core/framework/service/impl/FrameServiceImpl.java
index 5054ded2e4072fec57da28602db5557d0c502e4f..bbbc1eeabbb6936e5405c4edb8366c67d58ae514 100644
--- a/jeelowcode-core/src/main/java/com/jeelowcode/core/framework/service/impl/FrameServiceImpl.java
+++ b/jeelowcode-core/src/main/java/com/jeelowcode/core/framework/service/impl/FrameServiceImpl.java
@@ -98,9 +98,6 @@ public class FrameServiceImpl implements IFrameService {
@Autowired
private IDbFormRoleService dbFormRoleService;
- @Autowired
- private FormRoleDataRuleMapper roleDataRuleMapper;
-
@Autowired
private JeeLowCodeRedisUtils jeeLowCodeRedisUtils;
diff --git a/jeelowcode-core/src/main/java/com/jeelowcode/core/framework/utils/Func.java b/jeelowcode-core/src/main/java/com/jeelowcode/core/framework/utils/Func.java
index e2a83197028798a1b0f71aa981f957cfc7507ac0..712e66945440fe30dc3f901fc43e18887b246d3b 100644
--- a/jeelowcode-core/src/main/java/com/jeelowcode/core/framework/utils/Func.java
+++ b/jeelowcode-core/src/main/java/com/jeelowcode/core/framework/utils/Func.java
@@ -76,38 +76,6 @@ import java.util.stream.Collectors;
*/
public class Func extends FuncBase {
-
- //校验数据类型
- public static Object fomatDbValue(String fieldType, Object value) {
- if (FuncBase.isEmpty(value)) {
- return null;
- }
- if (FuncBase.equals(fieldType, JeeLowCodeFieldTypeEnum.STRING.getFieldType())
- || FuncBase.equals(fieldType, JeeLowCodeFieldTypeEnum.TEXT.getFieldType())
- || FuncBase.equals(fieldType, JeeLowCodeFieldTypeEnum.LONGTEXT.getFieldType())) {//字符串
- return FuncBase.toStr(value);
- } else if (FuncBase.equals(fieldType, JeeLowCodeFieldTypeEnum.INTEGER.getFieldType())) {
- return FuncBase.toInt(value);
- } else if (FuncBase.equals(fieldType, JeeLowCodeFieldTypeEnum.BIGINT.getFieldType())) {
- return FuncBase.toLong(value);
- } else if (FuncBase.equals(fieldType, JeeLowCodeFieldTypeEnum.BIGDECIMAL.getFieldType())) {
- return new BigDecimal(FuncBase.toStr(value));
- } else if (FuncBase.equals(fieldType, JeeLowCodeFieldTypeEnum.DATE.getFieldType())) {
- //yyyy-MM-dd
- String str = FuncBase.toStr(value);
- return DateUtil.parseDate(str.substring(0, 10));
- } else if (FuncBase.equals(fieldType, JeeLowCodeFieldTypeEnum.DATETIME.getFieldType())) {
- //yyyy-MM-dd HH:mm:ss
- String str = FuncBase.toStr(value);
- return DateUtil.parseDateTime(str.substring(0, 19));
- } else if (FuncBase.equals(fieldType, JeeLowCodeFieldTypeEnum.TIME.getFieldType())) {
- //HH:mm:ss
- String str = FuncBase.toStr(value);
- return DateUtil.parseTime(str.substring(0, 8));
- }
- return FuncBase.toStr(value);
- }
-
/**
* 校验表名称是否可用
*
@@ -257,33 +225,7 @@ public class Func extends FuncBase {
return sql;
}
- /**
- * 执行某一个类下的方法,
- *
- * @param classPath 类路径
- * @param methodName 方法名称
- * @param dataMap 参数
- * @return
- */
- public static Object runByClass(String classPath, String methodName, Map dataMap) {
- try {
- // 1. 获取Class对象
- Class> clazz = Class.forName(classPath);
-
- // 2. 创建DemoClass的一个实例
- Object demoClassInstance = clazz.getDeclaredConstructor().newInstance();
-
- // 3. 获取getBjName方法的对象
- Method method = clazz.getMethod(methodName, Map.class);
- // 4. 调用getBjName方法
- return method.invoke(demoClassInstance, dataMap);
- } catch (Exception e) {
- e.printStackTrace();
- throw new JeeLowCodeException(e.getMessage());
- }
-
- }
//计算
public static String executeJavaExpress(String express, Map dataMap) {
diff --git a/jeelowcode-framework/jeelowcode-plus/src/main/java/com/jeelowcode/framework/plus/component/JeelowCodePlusInterceptor.java b/jeelowcode-framework/jeelowcode-plus/src/main/java/com/jeelowcode/framework/plus/component/JeelowCodePlusInterceptor.java
index d6ba7163ac8a366b5c96d516f4ebd1709eb786d7..4712f04b0cdf41426edda1bba768186f79954a64 100644
--- a/jeelowcode-framework/jeelowcode-plus/src/main/java/com/jeelowcode/framework/plus/component/JeelowCodePlusInterceptor.java
+++ b/jeelowcode-framework/jeelowcode-plus/src/main/java/com/jeelowcode/framework/plus/component/JeelowCodePlusInterceptor.java
@@ -1,175 +1,133 @@
-/*
-Apache License
-Version 2.0, January 2004
-http://www.apache.org/licenses/
-本软件受适用的国家软件著作权法(包括国际条约)和开源协议 双重保护许可。
-
-开源协议中文释意如下:
-1.JeeLowCode开源版本无任何限制,在遵循本开源协议(Apache2.0)条款下,允许商用使用,不会造成侵权行为。
-2.允许基于本平台软件开展业务系统开发。
-3.在任何情况下,您不得使用本软件开发可能被认为与本软件竞争的软件。
-
-最终解释权归:http://www.jeelowcode.com
-*/
package com.jeelowcode.framework.plus.component;
-
-import com.jeelowcode.framework.global.JeeLowCodeBaseConstant;
import com.jeelowcode.framework.plus.SqlHelper;
import com.jeelowcode.framework.utils.utils.FuncBase;
-import org.apache.ibatis.builder.StaticSqlSource;
-import org.apache.ibatis.cache.CacheKey;
-import org.apache.ibatis.executor.Executor;
-import org.apache.ibatis.mapping.*;
-import org.apache.ibatis.plugin.Interceptor;
-import org.apache.ibatis.plugin.Intercepts;
-import org.apache.ibatis.plugin.Invocation;
-import org.apache.ibatis.plugin.Signature;
-import org.apache.ibatis.session.ResultHandler;
-import org.apache.ibatis.session.RowBounds;
+import org.apache.ibatis.executor.statement.RoutingStatementHandler;
+import org.apache.ibatis.executor.statement.StatementHandler;
+import org.apache.ibatis.mapping.BoundSql;
+import org.apache.ibatis.mapping.MappedStatement;
+import org.apache.ibatis.plugin.*;
+import org.apache.ibatis.reflection.MetaObject;
+import org.apache.ibatis.reflection.SystemMetaObject;
import org.springframework.stereotype.Component;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Proxy;
+import java.sql.Connection;
import java.util.ArrayList;
-import java.util.Iterator;
import java.util.List;
-import java.util.Map;
+import java.util.Properties;
import static com.jeelowcode.framework.global.JeeLowCodeBaseConstant.BASE_PACKAGES_CODE;
@Component
-@Intercepts({@Signature(
- type = Executor.class,
- method = "update",
- args = {MappedStatement.class, Object.class}
-), @Signature(
- type = Executor.class,
- method = "query",
- args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}
-), @Signature(
- type = Executor.class,
- method = "query",
- args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class}
-)})
+@Intercepts({
+ @Signature(type = StatementHandler.class,
+ method = "prepare",
+ args = {Connection.class, Integer.class})
+})
public class JeelowCodePlusInterceptor implements Interceptor {
- private List getSkipMapperList(){//todo 后面需要优化
- String SKIP_MAPPER_CODE = BASE_PACKAGES_CODE+".framework.mapper";//不做租户拦截的mapper
-
-
- List skipMapperList=new ArrayList<>();
- skipMapperList.add(SKIP_MAPPER_CODE);
+ private List getSkipMapperList() {
+ List skipMapperList = new ArrayList<>();
+ // 不做租户拦截的mapper包路径
+ skipMapperList.add(BASE_PACKAGES_CODE + ".framework.mapper");
+ // 可以添加更多需要跳过的mapper路径
return skipMapperList;
}
@Override
public Object intercept(Invocation invocation) throws Throwable {
- Object target = invocation.getTarget();
- Object[] args = invocation.getArgs();
- if (!(target instanceof Executor)) {
- return invocation.proceed();
- }
+ try {
+ StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
+ // 获取MappedStatement
+ MappedStatement ms = getMappedStatement(statementHandler);
+ if(FuncBase.isEmpty(ms)){
+ return invocation.proceed();
+ }
+ String id = ms.getId();
+ List skipMapperList = getSkipMapperList();
+ for(String skipMapper:skipMapperList){
+ if(id.startsWith(skipMapper)){
+ return invocation.proceed();
+ }
+ }
- Executor executor = (Executor) target;
- Object parameter = args[1];
- boolean isUpdate = args.length == 2;
- MappedStatement ms = (MappedStatement) args[0];
- String id = ms.getId();
- List skipMapperList = getSkipMapperList();
- for(String skipMapper:skipMapperList){
- if(id.startsWith(skipMapper)){
+ if (!id.startsWith(BASE_PACKAGES_CODE)) {//直接跳过,如果不是低代码平台,则直接跳过
return invocation.proceed();
}
+ // 获取SQL并处理
+ BoundSql boundSql = statementHandler.getBoundSql();
+ String originalSql = boundSql.getSql();
+
+ // 进行SQL替换处理
+ String publicSql = SqlHelper.getPublicSql(originalSql);
+
+ // 使用反射修改SQL
+ Field sqlField = BoundSql.class.getDeclaredField("sql");
+ sqlField.setAccessible(true);
+ sqlField.set(boundSql, publicSql);
+ } catch (Exception e) {
+ // 记录错误但不中断流程
+ System.err.println("拦截器处理异常: " + e.getMessage());
+ e.printStackTrace();
}
- if (!id.startsWith(BASE_PACKAGES_CODE)) {//直接跳过,如果不是低代码平台,则直接跳过
- return invocation.proceed();
- }
+ return invocation.proceed();
+ }
- if (!isUpdate && ms.getSqlCommandType() == SqlCommandType.SELECT) {//查询相关
- RowBounds rowBounds = (RowBounds) args[2];
- ResultHandler resultHandler = (ResultHandler) args[3];
- BoundSql boundSql;
- if (args.length == 4) {
- boundSql = ms.getBoundSql(parameter);
- } else {
- boundSql = (BoundSql) args[5];
- }
- String publicSql = SqlHelper.getPublicSql(boundSql.getSql());
- Object additionalParametersObj = boundSql.getAdditionalParameters();
- boundSql = new BoundSql(ms.getConfiguration(), publicSql, boundSql.getParameterMappings(), boundSql.getParameterObject());
- if (FuncBase.isNotEmpty(additionalParametersObj)) {
- Map additionalParameters = (Map) additionalParametersObj;
-
- Iterator> iterator = additionalParameters.entrySet().iterator();
- while (iterator.hasNext()) {
- Map.Entry next = iterator.next();
- String key = next.getKey();
- Object value = next.getValue();
- boundSql.setAdditionalParameter(key, value);
+ /**
+ * 通过反射获取MappedStatement
+ */
+ /**
+ * 通过 MetaObject 获取 MappedStatement
+ */
+ private MappedStatement getMappedStatement(StatementHandler handler) {
+ try {
+ // 处理代理对象
+ if (Proxy.isProxyClass(handler.getClass())) {
+ InvocationHandler invocationHandler = Proxy.getInvocationHandler(handler);
+ if (invocationHandler instanceof Plugin) {
+ Field targetField = invocationHandler.getClass().getDeclaredField("target");
+ targetField.setAccessible(true);
+ handler = (StatementHandler) targetField.get(invocationHandler);
}
}
- CacheKey cacheKey = executor.createCacheKey(ms, parameter, rowBounds, boundSql);
- List