1.首先获取需要匹配的角色菜单数据
//获取所有角色拥有的菜单权限数据
List<RoleOperatorPermission> roleOperatorPermission = permissionService.findRoleOperatorPermission(employee.getRoleId());
2.获取最外层数组数据示例数据data:[{name:“id”,children:“children:”“”},{name:“id1”,children:“children:”“”}]
JSONArray jsonArray = jsonObject.getJSONArray("data");
JSONArray newJsonArray = new JSONArray();
//获取角色第一层级菜单权限
for (RoleOperatorPermission list : roleOperatorPermission) {
for (int i = 0; i < jsonArray.size(); i++) {
JSONObject person = jsonArray.getJSONObject(i);
if (person.get("name").equals(list.getCode())) {
newJsonArray.add(person);
}
}
}
通过最外层数据遍历每个节点的子菜单并将遍历的子节点通过Fastjson赋值
//通过第一层级菜单逐级获取对应子菜单
for (int newIndex = 0; newIndex< newJsonArray.size();newIndex++) {
if (newJsonArray.getJSONObject(newIndex).get("children") != null && newJsonArray.getJSONObject(newIndex).get("children") instanceof JSONArray && newJsonArray.getJSONObject(newIndex).getJSONArray("children").size() > 0) {
JSONArray resultNode = findJsonNode(newJsonArray.getJSONObject(newIndex).getJSONArray("children"),roleOperatorPermission);
if (resultNode != null) {
newJsonArray.getJSONObject(newIndex).put("children", resultNode);
}
}
}
通过递归获取每个节点下的每个匹配的children节点
/**
* 递归获取每个children中匹配角色的菜单
* @param jsonArray
* @param roleOperatorPermissions
* @return
*/
private static JSONArray findJsonNode(JSONArray jsonArray, List<RoleOperatorPermission> roleOperatorPermissions) {
JSONArray result = new JSONArray();
for (int i = 0; i < jsonArray.size(); i++) {
JSONObject object = jsonArray.getJSONObject(i);
for (int rIndex = 0; rIndex < roleOperatorPermissions.size(); rIndex++) {
if (object.get("name").equals(roleOperatorPermissions.get(rIndex).getCode())) {
result.add(object);
}
}
JSONArray children = object.getJSONArray("children");
if (children != null && children instanceof JSONArray && children.size() > 0) {
JSONArray childResult = findJsonNode(children, roleOperatorPermissions);
if (childResult != null && childResult.size() > 0) {
object.put("children",childResult);
}
}
}
return result.size() > 0 ? result : null;
}