diff --git a/continew-common/src/main/java/top/continew/admin/common/constant/RegexConstants.java b/continew-common/src/main/java/top/continew/admin/common/constant/RegexConstants.java
index 70a8e71a..f0d9c7bb 100644
--- a/continew-common/src/main/java/top/continew/admin/common/constant/RegexConstants.java
+++ b/continew-common/src/main/java/top/continew/admin/common/constant/RegexConstants.java
@@ -70,20 +70,15 @@ public class RegexConstants {
* 域名、IPV4、IPV6
*
*/
- public static final String HTTP_HOST =
- "^(" +
- // ① 域名
- "(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?\\.)+[A-Za-z]{2,63}" +
- "|" +
- // ② IPv4
- "(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)" +
- "|" +
- // ③ IPv6(8 组 1-4 位十六进制,用 : 分隔,支持压缩 0)
- "(?:[0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4}" +
- "|" +
- // ④ IPv6 压缩形式(::)
- "(?:[0-9A-Fa-f]{1,4}:){0,6}::(?:[0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4}" +
- ")$";
+ public static final String HTTP_HOST = "^(" +
+ // ① 域名
+ "(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?\\.)+[A-Za-z]{2,63}" + "|" +
+ // ② IPv4
+ "(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)" + "|" +
+ // ③ IPv6(8 组 1-4 位十六进制,用 : 分隔,支持压缩 0)
+ "(?:[0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4}" + "|" +
+ // ④ IPv6 压缩形式(::)
+ "(?:[0-9A-Fa-f]{1,4}:){0,6}::(?:[0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4}" + ")$";
private RegexConstants() {
}
diff --git a/continew-plugin/continew-plugin-tenant/src/main/java/top/continew/admin/tenant/controller/CommonController.java b/continew-plugin/continew-plugin-tenant/src/main/java/top/continew/admin/tenant/controller/CommonController.java
index 82247c3a..a37e553a 100644
--- a/continew-plugin/continew-plugin-tenant/src/main/java/top/continew/admin/tenant/controller/CommonController.java
+++ b/continew-plugin/continew-plugin-tenant/src/main/java/top/continew/admin/tenant/controller/CommonController.java
@@ -64,9 +64,9 @@ public class CommonController {
@SaIgnore
@TenantIgnore
@GetMapping("/id/domain")
- public Long getTenantIdByUrl(@RequestParam("domain") String domain){
+ public Long getTenantIdByUrl(@RequestParam("domain") String domain) {
TenantDO tenantDO = tenantService.getByDomain(domain);
- if (tenantDO != null){
+ if (tenantDO != null) {
return tenantDO.getId();
}
return null;
diff --git a/continew-plugin/continew-plugin-tenant/src/main/java/top/continew/admin/tenant/handler/TenantDataHandlerForSystem.java b/continew-plugin/continew-plugin-tenant/src/main/java/top/continew/admin/tenant/handler/TenantDataHandlerForSystem.java
index 2b8f6b12..58def507 100644
--- a/continew-plugin/continew-plugin-tenant/src/main/java/top/continew/admin/tenant/handler/TenantDataHandlerForSystem.java
+++ b/continew-plugin/continew-plugin-tenant/src/main/java/top/continew/admin/tenant/handler/TenantDataHandlerForSystem.java
@@ -36,7 +36,6 @@ import top.continew.admin.system.mapper.user.UserPasswordHistoryMapper;
import top.continew.admin.system.mapper.user.UserSocialMapper;
import top.continew.admin.system.model.entity.DeptDO;
import top.continew.admin.system.model.entity.FileDO;
-import top.continew.admin.system.model.entity.MenuDO;
import top.continew.admin.system.model.entity.RoleDO;
import top.continew.admin.system.model.entity.user.UserDO;
import top.continew.admin.system.service.FileService;
@@ -96,8 +95,6 @@ public class TenantDataHandlerForSystem implements TenantDataHandler {
Long deptId = this.initDeptData(tenant);
// 初始化菜单
List menuIds = packageMenuService.listMenuIdsByPackageId(tenant.getPackageId());
- List menuList = menuMapper.lambdaQuery().in(MenuDO::getId, menuIds).list();
- this.initMenuData(menuList, 0L, 0L);
// 初始化角色
Long roleId = this.initRoleData(tenant);
// 角色绑定菜单
@@ -165,24 +162,6 @@ public class TenantDataHandlerForSystem implements TenantDataHandler {
return dept.getId();
}
- /**
- * 递归初始化菜单数据
- *
- * @param menuList 菜单列表
- * @param oldParentId 旧父级 ID
- * @param newParentId 新父级 ID
- */
- private void initMenuData(List menuList, Long oldParentId, Long newParentId) {
- List children = menuList.stream().filter(menuDO -> menuDO.getParentId().equals(oldParentId)).toList();
- for (MenuDO menu : children) {
- Long oldId = menu.getId();
- menu.setId(null);
- menu.setParentId(newParentId);
- menuMapper.insert(menu);
- initMenuData(menuList, oldId, menu.getId());
- }
- }
-
/**
* 初始化角色数据
*
diff --git a/continew-plugin/continew-plugin-tenant/src/main/java/top/continew/admin/tenant/service/impl/TenantServiceImpl.java b/continew-plugin/continew-plugin-tenant/src/main/java/top/continew/admin/tenant/service/impl/TenantServiceImpl.java
index 63f95d5f..176d7347 100644
--- a/continew-plugin/continew-plugin-tenant/src/main/java/top/continew/admin/tenant/service/impl/TenantServiceImpl.java
+++ b/continew-plugin/continew-plugin-tenant/src/main/java/top/continew/admin/tenant/service/impl/TenantServiceImpl.java
@@ -18,13 +18,18 @@ package top.continew.admin.tenant.service.impl;
import cn.hutool.core.collection.CollUtil;
import com.alicp.jetcache.anno.Cached;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import me.ahoo.cosid.provider.IdGeneratorProvider;
import org.springframework.stereotype.Service;
import top.continew.admin.common.base.service.BaseServiceImpl;
+import top.continew.admin.common.constant.CacheConstants;
+import top.continew.admin.common.constant.SysConstants;
import top.continew.admin.common.enums.DisEnableStatusEnum;
-import top.continew.admin.system.model.entity.MenuDO;
-import top.continew.admin.system.service.MenuService;
+import top.continew.admin.system.model.entity.RoleDO;
+import top.continew.admin.system.model.entity.RoleMenuDO;
+import top.continew.admin.system.service.RoleMenuService;
+import top.continew.admin.system.service.RoleService;
import top.continew.admin.tenant.config.TenantExtensionProperties;
import top.continew.admin.tenant.constant.TenantCacheConstants;
import top.continew.admin.tenant.constant.TenantConstants;
@@ -35,16 +40,15 @@ import top.continew.admin.tenant.model.query.TenantQuery;
import top.continew.admin.tenant.model.req.TenantReq;
import top.continew.admin.tenant.model.resp.TenantDetailResp;
import top.continew.admin.tenant.model.resp.TenantResp;
-import top.continew.admin.tenant.service.PackageMenuService;
import top.continew.admin.tenant.service.PackageService;
import top.continew.admin.tenant.service.TenantService;
import top.continew.starter.cache.redisson.util.RedisUtils;
+import top.continew.starter.core.constant.StringConstants;
import top.continew.starter.core.util.validation.CheckUtils;
import top.continew.starter.extension.tenant.util.TenantUtils;
import java.io.Serializable;
import java.time.LocalDateTime;
-import java.util.ArrayList;
import java.util.List;
/**
@@ -62,8 +66,8 @@ public class TenantServiceImpl extends BaseServiceImpl oldMenuIds = packageMenuService.listMenuIdsByPackageId(packageId);
- // 如果有删除的菜单则绑定了套餐的租户对应的菜单也会删除
- List deleteMenuIds = new ArrayList<>(oldMenuIds);
- deleteMenuIds.removeAll(newMenuIds);
- if (CollUtil.isNotEmpty(deleteMenuIds)) {
- List deleteMenus = menuService.listByIds(deleteMenuIds);
- tenantIdList.forEach(tenantId -> TenantUtils.execute(tenantId, () -> menuService
- .deleteTenantMenus(deleteMenus)));
- }
- // 如果有新增的菜单则绑定了套餐的租户对应的菜单也会新增
- List addMenuIds = new ArrayList<>(newMenuIds);
- addMenuIds.removeAll(oldMenuIds);
- if (CollUtil.isNotEmpty(addMenuIds)) {
- List addMenus = menuService.listByIds(addMenuIds);
- for (MenuDO addMenu : addMenus) {
- MenuDO parentMenu = addMenu.getParentId() != 0 ? menuService.getById(addMenu.getParentId()) : null;
- tenantIdList.forEach(tenantId -> TenantUtils.execute(tenantId, () -> menuService
- .addTenantMenu(addMenu, parentMenu)));
- }
- }
+ //删除旧菜单
+ tenantIdList.forEach(tenantId -> TenantUtils.execute(tenantId, () -> roleMenuService.remove(Wrappers
+ .lambdaQuery(RoleMenuDO.class)
+ .notIn(RoleMenuDO::getMenuId, newMenuIds))));
+ //新增菜单
+ tenantIdList.forEach(tenantId -> TenantUtils.execute(tenantId, () -> {
+ RoleDO roleDO = roleService.getByCode(SysConstants.TENANT_ADMIN_ROLE_CODE);
+ List oldMenuIds = roleMenuService.list(Wrappers.lambdaQuery(RoleMenuDO.class)
+ .eq(RoleMenuDO::getRoleId, roleDO.getId())).stream().map(RoleMenuDO::getMenuId).toList();
+ newMenuIds.removeAll(oldMenuIds);
+ roleMenuService.add(newMenuIds, roleDO.getId());
+ }));
+ //清理角色菜单缓存
+ RedisUtils.deleteByPattern(CacheConstants.ROLE_MENU_KEY_PREFIX + StringConstants.ASTERISK);
}
@Override
diff --git a/continew-server/src/main/resources/config/application.yml b/continew-server/src/main/resources/config/application.yml
index 57b69561..50ce5c34 100644
--- a/continew-server/src/main/resources/config/application.yml
+++ b/continew-server/src/main/resources/config/application.yml
@@ -223,6 +223,7 @@ continew-starter.tenant:
- sys_sms_log # 短信日志表
- sys_client # 客户端表
- sys_app # 应用表
+ - sys_menu
# 忽略菜单 ID(租户不能使用的菜单)
ignore-menus:
- 1130 # 字典管理
diff --git a/continew-server/src/main/resources/db/changelog/mysql/plugin/plugin_tenant.sql b/continew-server/src/main/resources/db/changelog/mysql/plugin/plugin_tenant.sql
index 0f421992..e6f7696f 100644
--- a/continew-server/src/main/resources/db/changelog/mysql/plugin/plugin_tenant.sql
+++ b/continew-server/src/main/resources/db/changelog/mysql/plugin/plugin_tenant.sql
@@ -48,9 +48,6 @@ CREATE TABLE IF NOT EXISTS `tenant_package_menu` (
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='租户套餐和菜单关联表';
-- 为已有表增加租户字段
-ALTER TABLE `sys_menu`
- ADD COLUMN `tenant_id` BIGINT NOT NULL DEFAULT 0 COMMENT '租户ID',
- ADD INDEX `idx_tenant_id` (`tenant_id`);
ALTER TABLE `sys_dept`
ADD COLUMN `tenant_id` BIGINT NOT NULL DEFAULT 0 COMMENT '租户ID',
ADD INDEX `idx_tenant_id` (`tenant_id`);
@@ -98,9 +95,6 @@ ALTER TABLE `sys_app`
ADD INDEX `idx_tenant_id` (`tenant_id`);
-- 调整唯一索引
-ALTER TABLE `sys_menu`
- DROP INDEX `uk_title_parent_id`,
- ADD UNIQUE INDEX `uk_title_parent_id` (`title`, `parent_id`, `tenant_id`);
ALTER TABLE `sys_dept`
DROP INDEX `uk_name_parent_id`,
ADD UNIQUE INDEX `uk_name_parent_id` (`name`, `parent_id`, `tenant_id`);
diff --git a/continew-system/src/main/java/top/continew/admin/auth/handler/AccountLoginHandler.java b/continew-system/src/main/java/top/continew/admin/auth/handler/AccountLoginHandler.java
index f4007e14..0277998f 100644
--- a/continew-system/src/main/java/top/continew/admin/auth/handler/AccountLoginHandler.java
+++ b/continew-system/src/main/java/top/continew/admin/auth/handler/AccountLoginHandler.java
@@ -72,7 +72,10 @@ public class AccountLoginHandler extends AbstractLoginHandler {
super.checkUserStatus(user);
// 执行认证
String token = this.authenticate(user, client);
- return LoginResp.builder().token(token).tenantId(TenantContextHolder.isTenantEnabled()? TenantContextHolder.getTenantId():null).build();
+ return LoginResp.builder()
+ .token(token)
+ .tenantId(TenantContextHolder.isTenantEnabled() ? TenantContextHolder.getTenantId() : null)
+ .build();
}
@Override
diff --git a/continew-system/src/main/java/top/continew/admin/auth/handler/EmailLoginHandler.java b/continew-system/src/main/java/top/continew/admin/auth/handler/EmailLoginHandler.java
index 5488fea6..e7ac5dc8 100644
--- a/continew-system/src/main/java/top/continew/admin/auth/handler/EmailLoginHandler.java
+++ b/continew-system/src/main/java/top/continew/admin/auth/handler/EmailLoginHandler.java
@@ -48,7 +48,11 @@ public class EmailLoginHandler extends AbstractLoginHandler {
super.checkUserStatus(user);
// 执行认证
String token = super.authenticate(user, client);
- return LoginResp.builder().token(token).tenantId(TenantContextHolder.isTenantEnabled()? TenantContextHolder.getTenantId():null).build(); }
+ return LoginResp.builder()
+ .token(token)
+ .tenantId(TenantContextHolder.isTenantEnabled() ? TenantContextHolder.getTenantId() : null)
+ .build();
+ }
@Override
public void preLogin(EmailLoginReq req, ClientResp client, HttpServletRequest request) {
diff --git a/continew-system/src/main/java/top/continew/admin/auth/handler/PhoneLoginHandler.java b/continew-system/src/main/java/top/continew/admin/auth/handler/PhoneLoginHandler.java
index 20542176..6d21a217 100644
--- a/continew-system/src/main/java/top/continew/admin/auth/handler/PhoneLoginHandler.java
+++ b/continew-system/src/main/java/top/continew/admin/auth/handler/PhoneLoginHandler.java
@@ -48,7 +48,11 @@ public class PhoneLoginHandler extends AbstractLoginHandler {
super.checkUserStatus(user);
// 执行认证
String token = super.authenticate(user, client);
- return LoginResp.builder().token(token).tenantId(TenantContextHolder.isTenantEnabled()? TenantContextHolder.getTenantId():null).build(); }
+ return LoginResp.builder()
+ .token(token)
+ .tenantId(TenantContextHolder.isTenantEnabled() ? TenantContextHolder.getTenantId() : null)
+ .build();
+ }
@Override
public void preLogin(PhoneLoginReq req, ClientResp client, HttpServletRequest request) {
diff --git a/continew-system/src/main/java/top/continew/admin/auth/handler/SocialLoginHandler.java b/continew-system/src/main/java/top/continew/admin/auth/handler/SocialLoginHandler.java
index 14eaf780..17cf8429 100644
--- a/continew-system/src/main/java/top/continew/admin/auth/handler/SocialLoginHandler.java
+++ b/continew-system/src/main/java/top/continew/admin/auth/handler/SocialLoginHandler.java
@@ -128,7 +128,10 @@ public class SocialLoginHandler extends AbstractLoginHandler {
userSocialService.saveOrUpdate(userSocial);
// 执行认证
String token = super.authenticate(user, client);
- return LoginResp.builder().token(token).tenantId(TenantContextHolder.isTenantEnabled()? TenantContextHolder.getTenantId():null).build();
+ return LoginResp.builder()
+ .token(token)
+ .tenantId(TenantContextHolder.isTenantEnabled() ? TenantContextHolder.getTenantId() : null)
+ .build();
}
@Override
diff --git a/continew-system/src/main/java/top/continew/admin/system/controller/CommonController.java b/continew-system/src/main/java/top/continew/admin/system/controller/CommonController.java
index 23cfe7cf..0e92eda7 100644
--- a/continew-system/src/main/java/top/continew/admin/system/controller/CommonController.java
+++ b/continew-system/src/main/java/top/continew/admin/system/controller/CommonController.java
@@ -130,10 +130,10 @@ public class CommonController {
@TenantIgnore
@SaIgnore
- @Operation(summary = "查询租户开启状态",description = "查询租户开启状态")
+ @Operation(summary = "查询租户开启状态", description = "查询租户开启状态")
@GetMapping("/dict/option/tenant")
@Cached(key = "'TENANT'", name = CacheConstants.OPTION_KEY_PREFIX)
- public Boolean tenantEnabled(){
+ public Boolean tenantEnabled() {
return TenantContextHolder.isTenantEnabled();
}
}