|
@@ -1,17 +1,40 @@
|
|
|
package com.coffee.framework.config.mybatisplus;
|
|
package com.coffee.framework.config.mybatisplus;
|
|
|
|
|
|
|
|
|
|
+import cn.hutool.core.collection.CollectionUtil;
|
|
|
|
|
+import cn.hutool.core.io.FileUtil;
|
|
|
|
|
+import cn.hutool.core.util.ClassUtil;
|
|
|
|
|
+import cn.hutool.core.util.ObjectUtil;
|
|
|
|
|
+import cn.hutool.core.util.StrUtil;
|
|
|
import com.baomidou.mybatisplus.annotation.DbType;
|
|
import com.baomidou.mybatisplus.annotation.DbType;
|
|
|
|
|
+import com.baomidou.mybatisplus.annotation.TableName;
|
|
|
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
|
|
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
|
|
|
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
|
|
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
|
|
|
|
|
+import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
|
|
|
import com.baomidou.mybatisplus.extension.plugins.inner.DataPermissionInterceptor;
|
|
import com.baomidou.mybatisplus.extension.plugins.inner.DataPermissionInterceptor;
|
|
|
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
|
|
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
|
|
|
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
|
|
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
|
|
|
|
|
+import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
|
|
|
|
|
+import com.coffee.common.entity.TenantGenericEntity;
|
|
|
import com.coffee.framework.config.mybatisplus.handler.CreateAndUpdateMetaObjectHandler;
|
|
import com.coffee.framework.config.mybatisplus.handler.CreateAndUpdateMetaObjectHandler;
|
|
|
import com.coffee.framework.config.mybatisplus.handler.CustomDataPermissionHandler;
|
|
import com.coffee.framework.config.mybatisplus.handler.CustomDataPermissionHandler;
|
|
|
|
|
+import lombok.AllArgsConstructor;
|
|
|
|
|
+import net.sf.jsqlparser.expression.Expression;
|
|
|
|
|
+import net.sf.jsqlparser.expression.StringValue;
|
|
|
|
|
+import net.sf.jsqlparser.schema.Column;
|
|
|
import org.mybatis.spring.annotation.MapperScan;
|
|
import org.mybatis.spring.annotation.MapperScan;
|
|
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
|
+import org.springframework.context.ApplicationContext;
|
|
|
import org.springframework.context.annotation.Bean;
|
|
import org.springframework.context.annotation.Bean;
|
|
|
import org.springframework.context.annotation.Configuration;
|
|
import org.springframework.context.annotation.Configuration;
|
|
|
|
|
+import org.springframework.core.io.Resource;
|
|
|
import org.springframework.transaction.annotation.EnableTransactionManagement;
|
|
import org.springframework.transaction.annotation.EnableTransactionManagement;
|
|
|
|
|
+import org.springframework.web.context.request.RequestContextHolder;
|
|
|
|
|
+import org.springframework.web.context.request.ServletRequestAttributes;
|
|
|
|
|
+
|
|
|
|
|
+import javax.annotation.PostConstruct;
|
|
|
|
|
+import java.io.IOException;
|
|
|
|
|
+import java.util.*;
|
|
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* mybatis-plus配置类
|
|
* mybatis-plus配置类
|
|
@@ -20,9 +43,39 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
|
|
|
*/
|
|
*/
|
|
|
@EnableTransactionManagement(proxyTargetClass = true)
|
|
@EnableTransactionManagement(proxyTargetClass = true)
|
|
|
@Configuration
|
|
@Configuration
|
|
|
-@MapperScan("${mybatis-plus.mapperPackage}")
|
|
|
|
|
|
|
+@MapperScan({"${mybatis-plus.mapperPackage}","com.coffee.framework.test.mapper"})
|
|
|
public class MybatisPlusConfig {
|
|
public class MybatisPlusConfig {
|
|
|
|
|
|
|
|
|
|
+ private final TenantIdManager tenantIdManager;
|
|
|
|
|
+
|
|
|
|
|
+ private final List<Class<?>> tableClass;
|
|
|
|
|
+
|
|
|
|
|
+ private Set<String> ignoreTableName;
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ public MybatisPlusConfig(TenantIdManager tenantIdManager) {
|
|
|
|
|
+ this.tenantIdManager=tenantIdManager;
|
|
|
|
|
+ Set<Class<?>> classes = ClassUtil.scanPackage("com.coffee");
|
|
|
|
|
+ //找到所有@TableName修饰的类
|
|
|
|
|
+ tableClass = classes.stream().filter(aClass -> ObjectUtil.isNotNull(aClass.getAnnotation(TableName.class))).collect(Collectors.toList());
|
|
|
|
|
+ if (CollectionUtil.isNotEmpty(tableClass)) {
|
|
|
|
|
+ ignoreTableName =
|
|
|
|
|
+ tableClass
|
|
|
|
|
+ .stream()
|
|
|
|
|
+ .filter(aClass -> aClass.getSuperclass() == TenantGenericEntity.class)
|
|
|
|
|
+ .map(aClass -> {
|
|
|
|
|
+ TableName tableName = aClass.getAnnotation(TableName.class);
|
|
|
|
|
+ return tableName.value();
|
|
|
|
|
+ })
|
|
|
|
|
+ .collect(Collectors.toSet());
|
|
|
|
|
+ }
|
|
|
|
|
+ ignoreTableName = Optional.ofNullable(ignoreTableName).orElse(new HashSet<>());
|
|
|
|
|
+ ignoreTableName.addAll(classes
|
|
|
|
|
+ .stream()
|
|
|
|
|
+ .filter(aClass -> ObjectUtil.isNull(aClass.getAnnotation(TableName.class)))
|
|
|
|
|
+ .map(aClass -> StrUtil.toUnderlineCase(aClass.getSimpleName()))
|
|
|
|
|
+ .collect(Collectors.toSet()));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
@Bean
|
|
@Bean
|
|
|
public MybatisPlusInterceptor mybatisPlusInterceptor() {
|
|
public MybatisPlusInterceptor mybatisPlusInterceptor() {
|
|
|
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
|
|
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
|
|
@@ -32,6 +85,8 @@ public class MybatisPlusConfig {
|
|
|
interceptor.addInnerInterceptor(paginationInnerInterceptor());
|
|
interceptor.addInnerInterceptor(paginationInnerInterceptor());
|
|
|
// 乐观锁插件
|
|
// 乐观锁插件
|
|
|
interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor());
|
|
interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor());
|
|
|
|
|
+ //多租户插件
|
|
|
|
|
+ interceptor.addInnerInterceptor(tenantLineInnerInterceptor());
|
|
|
return interceptor;
|
|
return interceptor;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -64,6 +119,40 @@ public class MybatisPlusConfig {
|
|
|
return new OptimisticLockerInnerInterceptor();
|
|
return new OptimisticLockerInnerInterceptor();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 多租户插件
|
|
|
|
|
+ */
|
|
|
|
|
+ public TenantLineInnerInterceptor tenantLineInnerInterceptor() {
|
|
|
|
|
+ TenantLineInnerInterceptor tenantInterceptor = new TenantLineInnerInterceptor();
|
|
|
|
|
+ tenantInterceptor.setTenantLineHandler(new TenantLineHandler() {
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public Expression getTenantId() {
|
|
|
|
|
+ return new StringValue(tenantIdManager.getCurrentTenantId());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public String getTenantIdColumn() {
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public boolean ignoreTable(String tableName) {
|
|
|
|
|
+ ServletRequestAttributes request = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
|
|
|
|
|
+ //非用户请求,即来自程序自身,则忽略
|
|
|
|
|
+ if(request==null){
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
|
|
+ return CollectionUtil.isEmpty(ignoreTableName)||ignoreTableName.contains(tableName);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public boolean ignoreInsert(List<Column> columns, String tenantIdColumn) {
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ return tenantInterceptor;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* 元对象字段填充控制器
|
|
* 元对象字段填充控制器
|
|
|
*/
|
|
*/
|