Jpa + EasyUI 递归构建 菜单树 实现角色菜单设置(menuTree、jsonArray、join、split)

一、功能描述

选择一个角色 为它赋予菜单权限
该角色已经拥有的菜单权限 要默认都选中,另外需要传参该角色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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值