留作备用
@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;
 
}