Browse Source

修复 多租户无法兼容问题
删除 冗余代码
新增 自动填充租户字段
修改 将公共组件移入 framework模块中

18339543638 2 years ago
parent
commit
5593ff1c01
34 changed files with 293 additions and 180 deletions
  1. 14 0
      tr-dependencies/pom.xml
  2. 25 0
      tr-framework/src/main/java/cn/tr/core/annotation/ColumnDefaultValue.java
  3. 1 1
      tr-framework/src/main/java/cn/tr/core/constant/AuthConstant.java
  4. 8 3
      tr-framework/src/main/java/cn/tr/core/constant/MybatisConstant.java
  5. 3 14
      tr-framework/src/main/java/cn/tr/core/strategy/LoginUserStrategy.java
  6. 0 26
      tr-framework/src/main/java/cn/tr/core/strategy/TenantStrategy.java
  7. 1 1
      tr-framework/src/main/java/cn/tr/core/strategy/auth/ILoginUser.java
  8. 1 1
      tr-modules/tr-module-auth/src/main/java/cn/tr/module/auth/config/FillUserAccountConfig.java
  9. 1 1
      tr-modules/tr-module-auth/src/main/java/cn/tr/module/auth/controller/AuthController.java
  10. 1 2
      tr-modules/tr-module-auth/src/main/java/cn/tr/module/auth/controller/CurrentUserController.java
  11. 4 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/operatelog/dto/query/SysOpeLogQueryDTO.java
  12. 3 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/operatelog/po/SysOperLogPO.java
  13. 4 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/operatelog/service/SysOperLogServiceImpl.java
  14. 1 1
      tr-plugins/tr-spring-boot-starter-plugin-biz-data-permission/src/test/java/cn/tr/plugin/biz/data/permission/config/db/TrDataPermissionHandlerTest.java
  15. 30 24
      tr-plugins/tr-spring-boot-starter-plugin-biz-tenant/src/main/java/cn/tr/plugin/biz/tenant/TrTenantAutoConfiguration.java
  16. 0 17
      tr-plugins/tr-spring-boot-starter-plugin-biz-tenant/src/main/java/cn/tr/plugin/biz/tenant/config/TenantStrategyConfig.java
  17. 59 0
      tr-plugins/tr-spring-boot-starter-plugin-biz-tenant/src/main/java/cn/tr/plugin/biz/tenant/config/db/TenantCreateAndUpdateMetaObjectHandler.java
  18. 2 2
      tr-plugins/tr-spring-boot-starter-plugin-biz-tenant/src/main/java/cn/tr/plugin/biz/tenant/config/db/TenantDatabaseInterceptor.java
  19. 9 7
      tr-plugins/tr-spring-boot-starter-plugin-biz-tenant/src/main/java/cn/tr/plugin/biz/tenant/config/ignore/TenantIgnoreUrlConfig.java
  20. 2 2
      tr-plugins/tr-spring-boot-starter-plugin-biz-tenant/src/main/java/cn/tr/plugin/biz/tenant/config/secutiry/TenantSecurityWebFilter.java
  21. 3 4
      tr-plugins/tr-spring-boot-starter-plugin-biz-tenant/src/main/java/cn/tr/plugin/biz/tenant/config/web/TenantContextWebFilter.java
  22. 3 2
      tr-plugins/tr-spring-boot-starter-plugin-biz-tenant/src/main/java/cn/tr/plugin/biz/tenant/properties/TenantProperties.java
  23. 0 22
      tr-plugins/tr-spring-boot-starter-plugin-eventbus/src/main/java/cn/tr/plugin/eventbus/config/register/SubscribeRegisterCenter.java
  24. 3 0
      tr-plugins/tr-spring-boot-starter-plugin-mp-enhance-actable/src/main/java/cn/tr/plugin/mp/enhance/actable/ActableAutoConfiguration.java
  25. 5 0
      tr-plugins/tr-spring-boot-starter-plugin-mp-enhance-actable/src/main/java/cn/tr/plugin/mp/enhance/actable/utils/ColumnUtils.java
  26. 6 0
      tr-plugins/tr-spring-boot-starter-plugin-mybatis/pom.xml
  27. 10 3
      tr-plugins/tr-spring-boot-starter-plugin-mybatis/src/main/java/cn/tr/plugin/mybatis/TrMybatisAutoConfiguration.java
  28. 1 1
      tr-plugins/tr-spring-boot-starter-plugin-mybatis/src/main/java/cn/tr/plugin/mybatis/config/handler/CreateAndUpdateMetaObjectHandler.java
  29. 1 1
      tr-plugins/tr-spring-boot-starter-plugin-mybatis/src/main/java/cn/tr/plugin/mybatis/context/PageContextHolder.java
  30. 7 0
      tr-plugins/tr-spring-boot-starter-plugin-mybatis/src/main/java/cn/tr/plugin/mybatis/pojo/BasePO.java
  31. 35 43
      tr-plugins/tr-spring-boot-starter-plugin-satoken/src/main/java/cn/tr/plugin/security/config/LoginUserStrategyConfig.java
  32. 2 0
      tr-plugins/tr-spring-boot-starter-plugin-web/src/main/java/cn/tr/plugin/web/config/jackson/mapper/core/ObjectMapperConfig.java
  33. 10 1
      tr-test/pom.xml
  34. 38 0
      tr-test/src/main/java/cn/tr/test/WebApplication.java

+ 14 - 0
tr-dependencies/pom.xml

@@ -349,6 +349,20 @@
                 <version>${revision}</version>
             </dependency>
 
+            <!--租户插件-->
+            <dependency>
+                <groupId>cn.tr</groupId>
+                <artifactId>tr-spring-boot-starter-plugin-biz-tenant</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
+            <!--表格插件-->
+            <dependency>
+                <groupId>cn.tr</groupId>
+                <artifactId>tr-spring-boot-starter-plugin-biz-excel</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
             <!--websocket插件-->
             <dependency>
                 <groupId>cn.tr</groupId>

+ 25 - 0
tr-framework/src/main/java/cn/tr/core/annotation/ColumnDefaultValue.java

@@ -0,0 +1,25 @@
+package cn.tr.core.annotation;
+
+import java.lang.annotation.*;
+
+
+/**
+ * 字段的默认值
+ *
+ * @author sunchenbin
+ * @version 2020年11月09日 下午6:13:37
+ */
+// 该注解用于方法声明
+@Target(ElementType.FIELD)
+// VM将在运行期也保留注释,因此可以通过反射机制读取注解的信息
+@Retention(RetentionPolicy.RUNTIME)
+// 将此注解包含在javadoc中
+@Documented
+public @interface ColumnDefaultValue {
+
+	/**
+	 * 字段的默认值
+	 * @return 字段的默认值
+	 */
+	String value();
+}

+ 1 - 1
tr-modules/tr-module-auth/src/main/java/cn/tr/module/auth/constant/AuthConstant.java → tr-framework/src/main/java/cn/tr/core/constant/AuthConstant.java

@@ -1,4 +1,4 @@
-package cn.tr.module.auth.constant;
+package cn.tr.core.constant;
 
 /**
  * @Interface : AuthConstant

+ 8 - 3
tr-plugins/tr-spring-boot-starter-plugin-mybatis/src/main/java/cn/tr/plugin/mybatis/constant/MybatisConstant.java → tr-framework/src/main/java/cn/tr/core/constant/MybatisConstant.java

@@ -1,4 +1,4 @@
-package cn.tr.plugin.mybatis.constant;
+package cn.tr.core.constant;
 
 /**
  * @ClassName : MybatisConstant
@@ -19,11 +19,16 @@ public class MybatisConstant {
     /**
      * 创建人字段名称
      */
-    public static final String CREATE_BY = "createBy";
+    public static final String CREATE_BY = "creator";
     /**
      * 更新人字段名称
      */
-    public static final String UPDATE_BY = "updateBy";
+    public static final String UPDATE_BY = "updater";
+
+    /**
+     * 租户id字段名称
+     */
+    public static final String TENANT_ID = "tenantId";
 
     /**
      * 分页信息缓存

+ 3 - 14
tr-framework/src/main/java/cn/tr/core/strategy/LoginUserStrategy.java

@@ -2,6 +2,7 @@ package cn.tr.core.strategy;
 
 
 import cn.tr.core.pojo.LoginResult;
+import cn.tr.core.strategy.auth.ILoginUser;
 
 import java.util.function.Function;
 import java.util.function.Supplier;
@@ -20,24 +21,12 @@ public class LoginUserStrategy {
 
     public static LoginUserStrategy tr =new LoginUserStrategy();
 
-    public Supplier<? extends  ILoginUser> loginUserSupplier;
+    public Supplier<? extends ILoginUser> loginUserSupplier;
 
     /**
      * 当前地址是否允许匿名登录,默认不允许
      */
-    public Supplier<Boolean> anonymousLoginSupplier=()->false;
-
-    /**
-     * 用户登录返回token
-     */
-    public Function<? super ILoginUser, LoginResult> loginTokenSupplier=loginUser -> new LoginResult();
-
-    public LoginResult login(ILoginUser loginUser){
-        if(loginTokenSupplier==null){
-            throw new RuntimeException("LoginUserStrategy.loginTokenSupplier is null");
-        }
-        return loginTokenSupplier.apply(loginUser);
-    }
+    public Supplier<Boolean> anonymousLoginSupplier=()->true;
 
     public String getCurrentUserId(){
         return loginUserSupplier==null?null:loginUserSupplier.get().getUserId();

+ 0 - 26
tr-framework/src/main/java/cn/tr/core/strategy/TenantStrategy.java

@@ -1,26 +0,0 @@
-package cn.tr.core.strategy;
-
-import javax.servlet.http.HttpServletRequest;
-import java.util.function.Function;
-
-/**
- * @ClassName : TenantStrategy
- * @Description : 租户策略
- * @Author : LF
- * @Date: 2023年02月21日
- */
-
-public class TenantStrategy {
-    private TenantStrategy(){
-
-    }
-
-    public static TenantStrategy tr=new TenantStrategy();
-
-    public Function<HttpServletRequest,String> tenantIdSupplier;
-
-    public String getTenantId(HttpServletRequest request){
-        return tenantIdSupplier==null?null:tenantIdSupplier.apply(request);
-    }
-
-}

+ 1 - 1
tr-framework/src/main/java/cn/tr/core/strategy/ILoginUser.java → tr-framework/src/main/java/cn/tr/core/strategy/auth/ILoginUser.java

@@ -1,4 +1,4 @@
-package cn.tr.core.strategy;
+package cn.tr.core.strategy.auth;
 
 /**
  * @ClassName : ILoginUser

+ 1 - 1
tr-modules/tr-module-auth/src/main/java/cn/tr/module/auth/config/FillUserAccountConfig.java

@@ -2,7 +2,7 @@ package cn.tr.module.auth.config;
 
 import cn.tr.core.enums.WebFilterOrderEnum;
 import cn.tr.core.strategy.auth.bo.UserAccountInfoBO;
-import cn.tr.module.auth.constant.AuthConstant;
+import cn.tr.core.constant.AuthConstant;
 import cn.tr.plugin.security.bo.LoginUserBO;
 import cn.tr.plugin.security.context.LoginUserContextHolder;
 import cn.tr.plugin.security.utils.SaTokenUtils;

+ 1 - 1
tr-modules/tr-module-auth/src/main/java/cn/tr/module/auth/controller/AuthController.java

@@ -5,7 +5,7 @@ import cn.tr.core.exception.TRExcCode;
 import cn.tr.core.pojo.CommonResult;
 import cn.tr.core.strategy.auth.AuthStrategy;
 import cn.tr.core.strategy.auth.bo.UserAccountInfoBO;
-import cn.tr.module.auth.constant.AuthConstant;
+import cn.tr.core.constant.AuthConstant;
 import cn.tr.module.auth.controller.vo.AuthInfoVO;
 import cn.tr.core.strategy.auth.bo.AuthenticationDTO;
 import cn.tr.core.strategy.auth.UserOperator;

+ 1 - 2
tr-modules/tr-module-auth/src/main/java/cn/tr/module/auth/controller/CurrentUserController.java

@@ -1,10 +1,9 @@
 package cn.tr.module.auth.controller;
 
-import cn.dev33.satoken.annotation.SaIgnore;
 import cn.tr.core.pojo.CommonResult;
 import cn.tr.core.strategy.auth.bo.UserAccountInfoBO;
 import cn.tr.module.auth.bo.UserInfoInTokenBO;
-import cn.tr.module.auth.constant.AuthConstant;
+import cn.tr.core.constant.AuthConstant;
 import cn.tr.plugin.security.utils.SaTokenUtils;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;

+ 4 - 1
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/operatelog/dto/query/SysOpeLogQueryDTO.java

@@ -2,6 +2,8 @@ package cn.tr.module.sys.operatelog.dto.query;
 
 import lombok.Data;
 
+import java.io.Serializable;
+
 /**
  * @ClassName : SysOpeLogQueryDTO
  * @Description :
@@ -9,5 +11,6 @@ import lombok.Data;
  * @Date: 2023年03月24日
  */
 @Data
-public class SysOpeLogQueryDTO {
+public class SysOpeLogQueryDTO implements Serializable {
+    private static final long serialVersionUID = -4279171934716001840L;
 }

+ 3 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/operatelog/po/SysOperLogPO.java

@@ -9,6 +9,8 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.ToString;
+import org.apache.ibatis.type.JdbcType;
+
 import java.util.Date;
 
 /**
@@ -137,5 +139,6 @@ public class SysOperLogPO extends BasePO {
      */
     @ApiModelProperty("响应数据")
     @Comment("响应数据")
+    @TableField(jdbcType = JdbcType.LONGVARCHAR)
     private String resultData;
 }

+ 4 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/operatelog/service/SysOperLogServiceImpl.java

@@ -3,7 +3,9 @@ package cn.tr.module.sys.operatelog.service;
 import cn.tr.module.sys.mapper.OperLogMapper;
 import cn.tr.module.sys.operatelog.dto.SysOperLogDTO;
 import cn.tr.module.sys.operatelog.dto.query.SysOpeLogQueryDTO;
+import cn.tr.module.sys.operatelog.po.SysOperLogPO;
 import cn.tr.module.sys.operatelog.repository.SysOperLogRepository;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -24,6 +26,8 @@ public class SysOperLogServiceImpl implements ISysOperLogService{
     private final SysOperLogRepository logRepository;
     @Override
     public List<SysOperLogDTO> selectOperLogDataList(SysOpeLogQueryDTO query) {
+        List<SysOperLogPO> sysOperLogPOS = logRepository.selectList(new QueryWrapper<>());
+
         return null;
     }
 

+ 1 - 1
tr-plugins/tr-spring-boot-starter-plugin-biz-data-permission/src/test/java/cn/tr/plugin/biz/data/permission/config/db/TrDataPermissionHandlerTest.java

@@ -2,7 +2,7 @@ package cn.tr.plugin.biz.data.permission.config.db;
 
 import cn.hutool.core.util.ReflectUtil;
 import cn.tr.core.strategy.DeptDataPermissionStrategy;
-import cn.tr.core.strategy.ILoginUser;
+import cn.tr.core.strategy.auth.ILoginUser;
 import cn.tr.core.strategy.LoginUserStrategy;
 import cn.tr.plugin.biz.data.permission.config.rule.DataPermissionRuleFactory;
 import cn.tr.plugin.biz.data.permission.config.rule.dept.DeptDataPermissionRule;

+ 30 - 24
tr-plugins/tr-spring-boot-starter-plugin-biz-tenant/src/main/java/cn/tr/plugin/biz/tenant/TrTenantAutoConfiguration.java

@@ -1,23 +1,26 @@
 package cn.tr.plugin.biz.tenant;
 
 import cn.tr.core.enums.WebFilterOrderEnum;
-import cn.tr.plugin.biz.tenant.config.TenantStrategyConfig;
 import cn.tr.plugin.biz.tenant.config.aop.TenantIgnoreAspect;
+import cn.tr.plugin.biz.tenant.config.db.TenantCreateAndUpdateMetaObjectHandler;
 import cn.tr.plugin.biz.tenant.config.db.TenantDatabaseInterceptor;
 import cn.tr.plugin.biz.tenant.config.ignore.TenantIgnoreUrlConfig;
 import cn.tr.plugin.biz.tenant.config.secutiry.TenantSecurityWebFilter;
 import cn.tr.plugin.biz.tenant.config.service.TenantFrameworkService;
 import cn.tr.plugin.biz.tenant.config.web.TenantContextWebFilter;
 import cn.tr.plugin.biz.tenant.properties.TenantProperties;
-import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
-import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor;
+import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
 import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
+import org.springframework.beans.BeansException;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.config.BeanPostProcessor;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
 import org.springframework.boot.web.servlet.FilterRegistrationBean;
 import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.context.annotation.Primary;
 import org.springframework.web.SpringServletContainerInitializer;
 import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
 
@@ -31,12 +34,23 @@ import java.util.*;
  */
 @ConditionalOnProperty(prefix = "tr.tenant", value = "enable", matchIfMissing = true)
 @EnableConfigurationProperties(TenantProperties.class)
-public class TrTenantAutoConfiguration {
-    @Bean
-    public TenantStrategyConfig tenantStrategyConfig(){
-        return new TenantStrategyConfig();
-    }
+public class TrTenantAutoConfiguration implements BeanPostProcessor {
 
+    @Override
+    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
+        if(bean.getClass()==TenantProperties.class){
+            TenantProperties properties= (TenantProperties) bean;
+            properties.getIgnoreUrls()
+                    .addAll(Arrays.asList("/actuator/**",
+                            "/druid/**",
+                            "/favicon.ico",
+                            "/**.html",
+                            "/**/*.html",
+                            "/error","/swagger-resources/**","/swagger-ui/**","/webjars/**","/v2/api-docs/*","/v2/api-docs","/v1/**"));
+
+        }
+        return bean;
+    }
     // ========== AOP ==========
     @Bean
     public TenantIgnoreAspect tenantIgnoreAspect() {
@@ -45,26 +59,18 @@ public class TrTenantAutoConfiguration {
 
     // ========== DB ==========
     @Bean
-    @ConditionalOnClass(MybatisPlusInterceptor.class)
-    public TenantLineInnerInterceptor tenantLineInnerInterceptor(TenantProperties properties,
-                                                                 MybatisPlusInterceptor interceptor) {
+    @Lazy
+    public TenantLineInnerInterceptor tenantLineInnerInterceptor(TenantProperties properties) {
         TenantLineInnerInterceptor inner = new TenantLineInnerInterceptor(new TenantDatabaseInterceptor(properties));
         // 添加到 interceptor 中
         // 需要加在首个,主要是为了在分页插件前面。这个是 MyBatis Plus 的规定
-        addInterceptor(interceptor,inner,0);
         return inner;
     }
 
     @Bean
-    @ConditionalOnClass(MybatisPlusInterceptor.class)
-    public MybatisPlusInterceptor mybatisPlusInterceptor(){
-        return new MybatisPlusInterceptor();
-    }
-
-    private void addInterceptor(MybatisPlusInterceptor interceptor, InnerInterceptor inner, int index) {
-        List<InnerInterceptor> inners = new ArrayList<>(interceptor.getInterceptors());
-        inners.add(index, inner);
-        interceptor.setInterceptors(inners);
+    @Primary
+    public MetaObjectHandler tenantCreateAndUpdateMetaObjectHandler(){
+        return new TenantCreateAndUpdateMetaObjectHandler();
     }
 
     // ========== Security ==========
@@ -88,9 +94,9 @@ public class TrTenantAutoConfiguration {
         return registrationBean;
     }
 
-    @Bean
-    public TenantIgnoreUrlConfig ignoreConfig(RequestMappingHandlerMapping handlerMapping, TenantProperties tenantProperties){
-        return new TenantIgnoreUrlConfig(handlerMapping,tenantProperties);
+    @Bean(initMethod = "init")
+    public TenantIgnoreUrlConfig ignoreConfig(List<RequestMappingHandlerMapping> handlerMappings, TenantProperties tenantProperties){
+        return new TenantIgnoreUrlConfig(handlerMappings,tenantProperties);
     }
 
 }

+ 0 - 17
tr-plugins/tr-spring-boot-starter-plugin-biz-tenant/src/main/java/cn/tr/plugin/biz/tenant/config/TenantStrategyConfig.java

@@ -1,17 +0,0 @@
-package cn.tr.plugin.biz.tenant.config;
-
-import cn.tr.core.strategy.TenantStrategy;
-import cn.tr.core.utils.ServletUtils;
-
-/**
- * @ClassName : TenantStrategyConfig
- * @Description :
- * @Author : LF
- * @Date: 2023年02月22日
- */
-
-public class TenantStrategyConfig {
-    {
-        TenantStrategy.tr.tenantIdSupplier=request -> ServletUtils.getHeader("Tenant-Id");
-    }
-}

+ 59 - 0
tr-plugins/tr-spring-boot-starter-plugin-biz-tenant/src/main/java/cn/tr/plugin/biz/tenant/config/db/TenantCreateAndUpdateMetaObjectHandler.java

@@ -0,0 +1,59 @@
+package cn.tr.plugin.biz.tenant.config.db;
+
+import cn.tr.core.strategy.LoginUserStrategy;
+import cn.tr.core.constant.MybatisConstant;
+import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.ibatis.reflection.MetaObject;
+
+import java.util.Date;
+
+/**
+ * MP注入处理器
+ *
+ * @author Kevin
+ */
+@Slf4j
+public class TenantCreateAndUpdateMetaObjectHandler implements MetaObjectHandler {
+
+
+    @Override
+    public void insertFill(MetaObject metaObject) {
+        try {
+            String localUserId = LoginUserStrategy.tr.getCurrentUserId();
+            String tenantId = LoginUserStrategy.tr.getTenantId();
+            if (metaObject.hasGetter(MybatisConstant.CREATE_TIME) && metaObject.getValue(MybatisConstant.CREATE_TIME) == null) {
+                this.strictInsertFill(metaObject,MybatisConstant. CREATE_TIME, Date.class, new Date());
+            }
+            if (metaObject.hasGetter(MybatisConstant.CREATE_BY) && metaObject.getValue(MybatisConstant.CREATE_BY) == null) {
+
+                this.strictInsertFill(metaObject, MybatisConstant.CREATE_BY, String.class,localUserId);
+            }
+            if (metaObject.hasGetter(MybatisConstant.TENANT_ID) && metaObject.getValue(MybatisConstant.TENANT_ID) == null) {
+
+                this.strictInsertFill(metaObject, MybatisConstant.TENANT_ID, String.class,tenantId);
+            }
+            updateFill(metaObject);
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.warn("CreateAndUpdateMetaObjectHandler insertFill confront a error,{}",e.getMessage());
+        }
+    }
+
+    @Override
+    public void updateFill(MetaObject metaObject) {
+        try {
+            String localUserId = LoginUserStrategy.tr.getCurrentUserId();
+            if (metaObject.hasGetter(MybatisConstant.UPDATE_TIME) ) {
+                this.strictUpdateFill(metaObject, MybatisConstant.UPDATE_TIME, Date.class, new Date());
+            }
+            if (metaObject.hasGetter(MybatisConstant.UPDATE_BY) ) {
+                this.strictUpdateFill(metaObject,MybatisConstant. UPDATE_BY, String.class,localUserId);
+            }
+        } catch (Exception e) {
+            log.warn("CreateAndUpdateMetaObjectHandler updateFill confront a error,{}",e.getMessage());
+        }
+    }
+
+
+}

+ 2 - 2
tr-plugins/tr-spring-boot-starter-plugin-biz-tenant/src/main/java/cn/tr/plugin/biz/tenant/config/db/TenantDatabaseInterceptor.java

@@ -2,7 +2,7 @@ package cn.tr.plugin.biz.tenant.config.db;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
-import cn.tr.core.strategy.TenantStrategy;
+import cn.tr.core.strategy.LoginUserStrategy;
 import cn.tr.core.utils.ServletUtils;
 import cn.tr.plugin.biz.tenant.context.TenantContextHolder;
 import cn.tr.plugin.biz.tenant.properties.TenantProperties;
@@ -44,7 +44,7 @@ public class TenantDatabaseInterceptor implements TenantLineHandler {
                 TenantContextHolder.setIgnore(false);
             }
         }
-        return new StringValue(TenantStrategy.tr.getTenantId(request));
+        return new StringValue(LoginUserStrategy.tr.getTenantId());
     }
 
     @Override

+ 9 - 7
tr-plugins/tr-spring-boot-starter-plugin-biz-tenant/src/main/java/cn/tr/plugin/biz/tenant/config/ignore/TenantIgnoreUrlConfig.java

@@ -12,9 +12,7 @@ import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
 import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
 
 import java.lang.annotation.Annotation;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 
 /**
  * @ClassName : TenantIgnoreUrlConfig
@@ -24,11 +22,15 @@ import java.util.Set;
  */
 @AllArgsConstructor
 @Slf4j
-public class TenantIgnoreUrlConfig implements CommandLineRunner {
-    private final RequestMappingHandlerMapping handlerMapping;
+public class TenantIgnoreUrlConfig {
+    private final List<RequestMappingHandlerMapping> handlerMappings;
     private final TenantProperties tenantProperties;
-    @Override
-    public void run(String... args) throws Exception {
+
+    public void init(){
+        handlerMappings.forEach(this::addUrl);
+    }
+
+    private void addUrl(RequestMappingHandlerMapping handlerMapping) {
         Map<RequestMappingInfo, HandlerMethod> handlerMethodMap = handlerMapping.getHandlerMethods();
         Set<String> controllerMappingUrls = new HashSet<>();
         for (RequestMappingInfo requestMappingInfo : handlerMethodMap.keySet()) {

+ 2 - 2
tr-plugins/tr-spring-boot-starter-plugin-biz-tenant/src/main/java/cn/tr/plugin/biz/tenant/config/secutiry/TenantSecurityWebFilter.java

@@ -64,8 +64,8 @@ public class TenantSecurityWebFilter  extends OncePerRequestFilter {
                 // 如果传递了租户编号,则进行比对租户编号,避免越权问题
             } else if (!Objects.equals(tenantId,  LoginUserStrategy.tr.getTenantId())) {
                 log.error("[doFilterInternal][租户({}) User({}) 越权访问租户({}) URL({}/{})]",
-                        LoginUserStrategy.tr.getTenantId(), LoginUserStrategy.tr.getCurrentUserId(),
-                        TenantContextHolder.getTenantId(), request.getRequestURI(), request.getMethod());
+                        LoginUserStrategy.tr.getTenantId(), tenantId,
+                        LoginUserStrategy.tr.getTenantId(), request.getRequestURI(), request.getMethod());
                 ServletUtils.writeJSON(response, CommonResult.error(TRExcCode.USER_ERROR_A0403,
                         "您无权访问该租户的数据"));
                 return;

+ 3 - 4
tr-plugins/tr-spring-boot-starter-plugin-biz-tenant/src/main/java/cn/tr/plugin/biz/tenant/config/web/TenantContextWebFilter.java

@@ -1,6 +1,6 @@
 package cn.tr.plugin.biz.tenant.config.web;
 
-import cn.tr.core.strategy.TenantStrategy;
+import cn.tr.core.strategy.LoginUserStrategy;
 import cn.tr.plugin.biz.tenant.context.TenantContextHolder;
 import org.springframework.web.filter.OncePerRequestFilter;
 
@@ -12,7 +12,7 @@ import java.io.IOException;
 
 /**
  * 多租户 Context Web 过滤器
- * 将请求 Header 中的 tenant-id 解析出来,添加到 {@link TenantContextHolder} 中,这样后续的 DB 等操作,可以获得到租户编号
+ * 使用当前用户编号放入本地缓存中
  *
  * @author 芋道源码
  */
@@ -22,8 +22,7 @@ public class TenantContextWebFilter extends OncePerRequestFilter {
     protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
             throws ServletException, IOException {
         // 设置
-        String tenantId = TenantStrategy.tr.getTenantId(request);
-        tenantId ="1";
+        String tenantId = LoginUserStrategy.tr.getTenantId();
         if (tenantId != null) {
             TenantContextHolder.setTenantId(tenantId);
             TenantContextHolder.setIgnore(false);

+ 3 - 2
tr-plugins/tr-spring-boot-starter-plugin-biz-tenant/src/main/java/cn/tr/plugin/biz/tenant/properties/TenantProperties.java

@@ -5,6 +5,7 @@ import lombok.Data;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.Set;
 
 /**
@@ -26,13 +27,13 @@ public class TenantProperties {
      *
      * 默认情况下,每个请求需要带上 tenant-id 的请求头。但是,部分请求是无需带上的,例如说短信回调、支付回调等 Open API!
      */
-    private Set<String> ignoreUrls = Collections.emptySet();
+    private Set<String> ignoreUrls = new HashSet<>();
 
     /**
      * 需要忽略多租户的表
      *
      * 即默认所有表都开启多租户的功能,所以记得添加对应的 tenant_id 字段哟
      */
-    private Set<String> ignoreTables = Collections.emptySet();
+    private Set<String> ignoreTables =new HashSet<>();
 
 }

+ 0 - 22
tr-plugins/tr-spring-boot-starter-plugin-eventbus/src/main/java/cn/tr/plugin/eventbus/config/register/SubscribeRegisterCenter.java

@@ -1,22 +0,0 @@
-package cn.tr.plugin.eventbus.config.register;
-
-import org.redisson.api.RedissonClient;
-
-/**
- * @ClassName : SubscribeRegisterCenter
- * @Description : 订阅者注册中心
- * 保存各个节点的订阅者信息,当 {@link cn.tr.plugin.eventbus.bean.Subscription.Feature } = {@link cn.tr.plugin.eventbus.bean.Subscription.Feature#shared}时,
- * 若有消息发送到来时, bitmap(id) 是否存在,
- * @Author : LF
- * @Date: 2023年03月18日
- */
-
-public class SubscribeRegisterCenter {
-    private RedissonClient redissonClient;
-
-
-
-    public void SubscribeRegisterCenter(){
-        boolean set = redissonClient.getBitSet("").set(123, true);
-    }
-}

+ 3 - 0
tr-plugins/tr-spring-boot-starter-plugin-mp-enhance-actable/src/main/java/cn/tr/plugin/mp/enhance/actable/ActableAutoConfiguration.java

@@ -23,6 +23,7 @@ import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
 import javax.sql.DataSource;
 
 import static com.gitee.sunchenbin.mybatis.actable.command.JavaToMysqlType.javaToMysqlTypeMap;
+import static com.gitee.sunchenbin.mybatis.actable.constants.MySqlTypeConstant.mySqlTypeAndLengthMap;
 
 /**
  * @ClassName : ActatbleAutoConfiguration
@@ -43,6 +44,8 @@ public class ActableAutoConfiguration implements BeanPostProcessor {
         javaToMysqlTypeMap.put("class java.sql.Date", MySqlTypeConstant.DATETIME);
         javaToMysqlTypeMap.put("class java.util.Date", MySqlTypeConstant.DATETIME);
         javaToMysqlTypeMap.put("class java.time.LocalDate", MySqlTypeConstant.DATETIME);
+
+        mySqlTypeAndLengthMap.put("longvarchar",mySqlTypeAndLengthMap.get("text"));
     }
     @Override
     public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {

+ 5 - 0
tr-plugins/tr-spring-boot-starter-plugin-mp-enhance-actable/src/main/java/cn/tr/plugin/mp/enhance/actable/utils/ColumnUtils.java

@@ -1,6 +1,7 @@
 package cn.tr.plugin.mp.enhance.actable.utils;
 
 import cn.hutool.core.date.DateUtil;
+import cn.tr.core.annotation.ColumnDefaultValue;
 import cn.tr.core.annotation.Comment;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
@@ -214,6 +215,7 @@ public class ColumnUtils {
     public static String getDefaultValue(Field field, Class<?> clasz){
         Column column = getColumn(field,clasz);
         DefaultValue defaultValue = field.getAnnotation(DefaultValue.class);
+        ColumnDefaultValue columnDefaultValue = field.getAnnotation(ColumnDefaultValue.class);
         if(!hasColumnAnnotation(field,clasz)){
             return null;
         }
@@ -223,6 +225,9 @@ public class ColumnUtils {
         if (defaultValue != null){
             return defaultValue.value();
         }
+        if(columnDefaultValue!=null){
+            return columnDefaultValue.value();
+        }
         return null;
     }
 

+ 6 - 0
tr-plugins/tr-spring-boot-starter-plugin-mybatis/pom.xml

@@ -48,6 +48,12 @@
         <dependency>
             <groupId>com.baomidou</groupId>
             <artifactId>mybatis-plus-extension</artifactId>
+            <exclusions>
+                <exclusion>
+                        <groupId>org.mybatis</groupId>
+                        <artifactId>mybatis</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
 
         <dependency>

+ 10 - 3
tr-plugins/tr-spring-boot-starter-plugin-mybatis/src/main/java/cn/tr/plugin/mybatis/TrMybatisAutoConfiguration.java

@@ -11,6 +11,7 @@ import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor;
 import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
 import java.util.*;
 
+import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
 import com.github.pagehelper.PageInterceptor;
 import org.apache.ibatis.plugin.Interceptor;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@@ -60,9 +61,15 @@ public class TrMybatisAutoConfiguration {
     @Bean
     public MybatisPlusInterceptor mybatisPlusInterceptor(List<InnerInterceptor> innerInterceptorList) {
         MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
-
-        innerInterceptorList.forEach(interceptor::addInnerInterceptor);
-
+        for (InnerInterceptor innerInterceptor : innerInterceptorList) {
+            if(innerInterceptor.getClass()== TenantLineInnerInterceptor.class){
+                List<InnerInterceptor> interceptors = new ArrayList<>(interceptor.getInterceptors());
+                interceptors.add(0,innerInterceptor);
+                interceptor.setInterceptors(interceptors);
+            }else {
+                interceptor.addInnerInterceptor(innerInterceptor);
+            }
+        }
         return interceptor;
     }
 

+ 1 - 1
tr-plugins/tr-spring-boot-starter-plugin-mybatis/src/main/java/cn/tr/plugin/mybatis/config/handler/CreateAndUpdateMetaObjectHandler.java

@@ -1,7 +1,7 @@
 package cn.tr.plugin.mybatis.config.handler;
 
 import cn.tr.core.strategy.LoginUserStrategy;
-import cn.tr.plugin.mybatis.constant.MybatisConstant;
+import cn.tr.core.constant.MybatisConstant;
 import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.ibatis.reflection.MetaObject;

+ 1 - 1
tr-plugins/tr-spring-boot-starter-plugin-mybatis/src/main/java/cn/tr/plugin/mybatis/context/PageContextHolder.java

@@ -2,7 +2,7 @@ package cn.tr.plugin.mybatis.context;
 
 import cn.tr.core.context.SecurityContextHolder;
 import cn.tr.core.pojo.PageDomain;
-import cn.tr.plugin.mybatis.constant.MybatisConstant;
+import cn.tr.core.constant.MybatisConstant;
 
 /**
  * @ClassName : PageContextHolder

+ 7 - 0
tr-plugins/tr-spring-boot-starter-plugin-mybatis/src/main/java/cn/tr/plugin/mybatis/pojo/BasePO.java

@@ -1,5 +1,6 @@
 package cn.tr.plugin.mybatis.pojo;
 
+import cn.tr.core.annotation.ColumnDefaultValue;
 import cn.tr.core.annotation.Comment;
 import com.baomidou.mybatisplus.annotation.FieldFill;
 import com.baomidou.mybatisplus.annotation.TableField;
@@ -50,10 +51,16 @@ public class BasePO implements Serializable {
     @TableField(fill = FieldFill.INSERT_UPDATE, jdbcType = JdbcType.VARCHAR)
     private String updater;
 
+    @Comment("租户id")
+
+    @TableField(fill = FieldFill.INSERT_UPDATE, jdbcType = JdbcType.VARCHAR)
+    private String tenantId;
+
     /**
      * 是否删除
      */
     @Comment("删除标记")
+    @ColumnDefaultValue("0")
     @TableLogic
     @TableField(jdbcType = JdbcType.TINYINT)
     private Boolean deleted;

+ 35 - 43
tr-plugins/tr-spring-boot-starter-plugin-satoken/src/main/java/cn/tr/plugin/security/config/LoginUserStrategyConfig.java

@@ -1,14 +1,10 @@
 package cn.tr.plugin.security.config;
 
-import cn.dev33.satoken.session.SaSession;
-import cn.dev33.satoken.stp.StpLogic;
-import cn.dev33.satoken.stp.StpUtil;
-import cn.hutool.core.util.ObjectUtil;
-import cn.tr.core.pojo.LoginResult;
-import cn.tr.core.strategy.ILoginUser;
+import cn.tr.core.constant.AuthConstant;
+import cn.tr.core.strategy.auth.ILoginUser;
 import cn.tr.core.strategy.LoginUserStrategy;
+import cn.tr.core.strategy.auth.bo.UserAccountInfoBO;
 import cn.tr.plugin.security.bo.LoginUserBO;
-import cn.tr.plugin.security.constant.SecurityConstant;
 import cn.tr.plugin.security.context.LoginUserContextHolder;
 import cn.tr.plugin.security.utils.SaTokenUtils;
 
@@ -26,46 +22,42 @@ public class LoginUserStrategyConfig {
         LoginUserStrategy.tr.loginUserSupplier=()->{
             LoginUserBO user = LoginUserContextHolder.getUser();
             if(user==null){
-                SaSession tokenSession = StpUtil.getTokenSession();
+                UserAccountInfoBO accountInfo = SaTokenUtils.getValue(AuthConstant.ACCOUNT_USER, UserAccountInfoBO.class);
+                return new ILoginUser() {
+                    @Override
+                    public String getUserId() {
+                        return accountInfo.getId();
+                    }
 
-                user = ObjectUtil.isNull(tokenSession)?null:tokenSession.getModel(SecurityConstant.LOGIN_USER, LoginUserBO.class);
-            }
-            String userId=user==null?null:user.getUserId();
-            String username=user==null?null:user.getUsername();
-            String tenantId=user==null?null:user.getTenantId();
-            return new ILoginUser() {
-                @Override
-                public String getUserId() {
-                    return userId;
-                }
-
-                @Override
-                public String getUsername() {
-                    return username;
-                }
+                    @Override
+                    public String getUsername() {
+                        return accountInfo.getUsername();
+                    }
 
-                @Override
-                public String getTenantId() {
-                    return tenantId;
-                }
-            };
-        };
+                    @Override
+                    public String getTenantId() {
+                        return accountInfo.getTenantId();
+                    }
+                };
+            }else {
+                LoginUserBO finalUser = user;
+                return new ILoginUser() {
+                    @Override
+                    public String getUserId() {
+                        return finalUser.getUserId();
+                    }
 
+                    @Override
+                    public String getUsername() {
+                        return finalUser.getUsername();
+                    }
 
-        /**
-         * 用户登录
-         */
-        LoginUserStrategy.tr.loginTokenSupplier=loginUser->{
-            StpLogic stpLogic = SaTokenUtils.getStpUtil();
-            stpLogic.login(loginUser.getUserId());
-            String tokenValue = stpLogic.getTokenValue();
-            long tokenTimeout = stpLogic.getTokenTimeout();
-            LoginUserBO user = new LoginUserBO(loginUser.getUserId(),loginUser.getUsername(),loginUser.getTenantId());
-            LoginUserContextHolder.setUser(user);
-            LoginResult loginResult = new LoginResult();
-            loginResult.setExpireTime(tokenTimeout);
-            loginResult.setToken(tokenValue);
-            return loginResult;
+                    @Override
+                    public String getTenantId() {
+                        return finalUser.getTenantId();
+                    }
+                };
+            }
         };
     }
 }

+ 2 - 0
tr-plugins/tr-spring-boot-starter-plugin-web/src/main/java/cn/tr/plugin/web/config/jackson/mapper/core/ObjectMapperConfig.java

@@ -7,6 +7,7 @@ import cn.tr.plugin.web.config.jackson.mapper.module.bean.EnumModule;
 import cn.tr.plugin.web.config.jackson.mapper.module.bean.StringModule;
 import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.config.BeanPostProcessor;
@@ -34,6 +35,7 @@ public class ObjectMapperConfig implements BeanPostProcessor {
          */
         objectMapper.registerModules(SimpleModuleRegister.getModules());
         objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+        objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
         JsonUtils.init(objectMapper);
         log.info("初始化 objectMapper 自动配置");
     }

+ 10 - 1
tr-test/pom.xml

@@ -21,7 +21,6 @@
         <dependency>
             <groupId>cn.tr</groupId>
             <artifactId>tr-spring-boot-starter-plugin-mp-enhance-actable</artifactId>
-            <version>0.0.9</version>
         </dependency>
 
         <dependency>
@@ -91,6 +90,16 @@
             <artifactId>tr-module-system</artifactId>
             <version>0.0.9</version>
         </dependency>
+
+        <dependency>
+            <groupId>cn.tr</groupId>
+            <artifactId>tr-spring-boot-starter-plugin-biz-tenant</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.tr</groupId>
+            <artifactId>tr-spring-boot-starter-plugin-biz-excel</artifactId>
+        </dependency>
     </dependencies>
 
 

+ 38 - 0
tr-test/src/main/java/cn/tr/test/WebApplication.java

@@ -1,8 +1,14 @@
 package cn.tr.test;
 
+import cn.dev33.satoken.stp.StpLogic;
 import cn.hutool.core.thread.ThreadUtil;
+import cn.tr.core.strategy.auth.AuthStrategy;
+import cn.tr.core.strategy.auth.UserOperator;
+import cn.tr.core.strategy.auth.bo.AuthenticationDTO;
+import cn.tr.core.strategy.auth.bo.UserAccountInfoBO;
 import cn.tr.plugin.eventbus.config.EventBus;
 import cn.tr.plugin.eventbus.constant.EventBusConstant;
+import cn.tr.plugin.security.utils.SaTokenUtils;
 import org.mybatis.spring.annotation.MapperScan;
 import org.redisson.api.RTopic;
 import org.redisson.api.RedissonClient;
@@ -21,6 +27,38 @@ import javax.annotation.PostConstruct;
 @SpringBootApplication(scanBasePackages = "cn.tr.module.*")
 @MapperScan("cn.tr.module.**.repository.**")
 public class WebApplication {
+    static {
+        AuthStrategy.tr
+                .addGranter(new UserOperator() {
+                    @Override
+                    public UserAccountInfoBO login(AuthenticationDTO authentication) {
+                        UserAccountInfoBO loginUser = new UserAccountInfoBO();
+                        StpLogic stpLogic = SaTokenUtils.getStpUtil();
+                        //  调用方法 stpLogic.login(${userId})产生token; 然后对LoginUserBo中参数进行赋值
+                        stpLogic.login("1");
+                        String tokenValue = stpLogic.getTokenValue();
+                        loginUser.setId("1");
+                        loginUser.setToken(tokenValue);
+                        loginUser.setUsername("测试账号");
+                        loginUser.setNickname("昵称");
+                        loginUser.setLoginType("login");
+                        loginUser.setSex(loginUser.getSex());
+                        loginUser.setTenantId("1");
+                        fillUserAgentInfo(loginUser);
+                        return loginUser;
+                    }
+
+                    @Override
+                    public boolean updatePassword(String oldPassword, String newPassword) {
+                        return true;
+                    }
+
+                    @Override
+                    public boolean match(String loginType) {
+                        return true;
+                    }
+                });
+    }
     public static void main(String[] args) {
         SpringApplication.run(WebApplication.class);
     }