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.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<SysMenu> 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<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.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;
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,192 +17,202 @@ 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<SysMenu> children = new ArrayList<SysMenu>();
@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<SysMenu> getChildren()
{
public List<SysMenu> getChildren() {
return children;
}
public void setChildren(List<SysMenu> children)
{
public void setChildren(List<SysMenu> 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)
return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
.append("menuId", getId())
.append("menuName", getMenuName())
.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.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<SysMenu> getUserMenuFromPortal(String userId) {
Object cache = redisCache.getCacheObject(menusKey(userId));
if (cache != null) {
List<String> ids = StringUtils.cast(cache);
return menuService.selectMenuList(ids);
List<MenuDto> menus = StringUtils.cast(cache);
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 {
return Collections.emptyList();
}
@ -88,16 +104,27 @@ public class SysPermissionService {
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);
}
@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;
}
}

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 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<SysMenuMapper, SysMenu> {
* @return 菜单列表
*/
public List<SysMenu> selectMenuTreeByUserId(String userId) {
List<SysMenu> menus = null;
List<SysMenu> menus;
if ("1".equals(userId)) {
menus = menuMapper.selectMenuTreeAll();
} else {
@ -109,13 +111,31 @@ public class SysMenuService extends BaseService<SysMenuMapper, SysMenu> {
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<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查询菜单树信息
*
@ -133,7 +153,7 @@ public class SysMenuService extends BaseService<SysMenuMapper, SysMenu> {
* @return 路由列表
*/
public List<RouterVo> buildMenus(List<SysMenu> menus) {
List<RouterVo> routers = new LinkedList<RouterVo>();
List<RouterVo> 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<SysMenuMapper, SysMenu> {
router.setComponent(getComponent(menu));
router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon()));
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.setRedirect("noRedirect");
router.setChildren(buildMenus(cMenus));
} else if (isMeunFrame(menu)) {
List<RouterVo> childrenList = new ArrayList<RouterVo>();
List<RouterVo> childrenList = new ArrayList<>();
RouterVo children = new RouterVo();
children.setPath(menu.getPath());
children.setComponent(menu.getComponent());
@ -168,13 +188,12 @@ public class SysMenuService extends BaseService<SysMenuMapper, SysMenu> {
* @return 树结构列表
*/
public List<SysMenu> buildMenuTree(List<SysMenu> menus) {
List<SysMenu> returnList = new ArrayList<SysMenu>();
List<String> tempList = new ArrayList<String>();
List<SysMenu> returnList = new ArrayList<>();
List<String> tempList = new ArrayList<>();
for (SysMenu dept : menus) {
tempList.add(dept.getId());
}
for (Iterator<SysMenu> 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<SysMenuMapper, SysMenu> {
*/
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<SysMenuMapper, SysMenu> {
*/
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<SysMenuMapper, SysMenu> {
* @return String
*/
public List<SysMenu> getChildPerms(List<SysMenu> list, String parentId) {
List<SysMenu> returnList = new ArrayList<SysMenu>();
for (Iterator<SysMenu> iterator = list.iterator(); iterator.hasNext(); ) {
SysMenu t = (SysMenu) iterator.next();
List<SysMenu> 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<SysMenuMapper, SysMenu> {
* 得到子节点列表
*/
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();
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<SysMenuMapper, SysMenu> {
* 判断是否有子节点
*/
private boolean hasChild(List<SysMenu> list, SysMenu t) {
return getChildList(list, t).size() > 0 ? true : false;
return !getChildList(list, t).isEmpty();
}
}

Loading…
Cancel
Save