Commit 4d53944771c66b563da1e3d68d3ba43405af8a06

Authored by YunaiV
1 parent 2598c033

【新增】新增 `@TenantIgnore` 注解,标记指定方法,忽略多租户的自动过滤,适合实现跨租户的逻辑

Showing 20 changed files with 195 additions and 215 deletions
yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/config/YudaoTenantAutoConfiguration.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.tenant.config;
  2 +
  3 +import cn.hutool.core.annotation.AnnotationUtil;
  4 +import cn.iocoder.yudao.framework.common.enums.WebFilterOrderEnum;
  5 +import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
  6 +import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler;
  7 +import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnoreAspect;
  8 +import cn.iocoder.yudao.framework.tenant.core.db.TenantDatabaseInterceptor;
  9 +import cn.iocoder.yudao.framework.tenant.core.job.TenantJob;
  10 +import cn.iocoder.yudao.framework.tenant.core.job.TenantJobHandlerDecorator;
  11 +import cn.iocoder.yudao.framework.tenant.core.mq.TenantRedisMessageInterceptor;
  12 +import cn.iocoder.yudao.framework.tenant.core.security.TenantSecurityWebFilter;
  13 +import cn.iocoder.yudao.framework.tenant.core.service.TenantFrameworkService;
  14 +import cn.iocoder.yudao.framework.tenant.core.web.TenantContextWebFilter;
  15 +import cn.iocoder.yudao.framework.web.config.WebProperties;
  16 +import cn.iocoder.yudao.framework.web.core.handler.GlobalExceptionHandler;
  17 +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
  18 +import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
  19 +import org.springframework.beans.BeansException;
  20 +import org.springframework.beans.factory.config.BeanPostProcessor;
  21 +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
  22 +import org.springframework.boot.context.properties.EnableConfigurationProperties;
  23 +import org.springframework.boot.web.servlet.FilterRegistrationBean;
  24 +import org.springframework.context.annotation.Bean;
  25 +import org.springframework.context.annotation.Configuration;
  26 +
  27 +@Configuration
  28 +@ConditionalOnProperty(prefix = "yudao.tenant", value = "enable", matchIfMissing = true) // 允许使用 yudao.tenant.enable=false 禁用多租户
  29 +@EnableConfigurationProperties(TenantProperties.class)
  30 +public class YudaoTenantAutoConfiguration {
  31 +
  32 + // ========== AOP ==========
  33 +
  34 + @Bean
  35 + public TenantIgnoreAspect tenantIgnoreAspect() {
  36 + return new TenantIgnoreAspect();
  37 + }
  38 +
  39 + // ========== DB ==========
  40 +
  41 + @Bean
  42 + public TenantLineInnerInterceptor tenantLineInnerInterceptor(TenantProperties properties,
  43 + MybatisPlusInterceptor interceptor) {
  44 + TenantLineInnerInterceptor inner = new TenantLineInnerInterceptor(new TenantDatabaseInterceptor(properties));
  45 + // 添加到 interceptor 中
  46 + // 需要加在首个,主要是为了在分页插件前面。这个是 MyBatis Plus 的规定
  47 + MyBatisUtils.addInterceptor(interceptor, inner, 0);
  48 + return inner;
  49 + }
  50 +
  51 + // ========== WEB ==========
  52 +
  53 + @Bean
  54 + public FilterRegistrationBean<TenantContextWebFilter> tenantContextWebFilter() {
  55 + FilterRegistrationBean<TenantContextWebFilter> registrationBean = new FilterRegistrationBean<>();
  56 + registrationBean.setFilter(new TenantContextWebFilter());
  57 + registrationBean.setOrder(WebFilterOrderEnum.TENANT_CONTEXT_FILTER);
  58 + return registrationBean;
  59 + }
  60 +
  61 + // ========== Security ==========
  62 +
  63 + @Bean
  64 + public FilterRegistrationBean<TenantSecurityWebFilter> tenantSecurityWebFilter(TenantProperties tenantProperties,
  65 + WebProperties webProperties,
  66 + GlobalExceptionHandler globalExceptionHandler,
  67 + TenantFrameworkService tenantFrameworkService) {
  68 + FilterRegistrationBean<TenantSecurityWebFilter> registrationBean = new FilterRegistrationBean<>();
  69 + registrationBean.setFilter(new TenantSecurityWebFilter(tenantProperties, webProperties,
  70 + globalExceptionHandler, tenantFrameworkService));
  71 + registrationBean.setOrder(WebFilterOrderEnum.TENANT_SECURITY_FILTER);
  72 + return registrationBean;
  73 + }
  74 +
  75 + // ========== MQ ==========
  76 +
  77 + @Bean
  78 + public TenantRedisMessageInterceptor tenantRedisMessageInterceptor() {
  79 + return new TenantRedisMessageInterceptor();
  80 + }
  81 +
  82 + // ========== Job ==========
  83 +
  84 + @Bean
  85 + @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
  86 + public BeanPostProcessor jobHandlerBeanPostProcessor(TenantFrameworkService tenantFrameworkService) {
  87 + return new BeanPostProcessor() {
  88 +
  89 + @Override
  90 + public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
  91 + if (!(bean instanceof JobHandler)) {
  92 + return bean;
  93 + }
  94 + // 有 TenantJob 注解的情况下,才会进行处理
  95 + if (!AnnotationUtil.hasAnnotation(bean.getClass(), TenantJob.class)) {
  96 + return bean;
  97 + }
  98 +
  99 + // 使用 TenantJobHandlerDecorator 装饰
  100 + return new TenantJobHandlerDecorator(tenantFrameworkService, (JobHandler) bean);
  101 + }
  102 +
  103 + };
  104 + }
  105 +
  106 +}
yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/config/YudaoTenantDatabaseAutoConfiguration.java deleted
1 -package cn.iocoder.yudao.framework.tenant.config;  
2 -  
3 -import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;  
4 -import cn.iocoder.yudao.framework.tenant.core.db.TenantDatabaseInterceptor;  
5 -import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;  
6 -import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;  
7 -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;  
8 -import org.springframework.boot.context.properties.EnableConfigurationProperties;  
9 -import org.springframework.context.annotation.Bean;  
10 -import org.springframework.context.annotation.Configuration;  
11 -  
12 -/**  
13 - * 多租户针对 DB 的自动配置  
14 - *  
15 - * @author 芋道源码  
16 - */  
17 -@Configuration  
18 -// 允许使用 yudao.tenant.enable=false 禁用多租户  
19 -@ConditionalOnProperty(prefix = "yudao.tenant", value = "enable", matchIfMissing = true)  
20 -@EnableConfigurationProperties(TenantProperties.class)  
21 -public class YudaoTenantDatabaseAutoConfiguration {  
22 -  
23 - @Bean  
24 - public TenantLineInnerInterceptor tenantLineInnerInterceptor(TenantProperties properties,  
25 - MybatisPlusInterceptor interceptor) {  
26 - TenantLineInnerInterceptor inner = new TenantLineInnerInterceptor(new TenantDatabaseInterceptor(properties));  
27 - // 添加到 interceptor 中  
28 - // 需要加在首个,主要是为了在分页插件前面。这个是 MyBatis Plus 的规定  
29 - MyBatisUtils.addInterceptor(interceptor, inner, 0);  
30 - return inner;  
31 - }  
32 -  
33 -}  
yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/config/YudaoTenantJobAutoConfiguration.java deleted
1 -package cn.iocoder.yudao.framework.tenant.config;  
2 -  
3 -import cn.hutool.core.annotation.AnnotationUtil;  
4 -import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler;  
5 -import cn.iocoder.yudao.framework.tenant.core.job.TenantJob;  
6 -import cn.iocoder.yudao.framework.tenant.core.job.TenantJobHandlerDecorator;  
7 -import cn.iocoder.yudao.framework.tenant.core.service.TenantFrameworkService;  
8 -import org.springframework.beans.BeansException;  
9 -import org.springframework.beans.factory.config.BeanPostProcessor;  
10 -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;  
11 -import org.springframework.context.annotation.Bean;  
12 -import org.springframework.context.annotation.Configuration;  
13 -  
14 -/**  
15 - * 多租户针对 Job 的自动配置  
16 - *  
17 - * @author 芋道源码  
18 - */  
19 -@Configuration  
20 -// 允许使用 yudao.tenant.enable=false 禁用多租户  
21 -@ConditionalOnProperty(prefix = "yudao.tenant", value = "enable", matchIfMissing = true)  
22 -public class YudaoTenantJobAutoConfiguration {  
23 -  
24 - @Bean  
25 - @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")  
26 - public BeanPostProcessor jobHandlerBeanPostProcessor(TenantFrameworkService tenantFrameworkService) {  
27 - return new BeanPostProcessor() {  
28 -  
29 - @Override  
30 - public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {  
31 - if (!(bean instanceof JobHandler)) {  
32 - return bean;  
33 - }  
34 - // 有 TenantJob 注解的情况下,才会进行处理  
35 - if (!AnnotationUtil.hasAnnotation(bean.getClass(), TenantJob.class)) {  
36 - return bean;  
37 - }  
38 -  
39 - // 使用 TenantJobHandlerDecorator 装饰  
40 - return new TenantJobHandlerDecorator(tenantFrameworkService, (JobHandler) bean);  
41 - }  
42 -  
43 - };  
44 - }  
45 -  
46 -}  
yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/config/YudaoTenantMQAutoConfiguration.java deleted
1 -package cn.iocoder.yudao.framework.tenant.config;  
2 -  
3 -import cn.iocoder.yudao.framework.tenant.core.mq.TenantRedisMessageInterceptor;  
4 -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;  
5 -import org.springframework.context.annotation.Bean;  
6 -import org.springframework.context.annotation.Configuration;  
7 -  
8 -/**  
9 - * 多租户针对 MQ 的自动配置  
10 - *  
11 - * @author 芋道源码  
12 - */  
13 -@Configuration  
14 -// 允许使用 yudao.tenant.enable=false 禁用多租户  
15 -@ConditionalOnProperty(prefix = "yudao.tenant", value = "enable", matchIfMissing = true)  
16 -public class YudaoTenantMQAutoConfiguration {  
17 -  
18 - @Bean  
19 - public TenantRedisMessageInterceptor tenantRedisMessageInterceptor() {  
20 - return new TenantRedisMessageInterceptor();  
21 - }  
22 -  
23 -}  
yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/config/YudaoTenantSecurityAutoConfiguration.java deleted
1 -package cn.iocoder.yudao.framework.tenant.config;  
2 -  
3 -import cn.iocoder.yudao.framework.common.enums.WebFilterOrderEnum;  
4 -import cn.iocoder.yudao.framework.tenant.core.security.TenantSecurityWebFilter;  
5 -import cn.iocoder.yudao.framework.tenant.core.service.TenantFrameworkService;  
6 -import cn.iocoder.yudao.framework.web.config.WebProperties;  
7 -import cn.iocoder.yudao.framework.web.core.handler.GlobalExceptionHandler;  
8 -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;  
9 -import org.springframework.boot.context.properties.EnableConfigurationProperties;  
10 -import org.springframework.boot.web.servlet.FilterRegistrationBean;  
11 -import org.springframework.context.annotation.Bean;  
12 -import org.springframework.context.annotation.Configuration;  
13 -  
14 -/**  
15 - * 多租户针对 Web 的自动配置  
16 - *  
17 - * @author 芋道源码  
18 - */  
19 -@Configuration  
20 -// 允许使用 yudao.tenant.enable=false 禁用多租户  
21 -@ConditionalOnProperty(prefix = "yudao.tenant", value = "enable", matchIfMissing = true)  
22 -@EnableConfigurationProperties(TenantProperties.class)  
23 -public class YudaoTenantSecurityAutoConfiguration {  
24 -  
25 - @Bean  
26 - public FilterRegistrationBean<TenantSecurityWebFilter> tenantSecurityWebFilter(TenantProperties tenantProperties,  
27 - WebProperties webProperties,  
28 - GlobalExceptionHandler globalExceptionHandler,  
29 - TenantFrameworkService tenantFrameworkService) {  
30 - FilterRegistrationBean<TenantSecurityWebFilter> registrationBean = new FilterRegistrationBean<>();  
31 - registrationBean.setFilter(new TenantSecurityWebFilter(tenantProperties, webProperties,  
32 - globalExceptionHandler, tenantFrameworkService));  
33 - registrationBean.setOrder(WebFilterOrderEnum.TENANT_SECURITY_FILTER);  
34 - return registrationBean;  
35 - }  
36 -  
37 -}  
yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/config/YudaoTenantWebAutoConfiguration.java deleted
1 -package cn.iocoder.yudao.framework.tenant.config;  
2 -  
3 -import cn.iocoder.yudao.framework.common.enums.WebFilterOrderEnum;  
4 -import cn.iocoder.yudao.framework.tenant.core.web.TenantContextWebFilter;  
5 -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;  
6 -import org.springframework.boot.web.servlet.FilterRegistrationBean;  
7 -import org.springframework.context.annotation.Bean;  
8 -import org.springframework.context.annotation.Configuration;  
9 -  
10 -/**  
11 - * 多租户针对 Web 的自动配置  
12 - *  
13 - * @author 芋道源码  
14 - */  
15 -@Configuration  
16 -// 允许使用 yudao.tenant.enable=false 禁用多租户  
17 -@ConditionalOnProperty(prefix = "yudao.tenant", value = "enable", matchIfMissing = true)  
18 -public class YudaoTenantWebAutoConfiguration {  
19 -  
20 - @Bean  
21 - public FilterRegistrationBean<TenantContextWebFilter> tenantContextWebFilter() {  
22 - FilterRegistrationBean<TenantContextWebFilter> registrationBean = new FilterRegistrationBean<>();  
23 - registrationBean.setFilter(new TenantContextWebFilter());  
24 - registrationBean.setOrder(WebFilterOrderEnum.TENANT_CONTEXT_FILTER);  
25 - return registrationBean;  
26 - }  
27 -  
28 -}  
yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/core/aop/TenantIgnore.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.tenant.core.aop;
  2 +
  3 +import java.lang.annotation.*;
  4 +
  5 +/**
  6 + * 忽略租户,标记指定方法不进行租户的自动过滤
  7 + *
  8 + * 注意,只有 DB 的场景会过滤,其它场景暂时不过滤:
  9 + * 1、Redis 场景:因为是基于 Key 实现多租户的能力,所以忽略没有意义,不像 DB 是一个 column 实现的
  10 + * 2、MQ 场景:有点难以抉择,目前可以通过 Consumer 手动在消费的方法上,添加 @TenantIgnore 进行忽略
  11 + *
  12 + * @author 芋道源码
  13 + */
  14 +@Target({ElementType.METHOD})
  15 +@Retention(RetentionPolicy.RUNTIME)
  16 +@Inherited
  17 +public @interface TenantIgnore {
  18 +}
yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/core/aop/TenantIgnoreAspect.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.tenant.core.aop;
  2 +
  3 +import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
  4 +import lombok.extern.slf4j.Slf4j;
  5 +import org.aspectj.lang.ProceedingJoinPoint;
  6 +import org.aspectj.lang.annotation.Around;
  7 +import org.aspectj.lang.annotation.Aspect;
  8 +
  9 +/**
  10 + * 忽略多租户的 Aspect,基于 {@link TenantIgnore} 注解实现,用于一些全局的逻辑。
  11 + * 例如说,一个定时任务,读取所有数据,进行处理。
  12 + * 又例如说,读取所有数据,进行缓存。
  13 + *
  14 + * @author 芋道源码
  15 + */
  16 +@Aspect
  17 +@Slf4j
  18 +public class TenantIgnoreAspect {
  19 +
  20 + @Around("@annotation(tenantIgnore)")
  21 + public Object around(ProceedingJoinPoint joinPoint, TenantIgnore tenantIgnore) throws Throwable {
  22 + Boolean oldIgnore = TenantContextHolder.isIgnore();
  23 + try {
  24 + TenantContextHolder.setIgnore(true);
  25 + // 执行逻辑
  26 + return joinPoint.proceed();
  27 + } finally {
  28 + TenantContextHolder.setIgnore(oldIgnore);
  29 + }
  30 + }
  31 +
  32 +}
yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/core/context/TenantContextHolder.java
@@ -9,9 +9,17 @@ import com.alibaba.ttl.TransmittableThreadLocal; @@ -9,9 +9,17 @@ import com.alibaba.ttl.TransmittableThreadLocal;
9 */ 9 */
10 public class TenantContextHolder { 10 public class TenantContextHolder {
11 11
  12 + /**
  13 + * 当前租户编号
  14 + */
12 private static final ThreadLocal<Long> TENANT_ID = new TransmittableThreadLocal<>(); 15 private static final ThreadLocal<Long> TENANT_ID = new TransmittableThreadLocal<>();
13 16
14 /** 17 /**
  18 + * 是否忽略租户
  19 + */
  20 + private static final ThreadLocal<Boolean> IGNORE = new TransmittableThreadLocal<>();
  21 +
  22 + /**
15 * 获得租户编号。 23 * 获得租户编号。
16 * 24 *
17 * @return 租户编号 25 * @return 租户编号
@@ -37,8 +45,22 @@ public class TenantContextHolder { @@ -37,8 +45,22 @@ public class TenantContextHolder {
37 TENANT_ID.set(tenantId); 45 TENANT_ID.set(tenantId);
38 } 46 }
39 47
  48 + public static void setIgnore(Boolean ignore) {
  49 + IGNORE.set(ignore);
  50 + }
  51 +
  52 + /**
  53 + * 当前是否忽略租户
  54 + *
  55 + * @return 是否忽略
  56 + */
  57 + public static boolean isIgnore() {
  58 + return Boolean.TRUE.equals(IGNORE.get());
  59 + }
  60 +
40 public static void clear() { 61 public static void clear() {
41 TENANT_ID.remove(); 62 TENANT_ID.remove();
  63 + IGNORE.remove();
42 } 64 }
43 65
44 } 66 }
yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/core/db/TenantDatabaseInterceptor.java
@@ -6,7 +6,7 @@ import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder; @@ -6,7 +6,7 @@ import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
6 import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler; 6 import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
7 import lombok.AllArgsConstructor; 7 import lombok.AllArgsConstructor;
8 import net.sf.jsqlparser.expression.Expression; 8 import net.sf.jsqlparser.expression.Expression;
9 -import net.sf.jsqlparser.expression.StringValue; 9 +import net.sf.jsqlparser.expression.LongValue;
10 10
11 /** 11 /**
12 * 基于 MyBatis Plus 多租户的功能,实现 DB 层面的多租户的功能 12 * 基于 MyBatis Plus 多租户的功能,实现 DB 层面的多租户的功能
@@ -20,12 +20,13 @@ public class TenantDatabaseInterceptor implements TenantLineHandler { @@ -20,12 +20,13 @@ public class TenantDatabaseInterceptor implements TenantLineHandler {
20 20
21 @Override 21 @Override
22 public Expression getTenantId() { 22 public Expression getTenantId() {
23 - return new StringValue(TenantContextHolder.getRequiredTenantId().toString()); 23 + return new LongValue( TenantContextHolder.getRequiredTenantId());
24 } 24 }
25 25
26 @Override 26 @Override
27 public boolean ignoreTable(String tableName) { 27 public boolean ignoreTable(String tableName) {
28 - return CollUtil.contains(properties.getIgnoreTables(), tableName); 28 + return TenantContextHolder.isIgnore() // 情况一,全局忽略多租户
  29 + || CollUtil.contains(properties.getIgnoreTables(), tableName); // 情况二,忽略多租户的表
29 } 30 }
30 31
31 } 32 }
yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/core/job/TenantJobHandlerInvoker.java deleted
1 -package cn.iocoder.yudao.framework.tenant.core.job;  
2 -  
3 -import cn.iocoder.yudao.framework.quartz.core.handler.JobHandlerInvoker;  
4 -  
5 -/**  
6 - * 多租户 JobHandlerInvoker 拓展实现类  
7 - *  
8 - * @author 芋道源码  
9 - */  
10 -public class TenantJobHandlerInvoker extends JobHandlerInvoker {  
11 -  
12 -  
13 -  
14 -}  
yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/core/util/TenantUtils.java
@@ -12,17 +12,23 @@ public class TenantUtils { @@ -12,17 +12,23 @@ public class TenantUtils {
12 /** 12 /**
13 * 使用指定租户,执行对应的逻辑 13 * 使用指定租户,执行对应的逻辑
14 * 14 *
  15 + * 注意,如果当前是忽略租户的情况下,会被强制设置成不忽略租户
  16 + * 当然,执行完成后,还是会恢复回去
  17 + *
15 * @param tenantId 租户编号 18 * @param tenantId 租户编号
16 * @param runnable 逻辑 19 * @param runnable 逻辑
17 */ 20 */
18 public static void execute(Long tenantId, Runnable runnable) { 21 public static void execute(Long tenantId, Runnable runnable) {
19 Long oldTenantId = TenantContextHolder.getTenantId(); 22 Long oldTenantId = TenantContextHolder.getTenantId();
  23 + Boolean oldIgnore = TenantContextHolder.isIgnore();
20 try { 24 try {
21 TenantContextHolder.setTenantId(tenantId); 25 TenantContextHolder.setTenantId(tenantId);
  26 + TenantContextHolder.setIgnore(false);
22 // 执行逻辑 27 // 执行逻辑
23 runnable.run(); 28 runnable.run();
24 } finally { 29 } finally {
25 TenantContextHolder.setTenantId(oldTenantId); 30 TenantContextHolder.setTenantId(oldTenantId);
  31 + TenantContextHolder.setIgnore(oldIgnore);
26 } 32 }
27 } 33 }
28 34
yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/resources/META-INF/spring.factories
1 org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ 1 org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
2 - cn.iocoder.yudao.framework.tenant.config.YudaoTenantDatabaseAutoConfiguration,\  
3 - cn.iocoder.yudao.framework.tenant.config.YudaoTenantWebAutoConfiguration,\  
4 - cn.iocoder.yudao.framework.tenant.config.YudaoTenantJobAutoConfiguration,\  
5 - cn.iocoder.yudao.framework.tenant.config.YudaoTenantMQAutoConfiguration,\  
6 - cn.iocoder.yudao.framework.tenant.config.YudaoTenantSecurityAutoConfiguration 2 + cn.iocoder.yudao.framework.tenant.config.YudaoTenantAutoConfiguration
yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/file/FileMapper.java
@@ -5,7 +5,6 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; @@ -5,7 +5,6 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; 5 import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
6 import cn.iocoder.yudao.module.infra.controller.admin.file.vo.FilePageReqVO; 6 import cn.iocoder.yudao.module.infra.controller.admin.file.vo.FilePageReqVO;
7 import cn.iocoder.yudao.module.infra.dal.dataobject.file.FileDO; 7 import cn.iocoder.yudao.module.infra.dal.dataobject.file.FileDO;
8 -import com.baomidou.mybatisplus.annotation.InterceptorIgnore;  
9 import org.apache.ibatis.annotations.Mapper; 8 import org.apache.ibatis.annotations.Mapper;
10 9
11 /** 10 /**
@@ -31,12 +30,10 @@ public interface FileMapper extends BaseMapperX&lt;FileDO&gt; { @@ -31,12 +30,10 @@ public interface FileMapper extends BaseMapperX&lt;FileDO&gt; {
31 /** 30 /**
32 * 基于 Path 获取文件 31 * 基于 Path 获取文件
33 * 实际上,是基于 ID 查询 32 * 实际上,是基于 ID 查询
34 - * 由于前端使用 <img /> 的方式获取图片,所以需要忽略租户的查询  
35 * 33 *
36 * @param path 路径 34 * @param path 路径
37 * @return 文件 35 * @return 文件
38 */ 36 */
39 - @InterceptorIgnore(tenantLine = "true")  
40 default FileDO selectByPath(String path) { 37 default FileDO selectByPath(String path) {
41 return selectById(path); 38 return selectById(path);
42 } 39 }
yudao-module-pay/yudao-module-pay-impl/src/main/java/cn/iocoder/yudao/module/pay/dal/mysql/merchant/PayChannelMapper.java
1 package cn.iocoder.yudao.module.pay.dal.mysql.merchant; 1 package cn.iocoder.yudao.module.pay.dal.mysql.merchant;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
4 import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; 5 import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
5 import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.channel.PayChannelExportReqVO; 6 import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.channel.PayChannelExportReqVO;
6 import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.channel.PayChannelPageReqVO; 7 import cn.iocoder.yudao.module.pay.controller.admin.merchant.vo.channel.PayChannelPageReqVO;
7 import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayChannelDO; 8 import cn.iocoder.yudao.module.pay.dal.dataobject.merchant.PayChannelDO;
8 -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;  
9 -import com.baomidou.mybatisplus.annotation.InterceptorIgnore;  
10 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 9 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
11 import org.apache.ibatis.annotations.Mapper; 10 import org.apache.ibatis.annotations.Mapper;
12 import org.apache.ibatis.annotations.Select; 11 import org.apache.ibatis.annotations.Select;
@@ -23,7 +22,6 @@ public interface PayChannelMapper extends BaseMapperX&lt;PayChannelDO&gt; { @@ -23,7 +22,6 @@ public interface PayChannelMapper extends BaseMapperX&lt;PayChannelDO&gt; {
23 } 22 }
24 23
25 @Select("SELECT id FROM pay_channel WHERE update_time > #{maxUpdateTime} LIMIT 1") 24 @Select("SELECT id FROM pay_channel WHERE update_time > #{maxUpdateTime} LIMIT 1")
26 - @InterceptorIgnore(tenantLine = "true") // 该方法忽略多租户。原因:该方法被异步 task 调用,此时获取不到租户编号  
27 Long selectExistsByUpdateTimeAfter(Date maxUpdateTime); 25 Long selectExistsByUpdateTimeAfter(Date maxUpdateTime);
28 26
29 default PageResult<PayChannelDO> selectPage(PayChannelPageReqVO reqVO) { 27 default PageResult<PayChannelDO> selectPage(PayChannelPageReqVO reqVO) {
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/DeptMapper.java
@@ -4,7 +4,6 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; @@ -4,7 +4,6 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
4 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; 4 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
5 import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptListReqVO; 5 import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptListReqVO;
6 import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO; 6 import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
7 -import com.baomidou.mybatisplus.annotation.InterceptorIgnore;  
8 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 7 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
9 import org.apache.ibatis.annotations.Mapper; 8 import org.apache.ibatis.annotations.Mapper;
10 import org.apache.ibatis.annotations.Select; 9 import org.apache.ibatis.annotations.Select;
@@ -30,12 +29,6 @@ public interface DeptMapper extends BaseMapperX&lt;DeptDO&gt; { @@ -30,12 +29,6 @@ public interface DeptMapper extends BaseMapperX&lt;DeptDO&gt; {
30 } 29 }
31 30
32 @Select("SELECT id FROM system_dept WHERE update_time > #{maxUpdateTime} LIMIT 1") 31 @Select("SELECT id FROM system_dept WHERE update_time > #{maxUpdateTime} LIMIT 1")
33 - @InterceptorIgnore(tenantLine = "true") // 该方法忽略多租户。原因:该方法被异步 task 调用,此时获取不到租户编号  
34 Long selectExistsByUpdateTimeAfter(Date maxUpdateTime); 32 Long selectExistsByUpdateTimeAfter(Date maxUpdateTime);
35 33
36 - // TODO 芋艿:后续想想,有没可能优化下。大体思路,是支持某个方法,忽略租户  
37 - @Select("SELECT * FROM system_dept")  
38 - @InterceptorIgnore(tenantLine = "true")  
39 - List<DeptDO> selectListIgnoreTenant();  
40 -  
41 } 34 }
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/MenuMapper.java
1 package cn.iocoder.yudao.module.system.dal.mysql.permission; 1 package cn.iocoder.yudao.module.system.dal.mysql.permission;
2 2
3 import cn.iocoder.yudao.framework.mybatis.core.enums.SqlConstants; 3 import cn.iocoder.yudao.framework.mybatis.core.enums.SqlConstants;
4 -import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuListReqVO;  
5 -import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO;  
6 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
7 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; 5 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
8 -import com.baomidou.mybatisplus.annotation.InterceptorIgnore; 6 +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuListReqVO;
  7 +import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO;
9 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 8 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
10 import org.apache.ibatis.annotations.Mapper; 9 import org.apache.ibatis.annotations.Mapper;
11 10
@@ -29,7 +28,6 @@ public interface MenuMapper extends BaseMapperX&lt;MenuDO&gt; { @@ -29,7 +28,6 @@ public interface MenuMapper extends BaseMapperX&lt;MenuDO&gt; {
29 .eqIfPresent(MenuDO::getStatus, reqVO.getStatus())); 28 .eqIfPresent(MenuDO::getStatus, reqVO.getStatus()));
30 } 29 }
31 30
32 - @InterceptorIgnore(tenantLine = "true") // 该方法忽略多租户。原因:该方法被异步 task 调用,此时获取不到租户编号  
33 default boolean selectExistsByUpdateTimeAfter(Date maxUpdateTime) { 31 default boolean selectExistsByUpdateTimeAfter(Date maxUpdateTime) {
34 return selectOne(new LambdaQueryWrapper<MenuDO>().select(MenuDO::getId) 32 return selectOne(new LambdaQueryWrapper<MenuDO>().select(MenuDO::getId)
35 .gt(MenuDO::getUpdateTime, maxUpdateTime).last(SqlConstants.LIMIT1)) != null; 33 .gt(MenuDO::getUpdateTime, maxUpdateTime).last(SqlConstants.LIMIT1)) != null;
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/RoleMenuMapper.java
@@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.system.dal.mysql.permission; @@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.system.dal.mysql.permission;
2 2
3 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 3 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
4 import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleMenuDO; 4 import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleMenuDO;
5 -import com.baomidou.mybatisplus.annotation.InterceptorIgnore;  
6 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 5 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
7 import org.apache.ibatis.annotations.Mapper; 6 import org.apache.ibatis.annotations.Mapper;
8 import org.apache.ibatis.annotations.Select; 7 import org.apache.ibatis.annotations.Select;
@@ -44,7 +43,6 @@ public interface RoleMenuMapper extends BaseMapperX&lt;RoleMenuDO&gt; { @@ -44,7 +43,6 @@ public interface RoleMenuMapper extends BaseMapperX&lt;RoleMenuDO&gt; {
44 } 43 }
45 44
46 @Select("SELECT id FROM system_role_menu WHERE update_time > #{maxUpdateTime} LIMIT 1") 45 @Select("SELECT id FROM system_role_menu WHERE update_time > #{maxUpdateTime} LIMIT 1")
47 - @InterceptorIgnore(tenantLine = "true") // 该方法忽略多租户。原因:该方法被异步 task 调用,此时获取不到租户编号  
48 Long selectExistsByUpdateTimeAfter(Date maxUpdateTime); 46 Long selectExistsByUpdateTimeAfter(Date maxUpdateTime);
49 47
50 } 48 }
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SmsChannelMapper.java
1 package cn.iocoder.yudao.module.system.dal.mysql.sms; 1 package cn.iocoder.yudao.module.system.dal.mysql.sms;
2 2
3 -import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.SmsChannelPageReqVO;  
4 -import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsChannelDO;  
5 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
7 import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; 5 import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
8 -import com.baomidou.mybatisplus.annotation.InterceptorIgnore; 6 +import cn.iocoder.yudao.module.system.controller.admin.sms.vo.channel.SmsChannelPageReqVO;
  7 +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsChannelDO;
9 import org.apache.ibatis.annotations.Mapper; 8 import org.apache.ibatis.annotations.Mapper;
10 import org.apache.ibatis.annotations.Select; 9 import org.apache.ibatis.annotations.Select;
11 10
@@ -23,7 +22,6 @@ public interface SmsChannelMapper extends BaseMapperX&lt;SmsChannelDO&gt; { @@ -23,7 +22,6 @@ public interface SmsChannelMapper extends BaseMapperX&lt;SmsChannelDO&gt; {
23 } 22 }
24 23
25 @Select("SELECT id FROM system_sms_channel WHERE update_time > #{maxUpdateTime} LIMIT 1") 24 @Select("SELECT id FROM system_sms_channel WHERE update_time > #{maxUpdateTime} LIMIT 1")
26 - @InterceptorIgnore(tenantLine = "true") // 该方法忽略多租户。原因:该方法被异步 task 调用,此时获取不到租户编号  
27 Long selectExistsByUpdateTimeAfter(Date maxUpdateTime); 25 Long selectExistsByUpdateTimeAfter(Date maxUpdateTime);
28 26
29 } 27 }
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/sms/SmsTemplateMapper.java
1 package cn.iocoder.yudao.module.system.dal.mysql.sms; 1 package cn.iocoder.yudao.module.system.dal.mysql.sms;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
4 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; 5 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
5 import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplateExportReqVO; 6 import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplateExportReqVO;
6 import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplatePageReqVO; 7 import cn.iocoder.yudao.module.system.controller.admin.sms.vo.template.SmsTemplatePageReqVO;
7 import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsTemplateDO; 8 import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsTemplateDO;
8 -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;  
9 -import com.baomidou.mybatisplus.annotation.InterceptorIgnore;  
10 import org.apache.ibatis.annotations.Mapper; 9 import org.apache.ibatis.annotations.Mapper;
11 import org.apache.ibatis.annotations.Select; 10 import org.apache.ibatis.annotations.Select;
12 11
@@ -17,7 +16,6 @@ import java.util.List; @@ -17,7 +16,6 @@ import java.util.List;
17 public interface SmsTemplateMapper extends BaseMapperX<SmsTemplateDO> { 16 public interface SmsTemplateMapper extends BaseMapperX<SmsTemplateDO> {
18 17
19 @Select("SELECT id FROM system_sms_template WHERE update_time > #{maxUpdateTime} LIMIT 1") 18 @Select("SELECT id FROM system_sms_template WHERE update_time > #{maxUpdateTime} LIMIT 1")
20 - @InterceptorIgnore(tenantLine = "true") // 该方法忽略多租户。原因:该方法被异步 task 调用,此时获取不到租户编号  
21 Long selectExistsByUpdateTimeAfter(Date maxUpdateTime); 19 Long selectExistsByUpdateTimeAfter(Date maxUpdateTime);
22 20
23 default SmsTemplateDO selectByCode(String code) { 21 default SmsTemplateDO selectByCode(String code) {