一、功能描述
选择一个角色 为它赋予菜单权限
该角色已经拥有的菜单权限 要默认都选中,另外需要传参该角色id:roleId
二、菜单树的展示
1.页面
var url;
function formatEdit(val,row){
return "<a href=\"javascript:openMenuSetDialog(" +row.id +")\"> <img style='margin-top:4px' src='/static/images/edit.gif'/></a>";
}
// 角色权限(菜单)
function openMenuSetDialog(roleId){
$("#dlg2").dialog("open").dialog("setTitle","权限菜单设置");
$("#menuTree").tree({
lines:true,
checkbox:true,
cascadeCheck:false,
url:'/admin/role/loadCheckMenuInfo?parentId=-1&roleId='+roleId,
onLoadSuccess:function(){
$("#menuTree").tree("expandAll");
},
onCheck:function(node,checked){
//如果当前节点被选中,就让当前目标节点的父节点也被选中
if(checked){
checkNode($("#menuTree").tree("getParent",node.target));
}
}
});
$("#roleId").val(roleId);
}
function checkNode(node){
if(!node){//根节点没有父节点了,就返回
return;
}else{
checkNode($("#menuTree").tree("getParent",node.target));
$("#menuTree").tree("check",node.target);
}
}
2.后台实现
/**
* 根据父节点获取所有复选框权限菜单
* @param parentId
* @param roleId
* @return
* @throws Exception
*/
@RequestMapping("/loadCheckMenuInfo")
public String loadCheckMenuInfo(Integer parentId,Integer roleId) throws Exception{
List<Menu> menuList=menuService.findByRoleId(roleId);
List<Integer> menuIdList=new LinkedList<Integer>();
for(Menu menu:menuList) {
menuIdList.add(menu.getId());
}
return getAllCheckMenuByParentId(parentId, menuIdList).toString();
}
先获取同一层级的菜单集合,然后遍历这个jsonArray,得到每个jsonObject,也就是每个当前层级的每个菜单,如果这个菜单是根节点,再添加它的子菜单:
/**
* 根据父节点id和权限菜单id集合获取所有复选框菜单集合
* @param parentId
* @param menuIdList
* @return
*/
public JsonArray getAllCheckMenuByParentId(Integer parentId,List<Integer> menuIdList) {
JsonArray jsonArray =this.getCheckMenuByParentId(parentId,menuIdList);//获取一层复选框菜单集合
for(int i=0;i<jsonArray.size();i++) {
JsonObject jsonObject=(JsonObject) jsonArray.get(i);
if("open".equals(jsonObject.get("state").getAsString())) {
continue;
}else {
jsonObject.add("children", getAllCheckMenuByParentId(jsonObject.get("id").getAsInt(), menuIdList));
}
}
return jsonArray;
}
/**
* 根据父节点id和权限菜单id集合获取一层复选框菜单集合
* @param parentId
* @param menuIdList
* @return
*/
private JsonArray getCheckMenuByParentId(Integer parentId, List<Integer> menuIdList) {
List<Menu> menuList=menuService.findByParentId(parentId);
JsonArray jsonArray =new JsonArray();
for(Menu menu:menuList) {
JsonObject jsonObject=new JsonObject();
jsonObject.addProperty("id", menu.getId());//节点id
jsonObject.addProperty("text", menu.getName());
if(menu.getState() == 1) {
jsonObject.addProperty("state", "closed");//根节点
}else {
jsonObject.addProperty("state", "open");//叶子节点
}
jsonObject.addProperty("iconCls", menu.getIcon());
if(menuIdList.contains(menu.getId())) {
jsonObject.addProperty("checked", true);
}
jsonArray.add(jsonObject);
}
return jsonArray;
}
Service层:
Repository接口:
public interface MenuRepository extends JpaRepository<Menu,Integer>{
/**
* 根据父节点以及用户角色id查询子节点
* @param id
* @return
*/
@Query(value="SELECT * FROM t_menu WHERE p_id=?1 AND id IN (SELECT menu_id FROM t_role_menu WHERE role_id=?2)",nativeQuery=true)
public List<Menu> findByParentIdAndRoleId(int parentId,int roleId);
/**
* 根据角色id获取菜单集合
* @param roleId
* @return
*/
@Query(value="SELECT m.* FROM t_role r,t_role_menu rm,t_menu m WHERE rm.`role_id`=r.`id` AND rm.`menu_id`=m.`id` AND r.`id`=?1",nativeQuery=true)
public List<Menu> findByRoleId(int roleId);
/*
* 根据菜单的parentId 来查询所有子菜单
*/
@Query(value="select * from t_menu where p_id=?1",nativeQuery=true)
public List<Menu> findByParentId(int parentId);
}
三、保存菜单树中选中的菜单
1.js代码:
function saveMenuSet(){
var roleId=$("#roleId").val();
var nodes=$("#menuTree").tree("getChecked");
var menuArrIds=[];
for(var i=0;i<nodes.length;i++){
menuArrIds.push(nodes[i].id);
}
var menuIds=menuArrIds.join(",");
$.post("/admin/role/saveMenuSet",{menuIds:menuIds,roleId:roleId},function(result){
if(result.success){
closeMenuSetDialog();
}else{
$.messager.alert("系统提示","提交失败,请联系管理员");
}
},"json");
}
2.后台代码
/**
* 保存角色权限设置
* @param menuIds
* @param roleId
* @return
* @throws Exception
*/
@RequestMapping("/saveMenuSet")
@RequiresPermissions(value="角色管理")
public Map<String,Object> saveMenuSet(String menuIds,Integer roleId) throws Exception{
Map<String,Object> resultMap=new HashMap<>();
roleMenuService.deleteByRoleId(roleId);//根据角色id删除所有角色权限关联实体
if(StringUtil.isNotEmpty(menuIds)) {
String idsStr[]=menuIds.split(",");
for(int i=0;i<idsStr.length;i++) {
RoleMenu roleMenu=new RoleMenu();
roleMenu.setRole(roleService.findById(roleId));
roleMenu.setMenu(menuService.findById(Integer.parseInt(idsStr[i])));
roleMenuService.save(roleMenu);
}
}
resultMap.put("success", true);
return resultMap;
}
完整代码地址:
https://gitee.com/never_enough/jxc_system/tree/master