From b663197e450c5992f4b11d2655236ba26ccc8089 Mon Sep 17 00:00:00 2001 From: yixiaco <627428179@qq.com> Date: Thu, 20 Apr 2023 23:17:31 +0800 Subject: [PATCH 1/3] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E5=BF=BD?= =?UTF-8?q?=E7=95=A5=E7=A7=9F=E6=88=B7=E5=86=99=E6=B3=95=EF=BC=8C=E5=9C=A8?= =?UTF-8?q?=E6=8A=9B=E5=87=BA=E5=BC=82=E5=B8=B8=E6=97=B6=E5=8F=AF=E4=BB=A5?= =?UTF-8?q?=E6=AD=A3=E7=A1=AE=E5=85=B3=E9=97=AD=E5=BF=BD=E7=95=A5=20fix=20?= =?UTF-8?q?=E4=BF=AE=E5=A4=8Doracle=E8=84=9A=E6=9C=AC=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E6=B2=A1=E5=AF=B9=E4=B8=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tenant/annotation/IgnoreTenant.java | 20 +++++++++++ .../common/tenant/aspect/TenantAspect.java | 34 ++++++++++++++++++ .../common/tenant/config/TenantConfig.java | 8 +++++ .../common/tenant/helper/TenantHelper.java | 36 +++++++++++++++++-- .../service/impl/SysOssConfigServiceImpl.java | 33 +++++++++-------- .../service/impl/SysTenantServiceImpl.java | 9 ++--- script/sql/oracle/oracle_test.sql | 4 +-- 7 files changed, 118 insertions(+), 26 deletions(-) create mode 100644 ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/annotation/IgnoreTenant.java create mode 100644 ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/aspect/TenantAspect.java diff --git a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/annotation/IgnoreTenant.java b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/annotation/IgnoreTenant.java new file mode 100644 index 000000000..fcc70d823 --- /dev/null +++ b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/annotation/IgnoreTenant.java @@ -0,0 +1,20 @@ +package org.dromara.common.tenant.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 忽略租户注解 + * + * @author yixiacoco + */ +@Inherited +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface IgnoreTenant { +} diff --git a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/aspect/TenantAspect.java b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/aspect/TenantAspect.java new file mode 100644 index 000000000..757c3b0fe --- /dev/null +++ b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/aspect/TenantAspect.java @@ -0,0 +1,34 @@ +package org.dromara.common.tenant.aspect; + +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.dromara.common.tenant.annotation.IgnoreTenant; +import org.dromara.common.tenant.helper.TenantHelper; +import org.springframework.core.annotation.Order; + +/** + * 租户切面 + * + * @author yixiacoco + */ +@Aspect +@Order(-1) +public class TenantAspect { + + /** + * 处理忽略租户 + * + * @param point 织入点 + * @param ignoreTenant 忽略注解 + */ + @Around("@within(ignoreTenant) || @annotation(ignoreTenant)") + public Object handleIgnore(ProceedingJoinPoint point, IgnoreTenant ignoreTenant) throws Throwable { + TenantHelper.enableIgnore(); + try { + return point.proceed(); + } finally { + TenantHelper.disableIgnore(); + } + } +} diff --git a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/config/TenantConfig.java b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/config/TenantConfig.java index 8610641dd..d1028da44 100644 --- a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/config/TenantConfig.java +++ b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/config/TenantConfig.java @@ -9,6 +9,7 @@ import org.dromara.common.core.utils.reflect.ReflectUtils; import org.dromara.common.mybatis.config.MybatisPlusConfig; import org.dromara.common.redis.config.RedisConfig; import org.dromara.common.redis.config.properties.RedissonProperties; +import org.dromara.common.tenant.aspect.TenantAspect; import org.dromara.common.tenant.core.TenantSaTokenDao; import org.dromara.common.tenant.handle.PlusTenantLineHandler; import org.dromara.common.tenant.handle.TenantKeyPrefixHandler; @@ -97,4 +98,11 @@ public class TenantConfig { return new TenantSaTokenDao(); } + /** + * 多租户切面 + */ + @Bean + public TenantAspect tenantAspect() { + return new TenantAspect(); + } } diff --git a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java index e1784b571..8d435a367 100644 --- a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java +++ b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java @@ -6,14 +6,16 @@ import cn.hutool.core.convert.Convert; import com.alibaba.ttl.TransmittableThreadLocal; import com.baomidou.mybatisplus.core.plugins.IgnoreStrategy; import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.constant.GlobalConstants; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.redis.utils.RedisUtils; import org.dromara.common.satoken.utils.LoginHelper; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import lombok.extern.slf4j.Slf4j; + +import java.util.function.Supplier; /** * 租户助手 @@ -49,6 +51,34 @@ public class TenantHelper { InterceptorIgnoreHelper.clearIgnoreStrategy(); } + /** + * 在忽略租户中执行 + * + * @param handle 处理执行方法 + */ + public static void ignore(Runnable handle) { + enableIgnore(); + try { + handle.run(); + } finally { + disableIgnore(); + } + } + + /** + * 在忽略租户中执行 + * + * @param handle 处理执行方法 + */ + public static T ignore(Supplier handle) { + enableIgnore(); + try { + return handle.get(); + } finally { + disableIgnore(); + } + } + /** * 设置动态租户(一直有效 需要手动清理) *

diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssConfigServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssConfigServiceImpl.java index 2c4d1ea5d..4d421ee04 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssConfigServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssConfigServiceImpl.java @@ -6,6 +6,8 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.constant.CacheNames; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.MapstructUtils; @@ -24,8 +26,6 @@ import org.dromara.system.domain.bo.SysOssConfigBo; import org.dromara.system.domain.vo.SysOssConfigVo; import org.dromara.system.mapper.SysOssConfigMapper; import org.dromara.system.service.ISysOssConfigService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -52,23 +52,26 @@ public class SysOssConfigServiceImpl implements ISysOssConfigService { */ @Override public void init() { - TenantHelper.enableIgnore(); - List list = baseMapper.selectList( - new LambdaQueryWrapper().orderByAsc(TenantEntity::getTenantId)); - TenantHelper.disableIgnore(); + List list = TenantHelper.ignore(() -> + baseMapper.selectList( + new LambdaQueryWrapper().orderByAsc(TenantEntity::getTenantId)) + ); Map> map = StreamUtils.groupByKey(list, SysOssConfig::getTenantId); - for (String tenantId : map.keySet()) { - TenantHelper.setDynamic(tenantId); - // 加载OSS初始化配置 - for (SysOssConfig config : map.get(tenantId)) { - String configKey = config.getConfigKey(); - if ("0".equals(config.getStatus())) { - RedisUtils.setCacheObject(OssConstant.DEFAULT_CONFIG_KEY, configKey); + try { + for (String tenantId : map.keySet()) { + TenantHelper.setDynamic(tenantId); + // 加载OSS初始化配置 + for (SysOssConfig config : map.get(tenantId)) { + String configKey = config.getConfigKey(); + if ("0".equals(config.getStatus())) { + RedisUtils.setCacheObject(OssConstant.DEFAULT_CONFIG_KEY, configKey); + } + CacheUtils.put(CacheNames.SYS_OSS_CONFIG, config.getConfigKey(), JsonUtils.toJsonString(config)); } - CacheUtils.put(CacheNames.SYS_OSS_CONFIG, config.getConfigKey(), JsonUtils.toJsonString(config)); } + } finally { + TenantHelper.clearDynamic(); } - TenantHelper.clearDynamic(); } @Override diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java index 703dc4029..9c4cb094c 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java @@ -17,7 +17,7 @@ import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.common.tenant.annotation.IgnoreTenant; import org.dromara.system.domain.*; import org.dromara.system.domain.bo.SysTenantBo; import org.dromara.system.domain.vo.SysTenantVo; @@ -111,9 +111,9 @@ public class SysTenantServiceImpl implements ISysTenantService { * 新增租户 */ @Override + @IgnoreTenant @Transactional(rollbackFor = Exception.class) public Boolean insertByBo(SysTenantBo bo) { - TenantHelper.enableIgnore(); SysTenant add = MapstructUtils.convert(bo, SysTenant.class); @@ -124,7 +124,6 @@ public class SysTenantServiceImpl implements ISysTenantService { add.setTenantId(tenantId); boolean flag = baseMapper.insert(add) > 0; if (!flag) { - TenantHelper.disableIgnore(); throw new ServiceException("创建租户失败"); } bo.setId(add.getId()); @@ -187,7 +186,6 @@ public class SysTenantServiceImpl implements ISysTenantService { } configMapper.insertBatch(sysConfigList); - TenantHelper.disableIgnore(); return true; } @@ -342,9 +340,9 @@ public class SysTenantServiceImpl implements ISysTenantService { * 同步租户套餐 */ @Override + @IgnoreTenant @Transactional(rollbackFor = Exception.class) public Boolean syncTenantPackage(String tenantId, String packageId) { - TenantHelper.enableIgnore(); SysTenantPackage tenantPackage = tenantPackageMapper.selectById(packageId); List roles = roleMapper.selectList( new LambdaQueryWrapper().eq(SysRole::getTenantId, tenantId)); @@ -369,7 +367,6 @@ public class SysTenantServiceImpl implements ISysTenantService { roleMenuMapper.delete( new LambdaQueryWrapper().in(SysRoleMenu::getRoleId, roleIds).notIn(!menuIds.isEmpty(), SysRoleMenu::getMenuId, menuIds)); } - TenantHelper.disableIgnore(); return true; } } diff --git a/script/sql/oracle/oracle_test.sql b/script/sql/oracle/oracle_test.sql index b4fc8814c..fd93786d9 100644 --- a/script/sql/oracle/oracle_test.sql +++ b/script/sql/oracle/oracle_test.sql @@ -66,8 +66,8 @@ comment on column test_tree.update_time is '更新时间'; comment on column test_tree.update_by is '更新人'; comment on column test_tree.del_flag is '删除标志'; -insert into sys_user(user_id, tenant_id, dept_id, user_name, nick_name, user_type, email, phonenumber, sex, avatar, password, status, del_flag, login_ip, login_date, create_dept, create_by, create_time, update_by, update_time, remark) values (3, '000000', 108, 'test', '本部门及以下 密码666666', 'sys_user', '', '', '0', null, '$2a$10$b8yUzN0C71sbz.PhNOCgJe.Tu1yWC3RNrTyjSQ8p1W0.aaUXUJ.Ne', '0', '0', '127.0.0.1', sysdate, 103, sysdate, 1, sysdate, 3, sysdate, null); -insert into sys_user(user_id, tenant_id, dept_id, user_name, nick_name, user_type, email, phonenumber, sex, avatar, password, status, del_flag, login_ip, login_date, create_dept, create_by, create_time, update_by, update_time, remark) values (4, '000000', 102, 'test1', '仅本人 密码666666', 'sys_user', '', '', '0', null, '$2a$10$b8yUzN0C71sbz.PhNOCgJe.Tu1yWC3RNrTyjSQ8p1W0.aaUXUJ.Ne', '0', '0', '127.0.0.1', sysdate, 103, sysdate, 1, sysdate, 4, sysdate, null); +insert into sys_user(user_id, tenant_id, dept_id, user_name, nick_name, user_type, email, phonenumber, sex, avatar, password, status, del_flag, login_ip, login_date, create_dept, create_by, create_time, update_by, update_time, remark) values (3, '000000', 108, 'test', '本部门及以下 密码666666', 'sys_user', '', '', '0', null, '$2a$10$b8yUzN0C71sbz.PhNOCgJe.Tu1yWC3RNrTyjSQ8p1W0.aaUXUJ.Ne', '0', '0', '127.0.0.1', sysdate, 103, 1, sysdate, 3, sysdate, null); +insert into sys_user(user_id, tenant_id, dept_id, user_name, nick_name, user_type, email, phonenumber, sex, avatar, password, status, del_flag, login_ip, login_date, create_dept, create_by, create_time, update_by, update_time, remark) values (4, '000000', 102, 'test1', '仅本人 密码666666', 'sys_user', '', '', '0', null, '$2a$10$b8yUzN0C71sbz.PhNOCgJe.Tu1yWC3RNrTyjSQ8p1W0.aaUXUJ.Ne', '0', '0', '127.0.0.1', sysdate, 103, 1, sysdate, 4, sysdate, null); insert into sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) values (5, '测试菜单', 0, 5, 'demo', null, 1, 0, 'M', '0', '0', null, 'star', 103, 1, sysdate, 1, sysdate, ''); From 716d7e7435ddbe34d5ae68f3779518d1233a27d6 Mon Sep 17 00:00:00 2001 From: yixiaco <627428179@qq.com> Date: Fri, 21 Apr 2023 00:01:58 +0800 Subject: [PATCH 2/3] =?UTF-8?q?update=20=E5=BF=BD=E7=95=A5=E7=A7=9F?= =?UTF-8?q?=E6=88=B7=E5=86=99=E6=B3=95=E5=8E=BB=E9=99=A4=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E6=B3=A8=E8=A7=A3=E7=9A=84=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tenant/annotation/IgnoreTenant.java | 20 -- .../common/tenant/aspect/TenantAspect.java | 34 ---- .../common/tenant/config/TenantConfig.java | 8 - .../common/tenant/helper/TenantHelper.java | 5 +- .../service/impl/SysTenantServiceImpl.java | 177 +++++++++--------- 5 files changed, 92 insertions(+), 152 deletions(-) delete mode 100644 ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/annotation/IgnoreTenant.java delete mode 100644 ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/aspect/TenantAspect.java diff --git a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/annotation/IgnoreTenant.java b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/annotation/IgnoreTenant.java deleted file mode 100644 index fcc70d823..000000000 --- a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/annotation/IgnoreTenant.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.dromara.common.tenant.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Inherited; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * 忽略租户注解 - * - * @author yixiacoco - */ -@Inherited -@Target(ElementType.METHOD) -@Retention(RetentionPolicy.RUNTIME) -@Documented -public @interface IgnoreTenant { -} diff --git a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/aspect/TenantAspect.java b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/aspect/TenantAspect.java deleted file mode 100644 index 757c3b0fe..000000000 --- a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/aspect/TenantAspect.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.dromara.common.tenant.aspect; - -import org.aspectj.lang.ProceedingJoinPoint; -import org.aspectj.lang.annotation.Around; -import org.aspectj.lang.annotation.Aspect; -import org.dromara.common.tenant.annotation.IgnoreTenant; -import org.dromara.common.tenant.helper.TenantHelper; -import org.springframework.core.annotation.Order; - -/** - * 租户切面 - * - * @author yixiacoco - */ -@Aspect -@Order(-1) -public class TenantAspect { - - /** - * 处理忽略租户 - * - * @param point 织入点 - * @param ignoreTenant 忽略注解 - */ - @Around("@within(ignoreTenant) || @annotation(ignoreTenant)") - public Object handleIgnore(ProceedingJoinPoint point, IgnoreTenant ignoreTenant) throws Throwable { - TenantHelper.enableIgnore(); - try { - return point.proceed(); - } finally { - TenantHelper.disableIgnore(); - } - } -} diff --git a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/config/TenantConfig.java b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/config/TenantConfig.java index d1028da44..8610641dd 100644 --- a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/config/TenantConfig.java +++ b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/config/TenantConfig.java @@ -9,7 +9,6 @@ import org.dromara.common.core.utils.reflect.ReflectUtils; import org.dromara.common.mybatis.config.MybatisPlusConfig; import org.dromara.common.redis.config.RedisConfig; import org.dromara.common.redis.config.properties.RedissonProperties; -import org.dromara.common.tenant.aspect.TenantAspect; import org.dromara.common.tenant.core.TenantSaTokenDao; import org.dromara.common.tenant.handle.PlusTenantLineHandler; import org.dromara.common.tenant.handle.TenantKeyPrefixHandler; @@ -98,11 +97,4 @@ public class TenantConfig { return new TenantSaTokenDao(); } - /** - * 多租户切面 - */ - @Bean - public TenantAspect tenantAspect() { - return new TenantAspect(); - } } diff --git a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java index 8d435a367..b9c90b6d8 100644 --- a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java +++ b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java @@ -15,6 +15,7 @@ import org.dromara.common.core.utils.StringUtils; import org.dromara.common.redis.utils.RedisUtils; import org.dromara.common.satoken.utils.LoginHelper; +import java.util.function.Consumer; import java.util.function.Supplier; /** @@ -56,10 +57,10 @@ public class TenantHelper { * * @param handle 处理执行方法 */ - public static void ignore(Runnable handle) { + public static void ignore(Consumer handle) { enableIgnore(); try { - handle.run(); + handle.accept(null); } finally { disableIgnore(); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java index 9c4cb094c..29dd76fba 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java @@ -17,7 +17,7 @@ import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.common.tenant.annotation.IgnoreTenant; +import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.system.domain.*; import org.dromara.system.domain.bo.SysTenantBo; import org.dromara.system.domain.vo.SysTenantVo; @@ -111,81 +111,81 @@ public class SysTenantServiceImpl implements ISysTenantService { * 新增租户 */ @Override - @IgnoreTenant @Transactional(rollbackFor = Exception.class) public Boolean insertByBo(SysTenantBo bo) { + TenantHelper.ignore(unused -> { - SysTenant add = MapstructUtils.convert(bo, SysTenant.class); + SysTenant add = MapstructUtils.convert(bo, SysTenant.class); - // 获取所有租户编号 - List tenantIds = baseMapper.selectObjs( - new LambdaQueryWrapper().select(SysTenant::getTenantId), Convert::toStr); - String tenantId = generateTenantId(tenantIds); - add.setTenantId(tenantId); - boolean flag = baseMapper.insert(add) > 0; - if (!flag) { - throw new ServiceException("创建租户失败"); - } - bo.setId(add.getId()); + // 获取所有租户编号 + List tenantIds = baseMapper.selectObjs( + new LambdaQueryWrapper().select(SysTenant::getTenantId), Convert::toStr); + String tenantId = generateTenantId(tenantIds); + add.setTenantId(tenantId); + boolean flag = baseMapper.insert(add) > 0; + if (!flag) { + throw new ServiceException("创建租户失败"); + } + bo.setId(add.getId()); - // 根据套餐创建角色 - Long roleId = createTenantRole(tenantId, bo.getPackageId()); + // 根据套餐创建角色 + Long roleId = createTenantRole(tenantId, bo.getPackageId()); - // 创建部门: 公司名是部门名称 - SysDept dept = new SysDept(); - dept.setTenantId(tenantId); - dept.setDeptName(bo.getCompanyName()); - dept.setLeader(bo.getUsername()); - dept.setParentId(Constants.TOP_PARENT_ID); - dept.setAncestors(Constants.TOP_PARENT_ID.toString()); - deptMapper.insert(dept); - Long deptId = dept.getDeptId(); + // 创建部门: 公司名是部门名称 + SysDept dept = new SysDept(); + dept.setTenantId(tenantId); + dept.setDeptName(bo.getCompanyName()); + dept.setLeader(bo.getUsername()); + dept.setParentId(Constants.TOP_PARENT_ID); + dept.setAncestors(Constants.TOP_PARENT_ID.toString()); + deptMapper.insert(dept); + Long deptId = dept.getDeptId(); - // 角色和部门关联表 - SysRoleDept roleDept = new SysRoleDept(); - roleDept.setRoleId(roleId); - roleDept.setDeptId(deptId); - roleDeptMapper.insert(roleDept); + // 角色和部门关联表 + SysRoleDept roleDept = new SysRoleDept(); + roleDept.setRoleId(roleId); + roleDept.setDeptId(deptId); + roleDeptMapper.insert(roleDept); - // 创建系统用户 - SysUser user = new SysUser(); - user.setTenantId(tenantId); - user.setUserName(bo.getUsername()); - user.setNickName(bo.getUsername()); - user.setPassword(BCrypt.hashpw(bo.getPassword())); - user.setDeptId(deptId); - userMapper.insert(user); + // 创建系统用户 + SysUser user = new SysUser(); + user.setTenantId(tenantId); + user.setUserName(bo.getUsername()); + user.setNickName(bo.getUsername()); + user.setPassword(BCrypt.hashpw(bo.getPassword())); + user.setDeptId(deptId); + userMapper.insert(user); - // 用户和角色关联表 - SysUserRole userRole = new SysUserRole(); - userRole.setUserId(user.getUserId()); - userRole.setRoleId(roleId); - userRoleMapper.insert(userRole); + // 用户和角色关联表 + SysUserRole userRole = new SysUserRole(); + userRole.setUserId(user.getUserId()); + userRole.setRoleId(roleId); + userRoleMapper.insert(userRole); - String defaultTenantId = TenantConstants.DEFAULT_TENANT_ID; - List dictTypeList = dictTypeMapper.selectList( - new LambdaQueryWrapper().eq(SysDictType::getTenantId, defaultTenantId)); - List dictDataList = dictDataMapper.selectList( - new LambdaQueryWrapper().eq(SysDictData::getTenantId, defaultTenantId)); - for (SysDictType dictType : dictTypeList) { - dictType.setDictId(null); - dictType.setTenantId(tenantId); - } - for (SysDictData dictData : dictDataList) { - dictData.setDictCode(null); - dictData.setTenantId(tenantId); - } - dictTypeMapper.insertBatch(dictTypeList); - dictDataMapper.insertBatch(dictDataList); - - List sysConfigList = configMapper.selectList( - new LambdaQueryWrapper().eq(SysConfig::getTenantId, defaultTenantId)); - for (SysConfig config : sysConfigList) { - config.setConfigId(null); - config.setTenantId(tenantId); - } - configMapper.insertBatch(sysConfigList); + String defaultTenantId = TenantConstants.DEFAULT_TENANT_ID; + List dictTypeList = dictTypeMapper.selectList( + new LambdaQueryWrapper().eq(SysDictType::getTenantId, defaultTenantId)); + List dictDataList = dictDataMapper.selectList( + new LambdaQueryWrapper().eq(SysDictData::getTenantId, defaultTenantId)); + for (SysDictType dictType : dictTypeList) { + dictType.setDictId(null); + dictType.setTenantId(tenantId); + } + for (SysDictData dictData : dictDataList) { + dictData.setDictCode(null); + dictData.setTenantId(tenantId); + } + dictTypeMapper.insertBatch(dictTypeList); + dictDataMapper.insertBatch(dictDataList); + List sysConfigList = configMapper.selectList( + new LambdaQueryWrapper().eq(SysConfig::getTenantId, defaultTenantId)); + for (SysConfig config : sysConfigList) { + config.setConfigId(null); + config.setTenantId(tenantId); + } + configMapper.insertBatch(sysConfigList); + }); return true; } @@ -340,33 +340,34 @@ public class SysTenantServiceImpl implements ISysTenantService { * 同步租户套餐 */ @Override - @IgnoreTenant @Transactional(rollbackFor = Exception.class) public Boolean syncTenantPackage(String tenantId, String packageId) { - SysTenantPackage tenantPackage = tenantPackageMapper.selectById(packageId); - List roles = roleMapper.selectList( - new LambdaQueryWrapper().eq(SysRole::getTenantId, tenantId)); - List roleIds = new ArrayList<>(roles.size() - 1); - List menuIds = StringUtils.splitTo(tenantPackage.getMenuIds(), Convert::toLong); - roles.forEach(item -> { - if (TenantConstants.TENANT_ADMIN_ROLE_KEY.equals(item.getRoleKey())) { - List roleMenus = new ArrayList<>(menuIds.size()); - menuIds.forEach(menuId -> { - SysRoleMenu roleMenu = new SysRoleMenu(); - roleMenu.setRoleId(item.getRoleId()); - roleMenu.setMenuId(menuId); - roleMenus.add(roleMenu); - }); - roleMenuMapper.delete(new LambdaQueryWrapper().eq(SysRoleMenu::getRoleId, item.getRoleId())); - roleMenuMapper.insertBatch(roleMenus); - } else { - roleIds.add(item.getRoleId()); + TenantHelper.ignore(unused -> { + SysTenantPackage tenantPackage = tenantPackageMapper.selectById(packageId); + List roles = roleMapper.selectList( + new LambdaQueryWrapper().eq(SysRole::getTenantId, tenantId)); + List roleIds = new ArrayList<>(roles.size() - 1); + List menuIds = StringUtils.splitTo(tenantPackage.getMenuIds(), Convert::toLong); + roles.forEach(item -> { + if (TenantConstants.TENANT_ADMIN_ROLE_KEY.equals(item.getRoleKey())) { + List roleMenus = new ArrayList<>(menuIds.size()); + menuIds.forEach(menuId -> { + SysRoleMenu roleMenu = new SysRoleMenu(); + roleMenu.setRoleId(item.getRoleId()); + roleMenu.setMenuId(menuId); + roleMenus.add(roleMenu); + }); + roleMenuMapper.delete(new LambdaQueryWrapper().eq(SysRoleMenu::getRoleId, item.getRoleId())); + roleMenuMapper.insertBatch(roleMenus); + } else { + roleIds.add(item.getRoleId()); + } + }); + if (!roleIds.isEmpty()) { + roleMenuMapper.delete( + new LambdaQueryWrapper().in(SysRoleMenu::getRoleId, roleIds).notIn(!menuIds.isEmpty(), SysRoleMenu::getMenuId, menuIds)); } }); - if (!roleIds.isEmpty()) { - roleMenuMapper.delete( - new LambdaQueryWrapper().in(SysRoleMenu::getRoleId, roleIds).notIn(!menuIds.isEmpty(), SysRoleMenu::getMenuId, menuIds)); - } return true; } } From 9782e8680f90798556f4de65cf558b1ca0b1af2c Mon Sep 17 00:00:00 2001 From: yixiaco <627428179@qq.com> Date: Fri, 21 Apr 2023 00:46:02 +0800 Subject: [PATCH 3/3] =?UTF-8?q?update=20=E5=BF=BD=E7=95=A5=E7=A7=9F?= =?UTF-8?q?=E6=88=B7=E5=9C=A8controller=E5=B1=82=EF=BC=8C=E7=A7=BB?= =?UTF-8?q?=E9=99=A4service=E5=8C=85=E5=90=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/tenant/helper/TenantHelper.java | 5 +- .../system/SysTenantController.java | 25 ++- .../service/impl/SysTenantServiceImpl.java | 174 +++++++++--------- 3 files changed, 102 insertions(+), 102 deletions(-) diff --git a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java index b9c90b6d8..8d435a367 100644 --- a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java +++ b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java @@ -15,7 +15,6 @@ import org.dromara.common.core.utils.StringUtils; import org.dromara.common.redis.utils.RedisUtils; import org.dromara.common.satoken.utils.LoginHelper; -import java.util.function.Consumer; import java.util.function.Supplier; /** @@ -57,10 +56,10 @@ public class TenantHelper { * * @param handle 处理执行方法 */ - public static void ignore(Consumer handle) { + public static void ignore(Runnable handle) { enableIgnore(); try { - handle.accept(null); + handle.run(); } finally { disableIgnore(); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java index 4ef666ddb..de25b8ecf 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java @@ -3,6 +3,11 @@ package org.dromara.system.controller.system; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaCheckRole; import com.baomidou.lock.annotation.Lock4j; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; import org.dromara.common.core.constant.TenantConstants; import org.dromara.common.core.domain.R; import org.dromara.common.core.validate.AddGroup; @@ -18,13 +23,15 @@ import org.dromara.common.web.core.BaseController; import org.dromara.system.domain.bo.SysTenantBo; import org.dromara.system.domain.vo.SysTenantVo; import org.dromara.system.service.ISysTenantService; -import jakarta.servlet.http.HttpServletResponse; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; -import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import java.util.List; @@ -72,7 +79,7 @@ public class SysTenantController extends BaseController { @SaCheckPermission("system:tenant:query") @GetMapping("/{id}") public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long id) { + @PathVariable Long id) { return R.ok(tenantService.queryById(id)); } @@ -89,7 +96,7 @@ public class SysTenantController extends BaseController { if (!tenantService.checkCompanyNameUnique(bo)) { return R.fail("新增租户'" + bo.getCompanyName() + "'失败,企业名称已存在"); } - return toAjax(tenantService.insertByBo(bo)); + return toAjax(TenantHelper.ignore(() -> tenantService.insertByBo(bo))); } /** @@ -168,7 +175,7 @@ public class SysTenantController extends BaseController { @Log(title = "租户", businessType = BusinessType.UPDATE) @GetMapping("/syncTenantPackage") public R syncTenantPackage(@NotBlank(message = "租户ID不能为空") String tenantId, @NotBlank(message = "套餐ID不能为空") String packageId) { - return toAjax(tenantService.syncTenantPackage(tenantId, packageId)); + return toAjax(TenantHelper.ignore(() -> tenantService.syncTenantPackage(tenantId, packageId))); } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java index 29dd76fba..0cd574ad0 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java @@ -17,7 +17,6 @@ import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.system.domain.*; import org.dromara.system.domain.bo.SysTenantBo; import org.dromara.system.domain.vo.SysTenantVo; @@ -113,79 +112,76 @@ public class SysTenantServiceImpl implements ISysTenantService { @Override @Transactional(rollbackFor = Exception.class) public Boolean insertByBo(SysTenantBo bo) { - TenantHelper.ignore(unused -> { + SysTenant add = MapstructUtils.convert(bo, SysTenant.class); - SysTenant add = MapstructUtils.convert(bo, SysTenant.class); + // 获取所有租户编号 + List tenantIds = baseMapper.selectObjs( + new LambdaQueryWrapper().select(SysTenant::getTenantId), Convert::toStr); + String tenantId = generateTenantId(tenantIds); + add.setTenantId(tenantId); + boolean flag = baseMapper.insert(add) > 0; + if (!flag) { + throw new ServiceException("创建租户失败"); + } + bo.setId(add.getId()); - // 获取所有租户编号 - List tenantIds = baseMapper.selectObjs( - new LambdaQueryWrapper().select(SysTenant::getTenantId), Convert::toStr); - String tenantId = generateTenantId(tenantIds); - add.setTenantId(tenantId); - boolean flag = baseMapper.insert(add) > 0; - if (!flag) { - throw new ServiceException("创建租户失败"); - } - bo.setId(add.getId()); + // 根据套餐创建角色 + Long roleId = createTenantRole(tenantId, bo.getPackageId()); - // 根据套餐创建角色 - Long roleId = createTenantRole(tenantId, bo.getPackageId()); + // 创建部门: 公司名是部门名称 + SysDept dept = new SysDept(); + dept.setTenantId(tenantId); + dept.setDeptName(bo.getCompanyName()); + dept.setLeader(bo.getUsername()); + dept.setParentId(Constants.TOP_PARENT_ID); + dept.setAncestors(Constants.TOP_PARENT_ID.toString()); + deptMapper.insert(dept); + Long deptId = dept.getDeptId(); - // 创建部门: 公司名是部门名称 - SysDept dept = new SysDept(); - dept.setTenantId(tenantId); - dept.setDeptName(bo.getCompanyName()); - dept.setLeader(bo.getUsername()); - dept.setParentId(Constants.TOP_PARENT_ID); - dept.setAncestors(Constants.TOP_PARENT_ID.toString()); - deptMapper.insert(dept); - Long deptId = dept.getDeptId(); + // 角色和部门关联表 + SysRoleDept roleDept = new SysRoleDept(); + roleDept.setRoleId(roleId); + roleDept.setDeptId(deptId); + roleDeptMapper.insert(roleDept); - // 角色和部门关联表 - SysRoleDept roleDept = new SysRoleDept(); - roleDept.setRoleId(roleId); - roleDept.setDeptId(deptId); - roleDeptMapper.insert(roleDept); + // 创建系统用户 + SysUser user = new SysUser(); + user.setTenantId(tenantId); + user.setUserName(bo.getUsername()); + user.setNickName(bo.getUsername()); + user.setPassword(BCrypt.hashpw(bo.getPassword())); + user.setDeptId(deptId); + userMapper.insert(user); - // 创建系统用户 - SysUser user = new SysUser(); - user.setTenantId(tenantId); - user.setUserName(bo.getUsername()); - user.setNickName(bo.getUsername()); - user.setPassword(BCrypt.hashpw(bo.getPassword())); - user.setDeptId(deptId); - userMapper.insert(user); + // 用户和角色关联表 + SysUserRole userRole = new SysUserRole(); + userRole.setUserId(user.getUserId()); + userRole.setRoleId(roleId); + userRoleMapper.insert(userRole); - // 用户和角色关联表 - SysUserRole userRole = new SysUserRole(); - userRole.setUserId(user.getUserId()); - userRole.setRoleId(roleId); - userRoleMapper.insert(userRole); + String defaultTenantId = TenantConstants.DEFAULT_TENANT_ID; + List dictTypeList = dictTypeMapper.selectList( + new LambdaQueryWrapper().eq(SysDictType::getTenantId, defaultTenantId)); + List dictDataList = dictDataMapper.selectList( + new LambdaQueryWrapper().eq(SysDictData::getTenantId, defaultTenantId)); + for (SysDictType dictType : dictTypeList) { + dictType.setDictId(null); + dictType.setTenantId(tenantId); + } + for (SysDictData dictData : dictDataList) { + dictData.setDictCode(null); + dictData.setTenantId(tenantId); + } + dictTypeMapper.insertBatch(dictTypeList); + dictDataMapper.insertBatch(dictDataList); - String defaultTenantId = TenantConstants.DEFAULT_TENANT_ID; - List dictTypeList = dictTypeMapper.selectList( - new LambdaQueryWrapper().eq(SysDictType::getTenantId, defaultTenantId)); - List dictDataList = dictDataMapper.selectList( - new LambdaQueryWrapper().eq(SysDictData::getTenantId, defaultTenantId)); - for (SysDictType dictType : dictTypeList) { - dictType.setDictId(null); - dictType.setTenantId(tenantId); - } - for (SysDictData dictData : dictDataList) { - dictData.setDictCode(null); - dictData.setTenantId(tenantId); - } - dictTypeMapper.insertBatch(dictTypeList); - dictDataMapper.insertBatch(dictDataList); - - List sysConfigList = configMapper.selectList( - new LambdaQueryWrapper().eq(SysConfig::getTenantId, defaultTenantId)); - for (SysConfig config : sysConfigList) { - config.setConfigId(null); - config.setTenantId(tenantId); - } - configMapper.insertBatch(sysConfigList); - }); + List sysConfigList = configMapper.selectList( + new LambdaQueryWrapper().eq(SysConfig::getTenantId, defaultTenantId)); + for (SysConfig config : sysConfigList) { + config.setConfigId(null); + config.setTenantId(tenantId); + } + configMapper.insertBatch(sysConfigList); return true; } @@ -342,32 +338,30 @@ public class SysTenantServiceImpl implements ISysTenantService { @Override @Transactional(rollbackFor = Exception.class) public Boolean syncTenantPackage(String tenantId, String packageId) { - TenantHelper.ignore(unused -> { - SysTenantPackage tenantPackage = tenantPackageMapper.selectById(packageId); - List roles = roleMapper.selectList( - new LambdaQueryWrapper().eq(SysRole::getTenantId, tenantId)); - List roleIds = new ArrayList<>(roles.size() - 1); - List menuIds = StringUtils.splitTo(tenantPackage.getMenuIds(), Convert::toLong); - roles.forEach(item -> { - if (TenantConstants.TENANT_ADMIN_ROLE_KEY.equals(item.getRoleKey())) { - List roleMenus = new ArrayList<>(menuIds.size()); - menuIds.forEach(menuId -> { - SysRoleMenu roleMenu = new SysRoleMenu(); - roleMenu.setRoleId(item.getRoleId()); - roleMenu.setMenuId(menuId); - roleMenus.add(roleMenu); - }); - roleMenuMapper.delete(new LambdaQueryWrapper().eq(SysRoleMenu::getRoleId, item.getRoleId())); - roleMenuMapper.insertBatch(roleMenus); - } else { - roleIds.add(item.getRoleId()); - } - }); - if (!roleIds.isEmpty()) { - roleMenuMapper.delete( - new LambdaQueryWrapper().in(SysRoleMenu::getRoleId, roleIds).notIn(!menuIds.isEmpty(), SysRoleMenu::getMenuId, menuIds)); + SysTenantPackage tenantPackage = tenantPackageMapper.selectById(packageId); + List roles = roleMapper.selectList( + new LambdaQueryWrapper().eq(SysRole::getTenantId, tenantId)); + List roleIds = new ArrayList<>(roles.size() - 1); + List menuIds = StringUtils.splitTo(tenantPackage.getMenuIds(), Convert::toLong); + roles.forEach(item -> { + if (TenantConstants.TENANT_ADMIN_ROLE_KEY.equals(item.getRoleKey())) { + List roleMenus = new ArrayList<>(menuIds.size()); + menuIds.forEach(menuId -> { + SysRoleMenu roleMenu = new SysRoleMenu(); + roleMenu.setRoleId(item.getRoleId()); + roleMenu.setMenuId(menuId); + roleMenus.add(roleMenu); + }); + roleMenuMapper.delete(new LambdaQueryWrapper().eq(SysRoleMenu::getRoleId, item.getRoleId())); + roleMenuMapper.insertBatch(roleMenus); + } else { + roleIds.add(item.getRoleId()); } }); + if (!roleIds.isEmpty()) { + roleMenuMapper.delete( + new LambdaQueryWrapper().in(SysRoleMenu::getRoleId, roleIds).notIn(!menuIds.isEmpty(), SysRoleMenu::getMenuId, menuIds)); + } return true; } }