From 008033a77cfa05c9331fe6e98bdfbca25618d4ef Mon Sep 17 00:00:00 2001 From: colin Date: Mon, 1 Sep 2025 14:17:04 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0TenantIgnore=E6=B3=A8?= =?UTF-8?q?=E8=A7=A3=EF=BC=8C=E4=BB=A5=E5=A2=9E=E5=8A=A0=E5=BF=BD=E7=95=A5?= =?UTF-8?q?=E7=A7=9F=E6=88=B7=E7=9A=84=E5=8F=A6=E4=B8=80=E7=A7=8D=E6=96=B9?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/annotation/TenantIgnore.java | 18 ++++++ .../tenant/handle/PlusTenantLineHandler.java | 63 +++++++++++++++---- .../dromara/generator/domain/GenTable.java | 10 ++- .../generator/domain/GenTableColumn.java | 9 +-- 4 files changed, 80 insertions(+), 20 deletions(-) create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/annotation/TenantIgnore.java diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/annotation/TenantIgnore.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/annotation/TenantIgnore.java new file mode 100644 index 000000000..da1aba0c5 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/annotation/TenantIgnore.java @@ -0,0 +1,18 @@ +package org.dromara.common.core.annotation; + +/** + * 租户忽略 + * + * @author Colin + * @date 2025/09/01 + */ +public @interface TenantIgnore { + + /** + * 是否开启忽略租户,默认为 true 开启 + *

+ * 支持 Spring EL 表达式,如果返回 true 则满足条件,进行租户的忽略 + */ + boolean enable() default true; + +} diff --git a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/handle/PlusTenantLineHandler.java b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/handle/PlusTenantLineHandler.java index f6d224bd6..846b3f759 100644 --- a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/handle/PlusTenantLineHandler.java +++ b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/handle/PlusTenantLineHandler.java @@ -1,17 +1,22 @@ package org.dromara.common.tenant.handle; -import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.annotation.AnnotationUtil; +import com.baomidou.mybatisplus.core.metadata.TableInfo; +import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler; -import lombok.AllArgsConstructor; +import com.baomidou.mybatisplus.extension.toolkit.SqlParserUtils; import lombok.extern.slf4j.Slf4j; import net.sf.jsqlparser.expression.Expression; import net.sf.jsqlparser.expression.NullValue; import net.sf.jsqlparser.expression.StringValue; +import org.dromara.common.core.annotation.TenantIgnore; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.common.tenant.properties.TenantProperties; -import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.ConcurrentHashMap; /** * 自定义租户处理器 @@ -19,11 +24,25 @@ import java.util.List; * @author Lion Li */ @Slf4j -@AllArgsConstructor public class PlusTenantLineHandler implements TenantLineHandler { private final TenantProperties tenantProperties; + /** + * 忽略的表 + *

+ * KEY:表名 + * VALUE:是否忽略 + */ + private final Map ignoreTables = new ConcurrentHashMap<>(); + + public PlusTenantLineHandler(TenantProperties tenantProperties) { + this.tenantProperties = tenantProperties; + // 添加忽略的表 + Optional.ofNullable(tenantProperties.getExcludes()).ifPresent(tables -> + tables.forEach(table -> addIgnoreTable(table, true))); + } + @Override public Expression getTenantId() { String tenantId = TenantHelper.getTenantId(); @@ -39,18 +58,36 @@ public class PlusTenantLineHandler implements TenantLineHandler { public boolean ignoreTable(String tableName) { String tenantId = TenantHelper.getTenantId(); // 判断是否有租户 + Boolean ignore = false; if (StringUtils.isNotBlank(tenantId)) { // 不需要过滤租户的表 - List excludes = tenantProperties.getExcludes(); - // 非业务表 - List tables = ListUtil.toList( - "gen_table", - "gen_table_column" - ); - tables.addAll(excludes); - return StringUtils.equalsAnyIgnoreCase(tableName, tables.toArray(new String[0])); + tableName = SqlParserUtils.removeWrapperSymbol(tableName); + ignore = ignoreTables.get(tableName.toLowerCase()); + if (ignore == null) { + ignore = computeIgnoreTable(tableName); + } + } + return ignore; + } + + private void addIgnoreTable(String tableName, boolean ignore) { + ignoreTables.put(tableName.toLowerCase(), ignore); + } + + private boolean computeIgnoreTable(String tableName) { + boolean ignore; + TableInfo tableInfo = TableInfoHelper.getTableInfo(tableName); + if (tableInfo == null) { + //找不到的表,说明不是项目里的或未被mp管理,不进行拦截(忽略租户) + ignore = true; + } else { + // 如果添加了 @TenantIgnore 注解,看是否忽略租户 + TenantIgnore tenantIgnore = AnnotationUtil.getAnnotation(tableInfo.getEntityType(), TenantIgnore.class); + ignore = tenantIgnore != null && tenantIgnore.enable(); } - return true; + // 添加到缓存 + addIgnoreTable(tableName, ignore); + return ignore; } } diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/domain/GenTable.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/domain/GenTable.java index f2d725709..979467ba9 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/domain/GenTable.java +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/domain/GenTable.java @@ -4,14 +4,16 @@ import com.baomidou.mybatisplus.annotation.FieldStrategy; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.mybatis.core.domain.BaseEntity; -import org.dromara.generator.constant.GenConstants; import jakarta.validation.Valid; import jakarta.validation.constraints.NotBlank; import lombok.Data; import lombok.EqualsAndHashCode; +import org.dromara.common.core.annotation.TenantIgnore; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.generator.constant.GenConstants; +import java.io.Serial; import java.util.List; /** @@ -23,8 +25,10 @@ import java.util.List; @Data @EqualsAndHashCode(callSuper = true) @TableName("gen_table") +@TenantIgnore public class GenTable extends BaseEntity { + /** * 编号 */ diff --git a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/domain/GenTableColumn.java b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/domain/GenTableColumn.java index 6b2e429ed..6dd136da2 100644 --- a/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/domain/GenTableColumn.java +++ b/ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/domain/GenTableColumn.java @@ -4,13 +4,13 @@ import com.baomidou.mybatisplus.annotation.FieldStrategy; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.mybatis.core.domain.BaseEntity; +import jakarta.validation.constraints.NotBlank; import lombok.Data; import lombok.EqualsAndHashCode; import org.apache.ibatis.type.JdbcType; - -import jakarta.validation.constraints.NotBlank; +import org.dromara.common.core.annotation.TenantIgnore; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.domain.BaseEntity; /** * 代码生成业务字段表 gen_table_column @@ -20,6 +20,7 @@ import jakarta.validation.constraints.NotBlank; @Data @EqualsAndHashCode(callSuper = true) @TableName("gen_table_column") +@TenantIgnore public class GenTableColumn extends BaseEntity { /** -- Gitee