Browse Source

feat: 调整菜单顺序,以门户为准

master_tdsql
hxh 11 months ago
parent
commit
80916e5ff7
  1. 11
      shuili-admin/src/main/java/com/kms/web/controller/system/SysLoginController.java
  2. 194
      shuili-framework/src/main/java/com/shuili/common/core/domain/entity/SysMenu.java
  3. 43
      shuili-system/src/main/java/com/kms/framework/web/service/SysPermissionService.java
  4. 54
      shuili-system/src/main/java/com/kms/system/service/SysMenuService.java

11
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.AsyncManager;
import com.kms.framework.manager.factory.AsyncFactory; import com.kms.framework.manager.factory.AsyncFactory;
import com.kms.framework.web.service.SysPermissionService; 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.SysMenuService;
import com.kms.system.service.SysRoleMenuService; import com.kms.system.service.SysRoleMenuService;
import com.kms.system.service.SysRoleService; import com.kms.system.service.SysRoleService;
@ -163,6 +164,9 @@ public class SysLoginController extends BaseController {
public AjaxResult getRouters() { public AjaxResult getRouters() {
// 用户信息 // 用户信息
SysUser user = UserUtils.getUser(); SysUser user = UserUtils.getUser();
if (user == null) {
return AjaxResult.error("用户未登录");
}
List<SysMenu> menus = menuService.selectMenuTreeByUserId(user.getId(), permissionService.getUserMenuFromPortal(user.getId())); List<SysMenu> menus = menuService.selectMenuTreeByUserId(user.getId(), permissionService.getUserMenuFromPortal(user.getId()));
return AjaxResult.success(menuService.buildMenus(menus)); return AjaxResult.success(menuService.buildMenus(menus));
} }
@ -302,7 +306,12 @@ public class SysLoginController extends BaseController {
String data = waterResult.getData(); String data = waterResult.getData();
JSONObject datajson = JSONObject.parseObject(data); JSONObject datajson = JSONObject.parseObject(data);
List<String> functionPerms = datajson.getJSONArray("functionPerms").toJavaList(String.class); List<String> functionPerms = datajson.getJSONArray("functionPerms").toJavaList(String.class);
List<String> menuCode = singleAllMenus.stream().map(SingleMenu::getCode).distinct().collect(Collectors.toList()); List<MenuDto> 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.setUserPermissionFromPortal(userId, functionPerms);
permissionService.setUserMenuFromPortal(userId, menuCode); permissionService.setUserMenuFromPortal(userId, menuCode);

194
shuili-framework/src/main/java/com/shuili/common/core/domain/entity/SysMenu.java

@ -1,15 +1,15 @@
package com.shuili.common.core.domain.entity; 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.TableField;
import com.baomidou.mybatisplus.annotation.TableName; 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.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle; 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 * 菜单权限表 sys_menu
@ -17,209 +17,219 @@ import com.shuili.common.core.domain.BaseEntity;
* @author shuili * @author shuili
*/ */
@TableName("sys_menu") @TableName("sys_menu")
public class SysMenu extends BaseEntity public class SysMenu extends BaseEntity {
{
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
/** 菜单名称 */ /**
* 菜单名称
*/
private String menuName; private String menuName;
/** 父菜单名称 */ /**
* 父菜单名称
*/
private String parentName; private String parentName;
/** 父菜单ID */ /**
* 父菜单ID
*/
private String parentId; private String parentId;
/** 显示顺序 */ /**
* 显示顺序
*/
private String orderNum; private String orderNum;
/** 路由地址 */ /**
* 路由地址
*/
private String path; private String path;
/** 组件路径 */ /**
* 组件路径
*/
private String component; private String component;
/** 是否为外链(0是 1否) */ /**
* 是否为外链0是 1否
*/
private String isFrame; private String isFrame;
/** 类型(M目录 C菜单 F按钮) */ /**
* 类型M目录 C菜单 F按钮
*/
private String menuType; private String menuType;
/** 显示状态(0显示 1隐藏) */ /**
* 显示状态0显示 1隐藏
*/
private String visible; private String visible;
/** 菜单状态(0显示 1隐藏) */ /**
* 菜单状态0显示 1隐藏
*/
private String status; private String status;
/** 权限字符串 */ /**
* 权限字符串
*/
private String perms; private String perms;
/** 菜单图标 */ /**
* 菜单图标
*/
private String icon; private String icon;
/** 子菜单 */ @TableField(exist = false)
private Boolean isMain = false;
/**
* 子菜单
*/
@TableField(exist = false) @TableField(exist = false)
private List<SysMenu> children = new ArrayList<SysMenu>(); private List<SysMenu> children = new ArrayList<SysMenu>();
@NotBlank(message = "菜单名称不能为空") @NotBlank(message = "菜单名称不能为空")
@Size(min = 0, max = 50, message = "菜单名称长度不能超过50个字符") @Size(min = 0, max = 50, message = "菜单名称长度不能超过50个字符")
public String getMenuName() public String getMenuName() {
{
return menuName; return menuName;
} }
public void setMenuName(String menuName) public void setMenuName(String menuName) {
{
this.menuName = menuName; this.menuName = menuName;
} }
public String getParentName() public String getParentName() {
{
return parentName; return parentName;
} }
public void setParentName(String parentName) public void setParentName(String parentName) {
{
this.parentName = parentName; this.parentName = parentName;
} }
public String getParentId() public String getParentId() {
{
return parentId; return parentId;
} }
public void setParentId(String parentId) public void setParentId(String parentId) {
{
this.parentId = parentId; this.parentId = parentId;
} }
@NotBlank(message = "显示顺序不能为空") @NotBlank(message = "显示顺序不能为空")
public String getOrderNum() public String getOrderNum() {
{
return orderNum; return orderNum;
} }
public void setOrderNum(String orderNum) public void setOrderNum(String orderNum) {
{
this.orderNum = orderNum; this.orderNum = orderNum;
} }
@Size(min = 0, max = 200, message = "路由地址不能超过200个字符") @Size(min = 0, max = 200, message = "路由地址不能超过200个字符")
public String getPath() public String getPath() {
{
return path; return path;
} }
public void setPath(String path) public void setPath(String path) {
{
this.path = path; this.path = path;
} }
@Size(min = 0, max = 200, message = "组件路径不能超过255个字符") @Size(min = 0, max = 200, message = "组件路径不能超过255个字符")
public String getComponent() public String getComponent() {
{
return component; return component;
} }
public void setComponent(String component) public void setComponent(String component) {
{
this.component = component; this.component = component;
} }
public String getIsFrame() public String getIsFrame() {
{
return isFrame; return isFrame;
} }
public void setIsFrame(String isFrame) public void setIsFrame(String isFrame) {
{
this.isFrame = isFrame; this.isFrame = isFrame;
} }
@NotBlank(message = "菜单类型不能为空") @NotBlank(message = "菜单类型不能为空")
public String getMenuType() public String getMenuType() {
{
return menuType; return menuType;
} }
public void setMenuType(String menuType) public void setMenuType(String menuType) {
{
this.menuType = menuType; this.menuType = menuType;
} }
public String getVisible() public String getVisible() {
{
return visible; return visible;
} }
public void setVisible(String visible) public void setVisible(String visible) {
{
this.visible = visible; this.visible = visible;
} }
public String getStatus() public String getStatus() {
{
return status; return status;
} }
public void setStatus(String status) public void setStatus(String status) {
{
this.status = status; this.status = status;
} }
@Size(min = 0, max = 100, message = "权限标识长度不能超过100个字符") @Size(min = 0, max = 100, message = "权限标识长度不能超过100个字符")
public String getPerms() public String getPerms() {
{
return perms; return perms;
} }
public void setPerms(String perms) public void setPerms(String perms) {
{
this.perms = perms; this.perms = perms;
} }
public String getIcon() public String getIcon() {
{
return icon; return icon;
} }
public void setIcon(String icon) public void setIcon(String icon) {
{
this.icon = icon; this.icon = icon;
} }
public List<SysMenu> getChildren() public List<SysMenu> getChildren() {
{
return children; return children;
} }
public void setChildren(List<SysMenu> children) public void setChildren(List<SysMenu> children) {
{
this.children = children; this.children = children;
} }
public void setIsMain(Boolean isMain) {
this.isMain = isMain;
}
public Boolean getIsMain() {
return isMain;
}
@Override @Override
public String toString() { public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
.append("menuId", getId()) .append("menuId", getId())
.append("menuName", getMenuName()) .append("menuName", getMenuName())
.append("parentId", getParentId()) .append("parentId", getParentId())
.append("orderNum", getOrderNum()) .append("orderNum", getOrderNum())
.append("path", getPath()) .append("path", getPath())
.append("component", getComponent()) .append("component", getComponent())
.append("isFrame", getIsFrame()) .append("isFrame", getIsFrame())
.append("menuType", getMenuType()) .append("menuType", getMenuType())
.append("visible", getVisible()) .append("visible", getVisible())
.append("status ", getStatus()) .append("status ", getStatus())
.append("perms", getPerms()) .append("perms", getPerms())
.append("icon", getIcon()) .append("icon", getIcon())
.append("createBy", getCreateUid()) .append("createBy", getCreateUid())
.append("createTime", getCreateTime()) .append("createTime", getCreateTime())
.append("updateBy", getUpdateUid()) .append("updateBy", getUpdateUid())
.append("updateTime", getUpdateTime()) .append("updateTime", getUpdateTime())
.append("remark", getRemark()) .append("remark", getRemark())
.toString(); .toString();
} }
} }

43
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.domain.entity.SysUser;
import com.shuili.common.core.redis.RedisCache; import com.shuili.common.core.redis.RedisCache;
import com.shuili.common.utils.StringUtils; 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.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.Collections; import java.util.*;
import java.util.HashSet; import java.util.stream.Collectors;
import java.util.List;
import java.util.Set;
/** /**
* 用户权限处理 * 用户权限处理
@ -77,8 +79,22 @@ public class SysPermissionService {
public List<SysMenu> getUserMenuFromPortal(String userId) { public List<SysMenu> getUserMenuFromPortal(String userId) {
Object cache = redisCache.getCacheObject(menusKey(userId)); Object cache = redisCache.getCacheObject(menusKey(userId));
if (cache != null) { if (cache != null) {
List<String> ids = StringUtils.cast(cache); List<MenuDto> menus = StringUtils.cast(cache);
return menuService.selectMenuList(ids); List<String> ides = menus.stream().map(MenuDto::getCode).collect(Collectors.toList());
Map<String, MenuDto> 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 { } else {
return Collections.emptyList(); return Collections.emptyList();
} }
@ -88,16 +104,27 @@ public class SysPermissionService {
redisCache.setCacheObject(permsKey(userId), perms); redisCache.setCacheObject(permsKey(userId), perms);
} }
public void setUserMenuFromPortal(String userId, List<String> menus) { public void setUserMenuFromPortal(String userId, List<MenuDto> menus) {
redisCache.setCacheObject(menusKey(userId), 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) { private String permsKey(String userId) {
return "user_perms:" + userId; return "user_perms:" + userId;
} }
private String menusKey(String userId) { private String menusKey(String userId) {
return "user_menus:" + userId; return "user_menus_v2:" + userId;
} }
} }

54
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 org.springframework.stereotype.Service;
import java.util.*; import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream;
/** /**
* 菜单 业务层处理 * 菜单 业务层处理
@ -92,7 +94,7 @@ public class SysMenuService extends BaseService<SysMenuMapper, SysMenu> {
* @return 菜单列表 * @return 菜单列表
*/ */
public List<SysMenu> selectMenuTreeByUserId(String userId) { public List<SysMenu> selectMenuTreeByUserId(String userId) {
List<SysMenu> menus = null; List<SysMenu> menus;
if ("1".equals(userId)) { if ("1".equals(userId)) {
menus = menuMapper.selectMenuTreeAll(); menus = menuMapper.selectMenuTreeAll();
} else { } else {
@ -109,13 +111,31 @@ public class SysMenuService extends BaseService<SysMenuMapper, SysMenu> {
menus = menuMapper.selectMenuTreeByUserId(userId); menus = menuMapper.selectMenuTreeByUserId(userId);
} }
if (menus != null) { if (menus != null) {
menus.addAll(menuList); return getChildPerms(unionMenu(menus, menuList), "0");
return getChildPerms(menus, "0");
} else { } else {
return Collections.emptyList(); return Collections.emptyList();
} }
} }
//菜单取并集
private List<SysMenu> unionMenu(List<SysMenu> menuList, List<SysMenu> 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查询菜单树信息 * 根据角色ID查询菜单树信息
* *
@ -133,7 +153,7 @@ public class SysMenuService extends BaseService<SysMenuMapper, SysMenu> {
* @return 路由列表 * @return 路由列表
*/ */
public List<RouterVo> buildMenus(List<SysMenu> menus) { public List<RouterVo> buildMenus(List<SysMenu> menus) {
List<RouterVo> routers = new LinkedList<RouterVo>(); List<RouterVo> routers = new LinkedList<>();
for (SysMenu menu : menus) { for (SysMenu menu : menus) {
RouterVo router = new RouterVo(); RouterVo router = new RouterVo();
router.setHidden("1".equals(menu.getVisible())); router.setHidden("1".equals(menu.getVisible()));
@ -142,12 +162,12 @@ public class SysMenuService extends BaseService<SysMenuMapper, SysMenu> {
router.setComponent(getComponent(menu)); router.setComponent(getComponent(menu));
router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon())); router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon()));
List<SysMenu> cMenus = menu.getChildren(); List<SysMenu> 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.setAlwaysShow(true);
router.setRedirect("noRedirect"); router.setRedirect("noRedirect");
router.setChildren(buildMenus(cMenus)); router.setChildren(buildMenus(cMenus));
} else if (isMeunFrame(menu)) { } else if (isMeunFrame(menu)) {
List<RouterVo> childrenList = new ArrayList<RouterVo>(); List<RouterVo> childrenList = new ArrayList<>();
RouterVo children = new RouterVo(); RouterVo children = new RouterVo();
children.setPath(menu.getPath()); children.setPath(menu.getPath());
children.setComponent(menu.getComponent()); children.setComponent(menu.getComponent());
@ -168,13 +188,12 @@ public class SysMenuService extends BaseService<SysMenuMapper, SysMenu> {
* @return 树结构列表 * @return 树结构列表
*/ */
public List<SysMenu> buildMenuTree(List<SysMenu> menus) { public List<SysMenu> buildMenuTree(List<SysMenu> menus) {
List<SysMenu> returnList = new ArrayList<SysMenu>(); List<SysMenu> returnList = new ArrayList<>();
List<String> tempList = new ArrayList<String>(); List<String> tempList = new ArrayList<>();
for (SysMenu dept : menus) { for (SysMenu dept : menus) {
tempList.add(dept.getId()); tempList.add(dept.getId());
} }
for (Iterator<SysMenu> iterator = menus.iterator(); iterator.hasNext(); ) { for (SysMenu menu : menus) {
SysMenu menu = (SysMenu) iterator.next();
// 如果是顶级节点, 遍历该父节点的所有子节点 // 如果是顶级节点, 遍历该父节点的所有子节点
if (!tempList.contains(menu.getParentId())) { if (!tempList.contains(menu.getParentId())) {
recursionFn(menus, menu); recursionFn(menus, menu);
@ -216,7 +235,7 @@ public class SysMenuService extends BaseService<SysMenuMapper, SysMenu> {
*/ */
public boolean hasChildByMenuId(String menuId) { public boolean hasChildByMenuId(String menuId) {
int result = menuMapper.hasChildByMenuId(menuId); int result = menuMapper.hasChildByMenuId(menuId);
return result > 0 ? true : false; return result > 0;
} }
/** /**
@ -227,7 +246,7 @@ public class SysMenuService extends BaseService<SysMenuMapper, SysMenu> {
*/ */
public boolean checkMenuExistRole(String menuId) { public boolean checkMenuExistRole(String menuId) {
int result = roleMenuMapper.checkMenuExistRole(menuId); int result = roleMenuMapper.checkMenuExistRole(menuId);
return result > 0 ? true : false; return result > 0;
} }
/** /**
@ -346,9 +365,8 @@ public class SysMenuService extends BaseService<SysMenuMapper, SysMenu> {
* @return String * @return String
*/ */
public List<SysMenu> getChildPerms(List<SysMenu> list, String parentId) { public List<SysMenu> getChildPerms(List<SysMenu> list, String parentId) {
List<SysMenu> returnList = new ArrayList<SysMenu>(); List<SysMenu> returnList = new ArrayList<>();
for (Iterator<SysMenu> iterator = list.iterator(); iterator.hasNext(); ) { for (SysMenu t : list) {
SysMenu t = (SysMenu) iterator.next();
// 一、根据传入的某个父节点ID,遍历该父节点的所有子节点 // 一、根据传入的某个父节点ID,遍历该父节点的所有子节点
if (t.getParentId().equals(parentId)) { if (t.getParentId().equals(parentId)) {
recursionFn(list, t); recursionFn(list, t);
@ -379,10 +397,10 @@ public class SysMenuService extends BaseService<SysMenuMapper, SysMenu> {
* 得到子节点列表 * 得到子节点列表
*/ */
private List<SysMenu> getChildList(List<SysMenu> list, SysMenu t) { private List<SysMenu> getChildList(List<SysMenu> list, SysMenu t) {
List<SysMenu> tlist = new ArrayList<SysMenu>(); List<SysMenu> tlist = new ArrayList<>();
Iterator<SysMenu> it = list.iterator(); Iterator<SysMenu> it = list.iterator();
while (it.hasNext()) { while (it.hasNext()) {
SysMenu n = (SysMenu) it.next(); SysMenu n = it.next();
if (n.getParentId().equals(t.getId())) { if (n.getParentId().equals(t.getId())) {
tlist.add(n); tlist.add(n);
} }
@ -394,7 +412,7 @@ public class SysMenuService extends BaseService<SysMenuMapper, SysMenu> {
* 判断是否有子节点 * 判断是否有子节点
*/ */
private boolean hasChild(List<SysMenu> list, SysMenu t) { private boolean hasChild(List<SysMenu> list, SysMenu t) {
return getChildList(list, t).size() > 0 ? true : false; return !getChildList(list, t).isEmpty();
} }
} }

Loading…
Cancel
Save