マルチレベルメニュークエリ
の再帰的アルゴリズム1.再帰的アルゴリズムの鍵は、最上位のエントリを見つけること
です。2。次に、下を見て、第1レベルのメニューの下位IDを第2レベルのメニューと比較します
。メインエンティティをネストする2つの特別なタイプのループ
第1レベルのメニューレベル値の属性は1であり
、以下同様です。MyBatisPlus
テーブル構造pidはメニューの親メニューとして使用され、pidは0がトップレベルです。メニュー。
1.マルチレイヤーメニュークエリは、最初にpid0のトップメニューを見つけて入力します
public List<Permission> queryAllMenu() {
//查询所有菜单的数据
List<Permission> permissionList = baseMapper.selectList(new QueryWrapper<Permission>().orderByDesc("id"))l
//把所有菜单按照要求进行封装
List<Permission> resultList = buildPermission(permissionList);
return resultList;
}
public static List<Permission> buildPermisstion(List<Permission> permissionList) ){
List<Permission> findList = new ArrayList<>();
for(Permission permissionNode : permissionList){
//得到顶层菜单 pid=0菜单
if("0".equals(permissionNode.getPid())) {
//设置顶层菜单的level是1
permissionNode.setLevel(1);
//根据顶层菜单,向里面进行查询子菜单,封装到finalNode里面
finalList.add(selectChildren(permissionNode,permissionList));}
}
return finalList
}
2.次は実際の再帰的アルゴリズムです
private static Permission selectChildren(Permission permissionNode, List<Permission> permissionList) {
//因为要向一层菜单里方二层,所以先将对象初始化
permissionNode.setChildren(new ArayList<Permission>());
for(Permission it:permissionList){
//判断二值是否相等,相等则为父子菜单
if(permissionNode.getId.equal(permissionList.getPid)){
//将父菜单的level加1赋值给子菜单
int level = permissionNode.getLevel()+1;
it.setLevel(level);
//如果children为空,进行初始化操作
if(permissionNode.getChildren() == null) {
permissionNode.setChildren(new ArrayList<Permission>());
}
//把查询出来的子菜单放到父菜单里面
permissionNode.getChildren().add(selectChildren(it,permissionList));
}
}
return permissionNode;
}
}