/**
* 更新角色-权限信息,包含以下参数:
* <p>
* id 当前角色的id
* ids 当前角色-权限的id集合
* parents 当前角色-权限的是否是父节点的parent集合
*
* <p>
* 之前在User层面上,我们要对其进行角色的更新,也就是说在User用户层面上更新权限,只需要维护用户-角色表数据。
* 而在角色层面上,只需要维护角色-权限表数据。
* <p>
* 误区:始终要记得,同一个角色拥有不同权限的情况是不存在的,如果两个用户拥有不同的权限,那么他们一定拥有了不同的角色
*
* @return
* @Param dataMap 以上参数数据的Map集合
*
* <p>
* 为什么要用Map接收?
* 如果想要传递对象(如数组)参数,ajax就必须发送post请求,而post请求传递对象参数就要用JSON.stringify()格式化数据为JSON字符串才能传递;
* 一旦使用了JSON.stringify()格式化数据,传递的就是JSON字符串,后端必须使用String类型接收,而我们传递的数据中包含了普通变量、数组等多种数据,所以使用使用Map接收,并指定泛型是String类型
*
* <p>
* 前端传递进来的参数在Map中封装的数据结构类似:
* {0:{key: id, value: {....}}, 1:{key: ids, value: {...}}, 2:{key: parents, value: {...}}}
*/
@ResponseBody
@RequestMapping(value = "/updateRolesPermissions", method = RequestMethod.POST)
public Result updateRolesPermissions(@RequestBody Map<String, Object> dataMap) {
try {
//重要的地方
Long id = Long.valueOf((String) dataMap.get("id")); //当前操作角色的id
ArrayList ids = (ArrayList) dataMap.get("ids"); //当前角色更新的权限id的集合体
ArrayList parents = (ArrayList) dataMap.get("parents"); //当前更新的角色权限parent信息
// 更新角色的权限关系即需要维护角色-权限表,前端传来了什么数据? 1、角色id;2、被选中的权限Id集合。
// 如何更新角色的权限?我们常会想到,根据表的主键update呀,但是,因为页面上展示的数据是后端构建的ZTree实体类JSON数据,其中并不包含表的主键值
// 所以,这里就采取一种比较极端的方式,先删除此角色所有关联的权限id,再依次关联此角色当前更新的权限id
//先删除此角色关联的所有权限id
roleService.deleteAllRolePermissions(id);
//再依次关联此角色更新的权限id
for (int i = 0; i < ids.size(); i++) {
if (!(boolean) parents.get(i)) {
//不是父节点才进行关联,因为父节点是角色,子节点才是权限
roleService.correlationPermissions(id, Long.valueOf(String.valueOf(ids.get(i))));
}
}
System.out.println(dataMap);
return new Result(true, "更新数据成功");
} catch (Exception e) {
e.printStackTrace();
return new Result(false, "发生未知错误");
}
}
注意因为例子用了@RequestBody所以不能用于contentType是form-data方式的请求