递归建立数据库的字段要建立pid
既pid是父id
这里的pid要能在id找到 找到就说明当前id的组织是父组织 如果找不到就说明的顶级id 图中的主菜单1就是顶级组织
public Menu getMenuTree() {
//先查询顶级目录
LambdaQueryWrapper<Menu> menuLambdaQueryWrapper = new LambdaQueryWrapper<>();
menuLambdaQueryWrapper.eq(Menu::getPid, "0");
Menu menusBase = menuMapper.selectOne(menuLambdaQueryWrapper);
//查询除了顶级组织以外的组织
LambdaQueryWrapper<Menu> menuLambdaQueryWrapper2 = new LambdaQueryWrapper<>();
menuLambdaQueryWrapper2.ne(Menu::getPid, "0");
List<Menu> menuLNotBase = menuMapper.selectList(menuLambdaQueryWrapper2);
List<Menu> menus = iterateMenus(menuLNotBase, menusBase.getId());
menusBase.setMenuChildren(menus);
return menusBase;
}
反复调用iterateMenus方法 直到循环遍历结束
/**
* 多级组织查询方法
*
* @param menuVoList 不包含最高层次组织的组织集合
* @param pid 父类id
* @return
*/
public List<Menu> iterateMenus(List<Menu> menuVoList, String pid) {
List<Menu> result = new ArrayList<>();
int a =0;
for (Menu menu : menuVoList) {
//获取菜单的id
String menuid = menu.getId();
//获取菜单的父id
String parentid = menu.getPid();
if (parentid.equals(pid)) {
//递归查询当前子菜单的子菜单
List<Menu> iterateMenu = iterateMenus(menuVoList, menuid);
menu.setMenuChildren(iterateMenu);
result.add(menu);
}
}
return result;
}
Entity有些字段不需要 我加是因为自己的业务
@Data
@NoArgsConstructor
@TableName("Menu")
public class Menu {
private String id;
private String name;
private String pid;
@TableField(exist = false)
private List<Menu> menuChildren;
@TableField(exist = false)
private Boolean nextRank;
}