权限表结构
递归调用的代码
private Object test(List<Permission> permissions, List<Permission> allList){//pid为0的权限数组,所有权限数组
List<Object> objList = new ArrayList<>();
for (Permission permission : permissions) {//遍历第一级别的权限
Integer id = permission.getId();//获取这一个权限的id
List<Permission> childNodes = new ArrayList<>();//子节点权限集合
for (Permission aList : allList) {//遍历所有权限,把父级id为当前id的权限找出来存在childNodes中
final Integer pId1 = aList.getPId();
if (pId1.equals(id)){
childNodes.add(aList);
}
}//获取完 permissions(遍历的当前权限)中第i个 所有的子节点存入childNodes
if (childNodes.size()!=0){//如果这个权限有下一级的权限,则继续递归
Object res = test(childNodes,allList);//递归得到obj的结果
Map<Object,Object> map = new HashMap<>();//把递归得到的结果
PermisTree permisTree = new PermisTree();
permisTree.setId(permission.getId());
permisTree.setName(permission.getName());
objList.add(permisTree);
map.put("sub",res);//存放子集
objList.add(map);
}else {//如果没有下一级权限,则输出 obj id:name
PermisTree permisTree = new PermisTree();
permisTree.setId(permission.getId());
permisTree.setName(permission.getName());
objList.add(permisTree);
}
}
//获取完 permissions中 所有子节点
// System.err.println(objList);
return objList;
}
调用test函数后获取的的map格式的数据,需要再将其转化为json格式
final Object test = test(aaa, permissions);//通过第一级别获取到所有的权限
final String res = JSON.toJSONString(test);//格式转换
final JSONArray objects = JSON.parseArray(res);
最后返回的结果
{
"message": "操作成功",
"status": 200,
"token": null,
"refreshToken": null,
"data": [
{
"name": "管理后台",
"id": 1
},
{
"sub": [
{
"name": "首页",
"id": 2
},
{
"name": "医院管理",
"id": 3
},
{
"name": "医生管理",
"id": 4
},
{
"sub": [
{
"name": "医生注册申请",
"id": 5
},
{
"name": "医生管理",
"id": 6
}
]
},
{
"name": "系统管理",
"id": 7
},
{
"sub": [
{
"name": "用户管理",
"id": 8
},
{
"name": "角色权限管理",
"id": 9
},
{
"name": "假体类型配置",
"id": 10
},
{
"name": "平台配置",
"id": 11
},
{
"name": "系统公告",
"id": 12
},
{
"name": "系统日志",
"id": 13
}
]
},
{
"name": "test",
"id": 21
}
]
},
{
"name": "2D规划",
"id": 14
},
{
"name": "3D规划",
"id": 15
},
{
"sub": [
{
"name": "3D医生权限",
"id": 17
},
{
"name": "3D临床专员权限",
"id": 18
},
{
"name": "3D临床经理权限",
"id": 19
}
]
},
{
"name": "JCT定制",
"id": 16
}
]
}
突然发现上面那个有点太chun了 = =
更新的test方法
//allList怎么变成全局变量
private Object test(List<Permission> permissions, List<Permission> allList){//pid为0的权限数组,所有权限数组
List<Object> objList = new ArrayList<>();
for (Permission permission : permissions) {//遍历第一级别的权限
Integer id = permission.getId();//获取这一个权限的id
List<Permission> childNodes = new ArrayList<>();//子节点权限集合
for (Permission aList : allList) {//遍历所有权限,把父级id为当前id的权限找出来存在childNodes中
final Integer pId1 = aList.getPId();
if (pId1.equals(id)){
childNodes.add(aList);
}
}//获取完 permissions(遍历的当前权限)中第i个 所有的子节点存入childNodes
if (childNodes.size()!=0){//如果这个权限有下一级的权限,则继续递归
Object res = test(childNodes,allList);//递归得到obj的结果
// Map<Object,Object> map = new HashMap<>();//把递归得到的结果
PermisTree permisTree = new PermisTree();
permisTree.setId(permission.getId());
permisTree.setName(permission.getName());
permisTree.setChildNode(res);
objList.add(permisTree);
// map.put("sub",res);//存放子集
// objList.add(map);
}else {//如果没有下一级权限,则输出 obj id:name
PermisTree permisTree = new PermisTree();
permisTree.setId(permission.getId());
permisTree.setName(permission.getName());
objList.add(permisTree);
}
}
//获取完 permissions中 所有子节点
// System.err.println(objList);
return objList;
}
返回数据的格式
{
"message": "操作成功",
"status": 200,
"token": null,
"refreshToken": null,
"data": [
{
"name": "管理后台",
"id": 1,
"childNode": [
{
"name": "首页",
"id": 2
},
{
"name": "医院管理",
"id": 3
},
{
"name": "医生管理",
"id": 4,
"childNode": [
{
"name": "医生注册申请",
"id": 5
},
{
"name": "医生管理",
"id": 6
}
]
},
{
"name": "系统管理",
"id": 7,
"childNode": [
{
"name": "用户管理",
"id": 8
},
{
"name": "角色权限管理",
"id": 9
},
{
"name": "假体类型配置",
"id": 10
},
{
"name": "平台配置",
"id": 11
},
{
"name": "系统公告",
"id": 12
},
{
"name": "系统日志",
"id": 13
}
]
},
{
"name": "test",
"id": 21
}
]
},
{
"name": "2D规划",
"id": 14
},
{
"name": "3D规划",
"id": 15,
"childNode": [
{
"name": "3D医生权限",
"id": 17
},
{
"name": "3D临床专员权限",
"id": 18
},
{
"name": "3D临床经理权限",
"id": 19
}
]
},
{
"name": "JCT定制",
"id": 16
}
]
}