采用递归实现多级菜单
1.菜单对象
@Data
public class SysMenuEntity {
/**菜单id*/
private Long id;
/**父菜单id,一级菜单为0*/
private Long parentId;
/**菜单名称*/
private String menuName;
/** 菜单URL*/
private String menuUrl;
/**类型 0:目录 1:菜单 2:按钮*/
private Integer menuType;
/** 菜单图标*/
private String menuIcon;
/**排序*/
private Integer orderNum;
/**子菜单*/
private List<SysMenuEntity> childMenuList;
}
2.菜单排序
/**
* 排序,根据orderNum升序排列
*
* @return 排序器
*/
private Comparator<SysMenuEntity> order() {
return (menu1, menu2) -> {
if (!menu1.getOrderNum().equals(menu2.getOrderNum())) {
return menu1.getOrderNum() - menu2.getOrderNum();
}
return 0;
};
}
3.获取子菜单列表
/**
* 获取子菜单列表
*
* @param parentId 父菜单id
* @param allMenuList 所有菜单列表
* @return 每个父菜单下的子菜单列表
*/
private List<SysMenuEntity> getChildMenuList(Long parentId, List<SysMenuEntity> allMenuList) {
//子菜单列表
List<SysMenuEntity> childMenuList = allMenuList.stream()
//父菜单id与当前菜单的父菜单id相同,添加到当前菜单的子菜单中
.filter(m -> parentId.equals(m.getParentId()))
.collect(Collectors.toList());
//递归调用
childMenuList.forEach(e -> e.setChildMenuList(getChildMenuList(e.getId(), allMenuList)));
childMenuList.sort(order());
//当前菜单下没有子菜单,返回空list,退出递归
if (childMenuList.size() == 0) {
return new ArrayList<>();
}
return childMenuList;
}
4.获取完整菜单列表树
/**
* 获取菜单列表
*
* @return 菜单列表
*/
public List<SysMenuEntity> listMenu() {
//获取数据库中所有菜单列表
List<SysMenuEntity> allMenuList = menuMapper.listSysMenu();
//根菜单列表,并排序
List<SysMenuEntity> rootMenuList = allMenuList.stream()
//父菜单是0的为根菜单。
.filter(e -> Long.valueOf(0).equals(e.getParentId()))
//排序
.sorted(order())
.collect(Collectors.toList());
//为根菜单设置子菜单
rootMenuList.forEach(e -> e.setChildMenuList(getChildMenuList(e.getId(), allMenuList)));
//为根菜单设置子菜单
return rootMenuList;
}