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. 158
      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);

158
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,192 +17,202 @@ 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())

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