留作备用
@Override
public List<MenuVO> getListMenuVO(List<Integer> roleId) {
//查询出所有菜单,这里过滤了一个状态条件(mybatis-puls的写法,不了解的同学可以去看下mybatis-puls)
QueryWrapper<SysMenu> sysMenuQueryWrapper = new QueryWrapper<>();
sysMenuQueryWrapper.eq("status",1);
sysMenuQueryWrapper.orderByAsc("sort");
List<SysMenu> sysMenus = list(sysMenuQueryWrapper);
//第一个参数必须是当前最高目录的parentId的值,这里写0也就是一级目录的parentId的值
return recursionForMenu(0,sysMenus);
}
/**
* 左侧菜单通过递归算法实现树
* @param parentId 父Id
* @param menuList 当前所有菜单
* @return
*/
private List<MenuVO> recursionForMenu(int parentId,List<SysMenu> menuList){
List<MenuVO> list = new ArrayList<>();
/**
* Optional.ofNullable(menuList).orElse(new ArrayList<>()) 如果menuList是空的则返回一个new ArrayList<>()
* .stream() 返回List中的流
* .filter(menu -> menu.getParentId().equals(parentId)) 筛选List,返回只有条件成立的元素(当前元素的parentId必须等于父id)
* .forEach 遍历这个list
*/
Optional.ofNullable(menuList).orElse(new ArrayList<>())
.stream()
.filter(menu -> menu.getParentId().equals(parentId))
.forEach(menu -> {
MenuVO menuVO = new MenuVO();
menuVO.setName(menu.getName());
//是否是目录
menuVO.setAlwaysShow(menu.getLevel().equals(1)?true:false);
menuVO.setPath(menu.getPath());
menuVO.setComponent(StringUtils.isNotEmpty(menu.getComponent())?menu.getComponent():"Layout");
menuVO.setMeta(new MetaVO(menu.getName(),menu.getIcon(),new ArrayList<>(Arrays.asList(1))));
List<MenuVO> children=recursionForMenu(menu.getMenuId(),menuList);
menuVO.setChildren(children);
list.add(menuVO);
});
return list;
}
/**
* 菜单的VO
*/
@Data
public class MenuVO {
private String path;
private String component;
private boolean alwaysShow;
private String name;
private MetaVO meta;
private List<MenuVO> children;
}
@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="SysMenu对象", description="")
public class SysMenu implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "ID")
@TableId(value = "menu_id", type = IdType.AUTO)
private Integer menuId;
@ApiModelProperty(value = "父ID")
private Integer parentId;
@ApiModelProperty(value = "名称")
private String name;
@ApiModelProperty(value = "路径")
private String component;
@ApiModelProperty(value = "路由")
private String path;
@ApiModelProperty(value = "等级")
private Integer level;
@ApiModelProperty(value = "类型 0:目录,1:菜单, 2:按钮")
private Integer type;
@ApiModelProperty(value = "图标")
private String icon;
@ApiModelProperty(value = "排序")
private Integer sort;
@ApiModelProperty(value = "状态 0:失效 1:启用")
private Integer status;
@ApiModelProperty(value = "shiro权限标识")
private String permit;
@ApiModelProperty(value = "父名称")
@TableField(exist = false)
private String pname;
}