当前位置: 代码迷 >> 综合 >> Jpa + EasyUI 递归构建 菜单树 实现角色菜单设置(menuTree、jsonArray、join、split)
  详细解决方案

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

热度:103   发布时间:2023-11-24 03:46:51.0

一、功能描述

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

  相关解决方案