From a82ce8da7bd8f79399f02933653637f39c15ddc4 Mon Sep 17 00:00:00 2001 From: hxr <1490493387@qq.com> Date: Sun, 22 Oct 2023 23:58:41 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=8F=9C=E5=8D=95=E8=B7=AF=E7=94=B1?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=98=AF=E5=90=A6=E5=BC=80=E5=90=AF=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E5=92=8C=E7=9B=AE=E5=BD=95=E5=A7=8B=E7=BB=88=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E7=9A=84=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/youlai/system/model/bo/RouteBO.java | 17 +- .../youlai/system/model/entity/SysMenu.java | 11 + .../youlai/system/model/form/MenuForm.java | 8 + .../com/youlai/system/model/vo/RouteVO.java | 6 +- .../service/impl/SysMenuServiceImpl.java | 248 ++++++++++-------- src/main/resources/mapper/SysMenuMapper.xml | 6 +- 6 files changed, 180 insertions(+), 116 deletions(-) diff --git a/src/main/java/com/youlai/system/model/bo/RouteBO.java b/src/main/java/com/youlai/system/model/bo/RouteBO.java index 4f821c71..0cb9420e 100644 --- a/src/main/java/com/youlai/system/model/bo/RouteBO.java +++ b/src/main/java/com/youlai/system/model/bo/RouteBO.java @@ -1,7 +1,5 @@ package com.youlai.system.model.bo; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; import com.youlai.system.common.enums.MenuTypeEnum; import lombok.Data; @@ -12,10 +10,7 @@ import java.util.List; */ @Data public class RouteBO { - /** - * - */ - @TableId(type = IdType.AUTO) + private Long id; /** @@ -73,4 +68,14 @@ public class RouteBO { */ private List roles; + /** + * 【目录】只有一个子路由是否始终显示(1:是 0:否) + */ + private Integer alwaysShow; + + /** + * 【菜单】是否开启页面缓存(1:是 0:否) + */ + private Integer keepAlive; + } \ No newline at end of file diff --git a/src/main/java/com/youlai/system/model/entity/SysMenu.java b/src/main/java/com/youlai/system/model/entity/SysMenu.java index 4c475060..0f0a3862 100644 --- a/src/main/java/com/youlai/system/model/entity/SysMenu.java +++ b/src/main/java/com/youlai/system/model/entity/SysMenu.java @@ -78,4 +78,15 @@ public class SysMenu extends BaseEntity { */ private String treePath; + /** + * 【菜单】是否开启页面缓存(1:开启;0:关闭) + */ + private Integer keepAlive; + + /** + * 【目录】只有一个子路由是否始终显示(1:是 0:否) + */ + private Integer alwaysShow; + + } \ No newline at end of file diff --git a/src/main/java/com/youlai/system/model/form/MenuForm.java b/src/main/java/com/youlai/system/model/form/MenuForm.java index ca4a6904..7b16f6d0 100644 --- a/src/main/java/com/youlai/system/model/form/MenuForm.java +++ b/src/main/java/com/youlai/system/model/form/MenuForm.java @@ -1,5 +1,6 @@ package com.youlai.system.model.form; +import com.fasterxml.jackson.annotation.JsonInclude; import com.youlai.system.common.enums.MenuTypeEnum; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -41,4 +42,11 @@ public class MenuForm { @Schema(description = "跳转路径") private String redirect; + @Schema(description = "【菜单】是否开启页面缓存", example = "1") + private Integer keepAlive; + + @Schema(description = "【目录】只有一个子路由是否始终显示", example = "1") + private Integer alwaysShow; + + } diff --git a/src/main/java/com/youlai/system/model/vo/RouteVO.java b/src/main/java/com/youlai/system/model/vo/RouteVO.java index bc080b66..95998f94 100644 --- a/src/main/java/com/youlai/system/model/vo/RouteVO.java +++ b/src/main/java/com/youlai/system/model/vo/RouteVO.java @@ -48,10 +48,12 @@ public class RouteVO { @Schema(description = "拥有路由权限的角色编码", example = "['ADMIN','ROOT']") private List roles; - @Schema(description = "是否开启缓存", example = "true") + @Schema(description = "【菜单】是否开启页面缓存", example = "true") + @JsonInclude(JsonInclude.Include.NON_NULL) private Boolean keepAlive; - @Schema(description = "是否一直显示根路由", example = "true") + @Schema(description = "【目录】只有一个子路由是否始终显示", example = "true") + @JsonInclude(JsonInclude.Include.NON_NULL) private Boolean alwaysShow; } diff --git a/src/main/java/com/youlai/system/service/impl/SysMenuServiceImpl.java b/src/main/java/com/youlai/system/service/impl/SysMenuServiceImpl.java index 5ba43b86..c587a4a7 100644 --- a/src/main/java/com/youlai/system/service/impl/SysMenuServiceImpl.java +++ b/src/main/java/com/youlai/system/service/impl/SysMenuServiceImpl.java @@ -2,6 +2,7 @@ package com.youlai.system.service.impl; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; @@ -29,6 +30,8 @@ import java.util.List; import java.util.Set; import java.util.stream.Collectors; +import static org.aspectj.weaver.tools.cache.SimpleCacheFactory.path; + /** * 菜单业务实现类 * @@ -55,43 +58,40 @@ public class SysMenuServiceImpl extends ServiceImpl impl Set parentIds = menus.stream() .map(SysMenu::getParentId) .collect(Collectors.toSet()); - Set menuIds = menus.stream() .map(SysMenu::getId) .collect(Collectors.toSet()); - List rootIds = CollectionUtil.subtractToList(parentIds, menuIds); // 求差集,得到 parentIds 中 menuIds 没有的元素 + // 获取根节点ID + List rootIds = parentIds.stream() + .filter(id -> !menuIds.contains(id)) + .toList(); - List list = new ArrayList<>(); - for (Long rootId : rootIds) { - list.addAll(recurMenus(rootId, menus)); // 递归 - } - return list; + // 使用递归函数来构建菜单树 + List menuList = rootIds.stream() + .flatMap(rootId -> buildMenuTree(rootId, menus).stream()) + .collect(Collectors.toList()); + + return menuList; } /** - * 保存菜单 + * 递归生成菜单列表 + * + * @param parentId 父级ID + * @param menuList 菜单列表 + * @return 菜单列表 */ - @Override - public boolean saveMenu(MenuForm menuForm) { - String path = menuForm.getPath(); - - MenuTypeEnum menuType = menuForm.getType(); // 菜单类型 - switch (menuType) { - case CATALOG -> { // 目录 - if (NumberUtil.equals(menuForm.getParentId(), 0) && !path.startsWith("/")) { - menuForm.setPath("/" + path); // 一级目录需以 / 开头 - } - menuForm.setComponent("Layout"); - } - case EXTLINK -> // 外链 - menuForm.setComponent(null); - } - SysMenu entity = menuConverter.form2Entity(menuForm); - - String treePath = generateMenuTreePath(menuForm.getParentId()); - entity.setTreePath(treePath); - return this.saveOrUpdate(entity); + private List buildMenuTree(Long parentId, List menuList) { + return CollectionUtil.emptyIfNull(menuList) + .stream() + .filter(menu -> menu.getParentId().equals(parentId)) + .map(entity -> { + MenuVO menuVO = menuConverter.entity2Vo(entity); + List children = buildMenuTree(entity.getId(), menuList); + menuVO.setChildren(children); + return menuVO; + }).toList(); } /** @@ -100,7 +100,31 @@ public class SysMenuServiceImpl extends ServiceImpl impl @Override public List