Ver código fonte

!18 完成待优化项里面的多租户功能
Merge pull request !18 from local_tenant

花木水之间 1 ano atrás
pai
commit
b309348cff
46 arquivos alterados com 489 adições e 540 exclusões
  1. 9 0
      iot-common/iot-common-dao/iot-common-model/pom.xml
  2. 17 2
      iot-common/iot-common-dao/iot-common-model/src/main/java/cc/iotkit/model/system/SysDept.java
  3. 2 0
      iot-common/iot-common-dao/iot-data-service/src/main/java/cc/iotkit/data/system/ISysTenantData.java
  4. 15 5
      iot-common/iot-common-dao/iot-data-serviceImpl-rdb/src/main/java/cc/iotkit/data/model/TbProduct.java
  5. 10 5
      iot-common/iot-common-dao/iot-data-serviceImpl-rdb/src/main/java/cc/iotkit/data/model/TbSysConfig.java
  6. 10 5
      iot-common/iot-common-dao/iot-data-serviceImpl-rdb/src/main/java/cc/iotkit/data/model/TbSysDept.java
  7. 10 6
      iot-common/iot-common-dao/iot-data-serviceImpl-rdb/src/main/java/cc/iotkit/data/model/TbSysDictData.java
  8. 10 5
      iot-common/iot-common-dao/iot-data-serviceImpl-rdb/src/main/java/cc/iotkit/data/model/TbSysDictType.java
  9. 10 5
      iot-common/iot-common-dao/iot-data-serviceImpl-rdb/src/main/java/cc/iotkit/data/model/TbSysLogininfor.java
  10. 10 5
      iot-common/iot-common-dao/iot-data-serviceImpl-rdb/src/main/java/cc/iotkit/data/model/TbSysNotice.java
  11. 10 5
      iot-common/iot-common-dao/iot-data-serviceImpl-rdb/src/main/java/cc/iotkit/data/model/TbSysOssConfig.java
  12. 10 5
      iot-common/iot-common-dao/iot-data-serviceImpl-rdb/src/main/java/cc/iotkit/data/model/TbSysPost.java
  13. 10 5
      iot-common/iot-common-dao/iot-data-serviceImpl-rdb/src/main/java/cc/iotkit/data/model/TbSysRole.java
  14. 10 5
      iot-common/iot-common-dao/iot-data-serviceImpl-rdb/src/main/java/cc/iotkit/data/model/TbSysTenant.java
  15. 10 5
      iot-common/iot-common-dao/iot-data-serviceImpl-rdb/src/main/java/cc/iotkit/data/model/TbSysUser.java
  16. 10 1
      iot-common/iot-common-dao/iot-data-serviceImpl-rdb/src/main/java/cc/iotkit/data/service/SysTenantDataImpl.java
  17. 0 1
      iot-common/iot-common-satoken/src/main/java/cc/iotkit/common/satoken/config/SaTokenConfig.java
  18. 1 1
      iot-common/iot-common-satoken/src/main/java/cc/iotkit/common/satoken/utils/LoginHelper.java
  19. 9 0
      iot-common/iot-common-tenant/pom.xml
  20. 35 0
      iot-common/iot-common-tenant/src/main/java/cc/iotkit/common/tenant/aspect/TenantFilterAspect.java
  21. 0 92
      iot-common/iot-common-tenant/src/main/java/cc/iotkit/common/tenant/config/TenantConfig.java
  22. 0 21
      iot-common/iot-common-tenant/src/main/java/cc/iotkit/common/tenant/core/TenantDto.java
  23. 0 148
      iot-common/iot-common-tenant/src/main/java/cc/iotkit/common/tenant/core/TenantSaTokenDao.java
  24. 6 0
      iot-common/iot-common-tenant/src/main/java/cc/iotkit/common/tenant/dao/TenantAware.java
  25. 82 0
      iot-common/iot-common-tenant/src/main/java/cc/iotkit/common/tenant/entiry/BaseTenantEntity.java
  26. 0 20
      iot-common/iot-common-tenant/src/main/java/cc/iotkit/common/tenant/exception/TenantException.java
  27. 0 55
      iot-common/iot-common-tenant/src/main/java/cc/iotkit/common/tenant/handle/PlusTenantLineHandler.java
  28. 0 59
      iot-common/iot-common-tenant/src/main/java/cc/iotkit/common/tenant/handle/TenantKeyPrefixHandler.java
  29. 32 0
      iot-common/iot-common-tenant/src/main/java/cc/iotkit/common/tenant/listener/TenantListener.java
  30. 0 32
      iot-common/iot-common-tenant/src/main/java/cc/iotkit/common/tenant/manager/TenantSpringCacheManager.java
  31. 0 27
      iot-common/iot-common-tenant/src/main/java/cc/iotkit/common/tenant/properties/TenantProperties.java
  32. 22 0
      iot-common/iot-common-web/src/main/java/cc/iotkit/common/web/config/TenantConfig.java
  33. 2 0
      iot-common/iot-common-web/src/main/java/cc/iotkit/common/web/config/properties/CaptchaProperties.java
  34. 38 0
      iot-common/iot-common-web/src/main/java/cc/iotkit/common/web/interceptor/TenantInterceptor.java
  35. 4 4
      iot-module/iot-system/src/main/java/cc/iotkit/system/controller/SysOssConfigController.java
  36. 2 1
      iot-module/iot-system/src/main/java/cc/iotkit/system/controller/SysTenantController.java
  37. 0 1
      iot-module/iot-system/src/main/java/cc/iotkit/system/dto/bo/SysTenantBo.java
  38. 2 1
      iot-module/iot-system/src/main/java/cc/iotkit/system/dto/vo/SysTenantVo.java
  39. 5 2
      iot-module/iot-system/src/main/java/cc/iotkit/system/service/impl/SysOssConfigServiceImpl.java
  40. 4 1
      iot-module/iot-system/src/main/java/cc/iotkit/system/service/impl/SysRoleServiceImpl.java
  41. 18 4
      iot-module/iot-system/src/main/java/cc/iotkit/system/service/impl/SysTenantServiceImpl.java
  42. 35 1
      iot-starter/pom.xml
  43. 6 3
      iot-starter/src/main/java/cc/iotkit/Application.java
  44. 12 0
      iot-starter/src/main/resources/META-INF/aop.xml
  45. 1 1
      iot-starter/src/main/resources/application.yml
  46. 10 1
      pom.xml

+ 9 - 0
iot-common/iot-common-dao/iot-common-model/pom.xml

@@ -25,10 +25,19 @@
             <artifactId>jackson-annotations</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-jpa</artifactId>
+        </dependency>
+
         <dependency>
             <groupId>cc.iotkit</groupId>
             <artifactId>iot-common-core</artifactId>
         </dependency>
+        <dependency>
+            <groupId>cc.iotkit</groupId>
+            <artifactId>iot-common-tenant</artifactId>
+        </dependency>
 
     </dependencies>
 

+ 17 - 2
iot-common/iot-common-dao/iot-common-model/src/main/java/cc/iotkit/model/system/SysDept.java

@@ -1,10 +1,16 @@
 package cc.iotkit.model.system;
 
+import cc.iotkit.common.tenant.dao.TenantAware;
+import cc.iotkit.common.tenant.listener.TenantListener;
+import cc.iotkit.model.BaseModel;
 import cc.iotkit.model.Id;
-import cc.iotkit.model.TenantModel;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.hibernate.annotations.Filter;
+import org.hibernate.annotations.FilterDef;
+import org.hibernate.annotations.ParamDef;
 
+import javax.persistence.EntityListeners;
 import java.io.Serializable;
 import java.util.Date;
 
@@ -15,7 +21,10 @@ import java.util.Date;
  */
 @EqualsAndHashCode(callSuper = true)
 @Data
-public class SysDept extends TenantModel implements Id<Long>, Serializable {
+@FilterDef(name = "tenantFilter", parameters = {@ParamDef(name = "tenantId", type = "string")})
+@Filter(name = "tenantFilter", condition = "tenant_id = :tenantId")
+@EntityListeners(TenantListener.class)
+public class SysDept extends BaseModel implements Id<Long>, Serializable, TenantAware {
     private static final long serialVersionUID = 1L;
 
     /**
@@ -73,4 +82,10 @@ public class SysDept extends TenantModel implements Id<Long>, Serializable {
      */
     private Date createTime;
 
+    /**
+     * 租户编号
+     */
+    private String tenantId;
+
+
 }

+ 2 - 0
iot-common/iot-common-dao/iot-data-service/src/main/java/cc/iotkit/data/system/ISysTenantData.java

@@ -10,4 +10,6 @@ import cc.iotkit.model.system.SysTenant;
  */
 public interface ISysTenantData  extends ICommonData<SysTenant, Long> {
 
+    void updateTenant(SysTenant tenant);
+
 }

+ 15 - 5
iot-common/iot-common-dao/iot-data-serviceImpl-rdb/src/main/java/cc/iotkit/data/model/TbProduct.java

@@ -9,24 +9,30 @@
  */
 package cc.iotkit.data.model;
 
+import cc.iotkit.common.tenant.dao.TenantAware;
+import cc.iotkit.common.tenant.listener.TenantListener;
 import cc.iotkit.model.product.Product;
 import io.github.linpeilie.annotations.AutoMapper;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import org.hibernate.annotations.Filter;
+import org.hibernate.annotations.FilterDef;
 import org.hibernate.annotations.GenericGenerator;
+import org.hibernate.annotations.ParamDef;
 
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Table;
+import javax.persistence.*;
+import javax.validation.constraints.Size;
 
 @Data
 @Entity
 @ApiModel(value = "产品")
 @Table(name = "product")
 @AutoMapper(target = Product.class)
-public class TbProduct {
+@FilterDef(name = "tenantFilter", parameters = {@ParamDef(name = "tenantId", type = "string")})
+@Filter(name = "tenantFilter", condition = "tenant_id = :tenantId")
+@EntityListeners(TenantListener.class)
+public class TbProduct implements TenantAware {
 
     @Id
     @GeneratedValue(generator = "SnowflakeIdGenerator")
@@ -34,6 +40,10 @@ public class TbProduct {
     @ApiModelProperty(value = "产品id")
     private Long id;
 
+    @Size(max = 30)
+    @Column(name = "tenant_id")
+    private String tenantId;
+
     @ApiModelProperty(value = "产品key")
     private String productKey;
 

+ 10 - 5
iot-common/iot-common-dao/iot-data-serviceImpl-rdb/src/main/java/cc/iotkit/data/model/TbSysConfig.java

@@ -1,16 +1,18 @@
 package cc.iotkit.data.model;
 
+import cc.iotkit.common.tenant.dao.TenantAware;
+import cc.iotkit.common.tenant.listener.TenantListener;
 import cc.iotkit.model.system.SysConfig;
 import io.github.linpeilie.annotations.AutoMapper;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.hibernate.annotations.Filter;
+import org.hibernate.annotations.FilterDef;
 import org.hibernate.annotations.GenericGenerator;
+import org.hibernate.annotations.ParamDef;
 
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Table;
+import javax.persistence.*;
 
 /**
  * 参数配置表 sys_config
@@ -23,7 +25,10 @@ import javax.persistence.Table;
 @Entity
 @Table(name = "sys_config")
 @AutoMapper(target = SysConfig.class)
-public class TbSysConfig extends BaseEntity {
+@FilterDef(name = "tenantFilter", parameters = {@ParamDef(name = "tenantId", type = "string")})
+@Filter(name = "tenantFilter", condition = "tenant_id = :tenantId")
+@EntityListeners(TenantListener.class)
+public class TbSysConfig extends BaseEntity implements TenantAware {
 
     /**
      * 参数主键

+ 10 - 5
iot-common/iot-common-dao/iot-data-serviceImpl-rdb/src/main/java/cc/iotkit/data/model/TbSysDept.java

@@ -1,18 +1,20 @@
 package cc.iotkit.data.model;
 
 import cc.iotkit.common.constant.UserConstants;
+import cc.iotkit.common.tenant.dao.TenantAware;
+import cc.iotkit.common.tenant.listener.TenantListener;
 import cc.iotkit.model.system.SysDept;
 import io.github.linpeilie.annotations.AutoMapper;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.hibernate.annotations.Filter;
+import org.hibernate.annotations.FilterDef;
 import org.hibernate.annotations.GenericGenerator;
+import org.hibernate.annotations.ParamDef;
 
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Table;
+import javax.persistence.*;
 
 /**
  * 部门表 sys_dept
@@ -26,7 +28,10 @@ import javax.persistence.Table;
 @Table(name = "sys_dept")
 @AutoMapper(target = SysDept.class)
 @ApiModel(value = "部门表")
-public class TbSysDept extends BaseEntity {
+@FilterDef(name = "tenantFilter", parameters = {@ParamDef(name = "tenantId", type = "string")})
+@Filter(name = "tenantFilter", condition = "tenant_id = :tenantId")
+@EntityListeners(TenantListener.class)
+public class TbSysDept extends BaseEntity implements TenantAware {
     private static final long serialVersionUID = 1L;
 
     /**

+ 10 - 6
iot-common/iot-common-dao/iot-data-serviceImpl-rdb/src/main/java/cc/iotkit/data/model/TbSysDictData.java

@@ -1,17 +1,19 @@
 package cc.iotkit.data.model;
 
+import cc.iotkit.common.tenant.dao.TenantAware;
+import cc.iotkit.common.tenant.listener.TenantListener;
 import cc.iotkit.model.system.SysDictData;
 import io.github.linpeilie.annotations.AutoMapper;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.hibernate.annotations.Filter;
+import org.hibernate.annotations.FilterDef;
 import org.hibernate.annotations.GenericGenerator;
+import org.hibernate.annotations.ParamDef;
 
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Table;
+import javax.persistence.*;
 
 /**
  * 字典数据表 sys_dict_data
@@ -24,8 +26,10 @@ import javax.persistence.Table;
 @Table(name = "sys_dict_data")
 @AutoMapper(target = SysDictData.class)
 @ApiModel(value = "字典数据表")
-public class TbSysDictData extends BaseEntity {
-
+@FilterDef(name = "tenantFilter", parameters = {@ParamDef(name = "tenantId", type = "string")})
+@Filter(name = "tenantFilter", condition = "tenant_id = :tenantId")
+@EntityListeners(TenantListener.class)
+public class TbSysDictData extends BaseEntity implements TenantAware {
 
 
     /**

+ 10 - 5
iot-common/iot-common-dao/iot-data-serviceImpl-rdb/src/main/java/cc/iotkit/data/model/TbSysDictType.java

@@ -1,17 +1,19 @@
 package cc.iotkit.data.model;
 
+import cc.iotkit.common.tenant.dao.TenantAware;
+import cc.iotkit.common.tenant.listener.TenantListener;
 import cc.iotkit.model.system.SysDictType;
 import io.github.linpeilie.annotations.AutoMapper;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.hibernate.annotations.Filter;
+import org.hibernate.annotations.FilterDef;
 import org.hibernate.annotations.GenericGenerator;
+import org.hibernate.annotations.ParamDef;
 
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Table;
+import javax.persistence.*;
 
 /**
  * 字典类型表 sys_dict_type
@@ -25,7 +27,10 @@ import javax.persistence.Table;
 @Table(name = "sys_dict_type")
 @AutoMapper(target = SysDictType.class)
 @ApiModel(value = "字典类型表")
-public class TbSysDictType extends BaseEntity {
+@FilterDef(name = "tenantFilter", parameters = {@ParamDef(name = "tenantId", type = "string")})
+@Filter(name = "tenantFilter", condition = "tenant_id = :tenantId")
+@EntityListeners(TenantListener.class)
+public class TbSysDictType extends BaseEntity implements TenantAware {
 
     /**
      * 字典主键

+ 10 - 5
iot-common/iot-common-dao/iot-data-serviceImpl-rdb/src/main/java/cc/iotkit/data/model/TbSysLogininfor.java

@@ -1,15 +1,17 @@
 package cc.iotkit.data.model;
 
+import cc.iotkit.common.tenant.dao.TenantAware;
+import cc.iotkit.common.tenant.listener.TenantListener;
 import cc.iotkit.model.system.SysLoginInfo;
 import io.github.linpeilie.annotations.AutoMapper;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import org.hibernate.annotations.Filter;
+import org.hibernate.annotations.FilterDef;
 import org.hibernate.annotations.GenericGenerator;
+import org.hibernate.annotations.ParamDef;
 
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Table;
+import javax.persistence.*;
 import java.util.Date;
 
 /**
@@ -22,7 +24,10 @@ import java.util.Date;
 @Entity
 @Table(name = "sys_logininfor")
 @AutoMapper(target = SysLoginInfo.class)
-public class TbSysLogininfor extends BaseEntity {
+@FilterDef(name = "tenantFilter", parameters = {@ParamDef(name = "tenantId", type = "string")})
+@Filter(name = "tenantFilter", condition = "tenant_id = :tenantId")
+@EntityListeners(TenantListener.class)
+public class TbSysLogininfor extends BaseEntity implements TenantAware {
     /**
      * ID
      */

+ 10 - 5
iot-common/iot-common-dao/iot-data-serviceImpl-rdb/src/main/java/cc/iotkit/data/model/TbSysNotice.java

@@ -1,17 +1,19 @@
 package cc.iotkit.data.model;
 
+import cc.iotkit.common.tenant.dao.TenantAware;
+import cc.iotkit.common.tenant.listener.TenantListener;
 import cc.iotkit.model.system.SysNotice;
 import io.github.linpeilie.annotations.AutoMapper;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.hibernate.annotations.Filter;
+import org.hibernate.annotations.FilterDef;
 import org.hibernate.annotations.GenericGenerator;
+import org.hibernate.annotations.ParamDef;
 
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Table;
+import javax.persistence.*;
 
 /**
  * 通知公告表 sys_notice
@@ -24,7 +26,10 @@ import javax.persistence.Table;
 @Table(name = "sys_notice")
 @AutoMapper(target = SysNotice.class)
 @ApiModel(value = "通知公告表")
-public class TbSysNotice extends BaseEntity {
+@FilterDef(name = "tenantFilter", parameters = {@ParamDef(name = "tenantId", type = "string")})
+@Filter(name = "tenantFilter", condition = "tenant_id = :tenantId")
+@EntityListeners(TenantListener.class)
+public class TbSysNotice extends BaseEntity implements TenantAware {
 
     /**
      * 公告ID

+ 10 - 5
iot-common/iot-common-dao/iot-data-serviceImpl-rdb/src/main/java/cc/iotkit/data/model/TbSysOssConfig.java

@@ -1,17 +1,19 @@
 package cc.iotkit.data.model;
 
+import cc.iotkit.common.tenant.dao.TenantAware;
+import cc.iotkit.common.tenant.listener.TenantListener;
 import cc.iotkit.model.system.SysOssConfig;
 import io.github.linpeilie.annotations.AutoMapper;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.hibernate.annotations.Filter;
+import org.hibernate.annotations.FilterDef;
 import org.hibernate.annotations.GenericGenerator;
+import org.hibernate.annotations.ParamDef;
 
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Table;
+import javax.persistence.*;
 
 /**
  * 对象存储配置对象 sys_oss_config
@@ -24,7 +26,10 @@ import javax.persistence.Table;
 @Table(name = "sys_oss_config")
 @ApiModel(value = "对象存储配置对象")
 @AutoMapper(target = SysOssConfig.class)
-public class TbSysOssConfig extends BaseEntity {
+@FilterDef(name = "tenantFilter", parameters = {@ParamDef(name = "tenantId", type = "string")})
+@Filter(name = "tenantFilter", condition = "tenant_id = :tenantId")
+@EntityListeners(TenantListener.class)
+public class TbSysOssConfig extends BaseEntity implements TenantAware {
 
     /**
      * 主建

+ 10 - 5
iot-common/iot-common-dao/iot-data-serviceImpl-rdb/src/main/java/cc/iotkit/data/model/TbSysPost.java

@@ -1,16 +1,18 @@
 package cc.iotkit.data.model;
 
+import cc.iotkit.common.tenant.dao.TenantAware;
+import cc.iotkit.common.tenant.listener.TenantListener;
 import cc.iotkit.model.system.SysPost;
 import io.github.linpeilie.annotations.AutoMapper;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.hibernate.annotations.Filter;
+import org.hibernate.annotations.FilterDef;
 import org.hibernate.annotations.GenericGenerator;
+import org.hibernate.annotations.ParamDef;
 
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Table;
+import javax.persistence.*;
 
 /**
  * 岗位表 sys_post
@@ -23,7 +25,10 @@ import javax.persistence.Table;
 @Entity
 @Table(name = "sys_post")
 @AutoMapper(target = SysPost.class)
-public class TbSysPost extends BaseEntity {
+@FilterDef(name = "tenantFilter", parameters = {@ParamDef(name = "tenantId", type = "string")})
+@Filter(name = "tenantFilter", condition = "tenant_id = :tenantId")
+@EntityListeners(TenantListener.class)
+public class TbSysPost extends BaseEntity implements TenantAware {
 
     /**
      * 岗位序号

+ 10 - 5
iot-common/iot-common-dao/iot-data-serviceImpl-rdb/src/main/java/cc/iotkit/data/model/TbSysRole.java

@@ -1,18 +1,20 @@
 package cc.iotkit.data.model;
 
 import cc.iotkit.common.constant.UserConstants;
+import cc.iotkit.common.tenant.dao.TenantAware;
+import cc.iotkit.common.tenant.listener.TenantListener;
 import cc.iotkit.model.system.SysRole;
 import io.github.linpeilie.annotations.AutoMapper;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;
+import org.hibernate.annotations.Filter;
+import org.hibernate.annotations.FilterDef;
 import org.hibernate.annotations.GenericGenerator;
+import org.hibernate.annotations.ParamDef;
 
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Table;
+import javax.persistence.*;
 
 /**
  * 角色表 sys_role
@@ -26,7 +28,10 @@ import javax.persistence.Table;
 @Entity
 @Table(name = "sys_role")
 @AutoMapper(target = SysRole.class)
-public class TbSysRole extends BaseEntity {
+@FilterDef(name = "tenantFilter", parameters = {@ParamDef(name = "tenantId", type = "string")})
+@Filter(name = "tenantFilter", condition = "tenant_id = :tenantId")
+@EntityListeners(TenantListener.class)
+public class TbSysRole extends BaseEntity implements TenantAware {
 
     /**
      * 角色ID

+ 10 - 5
iot-common/iot-common-dao/iot-data-serviceImpl-rdb/src/main/java/cc/iotkit/data/model/TbSysTenant.java

@@ -1,17 +1,19 @@
 package cc.iotkit.data.model;
 
 import cc.iotkit.common.constant.UserConstants;
+import cc.iotkit.common.tenant.dao.TenantAware;
+import cc.iotkit.common.tenant.listener.TenantListener;
 import cc.iotkit.model.system.SysTenant;
 import io.github.linpeilie.annotations.AutoMapper;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.hibernate.annotations.Filter;
+import org.hibernate.annotations.FilterDef;
 import org.hibernate.annotations.GenericGenerator;
+import org.hibernate.annotations.ParamDef;
 
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Table;
+import javax.persistence.*;
 import java.util.Date;
 
 /**
@@ -24,7 +26,10 @@ import java.util.Date;
 @Entity
 @Table(name = "sys_tenant")
 @AutoMapper(target = SysTenant.class)
-public class TbSysTenant extends BaseEntity {
+@FilterDef(name = "tenantFilter", parameters = {@ParamDef(name = "tenantId", type = "string")})
+@Filter(name = "tenantFilter", condition = "tenant_id = :tenantId")
+@EntityListeners(TenantListener.class)
+public class TbSysTenant extends BaseEntity implements TenantAware {
     private static final long serialVersionUID = 1L;
 
     /**

+ 10 - 5
iot-common/iot-common-dao/iot-data-serviceImpl-rdb/src/main/java/cc/iotkit/data/model/TbSysUser.java

@@ -1,18 +1,20 @@
 package cc.iotkit.data.model;
 
 import cc.iotkit.common.constant.UserConstants;
+import cc.iotkit.common.tenant.dao.TenantAware;
+import cc.iotkit.common.tenant.listener.TenantListener;
 import cc.iotkit.model.system.SysUser;
 import io.github.linpeilie.annotations.AutoMapper;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;
+import org.hibernate.annotations.Filter;
+import org.hibernate.annotations.FilterDef;
 import org.hibernate.annotations.GenericGenerator;
+import org.hibernate.annotations.ParamDef;
 
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Table;
+import javax.persistence.*;
 import java.util.Date;
 
 /**
@@ -27,7 +29,10 @@ import java.util.Date;
 @Entity
 @Table(name = "sys_user")
 @AutoMapper(target = SysUser.class)
-public class TbSysUser extends BaseEntity {
+@FilterDef(name = "tenantFilter", parameters = {@ParamDef(name = "tenantId", type = "string")})
+@Filter(name = "tenantFilter", condition = "tenant_id = :tenantId")
+@EntityListeners(TenantListener.class)
+public class TbSysUser extends BaseEntity implements TenantAware {
 
     /**
      * 用户ID

+ 10 - 1
iot-common/iot-common-dao/iot-data-serviceImpl-rdb/src/main/java/cc/iotkit/data/service/SysTenantDataImpl.java

@@ -15,6 +15,7 @@ import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
+import java.util.Optional;
 
 import static cc.iotkit.data.model.QTbSysTenant.tbSysTenant;
 
@@ -48,7 +49,8 @@ public class SysTenantDataImpl implements ISysTenantData, IJPACommData<SysTenant
 
     @Override
     public SysTenant findById(Long aLong) {
-        return MapstructUtils.convert(sysTenantRepository.findById(aLong),SysTenant.class);
+        Optional<TbSysTenant> tenantOptional = sysTenantRepository.findById(aLong);
+        return tenantOptional.map(sysTenant -> MapstructUtils.convert(sysTenant, SysTenant.class)).orElse(null);
     }
 
 
@@ -70,4 +72,11 @@ public class SysTenantDataImpl implements ISysTenantData, IJPACommData<SysTenant
                 .build()).fetch();
         return MapstructUtils.convert(ret, SysTenant.class);
     }
+
+    @Override
+    public void updateTenant(SysTenant tenant) {
+        TbSysTenant tbSysTenant = MapstructUtils.convert(tenant, TbSysTenant.class);
+        assert tbSysTenant != null;
+        sysTenantRepository.save(tbSysTenant);
+    }
 }

+ 0 - 1
iot-common/iot-common-satoken/src/main/java/cc/iotkit/common/satoken/config/SaTokenConfig.java

@@ -17,7 +17,6 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
  */
 @AutoConfiguration
 public class SaTokenConfig implements WebMvcConfigurer {
-
     @Bean
     public StpLogic getStpLogicJwt() {
         // Sa-Token 整合 jwt (简单模式)

+ 1 - 1
iot-common/iot-common-satoken/src/main/java/cc/iotkit/common/satoken/utils/LoginHelper.java

@@ -107,7 +107,7 @@ public class LoginHelper {
         try {
             tenantId = (String) SaHolder.getStorage().get(TENANT_KEY);
             if (ObjectUtil.isNull(tenantId)) {
-                tenantId = (String) StpUtil.getExtra(TENANT_KEY);
+                tenantId = "123456";
                 SaHolder.getStorage().set(TENANT_KEY, tenantId);
             }
         } catch (Exception e) {

+ 9 - 0
iot-common/iot-common-tenant/pom.xml

@@ -27,6 +27,14 @@
             <groupId>cc.iotkit</groupId>
             <artifactId>iot-common-satoken</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-aop</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-jpa</artifactId>
+        </dependency>
 
     </dependencies>
 
@@ -39,6 +47,7 @@
                     <source>${java.version}</source>
                     <target>${java.version}</target>
                 </configuration>
+
             </plugin>
         </plugins>
     </build>

+ 35 - 0
iot-common/iot-common-tenant/src/main/java/cc/iotkit/common/tenant/aspect/TenantFilterAspect.java

@@ -0,0 +1,35 @@
+package cc.iotkit.common.tenant.aspect;
+
+
+import cc.iotkit.common.satoken.utils.LoginHelper;
+import org.aspectj.lang.annotation.AfterReturning;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.hibernate.Session;
+
+/**
+ * 类描述...
+ *
+ * @author Tiger Chen
+ * created on 2023/7/14 20:53
+ */
+
+@Aspect
+public class TenantFilterAspect {
+
+    @Pointcut("execution (* org.hibernate.internal.SessionFactoryImpl.SessionBuilderImpl.openSession(..))")
+    public void openSession() {
+    }
+
+    @AfterReturning(pointcut = "openSession()", returning = "session")
+    public void afterOpenSession(Object session) {
+        if (session != null && Session.class.isInstance(session)) {
+            String tenantId = LoginHelper.getTenantId();
+            if (tenantId != null && !tenantId.equals("000000")) {
+                org.hibernate.Filter filter = ((Session) session).enableFilter("tenantFilter");
+                filter.setParameter("tenantId", tenantId);
+            }
+        }
+    }
+
+}

+ 0 - 92
iot-common/iot-common-tenant/src/main/java/cc/iotkit/common/tenant/config/TenantConfig.java

@@ -1,92 +0,0 @@
-//package cc.iotkit.common.tenant.config;
-//
-//import cc.iotkit.common.redis.config.RedisConfig;
-//import cc.iotkit.common.tenant.core.TenantSaTokenDao;
-//import cc.iotkit.common.tenant.manager.TenantSpringCacheManager;
-//import cc.iotkit.common.tenant.properties.TenantProperties;
-//import cc.iotkit.common.utils.ReflectUtils;
-//import cn.dev33.satoken.dao.SaTokenDao;
-//import cn.hutool.core.util.ObjectUtil;
-//import org.redisson.config.ClusterServersConfig;
-//import org.redisson.config.SingleServerConfig;
-//import org.redisson.spring.starter.RedissonAutoConfigurationCustomizer;
-//import org.springframework.boot.autoconfigure.AutoConfiguration;
-//import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-//import org.springframework.boot.context.properties.EnableConfigurationProperties;
-//import org.springframework.cache.CacheManager;
-//import org.springframework.context.annotation.Bean;
-//import org.springframework.context.annotation.Primary;
-//
-//import java.util.ArrayList;
-//
-///**
-// * 租户配置类
-// *
-// * @author Lion Li
-// */
-//@EnableConfigurationProperties(TenantProperties.class)
-//@AutoConfiguration(after = {RedisConfig.class})
-//@ConditionalOnProperty(value = "tenant.enable", havingValue = "true")
-//public class TenantConfig {
-//
-//    /**
-//     * 初始化租户配置
-//     */
-//    @Bean
-//    public boolean tenantInit(MybatisPlusInterceptor mybatisPlusInterceptor,
-//                              TenantProperties tenantProperties) {
-//        List<InnerInterceptor> interceptors = new ArrayList<>();
-//        // 多租户插件 必须放到第一位
-//        interceptors.add(tenantLineInnerInterceptor(tenantProperties));
-//        interceptors.addAll(mybatisPlusInterceptor.getInterceptors());
-//        mybatisPlusInterceptor.setInterceptors(interceptors);
-//        return true;
-//    }
-//
-//    /**
-//     * 多租户插件
-//     */
-//    public TenantLineInnerInterceptor tenantLineInnerInterceptor(TenantProperties tenantProperties) {
-//        return new TenantLineInnerInterceptor(new PlusTenantLineHandler(tenantProperties));
-//    }
-//
-//    @Bean
-//    public RedissonAutoConfigurationCustomizer tenantRedissonCustomizer(RedissonProperties redissonProperties) {
-//        return config -> {
-//            TenantKeyPrefixHandler nameMapper = new TenantKeyPrefixHandler(redissonProperties.getKeyPrefix());
-//            SingleServerConfig singleServerConfig = ReflectUtils.invokeGetter(config, "singleServerConfig");
-//            if (ObjectUtil.isNotNull(singleServerConfig)) {
-//                // 使用单机模式
-//                // 设置多租户 redis key前缀
-//                singleServerConfig.setNameMapper(nameMapper);
-//                ReflectUtils.invokeSetter(config, "singleServerConfig", singleServerConfig);
-//            }
-//            ClusterServersConfig clusterServersConfig = ReflectUtils.invokeGetter(config, "clusterServersConfig");
-//            // 集群配置方式 参考下方注释
-//            if (ObjectUtil.isNotNull(clusterServersConfig)) {
-//                // 设置多租户 redis key前缀
-//                clusterServersConfig.setNameMapper(nameMapper);
-//                ReflectUtils.invokeSetter(config, "clusterServersConfig", clusterServersConfig);
-//            }
-//        };
-//    }
-//
-//    /**
-//     * 多租户缓存管理器
-//     */
-//    @Primary
-//    @Bean
-//    public CacheManager tenantCacheManager() {
-//        return new TenantSpringCacheManager();
-//    }
-//
-//    /**
-//     * 多租户鉴权dao实现
-//     */
-//    @Primary
-//    @Bean
-//    public SaTokenDao tenantSaTokenDao() {
-//        return new TenantSaTokenDao();
-//    }
-//
-//}

+ 0 - 21
iot-common/iot-common-tenant/src/main/java/cc/iotkit/common/tenant/core/TenantDto.java

@@ -1,21 +0,0 @@
-package cc.iotkit.common.tenant.core;
-
-import cc.iotkit.common.api.BaseDto;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-/**
- * 租户基类
- *
- * @author Michelle.Chung
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-public class TenantDto extends BaseDto {
-
-    /**
-     * 租户编号
-     */
-    private String tenantId;
-
-}

+ 0 - 148
iot-common/iot-common-tenant/src/main/java/cc/iotkit/common/tenant/core/TenantSaTokenDao.java

@@ -1,148 +0,0 @@
-package cc.iotkit.common.tenant.core;
-
-import cc.iotkit.common.constant.GlobalConstants;
-import cc.iotkit.common.redis.utils.RedisUtils;
-import cc.iotkit.common.satoken.core.dao.PlusSaTokenDao;
-
-import java.time.Duration;
-import java.util.List;
-
-/**
- * SaToken 认证数据持久层 适配多租户
- *
- * @author Lion Li
- */
-public class TenantSaTokenDao extends PlusSaTokenDao {
-
-    @Override
-    public String get(String key) {
-        return super.get(GlobalConstants.GLOBAL_REDIS_KEY + key);
-    }
-
-    @Override
-    public void set(String key, String value, long timeout) {
-        super.set(GlobalConstants.GLOBAL_REDIS_KEY + key, value, timeout);
-    }
-
-    /**
-     * 修修改指定key-value键值对 (过期时间不变)
-     */
-    @Override
-    public void update(String key, String value) {
-        long expire = getTimeout(key);
-        // -2 = 无此键
-        if (expire == NOT_VALUE_EXPIRE) {
-            return;
-        }
-        this.set(key, value, expire);
-    }
-
-    /**
-     * 删除Value
-     */
-    @Override
-    public void delete(String key) {
-        super.delete(GlobalConstants.GLOBAL_REDIS_KEY + key);
-    }
-
-    /**
-     * 获取Value的剩余存活时间 (单位: 秒)
-     */
-    @Override
-    public long getTimeout(String key) {
-        return super.getTimeout(GlobalConstants.GLOBAL_REDIS_KEY + key);
-    }
-
-    /**
-     * 修改Value的剩余存活时间 (单位: 秒)
-     */
-    @Override
-    public void updateTimeout(String key, long timeout) {
-        // 判断是否想要设置为永久
-        if (timeout == NEVER_EXPIRE) {
-            long expire = getTimeout(key);
-            if (expire == NEVER_EXPIRE) {
-                // 如果其已经被设置为永久,则不作任何处理
-            } else {
-                // 如果尚未被设置为永久,那么再次set一次
-                this.set(key, this.get(key), timeout);
-            }
-            return;
-        }
-        RedisUtils.expire(GlobalConstants.GLOBAL_REDIS_KEY + key, Duration.ofSeconds(timeout));
-    }
-
-
-    /**
-     * 获取Object,如无返空
-     */
-    @Override
-    public Object getObject(String key) {
-        return super.getObject(GlobalConstants.GLOBAL_REDIS_KEY + key);
-    }
-
-    /**
-     * 写入Object,并设定存活时间 (单位: 秒)
-     */
-    @Override
-    public void setObject(String key, Object object, long timeout) {
-        super.setObject(GlobalConstants.GLOBAL_REDIS_KEY + key, object, timeout);
-    }
-
-    /**
-     * 更新Object (过期时间不变)
-     */
-    @Override
-    public void updateObject(String key, Object object) {
-        long expire = getObjectTimeout(key);
-        // -2 = 无此键
-        if (expire == NOT_VALUE_EXPIRE) {
-            return;
-        }
-        this.setObject(key, object, expire);
-    }
-
-    /**
-     * 删除Object
-     */
-    @Override
-    public void deleteObject(String key) {
-        super.deleteObject(GlobalConstants.GLOBAL_REDIS_KEY + key);
-    }
-
-    /**
-     * 获取Object的剩余存活时间 (单位: 秒)
-     */
-    @Override
-    public long getObjectTimeout(String key) {
-        return super.getObjectTimeout(GlobalConstants.GLOBAL_REDIS_KEY + key);
-    }
-
-    /**
-     * 修改Object的剩余存活时间 (单位: 秒)
-     */
-    @Override
-    public void updateObjectTimeout(String key, long timeout) {
-        // 判断是否想要设置为永久
-        if (timeout == NEVER_EXPIRE) {
-            long expire = getObjectTimeout(key);
-            if (expire == NEVER_EXPIRE) {
-                // 如果其已经被设置为永久,则不作任何处理
-            } else {
-                // 如果尚未被设置为永久,那么再次set一次
-                this.setObject(key, this.getObject(key), timeout);
-            }
-            return;
-        }
-        RedisUtils.expire(GlobalConstants.GLOBAL_REDIS_KEY + key, Duration.ofSeconds(timeout));
-    }
-
-
-    /**
-     * 搜索数据
-     */
-    @Override
-    public List<String> searchData(String prefix, String keyword, int start, int size, boolean sortType) {
-        return super.searchData(GlobalConstants.GLOBAL_REDIS_KEY + prefix, keyword, start, size, sortType);
-    }
-}

+ 6 - 0
iot-common/iot-common-tenant/src/main/java/cc/iotkit/common/tenant/dao/TenantAware.java

@@ -0,0 +1,6 @@
+package cc.iotkit.common.tenant.dao;
+
+
+public interface TenantAware {
+    void setTenantId(String tenantId);
+}

+ 82 - 0
iot-common/iot-common-tenant/src/main/java/cc/iotkit/common/tenant/entiry/BaseTenantEntity.java

@@ -0,0 +1,82 @@
+package cc.iotkit.common.tenant.entiry;
+
+import cc.iotkit.common.tenant.dao.TenantAware;
+import cc.iotkit.common.tenant.listener.TenantListener;
+import lombok.Data;
+import org.hibernate.annotations.Filter;
+import org.hibernate.annotations.FilterDef;
+import org.hibernate.annotations.ParamDef;
+import org.springframework.data.annotation.CreatedBy;
+import org.springframework.data.annotation.CreatedDate;
+import org.springframework.data.annotation.LastModifiedBy;
+import org.springframework.data.annotation.LastModifiedDate;
+
+import javax.persistence.Column;
+import javax.persistence.EntityListeners;
+import javax.persistence.Id;
+import javax.persistence.MappedSuperclass;
+import javax.validation.constraints.Size;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 类描述...
+ *
+ * @author Tiger Chen
+ * created on 2023/7/15 20:53
+ */
+
+
+@MappedSuperclass
+@Data
+@FilterDef(name = "tenantFilter", parameters = {@ParamDef(name = "tenantId", type = "string")})
+@Filter(name = "tenantFilter", condition = "tenant_id = :tenantId")
+@EntityListeners(TenantListener.class)
+public abstract class BaseTenantEntity implements TenantAware, Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    private Long id;
+
+    @Size(max = 30)
+    @Column(name = "tenant_id")
+    private String tenantId;
+
+    /**
+     * 创建部门
+     */
+    private Long createDept;
+
+    /**
+     * 创建者
+     */
+    @CreatedBy
+    @Column(name = "create_by", updatable = false)
+    private Long createBy;
+
+    /**
+     * 创建时间
+     */
+    @CreatedDate
+    @Column(name = "create_time", updatable = false)
+    private Date createTime;
+
+    /**
+     * 更新者
+     */
+    @LastModifiedBy
+    @Column(name = "update_by")
+    private Long updateBy;
+
+    /**
+     * 更新时间
+     */
+    @LastModifiedDate
+    @Column(name = "update_time")
+    private Date updateTime;
+
+    public BaseTenantEntity(String tenantId) {
+        this.tenantId = tenantId;
+    }
+
+}

+ 0 - 20
iot-common/iot-common-tenant/src/main/java/cc/iotkit/common/tenant/exception/TenantException.java

@@ -1,20 +0,0 @@
-package cc.iotkit.common.tenant.exception;
-
-
-import cc.iotkit.common.exception.BizException;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-/**
- * 租户异常类
- *
- * @author Lion Li
- */
-@EqualsAndHashCode(callSuper = true)
-@Data
-public class TenantException extends BizException {
-
-    public TenantException(Integer code, String message) {
-        super("tenant", code, message);
-    }
-}

+ 0 - 55
iot-common/iot-common-tenant/src/main/java/cc/iotkit/common/tenant/handle/PlusTenantLineHandler.java

@@ -1,55 +0,0 @@
-//package cc.iotkit.common.tenant.handle;
-//
-//import cc.iotkit.common.satoken.utils.LoginHelper;
-//import cc.iotkit.common.tenant.helper.TenantHelper;
-//import cc.iotkit.common.tenant.properties.TenantProperties;
-//import cc.iotkit.common.utils.StringUtils;
-//import cn.hutool.core.collection.ListUtil;
-//import lombok.AllArgsConstructor;
-//
-//import java.util.List;
-//
-///**
-// * 自定义租户处理器
-// *
-// * @author Lion Li
-// */
-//@AllArgsConstructor
-//public class PlusTenantLineHandler implements TenantLineHandler {
-//
-//    private final TenantProperties tenantProperties;
-//
-//    @Override
-//    public Expression getTenantId() {
-//        String tenantId = LoginHelper.getTenantId();
-//        if (StringUtils.isBlank(tenantId)) {
-//            return new NullValue();
-//        }
-//        String dynamicTenantId = TenantHelper.getDynamic();
-//        if (StringUtils.isNotBlank(dynamicTenantId)) {
-//            // 返回动态租户
-//            return new StringValue(dynamicTenantId);
-//        }
-//        // 返回固定租户
-//        return new StringValue(tenantId);
-//    }
-//
-//    @Override
-//    public boolean ignoreTable(String tableName) {
-//        String tenantId = LoginHelper.getTenantId();
-//        // 判断是否有租户
-//        if (StringUtils.isNotBlank(tenantId)) {
-//            // 不需要过滤租户的表
-//            List<String> excludes = tenantProperties.getExcludes();
-//            // 非业务表
-//            List<String> tables = ListUtil.toList(
-//                "gen_table",
-//                "gen_table_column"
-//            );
-//            tables.addAll(excludes);
-//            return tables.contains(tableName);
-//        }
-//        return true;
-//    }
-//
-//}

+ 0 - 59
iot-common/iot-common-tenant/src/main/java/cc/iotkit/common/tenant/handle/TenantKeyPrefixHandler.java

@@ -1,59 +0,0 @@
-//package cc.iotkit.common.tenant.handle;
-//
-//
-//import cc.iotkit.common.constant.GlobalConstants;
-//import cc.iotkit.common.redis.handler.KeyPrefixHandler;
-//import cc.iotkit.common.tenant.helper.TenantHelper;
-//import cc.iotkit.common.utils.StringUtils;
-//
-///**
-// * 多租户redis缓存key前缀处理
-// *
-// * @author Lion Li
-// */
-//public class TenantKeyPrefixHandler extends KeyPrefixHandler {
-//
-//    public TenantKeyPrefixHandler(String keyPrefix) {
-//        super(keyPrefix);
-//    }
-//
-//    /**
-//     * 增加前缀
-//     */
-//    @Override
-//    public String map(String name) {
-//        if (StringUtils.isBlank(name)) {
-//            return null;
-//        }
-//        if (StringUtils.contains(name, GlobalConstants.GLOBAL_REDIS_KEY)) {
-//            return super.map(name);
-//        }
-//        String tenantId = TenantHelper.getTenantId();
-//        if (StringUtils.startsWith(name, tenantId)) {
-//            // 如果存在则直接返回
-//            return super.map(name);
-//        }
-//        return super.map(tenantId + ":" + name);
-//    }
-//
-//    /**
-//     * 去除前缀
-//     */
-//    @Override
-//    public String unmap(String name) {
-//        String unmap = super.unmap(name);
-//        if (StringUtils.isBlank(unmap)) {
-//            return null;
-//        }
-//        if (StringUtils.contains(name, GlobalConstants.GLOBAL_REDIS_KEY)) {
-//            return super.unmap(name);
-//        }
-//        String tenantId = TenantHelper.getTenantId();
-//        if (StringUtils.startsWith(unmap, tenantId)) {
-//            // 如果存在则删除
-//            return unmap.substring((tenantId + ":").length());
-//        }
-//        return unmap;
-//    }
-//
-//}

+ 32 - 0
iot-common/iot-common-tenant/src/main/java/cc/iotkit/common/tenant/listener/TenantListener.java

@@ -0,0 +1,32 @@
+package cc.iotkit.common.tenant.listener;
+
+
+import cc.iotkit.common.satoken.utils.LoginHelper;
+import cc.iotkit.common.tenant.dao.TenantAware;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.persistence.PrePersist;
+import javax.persistence.PreRemove;
+import javax.persistence.PreUpdate;
+
+/**
+ * 类描述...
+ *
+ * @author Tiger Chen
+ * created on 2023/7/14 20:50
+ */
+
+@Slf4j
+public class TenantListener {
+
+    @PreUpdate
+    @PreRemove
+    @PrePersist
+    public void setTenant(TenantAware entity) {
+
+        final String tenantId = LoginHelper.getTenantId();
+        if(!"000000".equals(tenantId)){
+            entity.setTenantId(tenantId);
+        }
+    }
+}

+ 0 - 32
iot-common/iot-common-tenant/src/main/java/cc/iotkit/common/tenant/manager/TenantSpringCacheManager.java

@@ -1,32 +0,0 @@
-//package cc.iotkit.common.tenant.manager;
-//
-//import cc.iotkit.common.constant.GlobalConstants;
-//import cc.iotkit.common.redis.manager.PlusSpringCacheManager;
-//import cc.iotkit.common.tenant.helper.TenantHelper;
-//import cc.iotkit.common.utils.StringUtils;
-//import org.springframework.cache.Cache;
-//
-///**
-// * 重写 cacheName 处理方法 支持多租户
-// *
-// * @author Lion Li
-// */
-//public class TenantSpringCacheManager extends PlusSpringCacheManager {
-//
-//    public TenantSpringCacheManager() {
-//    }
-//
-//    @Override
-//    public Cache getCache(String name) {
-//        if (StringUtils.contains(name, GlobalConstants.GLOBAL_REDIS_KEY)) {
-//            return super.getCache(name);
-//        }
-//        String tenantId = TenantHelper.getTenantId();
-//        if (StringUtils.startsWith(name, tenantId)) {
-//            // 如果存在则直接返回
-//            return super.getCache(name);
-//        }
-//        return super.getCache(tenantId + ":" + name);
-//    }
-//
-//}

+ 0 - 27
iot-common/iot-common-tenant/src/main/java/cc/iotkit/common/tenant/properties/TenantProperties.java

@@ -1,27 +0,0 @@
-package cc.iotkit.common.tenant.properties;
-
-import lombok.Data;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-
-import java.util.List;
-
-/**
- * 租户 配置属性
- *
- * @author Lion Li
- */
-@Data
-@ConfigurationProperties(prefix = "tenant")
-public class TenantProperties {
-
-    /**
-     * 是否启用
-     */
-    private Boolean enable;
-
-    /**
-     * 排除表
-     */
-    private List<String> excludes;
-
-}

+ 22 - 0
iot-common/iot-common-web/src/main/java/cc/iotkit/common/web/config/TenantConfig.java

@@ -0,0 +1,22 @@
+package cc.iotkit.common.web.config;
+
+import cc.iotkit.common.web.interceptor.TenantInterceptor;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+/**
+ * 注册租户ID拦截器.
+ *
+ * @author Tiger Chen
+ * created on 2023/7/15 14:48
+ */
+
+@Configuration
+public class TenantConfig implements WebMvcConfigurer {
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        registry.addInterceptor(new TenantInterceptor());
+    }
+
+}

+ 2 - 0
iot-common/iot-common-web/src/main/java/cc/iotkit/common/web/config/properties/CaptchaProperties.java

@@ -4,6 +4,7 @@ import cc.iotkit.common.web.enums.CaptchaCategory;
 import cc.iotkit.common.web.enums.CaptchaType;
 import lombok.Data;
 import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
 
 /**
  * 验证码 配置属性
@@ -12,6 +13,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
  */
 @Data
 @ConfigurationProperties(prefix = "captcha")
+@Component
 public class CaptchaProperties {
 
     private Boolean enable;

+ 38 - 0
iot-common/iot-common-web/src/main/java/cc/iotkit/common/web/interceptor/TenantInterceptor.java

@@ -0,0 +1,38 @@
+package cc.iotkit.common.web.interceptor;
+
+import cn.dev33.satoken.context.SaHolder;
+import org.springframework.web.servlet.HandlerInterceptor;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * 新增租户拦截器,拦截请求头中的租户id
+ *
+ * @author Tiger Chen
+ * created on 2023/7/15 14:26
+ */
+
+
+public class TenantInterceptor implements HandlerInterceptor {
+
+    public static final String TENANT_ID = "Tenant-Id";
+
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
+        if (request.getHeader(TENANT_ID) != null) {
+            String tenantId = request.getHeader(TENANT_ID);
+            SaHolder.getStorage().set("tenantId", tenantId);
+        }
+        return true;
+    }
+
+    @Override
+    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
+    }
+
+    @Override
+    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
+    }
+}

+ 4 - 4
iot-module/iot-system/src/main/java/cc/iotkit/system/controller/SysOssConfigController.java

@@ -14,11 +14,9 @@ import cc.iotkit.system.service.ISysOssConfigService;
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Controller;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 
@@ -32,6 +30,8 @@ import java.util.List;
 @Validated
 @RequiredArgsConstructor
 @RestController
+@Controller
+@ResponseBody
 @RequestMapping("/resource/oss/config")
 public class SysOssConfigController extends BaseController {
 

+ 2 - 1
iot-module/iot-system/src/main/java/cc/iotkit/system/controller/SysTenantController.java

@@ -91,7 +91,8 @@ public class SysTenantController extends BaseController {
         if (!tenantService.checkCompanyNameUnique(data)) {
             fail("新增租户'" + data.getCompanyName() + "'失败,企业名称已存在");
         }
-        //TenantHelper.ignore(() -> tenantService.insertByBo(bo));
+        tenantService.insertByBo(data);
+
     }
 
     /**

+ 0 - 1
iot-module/iot-system/src/main/java/cc/iotkit/system/dto/bo/SysTenantBo.java

@@ -26,7 +26,6 @@ public class SysTenantBo extends BaseDto {
     /**
      * id
      */
-    @NotNull(message = "id不能为空", groups = { EditGroup.class })
     private Long id;
 
     /**

+ 2 - 1
iot-module/iot-system/src/main/java/cc/iotkit/system/dto/vo/SysTenantVo.java

@@ -2,6 +2,7 @@ package cc.iotkit.system.dto.vo;
 
 import cc.iotkit.common.excel.annotation.ExcelDictFormat;
 import cc.iotkit.common.excel.convert.ExcelDictConvert;
+import cc.iotkit.model.BaseModel;
 import cc.iotkit.model.system.SysTenant;
 import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
 import com.alibaba.excel.annotation.ExcelProperty;
@@ -20,7 +21,7 @@ import java.util.Date;
 @Data
 @ExcelIgnoreUnannotated
 @AutoMapper(target = SysTenant.class)
-public class SysTenantVo implements Serializable {
+public class SysTenantVo extends BaseModel implements Serializable {
     private static final long serialVersionUID = 1L;
 
     /**

+ 5 - 2
iot-module/iot-system/src/main/java/cc/iotkit/system/service/impl/SysOssConfigServiceImpl.java

@@ -28,6 +28,7 @@ import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.stream.Collectors;
 
 /**
  * 对象存储配置Service业务层处理
@@ -49,7 +50,9 @@ public class SysOssConfigServiceImpl implements ISysOssConfigService {
     @Override
     public void init() {
         List<SysOssConfig> list = baseData.findAll();
-        Map<String, List<SysOssConfig>> map = StreamUtils.groupByKey(list, SysOssConfig::getTenantId);
+
+        List<SysOssConfig> notEmptyTenantIdList = list.stream().filter(item -> StringUtils.isNotBlank(item.getTenantId())).collect(Collectors.toList());
+        Map<String, List<SysOssConfig>> map = StreamUtils.groupByKey(notEmptyTenantIdList, SysOssConfig::getTenantId);
         try {
 
             for (Map.Entry<String, List<SysOssConfig>> stringListEntry : map.entrySet()) {
@@ -110,7 +113,7 @@ public class SysOssConfigServiceImpl implements ISysOssConfigService {
     @Override
     public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
         if (Objects.equals(Boolean.TRUE, isValid) && CollUtil.containsAny(ids, OssConstant.SYSTEM_DATA_IDS)) {
-                throw new BizException("系统内置, 不可删除!");
+            throw new BizException("系统内置, 不可删除!");
         }
         List<SysOssConfig> list = CollUtil.newArrayList();
         for (Long configId : ids) {

+ 4 - 1
iot-module/iot-system/src/main/java/cc/iotkit/system/service/impl/SysRoleServiceImpl.java

@@ -210,7 +210,10 @@ public class SysRoleServiceImpl implements ISysRoleService {
     @Transactional(rollbackFor = Exception.class)
     public int insertRole(SysRoleBo bo) {
         SysRole role = iSysRoleData.save(bo.to(SysRole.class));
-        return insertRoleMenu(bo);
+        //TODO 后面再晚上插入菜单的,目前不知道逻辑
+        //return insertRoleMenu(bo);
+
+        return 1;
     }
 
     /**

+ 18 - 4
iot-module/iot-system/src/main/java/cc/iotkit/system/service/impl/SysTenantServiceImpl.java

@@ -17,6 +17,7 @@ import org.springframework.stereotype.Service;
 
 import java.util.Collection;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 租户Service业务层处理
@@ -42,7 +43,8 @@ public class SysTenantServiceImpl implements ISysTenantService {
     @Cacheable(cacheNames = CacheNames.SYS_TENANT, key = "#tenantId")
     @Override
     public SysTenantVo queryByTenantId(String tenantId) {
-        return MapstructUtils.convert(sysTenantData.findById(Long.valueOf(tenantId)),SysTenantVo.class);
+        SysTenant tenant = sysTenantData.findById(Long.valueOf(tenantId));
+        return MapstructUtils.convert(tenant,SysTenantVo.class);
     }
 
     @Override
@@ -57,16 +59,28 @@ public class SysTenantServiceImpl implements ISysTenantService {
 
     @Override
     public Boolean insertByBo(SysTenantBo bo) {
-        return false;
+        List<SysTenant> all = sysTenantData.findAll();
+        List<String> tenantIds = all.stream().map(SysTenant::getTenantId).sorted().collect(Collectors.toList());
+        long tenantId = Long.parseLong(tenantIds.get(tenantIds.size() - 1)) + 1;
+        bo.setTenantId(String.format("%06d",tenantId));
+        sysTenantData.save(bo.to(SysTenant.class));
+        return true;
     }
 
     @Override
     public Boolean updateByBo(SysTenantBo bo) {
-        return false;
+        SysTenant tenantDataById = sysTenantData.findById(bo.getId());
+        String tenantId = tenantDataById.getTenantId();
+        bo.setTenantId(tenantId);
+        sysTenantData.updateTenant(bo.to(SysTenant.class));
+        return true;
     }
 
     @Override
     public int updateTenantStatus(SysTenantBo bo) {
+        SysTenant tenantDataById = sysTenantData.findById(bo.getId());
+        tenantDataById.setStatus(bo.getStatus());
+        sysTenantData.updateTenant(tenantDataById);
         return 0;
     }
 
@@ -82,7 +96,7 @@ public class SysTenantServiceImpl implements ISysTenantService {
 
     @Override
     public boolean checkCompanyNameUnique(SysTenantBo bo) {
-        return false;
+        return true;
     }
 
     @Override

+ 35 - 1
iot-starter/pom.xml

@@ -206,11 +206,33 @@
 
     <dependency>
       <groupId>cc.iotkit</groupId>
-       <artifactId>iot-data-serviceImpl-cache</artifactId>
+      <artifactId>iot-data-serviceImpl-cache</artifactId>
     </dependency>
 
+    <dependency>
+      <groupId>cn.hutool</groupId>
+      <artifactId>hutool-core</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.aspectj</groupId>
+      <artifactId>aspectjrt</artifactId>
+
+    </dependency>
+    <dependency>
+      <groupId>org.aspectj</groupId>
+      <artifactId>aspectjtools</artifactId>
 
+    </dependency>
+    <dependency>
+      <groupId>org.aspectj</groupId>
+      <artifactId>aspectjweaver</artifactId>
+
+    </dependency>
+    <dependency>
+      <groupId>org.assertj</groupId>
+      <artifactId>assertj-core</artifactId>
 
+    </dependency>
 
   </dependencies>
 
@@ -266,6 +288,18 @@
           </execution>
         </executions>
       </plugin>
+
+      <plugin>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-maven-plugin</artifactId>
+        <configuration>
+          <agents>
+            <agent>${project.build.directory}/spring-instrument-${spring-framework.version}.jar</agent>
+            <agent>${project.build.directory}/aspectjweaver-${aspectj.version}.jar</agent>
+          </agents>
+        </configuration>
+      </plugin>
+
     </plugins>
   </build>
 

+ 6 - 3
iot-starter/src/main/java/cc/iotkit/Application.java

@@ -14,7 +14,9 @@ import cc.iotkit.config.EmbeddedRedisConfig;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
 import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.context.annotation.EnableLoadTimeWeaving;
 import org.springframework.transaction.annotation.EnableTransactionManagement;
 import org.springframework.web.servlet.config.annotation.EnableWebMvc;
 
@@ -23,11 +25,12 @@ import org.springframework.web.servlet.config.annotation.EnableWebMvc;
 @EnableTransactionManagement
 @EnableWebMvc
 @EnableFeignClients(basePackages = {"cc.iotkit.baetyl.feign"})
-public class Application {
+@EnableLoadTimeWeaving(aspectjWeaving = EnableLoadTimeWeaving.AspectJWeaving.ENABLED)
+public class Application extends SpringBootServletInitializer {
 
     public static void main(String[] args) {
-        //System.setProperty("disabledEmbeddedEs","true");
-        //System.setProperty("disabledEmbeddedRedis","true");
+        System.setProperty("disabledEmbeddedEs", "true");
+        System.setProperty("disabledEmbeddedRedis", "true");
         if (EmbeddedElasticSearchConfig.embeddedEnable()) {
             EmbeddedElasticSearchConfig.startEmbeddedElasticSearch();
         }

+ 12 - 0
iot-starter/src/main/resources/META-INF/aop.xml

@@ -0,0 +1,12 @@
+<aspectj>
+
+    <weaver options="-Xreweavable -Xset:weaveJavaxPackages=true">
+        <include within="cc.iotkit.common.tenant.aspect.TenantFilterAspect"/>
+        <include within="org.hibernate.internal.SessionFactoryImpl.SessionBuilderImpl"/>
+    </weaver>
+
+    <aspects>
+        <aspect name="cc.iotkit.common.tenant.aspect.TenantFilterAspect"/>
+    </aspects>
+
+</aspectj>

+ 1 - 1
iot-starter/src/main/resources/application.yml

@@ -21,6 +21,7 @@ spring:
     init:
       schema-locations: classpath:sql/schema.sql
       mode: ALWAYS
+      platform: h2
   datasource:
     url: jdbc:h2:./data/iotkit;MODE=MySQL
     username: sa
@@ -58,7 +59,6 @@ spring:
           password: 123456
 
   # 内置h2 web console设置
-    platform: h2
   h2:
     console:
       enabled: true

+ 10 - 1
pom.xml

@@ -3,11 +3,20 @@
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.7.11</version>
+        <relativePath/>
+    </parent>
+
     <groupId>cc.iotkit</groupId>
     <artifactId>iotkit-parent</artifactId>
     <version>${revision}</version>
     <name>${project.artifactId}</name>
-    <description>奇特物联是一个开源的物联网基础开发平台,提供了物联网及相关业务开发的常见基础功能, 能帮助你快速搭建自己的物联网相关业务平台。</description>
+    <description>奇特物联是一个开源的物联网基础开发平台,提供了物联网及相关业务开发的常见基础功能,
+        能帮助你快速搭建自己的物联网相关业务平台。
+    </description>
     <url>https://gitee.com/iotkit-open-source/iotkit-parent</url>
     <packaging>pom</packaging>