From 23bab6a22876c02dfe08859e2ed600fd89f64a99 Mon Sep 17 00:00:00 2001 From: Liuyang <2746366019@qq.com> Date: Thu, 6 Mar 2025 14:29:41 +0800 Subject: [PATCH] =?UTF-8?q?feat(menu):=20=E6=B7=BB=E5=8A=A0=E8=8F=9C?= =?UTF-8?q?=E5=8D=95=E7=9A=84=E7=88=B6=E8=B7=AF=E5=BE=84=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 MenuDO 和 AuthPermissionInfoRespVO.MenuVO 中添加 parentPath 字段 - 在构建菜单树时,为每个菜单设置父菜单路径 - 优化菜单查询逻辑,批量获取父菜单信息 --- .../auth/vo/AuthPermissionInfoRespVO.java | 3 ++ .../system/convert/auth/AuthConvert.java | 6 +++- .../dal/dataobject/permission/MenuDO.java | 4 +++ .../service/permission/MenuServiceImpl.java | 34 ++++++++++++++++++- 4 files changed, 45 insertions(+), 2 deletions(-) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/AuthPermissionInfoRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/AuthPermissionInfoRespVO.java index c26acb8ca..45198b9b0 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/AuthPermissionInfoRespVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/AuthPermissionInfoRespVO.java @@ -62,6 +62,9 @@ public class AuthPermissionInfoRespVO { @Schema(description = "父菜单 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") private Long parentId; + @Schema(description = "父菜单 路由地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private String parentPath; + @Schema(description = "菜单名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道") private String name; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/auth/AuthConvert.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/auth/AuthConvert.java index 18463e7f6..e042210c5 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/auth/AuthConvert.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/auth/AuthConvert.java @@ -59,7 +59,11 @@ public interface AuthConvert { // 构建菜单树 // 使用 LinkedHashMap 的原因,是为了排序 。实际也可以用 Stream API ,就是太丑了。 Map treeNodeMap = new LinkedHashMap<>(); - menuList.forEach(menu -> treeNodeMap.put(menu.getId(), AuthConvert.INSTANCE.convertTreeNode(menu))); + menuList.forEach(menu -> { + AuthPermissionInfoRespVO.MenuVO menuVO = AuthConvert.INSTANCE.convertTreeNode(menu); + menuVO.setParentPath(menu.getParentPath()); + treeNodeMap.put(menu.getId(), menuVO); + }); // 处理父子关系 treeNodeMap.values().stream().filter(node -> !node.getParentId().equals(ID_ROOT)).forEach(childNode -> { // 获得父节点 diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/MenuDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/MenuDO.java index 90d583329..2e169174f 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/MenuDO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/permission/MenuDO.java @@ -59,6 +59,10 @@ public class MenuDO extends BaseDO { * 父菜单ID */ private Long parentId; + /** + * 父菜单 路由地址 + */ + private String parentPath; /** * 路由地址 * diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceImpl.java index d253cd6ca..bcbefca75 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceImpl.java @@ -22,6 +22,8 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; @@ -184,7 +186,37 @@ public class MenuServiceImpl implements MenuService { if (CollUtil.isEmpty(ids)) { return Lists.newArrayList(); } - return menuMapper.selectBatchIds(ids); + + // 根据 ids 获取菜单列表 + List dos = menuMapper.selectBatchIds(ids); + if (CollUtil.isEmpty(dos)) { + return dos; + } + + // 过滤出父ID不为空且不为0的菜单,获取父菜单ID列表 + List parentMenuIds = dos.stream() + .filter(menu -> menu.getParentId() != null && menu.getParentId() != 0) + .map(MenuDO::getParentId) + .distinct() + .collect(Collectors.toList()); + + if (CollUtil.isNotEmpty(parentMenuIds)) { + // 根据父菜单ID列表获取父菜单列表,并转换为Map + Map parentMenuMap = menuMapper.selectBatchIds(parentMenuIds).stream() + .collect(Collectors.toMap(MenuDO::getId, Function.identity())); + + // 为每个菜单设置父菜单路径 + dos.forEach(menu -> { + if (menu.getParentId() != null && menu.getParentId() != 0) { + MenuDO parentMenu = parentMenuMap.get(menu.getParentId()); + if (parentMenu != null) { + menu.setParentPath(parentMenu.getPath()); + } + } + }); + } + + return dos; } /**