备忘、顺便分享
实体类
主菜单实体类
@Getter
@Setter
public class Menu implements Serializable{
private static final long serialVersionUID = 1L;
//id
private Integer id;
//父id
private Integer pid;
//路径
private String path;
//标题
private String title;
//图标
private String icon;
//子节点集合
private List<Children> children;
子菜单实体类
@Getter
@Setter
public class Children {
//id
private Integer id;
//父id
private Integer pid;
//路径
private String path;
//标题
private String title;
//图标
private String icon;
}
其实只用一个主菜单也行。我这有点特殊性。只用一个菜单的实体类
public class Menu implements Serializable{
private static final long serialVersionUID = 1L;
//id
private Integer id;
//父id
private Integer pid;
//路径
private String path;
//标题
private String title;
//图标
private String icon;
//子节点集合
private List<Menu> children;
调用
public List<Menu> getMenuToRoles( Set<String> roles) {
HashMap map = new HashMap();
Set<Integer> set = new HashSet<Integer>();
Iterator iterator = roles.iterator();
while (iterator.hasNext()){
Set<Integer> menu = loginService.getMenuToRoles((String) iterator.next());
set.addAll(menu);
}
List<Menu> list = loginService.getAllMenu(set);
List<HashMap> MenuMap =new ArrayList<HashMap>();
//2.1)、找到所有的一级分类
List<Menu> level1Menus = list.stream().filter((Menu) -> {
return Menu.getPid() == 0;
}).map((menu)->{
menu.setChildren(getchildren(menu,list));
return menu;
}).collect(Collectors.toList());
return level1Menus;
}
//递归查找所有菜单的子菜单
private List<Children> getchildren(Menu root,List<Menu> all){
List<Children> children = all.stream().filter((Menu) -> {
return Menu.getPid() == root.getId();
}).map((Menu) -> {
Children ch = new Children();
ch.setPath(Menu.getPath());
ch.setTitle(Menu.getTitle());
ch.setIcon(Menu.getIcon());
//1.找到子菜单
// Menu.setChildren(getchildren(Menu,all));
return ch;
}).collect(Collectors.toList());
return children;
}
总结
上边处理的2级菜单,三级菜单把注释打开就行了