Commit 4b95146c98aa1dc053f2876a69fa0e9d58df79d2

Authored by YunaiV
1 parent 8795a4cd

设置实体继承多租户的 DO

Showing 16 changed files with 116 additions and 26 deletions
README.md
@@ -33,6 +33,7 @@ @@ -33,6 +33,7 @@
33 | | 菜单管理 | 配置系统菜单,操作权限,按钮权限标识等 | 33 | | 菜单管理 | 配置系统菜单,操作权限,按钮权限标识等 |
34 | | 部门管理 | 配置系统组织机构(公司、部门、小组),树结构展现支持数据权限 | 34 | | 部门管理 | 配置系统组织机构(公司、部门、小组),树结构展现支持数据权限 |
35 | | 岗位管理 | 配置系统用户所属担任职务 | 35 | | 岗位管理 | 配置系统用户所属担任职务 |
  36 +| | 租户管理 | 配置系统租户,支持 SaaS 场景下的多租户功能 |
36 | | 字典管理 | 对系统中经常使用的一些较为固定的数据进行维护 | 37 | | 字典管理 | 对系统中经常使用的一些较为固定的数据进行维护 |
37 | 🚀 | 短信管理 | 短信渠道、短息模板、短信日志,对接阿里云、云片等主流短信平台 | 38 | 🚀 | 短信管理 | 短信渠道、短息模板、短信日志,对接阿里云、云片等主流短信平台 |
38 | 🚀 | 操作日志 | 系统正常操作日志记录和查询,集成 Swagger 生成日志内容 | 39 | 🚀 | 操作日志 | 系统正常操作日志记录和查询,集成 Swagger 生成日志内容 |
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/dept/SysDeptDO.java
1 package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept; 1 package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept;
2 2
3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; 3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
4 -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 4 +import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO;
5 import com.baomidou.mybatisplus.annotation.TableId; 5 import com.baomidou.mybatisplus.annotation.TableId;
6 import com.baomidou.mybatisplus.annotation.TableName; 6 import com.baomidou.mybatisplus.annotation.TableName;
7 import lombok.Data; 7 import lombok.Data;
@@ -15,7 +15,7 @@ import lombok.EqualsAndHashCode; @@ -15,7 +15,7 @@ import lombok.EqualsAndHashCode;
15 @TableName("sys_dept") 15 @TableName("sys_dept")
16 @Data 16 @Data
17 @EqualsAndHashCode(callSuper = true) 17 @EqualsAndHashCode(callSuper = true)
18 -public class SysDeptDO extends BaseDO { 18 +public class SysDeptDO extends TenantBaseDO {
19 19
20 /** 20 /**
21 * 部门ID 21 * 部门ID
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/dept/SysPostDO.java
1 package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept; 1 package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept;
2 2
3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; 3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
4 -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 4 +import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO;
5 import com.baomidou.mybatisplus.annotation.TableId; 5 import com.baomidou.mybatisplus.annotation.TableId;
6 import com.baomidou.mybatisplus.annotation.TableName; 6 import com.baomidou.mybatisplus.annotation.TableName;
7 import lombok.Data; 7 import lombok.Data;
@@ -15,14 +15,13 @@ import lombok.EqualsAndHashCode; @@ -15,14 +15,13 @@ import lombok.EqualsAndHashCode;
15 @TableName("sys_post") 15 @TableName("sys_post")
16 @Data 16 @Data
17 @EqualsAndHashCode(callSuper = true) 17 @EqualsAndHashCode(callSuper = true)
18 -public class SysPostDO extends BaseDO { 18 +public class SysPostDO extends TenantBaseDO {
19 19
20 /** 20 /**
21 * 岗位序号 21 * 岗位序号
22 */ 22 */
23 @TableId 23 @TableId
24 private Long id; 24 private Long id;
25 -  
26 /** 25 /**
27 * 岗位名称 26 * 岗位名称
28 */ 27 */
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/logger/SysOperateLogDO.java
@@ -3,7 +3,7 @@ package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.logger; @@ -3,7 +3,7 @@ package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.logger;
3 import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; 3 import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
4 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 4 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
5 import cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum; 5 import cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum;
6 -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 6 +import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO;
7 import com.baomidou.mybatisplus.annotation.TableField; 7 import com.baomidou.mybatisplus.annotation.TableField;
8 import com.baomidou.mybatisplus.annotation.TableId; 8 import com.baomidou.mybatisplus.annotation.TableId;
9 import com.baomidou.mybatisplus.annotation.TableName; 9 import com.baomidou.mybatisplus.annotation.TableName;
@@ -22,7 +22,7 @@ import java.util.Map; @@ -22,7 +22,7 @@ import java.util.Map;
22 @TableName(value = "sys_operate_log", autoResultMap = true) 22 @TableName(value = "sys_operate_log", autoResultMap = true)
23 @Data 23 @Data
24 @EqualsAndHashCode(callSuper = true) 24 @EqualsAndHashCode(callSuper = true)
25 -public class SysOperateLogDO extends BaseDO { 25 +public class SysOperateLogDO extends TenantBaseDO {
26 26
27 /** 27 /**
28 * {@link #javaMethodArgs} 的最大长度 28 * {@link #javaMethodArgs} 的最大长度
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/notice/SysNoticeDO.java
1 package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.notice; 1 package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.notice;
2 2
3 -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;  
4 -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;  
5 import cn.iocoder.yudao.adminserver.modules.system.enums.notice.SysNoticeTypeEnum; 3 import cn.iocoder.yudao.adminserver.modules.system.enums.notice.SysNoticeTypeEnum;
  4 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  5 +import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO;
6 import com.baomidou.mybatisplus.annotation.TableField; 6 import com.baomidou.mybatisplus.annotation.TableField;
7 import com.baomidou.mybatisplus.annotation.TableName; 7 import com.baomidou.mybatisplus.annotation.TableName;
8 import lombok.Data; 8 import lombok.Data;
@@ -16,7 +16,7 @@ import lombok.EqualsAndHashCode; @@ -16,7 +16,7 @@ import lombok.EqualsAndHashCode;
16 @TableName("sys_notice") 16 @TableName("sys_notice")
17 @Data 17 @Data
18 @EqualsAndHashCode(callSuper = true) 18 @EqualsAndHashCode(callSuper = true)
19 -public class SysNoticeDO extends BaseDO { 19 +public class SysNoticeDO extends TenantBaseDO {
20 20
21 /** 21 /**
22 * 公告ID 22 * 公告ID
yudao-admin-server/src/main/resources/application.yaml
@@ -73,7 +73,7 @@ yudao: @@ -73,7 +73,7 @@ yudao:
73 constants-class-list: 73 constants-class-list:
74 - cn.iocoder.yudao.adminserver.modules.infra.enums.InfErrorCodeConstants 74 - cn.iocoder.yudao.adminserver.modules.infra.enums.InfErrorCodeConstants
75 - cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants 75 - cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants
76 - tenant:  
77 - tables: sys_user, sys_user_session 76 + tenant: # 多租户相关配置项
  77 + tables: # 配置需要开启多租户的表;如果实体已经继承 TenantBaseDO 类,则无需重复配置
78 78
79 debug: false 79 debug: false
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/dal/dataobject/file/InfFileDO.java
1 package cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.file; 1 package cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.file;
2 2
3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
  4 +import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO;
4 import com.baomidou.mybatisplus.annotation.IdType; 5 import com.baomidou.mybatisplus.annotation.IdType;
5 import com.baomidou.mybatisplus.annotation.TableField; 6 import com.baomidou.mybatisplus.annotation.TableField;
6 import com.baomidou.mybatisplus.annotation.TableId; 7 import com.baomidou.mybatisplus.annotation.TableId;
@@ -21,7 +22,7 @@ import java.io.InputStream; @@ -21,7 +22,7 @@ import java.io.InputStream;
21 @Builder 22 @Builder
22 @NoArgsConstructor 23 @NoArgsConstructor
23 @AllArgsConstructor 24 @AllArgsConstructor
24 -public class InfFileDO extends BaseDO { 25 +public class InfFileDO extends TenantBaseDO {
25 26
26 /** 27 /**
27 * 文件路径 28 * 文件路径
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/dal/dataobject/logger/InfApiAccessLogDO.java
@@ -2,7 +2,7 @@ package cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger; @@ -2,7 +2,7 @@ package cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger;
2 2
3 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; 3 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
4 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 4 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
5 -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 5 +import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO;
6 import com.baomidou.mybatisplus.annotation.TableId; 6 import com.baomidou.mybatisplus.annotation.TableId;
7 import com.baomidou.mybatisplus.annotation.TableName; 7 import com.baomidou.mybatisplus.annotation.TableName;
8 import lombok.*; 8 import lombok.*;
@@ -21,7 +21,7 @@ import java.util.Date; @@ -21,7 +21,7 @@ import java.util.Date;
21 @Builder 21 @Builder
22 @NoArgsConstructor 22 @NoArgsConstructor
23 @AllArgsConstructor 23 @AllArgsConstructor
24 -public class InfApiAccessLogDO extends BaseDO { 24 +public class InfApiAccessLogDO extends TenantBaseDO {
25 25
26 /** 26 /**
27 * 编号 27 * 编号
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/dal/dataobject/logger/InfApiErrorLogDO.java
1 package cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger; 1 package cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger;
2 2
3 -import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;  
4 -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;  
5 import cn.iocoder.yudao.coreservice.modules.infra.enums.logger.InfApiErrorLogProcessStatusEnum; 3 import cn.iocoder.yudao.coreservice.modules.infra.enums.logger.InfApiErrorLogProcessStatusEnum;
  4 +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
  5 +import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO;
6 import com.baomidou.mybatisplus.annotation.TableId; 6 import com.baomidou.mybatisplus.annotation.TableId;
7 import com.baomidou.mybatisplus.annotation.TableName; 7 import com.baomidou.mybatisplus.annotation.TableName;
8 import lombok.*; 8 import lombok.*;
@@ -21,7 +21,7 @@ import java.util.Date; @@ -21,7 +21,7 @@ import java.util.Date;
21 @Builder 21 @Builder
22 @NoArgsConstructor 22 @NoArgsConstructor
23 @AllArgsConstructor 23 @AllArgsConstructor
24 -public class InfApiErrorLogDO extends BaseDO { 24 +public class InfApiErrorLogDO extends TenantBaseDO {
25 25
26 /** 26 /**
27 * 编号 27 * 编号
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/member/dal/dataobject/user/MbrUserDO.java
1 package cn.iocoder.yudao.coreservice.modules.member.dal.dataobject.user; 1 package cn.iocoder.yudao.coreservice.modules.member.dal.dataobject.user;
2 2
3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; 3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
4 -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 4 +import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO;
5 import com.baomidou.mybatisplus.annotation.TableId; 5 import com.baomidou.mybatisplus.annotation.TableId;
6 import com.baomidou.mybatisplus.annotation.TableName; 6 import com.baomidou.mybatisplus.annotation.TableName;
7 import lombok.*; 7 import lombok.*;
@@ -22,7 +22,7 @@ import java.util.Date; @@ -22,7 +22,7 @@ import java.util.Date;
22 @Builder 22 @Builder
23 @NoArgsConstructor 23 @NoArgsConstructor
24 @AllArgsConstructor 24 @AllArgsConstructor
25 -public class MbrUserDO extends BaseDO { 25 +public class MbrUserDO extends TenantBaseDO {
26 26
27 /** 27 /**
28 * 用户ID 28 * 用户ID
yudao-framework/pom.xml
@@ -33,6 +33,7 @@ @@ -33,6 +33,7 @@
33 <module>yudao-spring-boot-starter-biz-weixin</module> 33 <module>yudao-spring-boot-starter-biz-weixin</module>
34 <module>yudao-spring-boot-starter-extension</module> 34 <module>yudao-spring-boot-starter-extension</module>
35 <module>yudao-spring-boot-starter-tenant</module> 35 <module>yudao-spring-boot-starter-tenant</module>
  36 + <module>yudao-spring-boot-starter-datascope</module>
36 </modules> 37 </modules>
37 38
38 <artifactId>yudao-framework</artifactId> 39 <artifactId>yudao-framework</artifactId>
yudao-framework/yudao-spring-boot-starter-datascope/pom.xml 0 → 100644
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<project xmlns="http://maven.apache.org/POM/4.0.0"
  3 + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5 + <parent>
  6 + <artifactId>yudao-framework</artifactId>
  7 + <groupId>cn.iocoder.boot</groupId>
  8 + <version>${revision}</version>
  9 + </parent>
  10 + <modelVersion>4.0.0</modelVersion>
  11 + <artifactId>yudao-spring-boot-starter-datascope</artifactId>
  12 + <packaging>jar</packaging>
  13 +
  14 + <name>${artifactId}</name>
  15 + <description>数据权限</description>
  16 + <url>https://github.com/YunaiV/ruoyi-vue-pro</url>
  17 +
  18 + <dependencies>
  19 + <dependency>
  20 + <groupId>cn.iocoder.boot</groupId>
  21 + <artifactId>yudao-common</artifactId>
  22 + </dependency>
  23 +
  24 + <!-- Web 相关 -->
  25 + <dependency>
  26 + <groupId>org.springframework.boot</groupId>
  27 + <artifactId>spring-boot-starter-web</artifactId>
  28 + </dependency>
  29 +
  30 + <dependency>
  31 + <groupId>cn.iocoder.boot</groupId>
  32 + <artifactId>yudao-spring-boot-starter-security</artifactId>
  33 + </dependency>
  34 +
  35 + <!-- DB 相关 -->
  36 + <dependency>
  37 + <groupId>cn.iocoder.boot</groupId>
  38 + <artifactId>yudao-spring-boot-starter-mybatis</artifactId>
  39 + </dependency>
  40 +
  41 + <dependency>
  42 + <groupId>cn.iocoder.boot</groupId>
  43 + <artifactId>yudao-spring-boot-starter-redis</artifactId>
  44 + </dependency>
  45 +
  46 + <!-- Job 定时任务相关 -->
  47 + <dependency>
  48 + <groupId>cn.iocoder.boot</groupId>
  49 + <artifactId>yudao-spring-boot-starter-job</artifactId>
  50 + </dependency>
  51 +
  52 + <!-- 消息队列相关 -->
  53 + <dependency>
  54 + <groupId>cn.iocoder.boot</groupId>
  55 + <artifactId>yudao-spring-boot-starter-mq</artifactId>
  56 + </dependency>
  57 +
  58 + <!-- Test 测试相关 -->
  59 + <dependency>
  60 + <groupId>org.springframework.boot</groupId>
  61 + <artifactId>spring-boot-starter-test</artifactId>
  62 + <scope>test</scope>
  63 + </dependency>
  64 + </dependencies>
  65 +
  66 +</project>
yudao-framework/yudao-spring-boot-starter-datascope/src/main/java/cn/iocoder/yudao/framework/datascope/package-info.java 0 → 100644
  1 +/**
  2 + * 基于 JSqlParser 解析 SQL,增加数据权限的 WHERE 条件
  3 + */
  4 +package cn.iocoder.yudao.framework.datascope;
yudao-framework/yudao-spring-boot-starter-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/core/db/TenantDatabaseInterceptor.java
@@ -3,6 +3,8 @@ package cn.iocoder.yudao.framework.tenant.core.db; @@ -3,6 +3,8 @@ package cn.iocoder.yudao.framework.tenant.core.db;
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.iocoder.yudao.framework.tenant.config.TenantProperties; 4 import cn.iocoder.yudao.framework.tenant.config.TenantProperties;
5 import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder; 5 import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
  6 +import com.baomidou.mybatisplus.core.metadata.TableInfo;
  7 +import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
6 import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler; 8 import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
7 import lombok.AllArgsConstructor; 9 import lombok.AllArgsConstructor;
8 import net.sf.jsqlparser.expression.Expression; 10 import net.sf.jsqlparser.expression.Expression;
@@ -25,6 +27,11 @@ public class TenantDatabaseInterceptor implements TenantLineHandler { @@ -25,6 +27,11 @@ public class TenantDatabaseInterceptor implements TenantLineHandler {
25 27
26 @Override 28 @Override
27 public boolean ignoreTable(String tableName) { 29 public boolean ignoreTable(String tableName) {
  30 + // 如果实体类继承 TenantBaseDO 类,则是多租户表,不进行忽略
  31 + TableInfo tableInfo = TableInfoHelper.getTableInfo(tableName);
  32 + if (tableInfo != null && TenantBaseDO.class.isAssignableFrom(tableInfo.getEntityType())) {
  33 + return false;
  34 + }
28 // 不包含,说明要过滤 35 // 不包含,说明要过滤
29 return !CollUtil.contains(properties.getTables(), tableName); 36 return !CollUtil.contains(properties.getTables(), tableName);
30 } 37 }
yudao-framework/yudao-spring-boot-starter-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/core/web/TenantContextWebFilter.java
@@ -14,9 +14,6 @@ import java.io.IOException; @@ -14,9 +14,6 @@ import java.io.IOException;
14 * 多租户 Context Web 过滤器 14 * 多租户 Context Web 过滤器
15 * 将请求 Header 中的 tenant-id 解析出来,添加到 {@link TenantContextHolder} 中,这样后续的 DB 等操作,可以获得到租户编号。 15 * 将请求 Header 中的 tenant-id 解析出来,添加到 {@link TenantContextHolder} 中,这样后续的 DB 等操作,可以获得到租户编号。
16 * 16 *
17 - * Q:会不会存在模拟 tenant-id 导致跨租户的问题?  
18 - * A:用户登陆后,获得的 Token 是基于租户级别隔离,从而保证授权失败。  
19 - *  
20 * @author 芋道源码 17 * @author 芋道源码
21 */ 18 */
22 public class TenantContextWebFilter extends OncePerRequestFilter { 19 public class TenantContextWebFilter extends OncePerRequestFilter {
更新日志.md
@@ -20,10 +20,24 @@ @@ -20,10 +20,24 @@
20 20
21 ## [v1.2.0] 进行中 21 ## [v1.2.0] 进行中
22 22
23 -* 新增用户前台的昵称、头像的修改  
24 -* 修复通知和字典查询权限 Bug 23 +### ⚠️ Warning
25 24
26 -TODO 25 +这是一个多租户的预览版本,涉及的改动较大。
  26 +
  27 +### ⭐ New Features
  28 +
  29 +* 【新增】多租户,支持 Web、Security、Job、MQ、Async、DB、Redis 组件
  30 +* 【新增】用户前台的昵称、头像的修改
  31 +
  32 +### 🐞 Bug Fixes
  33 +
  34 +* 【修复】通知和字典查询权限 Bug
  35 +
  36 +### 🔨 Dependency Upgrades
  37 +
  38 +暂无
  39 +
  40 +### 📝 TODO
27 41
28 * 支付 42 * 支付
29 * 用户前台的社交登陆 43 * 用户前台的社交登陆