From 80916e5ff7efdb46deeaee5948219cce2aef2c90 Mon Sep 17 00:00:00 2001 From: hxh <762326930@qq.com> Date: Mon, 27 May 2024 16:29:44 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=B0=83=E6=95=B4=E8=8F=9C=E5=8D=95?= =?UTF-8?q?=E9=A1=BA=E5=BA=8F=EF=BC=8C=E4=BB=A5=E9=97=A8=E6=88=B7=E4=B8=BA?= =?UTF-8?q?=E5=87=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/system/SysLoginController.java | 11 +- .../common/core/domain/entity/SysMenu.java | 194 +++++++++--------- .../web/service/SysPermissionService.java | 43 +++- .../kms/system/service/SysMenuService.java | 54 +++-- 4 files changed, 183 insertions(+), 119 deletions(-) diff --git a/shuili-admin/src/main/java/com/kms/web/controller/system/SysLoginController.java b/shuili-admin/src/main/java/com/kms/web/controller/system/SysLoginController.java index e835bf68..85aa913e 100644 --- a/shuili-admin/src/main/java/com/kms/web/controller/system/SysLoginController.java +++ b/shuili-admin/src/main/java/com/kms/web/controller/system/SysLoginController.java @@ -10,6 +10,7 @@ import com.kms.common.utils.UserUtils; import com.kms.framework.manager.AsyncManager; import com.kms.framework.manager.factory.AsyncFactory; import com.kms.framework.web.service.SysPermissionService; +import com.kms.framework.web.service.SysPermissionService.MenuDto; import com.kms.system.service.SysMenuService; import com.kms.system.service.SysRoleMenuService; import com.kms.system.service.SysRoleService; @@ -163,6 +164,9 @@ public class SysLoginController extends BaseController { public AjaxResult getRouters() { // 用户信息 SysUser user = UserUtils.getUser(); + if (user == null) { + return AjaxResult.error("用户未登录"); + } List menus = menuService.selectMenuTreeByUserId(user.getId(), permissionService.getUserMenuFromPortal(user.getId())); return AjaxResult.success(menuService.buildMenus(menus)); } @@ -302,7 +306,12 @@ public class SysLoginController extends BaseController { String data = waterResult.getData(); JSONObject datajson = JSONObject.parseObject(data); List functionPerms = datajson.getJSONArray("functionPerms").toJavaList(String.class); - List menuCode = singleAllMenus.stream().map(SingleMenu::getCode).distinct().collect(Collectors.toList()); + List menuCode = singleAllMenus.stream().map(item -> MenuDto.builder() + .code(item.getCode()) + .visible(item.getVisible()) + .seq(item.getSeq()) + .status(item.getStatus()) + .build()).distinct().collect(Collectors.toList()); permissionService.setUserPermissionFromPortal(userId, functionPerms); permissionService.setUserMenuFromPortal(userId, menuCode); diff --git a/shuili-framework/src/main/java/com/shuili/common/core/domain/entity/SysMenu.java b/shuili-framework/src/main/java/com/shuili/common/core/domain/entity/SysMenu.java index 04638109..7c64157d 100644 --- a/shuili-framework/src/main/java/com/shuili/common/core/domain/entity/SysMenu.java +++ b/shuili-framework/src/main/java/com/shuili/common/core/domain/entity/SysMenu.java @@ -1,15 +1,15 @@ package com.shuili.common.core.domain.entity; -import java.util.ArrayList; -import java.util.List; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.Size; - import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; +import com.shuili.common.core.domain.BaseEntity; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; -import com.shuili.common.core.domain.BaseEntity; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.util.ArrayList; +import java.util.List; /** * 菜单权限表 sys_menu @@ -17,209 +17,219 @@ import com.shuili.common.core.domain.BaseEntity; * @author shuili */ @TableName("sys_menu") -public class SysMenu extends BaseEntity -{ +public class SysMenu extends BaseEntity { private static final long serialVersionUID = 1L; - /** 菜单名称 */ + /** + * 菜单名称 + */ private String menuName; - /** 父菜单名称 */ + /** + * 父菜单名称 + */ private String parentName; - /** 父菜单ID */ + /** + * 父菜单ID + */ private String parentId; - /** 显示顺序 */ + /** + * 显示顺序 + */ private String orderNum; - /** 路由地址 */ + /** + * 路由地址 + */ private String path; - /** 组件路径 */ + /** + * 组件路径 + */ private String component; - /** 是否为外链(0是 1否) */ + /** + * 是否为外链(0是 1否) + */ private String isFrame; - /** 类型(M目录 C菜单 F按钮) */ + /** + * 类型(M目录 C菜单 F按钮) + */ private String menuType; - /** 显示状态(0显示 1隐藏) */ + /** + * 显示状态(0显示 1隐藏) + */ private String visible; - /** 菜单状态(0显示 1隐藏) */ + /** + * 菜单状态(0显示 1隐藏) + */ private String status; - /** 权限字符串 */ + /** + * 权限字符串 + */ private String perms; - /** 菜单图标 */ + /** + * 菜单图标 + */ private String icon; - /** 子菜单 */ + @TableField(exist = false) + private Boolean isMain = false; + + /** + * 子菜单 + */ @TableField(exist = false) private List children = new ArrayList(); @NotBlank(message = "菜单名称不能为空") @Size(min = 0, max = 50, message = "菜单名称长度不能超过50个字符") - public String getMenuName() - { + public String getMenuName() { return menuName; } - public void setMenuName(String menuName) - { + public void setMenuName(String menuName) { this.menuName = menuName; } - public String getParentName() - { + public String getParentName() { return parentName; } - public void setParentName(String parentName) - { + public void setParentName(String parentName) { this.parentName = parentName; } - public String getParentId() - { + public String getParentId() { return parentId; } - public void setParentId(String parentId) - { + public void setParentId(String parentId) { this.parentId = parentId; } @NotBlank(message = "显示顺序不能为空") - public String getOrderNum() - { + public String getOrderNum() { return orderNum; } - public void setOrderNum(String orderNum) - { + public void setOrderNum(String orderNum) { this.orderNum = orderNum; } @Size(min = 0, max = 200, message = "路由地址不能超过200个字符") - public String getPath() - { + public String getPath() { return path; } - public void setPath(String path) - { + public void setPath(String path) { this.path = path; } @Size(min = 0, max = 200, message = "组件路径不能超过255个字符") - public String getComponent() - { + public String getComponent() { return component; } - public void setComponent(String component) - { + public void setComponent(String component) { this.component = component; } - public String getIsFrame() - { + public String getIsFrame() { return isFrame; } - public void setIsFrame(String isFrame) - { + public void setIsFrame(String isFrame) { this.isFrame = isFrame; } @NotBlank(message = "菜单类型不能为空") - public String getMenuType() - { + public String getMenuType() { return menuType; } - public void setMenuType(String menuType) - { + public void setMenuType(String menuType) { this.menuType = menuType; } - public String getVisible() - { + public String getVisible() { return visible; } - public void setVisible(String visible) - { + public void setVisible(String visible) { this.visible = visible; } - public String getStatus() - { + public String getStatus() { return status; } - public void setStatus(String status) - { + public void setStatus(String status) { this.status = status; } @Size(min = 0, max = 100, message = "权限标识长度不能超过100个字符") - public String getPerms() - { + public String getPerms() { return perms; } - public void setPerms(String perms) - { + public void setPerms(String perms) { this.perms = perms; } - public String getIcon() - { + public String getIcon() { return icon; } - public void setIcon(String icon) - { + public void setIcon(String icon) { this.icon = icon; } - public List getChildren() - { + public List getChildren() { return children; } - public void setChildren(List children) - { + public void setChildren(List children) { this.children = children; } + public void setIsMain(Boolean isMain) { + this.isMain = isMain; + } + + public Boolean getIsMain() { + return isMain; + } + @Override public String toString() { - return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) - .append("menuId", getId()) - .append("menuName", getMenuName()) - .append("parentId", getParentId()) - .append("orderNum", getOrderNum()) - .append("path", getPath()) - .append("component", getComponent()) - .append("isFrame", getIsFrame()) - .append("menuType", getMenuType()) - .append("visible", getVisible()) - .append("status ", getStatus()) - .append("perms", getPerms()) - .append("icon", getIcon()) - .append("createBy", getCreateUid()) - .append("createTime", getCreateTime()) - .append("updateBy", getUpdateUid()) - .append("updateTime", getUpdateTime()) - .append("remark", getRemark()) - .toString(); + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("menuId", getId()) + .append("menuName", getMenuName()) + .append("parentId", getParentId()) + .append("orderNum", getOrderNum()) + .append("path", getPath()) + .append("component", getComponent()) + .append("isFrame", getIsFrame()) + .append("menuType", getMenuType()) + .append("visible", getVisible()) + .append("status ", getStatus()) + .append("perms", getPerms()) + .append("icon", getIcon()) + .append("createBy", getCreateUid()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateUid()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); } } diff --git a/shuili-system/src/main/java/com/kms/framework/web/service/SysPermissionService.java b/shuili-system/src/main/java/com/kms/framework/web/service/SysPermissionService.java index 7bdb5bc3..81e0d5e7 100644 --- a/shuili-system/src/main/java/com/kms/framework/web/service/SysPermissionService.java +++ b/shuili-system/src/main/java/com/kms/framework/web/service/SysPermissionService.java @@ -6,13 +6,15 @@ import com.shuili.common.core.domain.entity.SysMenu; import com.shuili.common.core.domain.entity.SysUser; import com.shuili.common.core.redis.RedisCache; import com.shuili.common.utils.StringUtils; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; +import java.util.stream.Collectors; /** * 用户权限处理 @@ -77,8 +79,22 @@ public class SysPermissionService { public List getUserMenuFromPortal(String userId) { Object cache = redisCache.getCacheObject(menusKey(userId)); if (cache != null) { - List ids = StringUtils.cast(cache); - return menuService.selectMenuList(ids); + List menus = StringUtils.cast(cache); + List ides = menus.stream().map(MenuDto::getCode).collect(Collectors.toList()); + Map map = menus.stream().collect(Collectors.toMap(MenuDto::getCode, m -> m)); + return menuService.selectMenuList(ides).stream().map(item -> + { + MenuDto dto = map.get(item.getId()); + if (dto != null) { + item.setVisible(dto.getVisible()); + item.setOrderNum(dto.getSeq().toString()); + item.setStatus(dto.getStatus()); + item.setIsMain(true); + return item; + } + return null; + } + ).filter(Objects::nonNull).collect(Collectors.toList()); } else { return Collections.emptyList(); } @@ -88,16 +104,27 @@ public class SysPermissionService { redisCache.setCacheObject(permsKey(userId), perms); } - public void setUserMenuFromPortal(String userId, List menus) { + public void setUserMenuFromPortal(String userId, List menus) { redisCache.setCacheObject(menusKey(userId), menus); } + @Data + @AllArgsConstructor + @NoArgsConstructor + @Builder + public static class MenuDto { + private String code; //菜单标识 + private String visible; //是否可见 1可见 0不可见 + private Integer seq; //排序 + private String status; //状态 1启用 0停用 + } + private String permsKey(String userId) { return "user_perms:" + userId; } private String menusKey(String userId) { - return "user_menus:" + userId; + return "user_menus_v2:" + userId; } } diff --git a/shuili-system/src/main/java/com/kms/system/service/SysMenuService.java b/shuili-system/src/main/java/com/kms/system/service/SysMenuService.java index e63a0e26..0e349f5c 100644 --- a/shuili-system/src/main/java/com/kms/system/service/SysMenuService.java +++ b/shuili-system/src/main/java/com/kms/system/service/SysMenuService.java @@ -16,7 +16,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.*; +import java.util.function.Function; import java.util.stream.Collectors; +import java.util.stream.Stream; /** * 菜单 业务层处理 @@ -92,7 +94,7 @@ public class SysMenuService extends BaseService { * @return 菜单列表 */ public List selectMenuTreeByUserId(String userId) { - List menus = null; + List menus; if ("1".equals(userId)) { menus = menuMapper.selectMenuTreeAll(); } else { @@ -109,13 +111,31 @@ public class SysMenuService extends BaseService { menus = menuMapper.selectMenuTreeByUserId(userId); } if (menus != null) { - menus.addAll(menuList); - return getChildPerms(menus, "0"); + return getChildPerms(unionMenu(menus, menuList), "0"); } else { return Collections.emptyList(); } } + //菜单取并集 + private List unionMenu(List menuList, List menus) { + return Stream.concat(menuList.stream(), menus.stream()) + .collect(Collectors.toMap(SysMenu::getId, Function.identity(), (o1, o2) -> { + if (o1.getIsMain()) { + return o1; + } + if (o2.getIsMain()) { + return o2; + } + return o1; + })) + .values() + .stream() + .filter(item -> item.getStatus().equals("0")) + .collect(Collectors.toList()); + + } + /** * 根据角色ID查询菜单树信息 * @@ -133,7 +153,7 @@ public class SysMenuService extends BaseService { * @return 路由列表 */ public List buildMenus(List menus) { - List routers = new LinkedList(); + List routers = new LinkedList<>(); for (SysMenu menu : menus) { RouterVo router = new RouterVo(); router.setHidden("1".equals(menu.getVisible())); @@ -142,12 +162,12 @@ public class SysMenuService extends BaseService { router.setComponent(getComponent(menu)); router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon())); List cMenus = menu.getChildren(); - if (!cMenus.isEmpty() && cMenus.size() > 0 && UserConstants.TYPE_DIR.equals(menu.getMenuType())) { + if (!cMenus.isEmpty() && UserConstants.TYPE_DIR.equals(menu.getMenuType())) { router.setAlwaysShow(true); router.setRedirect("noRedirect"); router.setChildren(buildMenus(cMenus)); } else if (isMeunFrame(menu)) { - List childrenList = new ArrayList(); + List childrenList = new ArrayList<>(); RouterVo children = new RouterVo(); children.setPath(menu.getPath()); children.setComponent(menu.getComponent()); @@ -168,13 +188,12 @@ public class SysMenuService extends BaseService { * @return 树结构列表 */ public List buildMenuTree(List menus) { - List returnList = new ArrayList(); - List tempList = new ArrayList(); + List returnList = new ArrayList<>(); + List tempList = new ArrayList<>(); for (SysMenu dept : menus) { tempList.add(dept.getId()); } - for (Iterator iterator = menus.iterator(); iterator.hasNext(); ) { - SysMenu menu = (SysMenu) iterator.next(); + for (SysMenu menu : menus) { // 如果是顶级节点, 遍历该父节点的所有子节点 if (!tempList.contains(menu.getParentId())) { recursionFn(menus, menu); @@ -216,7 +235,7 @@ public class SysMenuService extends BaseService { */ public boolean hasChildByMenuId(String menuId) { int result = menuMapper.hasChildByMenuId(menuId); - return result > 0 ? true : false; + return result > 0; } /** @@ -227,7 +246,7 @@ public class SysMenuService extends BaseService { */ public boolean checkMenuExistRole(String menuId) { int result = roleMenuMapper.checkMenuExistRole(menuId); - return result > 0 ? true : false; + return result > 0; } /** @@ -346,9 +365,8 @@ public class SysMenuService extends BaseService { * @return String */ public List getChildPerms(List list, String parentId) { - List returnList = new ArrayList(); - for (Iterator iterator = list.iterator(); iterator.hasNext(); ) { - SysMenu t = (SysMenu) iterator.next(); + List returnList = new ArrayList<>(); + for (SysMenu t : list) { // 一、根据传入的某个父节点ID,遍历该父节点的所有子节点 if (t.getParentId().equals(parentId)) { recursionFn(list, t); @@ -379,10 +397,10 @@ public class SysMenuService extends BaseService { * 得到子节点列表 */ private List getChildList(List list, SysMenu t) { - List tlist = new ArrayList(); + List tlist = new ArrayList<>(); Iterator it = list.iterator(); while (it.hasNext()) { - SysMenu n = (SysMenu) it.next(); + SysMenu n = it.next(); if (n.getParentId().equals(t.getId())) { tlist.add(n); } @@ -394,7 +412,7 @@ public class SysMenuService extends BaseService { * 判断是否有子节点 */ private boolean hasChild(List list, SysMenu t) { - return getChildList(list, t).size() > 0 ? true : false; + return !getChildList(list, t).isEmpty(); } }