From 979cc77555c24358c4268a6519967c23545ff1fb Mon Sep 17 00:00:00 2001 From: stylefeng Date: Mon, 5 May 2025 21:30:04 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=908.3.4=E3=80=91=E3=80=90mp=E3=80=91?= =?UTF-8?q?=E8=B0=83=E6=95=B4=E7=A7=9F=E6=88=B7=E7=9A=84=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kernel/rule/constants/RuleConstants.java | 5 ++ .../kernel/db/mp/tenant/SaasServiceApi.java | 29 ++++++++ .../kernel/db/mp/tenant/TenantSwitchApi.java | 47 +++++++++++++ .../tenant/context/TenantSwitchContext.java | 21 ++++++ .../defaultimpl/DefaultSaasServiceImpl.java | 25 +++++++ .../defaultimpl/DefaultTenantSwitchImpl.java | 31 +++++++++ .../db/mp/tenant/pojo/TenantSwitchInfo.java | 42 ++++++++++++ .../ProjectTenantAutoConfiguration.java | 68 +++++++++++++++++++ .../sys/api/constants/SysConstants.java | 4 +- 9 files changed, 271 insertions(+), 1 deletion(-) create mode 100644 kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/tenant/SaasServiceApi.java create mode 100644 kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/tenant/TenantSwitchApi.java create mode 100644 kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/tenant/context/TenantSwitchContext.java create mode 100644 kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/tenant/defaultimpl/DefaultSaasServiceImpl.java create mode 100644 kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/tenant/defaultimpl/DefaultTenantSwitchImpl.java create mode 100644 kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/tenant/pojo/TenantSwitchInfo.java create mode 100644 kernel-d-db/db-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/db/starter/ProjectTenantAutoConfiguration.java diff --git a/kernel-a-rule/src/main/java/cn/stylefeng/roses/kernel/rule/constants/RuleConstants.java b/kernel-a-rule/src/main/java/cn/stylefeng/roses/kernel/rule/constants/RuleConstants.java index 10f0fdd03..0985767dd 100644 --- a/kernel-a-rule/src/main/java/cn/stylefeng/roses/kernel/rule/constants/RuleConstants.java +++ b/kernel-a-rule/src/main/java/cn/stylefeng/roses/kernel/rule/constants/RuleConstants.java @@ -107,4 +107,9 @@ public interface RuleConstants { */ String TENANT_DB_PREFIX = "sys_tenant_db_"; + /** + * 默认租户ID + */ + Long DEFAULT_ROOT_TENANT_ID = 1L; + } diff --git a/kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/tenant/SaasServiceApi.java b/kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/tenant/SaasServiceApi.java new file mode 100644 index 000000000..ea24eaba4 --- /dev/null +++ b/kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/tenant/SaasServiceApi.java @@ -0,0 +1,29 @@ +package cn.stylefeng.roses.kernel.db.mp.tenant; + +import cn.stylefeng.roses.kernel.db.mp.tenant.pojo.TenantSwitchInfo; + +/** + * 租户业务的相关API + * + * @author fengshuonan + * @since 2025/5/4 18:35 + */ +public interface SaasServiceApi { + + /** + * 通过租户id获取租户的切换信息 + * + * @author fengshuonan + * @since 2025/5/4 18:35 + */ + TenantSwitchInfo getTenantSwitchInfo(Long tenantId); + + /** + * 通过租户编码获取租户的去切换信息 + * + * @author fengshuonan + * @since 2025/5/5 11:31 + */ + TenantSwitchInfo getTenantSwitchInfo(String tenantCode); + +} diff --git a/kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/tenant/TenantSwitchApi.java b/kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/tenant/TenantSwitchApi.java new file mode 100644 index 000000000..df80d5d2f --- /dev/null +++ b/kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/tenant/TenantSwitchApi.java @@ -0,0 +1,47 @@ +package cn.stylefeng.roses.kernel.db.mp.tenant; + +import cn.stylefeng.roses.kernel.db.mp.tenant.pojo.TenantSwitchInfo; + +import java.util.function.Supplier; + +/** + * 统一切换当前租户的API + *

+ * 根据租户的数据源配置,判断是否切分租户id或者租户的独立数据源 + * + * @author fengshuonan + * @since 2025/5/5 10:59 + */ +public interface TenantSwitchApi { + + /** + * 根据租户编码切换租户,并执行相关业务 + * + * @param tenantCode 租户的编码 + * @param action 需要切换租户的代码 + * @author fengshuonan + * @since 2025/5/4 17:23 + */ + T changeTenant(String tenantCode, Supplier action); + + /** + * 根据租户id切换租户,并执行相关业务 + * + * @param tenantId 租户的id + * @param action 需要切换租户的代码 + * @author fengshuonan + * @since 2025/5/4 17:23 + */ + T changeTenant(Long tenantId, Supplier action); + + /** + * 切换租户,并执行相关业务 + * + * @param tenantSwitchInfo 租户的详细信息 + * @param action 需要切换租户的代码 + * @author fengshuonan + * @since 2025/5/4 17:23 + */ + T changeTenant(TenantSwitchInfo tenantSwitchInfo, Supplier action); + +} diff --git a/kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/tenant/context/TenantSwitchContext.java b/kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/tenant/context/TenantSwitchContext.java new file mode 100644 index 000000000..6d7f276a3 --- /dev/null +++ b/kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/tenant/context/TenantSwitchContext.java @@ -0,0 +1,21 @@ +package cn.stylefeng.roses.kernel.db.mp.tenant.context; + +import cn.hutool.extra.spring.SpringUtil; +import cn.stylefeng.roses.kernel.db.mp.tenant.TenantSwitchApi; + +/** + * 租户切换的上下文,快捷工具 + * + * @author fengshuonan + * @since 2025/5/5 11:21 + */ +public class TenantSwitchContext { + + public TenantSwitchContext() { + } + + public static TenantSwitchApi me() { + return SpringUtil.getBean(TenantSwitchApi.class); + } + +} diff --git a/kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/tenant/defaultimpl/DefaultSaasServiceImpl.java b/kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/tenant/defaultimpl/DefaultSaasServiceImpl.java new file mode 100644 index 000000000..5a29b2bd6 --- /dev/null +++ b/kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/tenant/defaultimpl/DefaultSaasServiceImpl.java @@ -0,0 +1,25 @@ +package cn.stylefeng.roses.kernel.db.mp.tenant.defaultimpl; + +import cn.stylefeng.roses.kernel.db.mp.tenant.SaasServiceApi; +import cn.stylefeng.roses.kernel.db.mp.tenant.pojo.TenantSwitchInfo; +import cn.stylefeng.roses.kernel.rule.constants.RuleConstants; + +/** + * 默认的租户业务的实现 + * + * @author fengshuonan + * @since 2025/5/5 21:06 + */ +public class DefaultSaasServiceImpl implements SaasServiceApi { + + @Override + public TenantSwitchInfo getTenantSwitchInfo(Long tenantId) { + return new TenantSwitchInfo(RuleConstants.DEFAULT_ROOT_TENANT_ID, null, null); + } + + @Override + public TenantSwitchInfo getTenantSwitchInfo(String tenantCode) { + return new TenantSwitchInfo(RuleConstants.DEFAULT_ROOT_TENANT_ID, tenantCode, null); + } + +} diff --git a/kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/tenant/defaultimpl/DefaultTenantSwitchImpl.java b/kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/tenant/defaultimpl/DefaultTenantSwitchImpl.java new file mode 100644 index 000000000..55f7e63d6 --- /dev/null +++ b/kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/tenant/defaultimpl/DefaultTenantSwitchImpl.java @@ -0,0 +1,31 @@ +package cn.stylefeng.roses.kernel.db.mp.tenant.defaultimpl; + +import cn.stylefeng.roses.kernel.db.mp.tenant.TenantSwitchApi; +import cn.stylefeng.roses.kernel.db.mp.tenant.pojo.TenantSwitchInfo; + +import java.util.function.Supplier; + +/** + * 某人的租户切换的实现 + * + * @author fengshuonan + * @since 2025/5/5 21:06 + */ +public class DefaultTenantSwitchImpl implements TenantSwitchApi { + + @Override + public T changeTenant(String tenantCode, Supplier action) { + return action.get(); + } + + @Override + public T changeTenant(Long tenantId, Supplier action) { + return action.get(); + } + + @Override + public T changeTenant(TenantSwitchInfo tenantSwitchInfo, Supplier action) { + return action.get(); + } + +} diff --git a/kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/tenant/pojo/TenantSwitchInfo.java b/kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/tenant/pojo/TenantSwitchInfo.java new file mode 100644 index 000000000..fb4557877 --- /dev/null +++ b/kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/tenant/pojo/TenantSwitchInfo.java @@ -0,0 +1,42 @@ +package cn.stylefeng.roses.kernel.db.mp.tenant.pojo; + +import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription; +import lombok.Data; + +/** + * 租户切换信息 + * + * @author fengshuonan + * @since 2025/5/4 20:38 + */ +@Data +public class TenantSwitchInfo { + + /** + * 租户id + */ + @ChineseDescription("租户id") + private Long tenantId; + + /** + * 租户唯一标识 + */ + @ChineseDescription("租户唯一标识") + private String tenantCode; + + /** + * 数据隔离方式:1-租户id隔离,2-数据库分离 + */ + @ChineseDescription("数据隔离方式:1-租户id隔离,2-数据库分离") + private Integer dataMode; + + public TenantSwitchInfo() { + } + + public TenantSwitchInfo(Long tenantId, String tenantCode, Integer dataMode) { + this.tenantId = tenantId; + this.tenantCode = tenantCode; + this.dataMode = dataMode; + } + +} diff --git a/kernel-d-db/db-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/db/starter/ProjectTenantAutoConfiguration.java b/kernel-d-db/db-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/db/starter/ProjectTenantAutoConfiguration.java new file mode 100644 index 000000000..4c1592935 --- /dev/null +++ b/kernel-d-db/db-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/db/starter/ProjectTenantAutoConfiguration.java @@ -0,0 +1,68 @@ +/* + * Copyright [2020-2030] [https://www.stylefeng.cn] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Guns采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Guns源码头部的版权声明。 + * 3.请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://gitee.com/stylefeng/guns + * 5.在修改包名,模块名称,项目代码等时,请注明软件出处 https://gitee.com/stylefeng/guns + * 6.若您的项目无法满足以上几点,可申请商业授权 + */ +package cn.stylefeng.roses.kernel.db.starter; + +import cn.stylefeng.roses.kernel.db.mp.tenant.SaasServiceApi; +import cn.stylefeng.roses.kernel.db.mp.tenant.TenantSwitchApi; +import cn.stylefeng.roses.kernel.db.mp.tenant.defaultimpl.DefaultSaasServiceImpl; +import cn.stylefeng.roses.kernel.db.mp.tenant.defaultimpl.DefaultTenantSwitchImpl; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * 租户相关的自动配置 + * + * @author fengshuonan + * @since 2025/5/5 21:03 + */ +@Configuration +public class ProjectTenantAutoConfiguration { + + /** + * 租户数据获取的实现 + * + * @author fengshuonan + * @since 2025/5/5 21:07 + */ + @Bean + @ConditionalOnMissingBean + public SaasServiceApi saasServiceApi() { + return new DefaultSaasServiceImpl(); + } + + /** + * 默认租户切换 + * + * @author fengshuonan + * @since 2025/5/5 21:08 + */ + @Bean + @ConditionalOnMissingBean + public TenantSwitchApi tenantSwitchApi() { + return new DefaultTenantSwitchImpl(); + } + +} diff --git a/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/constants/SysConstants.java b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/constants/SysConstants.java index 18600a349..e69470037 100644 --- a/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/constants/SysConstants.java +++ b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/constants/SysConstants.java @@ -24,6 +24,8 @@ */ package cn.stylefeng.roses.kernel.sys.api.constants; +import cn.stylefeng.roses.kernel.rule.constants.RuleConstants; + /** * 基础核心业务业务 * @@ -75,6 +77,6 @@ public interface SysConstants { /** * 默认租户ID */ - Long DEFAULT_ROOT_TENANT_ID = 1L; + Long DEFAULT_ROOT_TENANT_ID = RuleConstants.DEFAULT_ROOT_TENANT_ID; }