diff --git a/sql/dm/20260116角色权限增加菜单是否显示字段.sql b/sql/dm/20260116角色权限增加菜单是否显示字段.sql new file mode 100644 index 00000000..a2ff62d4 --- /dev/null +++ b/sql/dm/20260116角色权限增加菜单是否显示字段.sql @@ -0,0 +1,4 @@ +ALTER TABLE "SYSTEM_ROLE_MENU" ADD COLUMN "SHOW_MENU" BIT DEFAULT ('1') NOT NULL; +COMMENT ON COLUMN "SYSTEM_ROLE_MENU"."SHOW_MENU" IS '是否显示菜单'; + +CREATE INDEX "IDX_SYSTEM_ROLE_ID_AND_MENU_ID" ON "SYSTEM_ROLE_MENU"(ROLE_ID,MENU_ID); \ No newline at end of file diff --git a/zt-module-system/zt-module-system-server-app/src/main/resources/logback-spring.xml b/zt-module-system/zt-module-system-server-app/src/main/resources/logback-spring.xml index 3acd4d89..d68b13bb 100644 --- a/zt-module-system/zt-module-system-server-app/src/main/resources/logback-spring.xml +++ b/zt-module-system/zt-module-system-server-app/src/main/resources/logback-spring.xml @@ -103,4 +103,8 @@ + + + + diff --git a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/controller/admin/auth/AuthController.java b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/controller/admin/auth/AuthController.java index ca3fb848..08430f4d 100644 --- a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/controller/admin/auth/AuthController.java +++ b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/controller/admin/auth/AuthController.java @@ -12,6 +12,7 @@ import com.zt.plat.module.system.controller.admin.auth.vo.*; import com.zt.plat.module.system.convert.auth.AuthConvert; import com.zt.plat.module.system.dal.dataobject.permission.MenuDO; import com.zt.plat.module.system.dal.dataobject.permission.RoleDO; +import com.zt.plat.module.system.dal.dataobject.permission.RoleMenuDO; import com.zt.plat.module.system.dal.dataobject.user.AdminUserDO; import com.zt.plat.module.system.enums.logger.LoginLogTypeEnum; import com.zt.plat.module.system.service.auth.AdminAuthService; @@ -33,7 +34,9 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Set; import static com.zt.plat.framework.common.pojo.CommonResult.success; @@ -126,7 +129,18 @@ public class AuthController { // 1.3 获得菜单列表 Set menuIds = permissionService.getRoleMenuListByRoleId(convertSet(roles, RoleDO::getId)); List menuList = menuService.getMenuList(menuIds); + Set roleMenuList = permissionService.getByRoleIdAndMenuIds(roleIds, menuIds); + Map roleMenuMap = new HashMap<>(roleMenuList.size()); + for (RoleMenuDO roleMenu : roleMenuList) { + roleMenuMap.put(roleMenu.getMenuId(), roleMenu); + } menuList = menuService.filterDisableMenus(menuList); + for (MenuDO menu : menuList) { + RoleMenuDO roleMenu = roleMenuMap.get(menu.getId()); + if (roleMenu != null && roleMenu.getShowMenu() != null && !roleMenu.getShowMenu()) { + menu.setVisible(false); + } + } // 2. 拼接结果返回 return success(AuthConvert.INSTANCE.convert(user, roles, menuList)); diff --git a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/controller/admin/permission/PermissionController.java b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/controller/admin/permission/PermissionController.java index f34ec982..d84bc342 100644 --- a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/controller/admin/permission/PermissionController.java +++ b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/controller/admin/permission/PermissionController.java @@ -6,11 +6,13 @@ import com.zt.plat.framework.common.enums.CommonStatusEnum; import com.zt.plat.framework.common.pojo.CommonResult; import com.zt.plat.framework.common.util.collection.CollectionUtils; import com.zt.plat.module.system.controller.admin.permission.vo.permission.PermissionAssignRoleDataScopeReqVO; +import com.zt.plat.module.system.controller.admin.permission.vo.permission.PermissionAssignRoleMenuItemReqVO; import com.zt.plat.module.system.controller.admin.permission.vo.permission.PermissionAssignRoleMenuReqVO; import com.zt.plat.module.system.controller.admin.permission.vo.permission.PermissionAssignUserRoleReqVO; import com.zt.plat.module.system.controller.admin.permission.vo.permission.PermissionUserSupervisionRespVO; import com.zt.plat.module.system.dal.dataobject.permission.MenuDO; import com.zt.plat.module.system.dal.dataobject.permission.RoleDO; +import com.zt.plat.module.system.dal.dataobject.permission.RoleMenuDO; import com.zt.plat.module.system.dal.dataobject.user.AdminUserDO; import com.zt.plat.module.system.enums.permission.MenuTypeEnum; import com.zt.plat.module.system.service.permission.MenuService; @@ -57,8 +59,16 @@ public class PermissionController { @Parameter(name = "roleId", description = "角色编号", required = true) @GetMapping("/list-role-menus") @PreAuthorize("@ss.hasPermission('system:permission:assign-role-menu')") - public CommonResult> getRoleMenuList(Long roleId) { - return success(permissionService.getRoleMenuListByRoleId(roleId)); + public CommonResult> getRoleMenuList(Long roleId) { + Set menuIds = permissionService.getRoleMenuListByRoleId(roleId); + Set menuList = permissionService.getByRoleIdAndMenuIds(Collections.singleton(roleId), menuIds); + Set result = menuList.stream().map(menu -> { + PermissionAssignRoleMenuItemReqVO reqVO = new PermissionAssignRoleMenuItemReqVO(); + reqVO.setId(menu.getMenuId()); + reqVO.setShowMenu(menu.getShowMenu()); + return reqVO; + }).collect(Collectors.toSet()); + return success(result); } @PostMapping("/assign-role-menu") @@ -66,10 +76,13 @@ public class PermissionController { @PreAuthorize("@ss.hasPermission('system:permission:assign-role-menu')") public CommonResult assignRoleMenu(@Validated @RequestBody PermissionAssignRoleMenuReqVO reqVO) { // 开启多租户的情况下,需要过滤掉未开通的菜单 - tenantService.handleTenantMenu(menuIds -> reqVO.getMenuIds().removeIf(menuId -> !CollUtil.contains(menuIds, menuId))); + tenantService.handleTenantMenu(menuIds -> reqVO.getMenus().removeIf(menu -> !CollUtil.contains(menuIds, menu.getId()))); // 执行菜单的分配 - permissionService.assignRoleMenu(reqVO.getRoleId(), reqVO.getMenuIds()); + permissionService.assignRoleMenu(reqVO.getRoleId(), reqVO.getMenus().stream().map(PermissionAssignRoleMenuItemReqVO::getId).collect(Collectors.toSet())); + + // 更新菜单的显示状态 + permissionService.updateMenuDisplay(reqVO.getRoleId(), reqVO.getMenus()); return success(true); } diff --git a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/controller/admin/permission/vo/permission/PermissionAssignRoleMenuItemReqVO.java b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/controller/admin/permission/vo/permission/PermissionAssignRoleMenuItemReqVO.java new file mode 100644 index 00000000..0d038266 --- /dev/null +++ b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/controller/admin/permission/vo/permission/PermissionAssignRoleMenuItemReqVO.java @@ -0,0 +1,22 @@ +package com.zt.plat.module.system.controller.admin.permission.vo.permission; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + + +@Schema(description = "管理后台 - 赋予角色菜单--菜单列表 Request VO") +@Data +public class PermissionAssignRoleMenuItemReqVO { + + @Schema(description = "菜单ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "菜单ID不能为空") + private Long id; + + @Schema(description = "是否显示菜单,默认显示(true)") + private Boolean showMenu = true; + + @Schema(description = "是否显示菜单按钮是否点击过(避免大量更新数据,只更新点击过的)") + private Boolean showMenuChanged = false; + +} diff --git a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/controller/admin/permission/vo/permission/PermissionAssignRoleMenuReqVO.java b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/controller/admin/permission/vo/permission/PermissionAssignRoleMenuReqVO.java index 6e8f740c..bf9e2421 100644 --- a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/controller/admin/permission/vo/permission/PermissionAssignRoleMenuReqVO.java +++ b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/controller/admin/permission/vo/permission/PermissionAssignRoleMenuReqVO.java @@ -15,7 +15,7 @@ public class PermissionAssignRoleMenuReqVO { @NotNull(message = "角色编号不能为空") private Long roleId; - @Schema(description = "菜单编号列表", example = "1,3,5") - private Set menuIds = Collections.emptySet(); // 兜底 + @Schema(description = "菜单编列表") + private Set menus = Collections.emptySet(); // 兜底 } diff --git a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/dal/dataobject/permission/RoleMenuDO.java b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/dal/dataobject/permission/RoleMenuDO.java index ca462cb7..354c4746 100644 --- a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/dal/dataobject/permission/RoleMenuDO.java +++ b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/dal/dataobject/permission/RoleMenuDO.java @@ -33,4 +33,9 @@ public class RoleMenuDO extends TenantBaseDO { */ private Long menuId; + /** + * 是否显示菜单 + */ + private Boolean showMenu = true; + } diff --git a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/permission/PermissionService.java b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/permission/PermissionService.java index 69a4857c..7a23c24e 100644 --- a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/permission/PermissionService.java +++ b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/permission/PermissionService.java @@ -1,6 +1,8 @@ package com.zt.plat.module.system.service.permission; import com.zt.plat.framework.common.biz.system.permission.dto.DeptDataPermissionRespDTO; +import com.zt.plat.module.system.controller.admin.permission.vo.permission.PermissionAssignRoleMenuItemReqVO; +import com.zt.plat.module.system.dal.dataobject.permission.RoleMenuDO; import com.zt.plat.module.system.enums.permission.DataScopeEnum; import java.util.Collection; @@ -153,4 +155,21 @@ public interface PermissionService { */ DataScopeEnum getUserDataPermissionLevel(Long userId); + /** + * 更新菜单是否显示 + * + * @param roleId 用户编号 + * @param menus 包含菜单编号和是否显示的Bean List + * @return + */ + void updateMenuDisplay(Long roleId, Set menus); + + /** + * 根据角色ID和菜单IDS批量查询 + * + * @param ids + * @return + */ + Set getByRoleIdAndMenuIds(Set roleIds, Set ids); + } diff --git a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/permission/PermissionServiceImpl.java b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/permission/PermissionServiceImpl.java index 52265633..ce302e9e 100644 --- a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/permission/PermissionServiceImpl.java +++ b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/permission/PermissionServiceImpl.java @@ -6,6 +6,8 @@ import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.extra.spring.SpringUtil; import com.baomidou.dynamic.datasource.annotation.DSTransactional; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Suppliers; import com.google.common.collect.Sets; @@ -14,6 +16,7 @@ import com.zt.plat.framework.common.enums.CommonStatusEnum; import com.zt.plat.framework.common.util.collection.CollectionUtils; import com.zt.plat.framework.datapermission.core.annotation.DataPermission; import com.zt.plat.framework.tenant.core.context.DeptContextHolder; +import com.zt.plat.module.system.controller.admin.permission.vo.permission.PermissionAssignRoleMenuItemReqVO; import com.zt.plat.module.system.dal.dataobject.permission.MenuDO; import com.zt.plat.module.system.dal.dataobject.permission.RoleDO; import com.zt.plat.module.system.dal.dataobject.permission.RoleMenuDO; @@ -485,4 +488,35 @@ public class PermissionServiceImpl implements PermissionService { return SpringUtil.getBean(getClass()); } + /** + * 更新菜单是否显示 + * + * @param roleId 用户编号 + * @param menus 包含菜单编号和是否显示的Bean List + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void updateMenuDisplay(Long roleId, Set menus) { + for (PermissionAssignRoleMenuItemReqVO menu : menus) { + if (menu.getShowMenuChanged()) { + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(RoleMenuDO::getRoleId, roleId).eq(RoleMenuDO::getMenuId, menu.getId()).set(RoleMenuDO::getShowMenu, menu.getShowMenu()); + roleMenuMapper.update(updateWrapper); + } + } + } + + @Override + public Set getByRoleIdAndMenuIds(Set roleIds, Set ids) { + Set result = new HashSet<>(ids.size()); + for (Long roleId : roleIds) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(RoleMenuDO::getRoleId, roleId).in(!ids.isEmpty(),RoleMenuDO::getMenuId, ids); + result.addAll(roleMenuMapper.selectList(queryWrapper)); + } + return result; + } + + }