动态菜单加载过程

根据登录的userID查询出角色绑定的menucode,再查出所有菜单List<Module>

去除List<Module>中没有绑定的菜单

再将List<Module>建立成树形机构

在将list转为json格式字符串返回到前端

    /**
     * 根据用户id获取module列表
     * @param userId
     * @return
     * List<SysModule>
     */
    public List<SysModule> selectModuleByUserId(String userId){
        //最终的List<SysModule>集合
        List<SysModule> result=new ArrayList<SysModule>();
        //查询所有的List<SysModule>
        List<SysModule> modules=dao.queryForObjectList("select * from sys_module order by sortNumber asc", null,SysModule.class);
        if(modules==null){
            modules=new ArrayList<SysModule>();
        }
        //查询用户可以操作的模块编号String集合
        List<String> mids=dao.queryOneColumnForMoreRows("select distinct moduleCode from sys_role_module where roleCode in (select roleCode from sys_user_role where userCode=?)", new Object[]{userId}, String.class);
        if(mids==null){
            mids=new ArrayList<String>();
        }
        //去除没有权限的叶子节点
        clear(modules,mids);
        //建立模块层次结构
        for(int i=0;i<modules.size();i++){
            SysModule m=modules.get(i);
            if(m.getParentCode()!=null&&m.getParentCode().equals("0")){   //一级目录,父级code为0
                resetModules2(m,modules);
                result.add(m);
            }
        }
        return result;
    }
/** * 根据mids去掉不存在的modules * @param modules 所有菜单List集合 * @param mids 绑定userid的菜单code * void */ private void clear(List<SysModule> modules,List<String> mids){ for(int i=0;i<modules.size();i++){ //遍历所有菜单 SysModule m=modules.get(i); if(m.getModulePath()!=null&&!m.getModulePath().trim().equals("")){ //当菜单路径不为空时,为空的菜单是文件夹,不允许删除. boolean bl=false; //假设不存在 for(int n=0;n<mids.size();n++){ //遍历所有存在的菜单code if(mids.get(n).toString().equals(m.getModuleCode())){ //遍历的菜单存在于绑定的权限中 bl=true; break; } } if(!bl){ //此菜单不存在,即在绑定userid的菜单code中找不到 modules.remove(i); //移除此菜单 i--; //移除后,i-1,下次遍历认为当前位置 } } } } /** * 为m设置子节点 * @param m 父节点 * @param ms 在ms中找到m的子节点 * void */ private void resetModules2(SysModule m,List<SysModule> ms){ for(int i=0;i<ms.size();i++){ //循环modules SysModule c=ms.get(i); //获取module if (c.getParentCode()!=null&&c.getParentCode()!="") { //当module的父code不为空时,即是子菜单 if(c.getParentCode().equals(m.getModuleCode())){ //如果module的的父code等于m的code,也就是遍历到的module是m的子菜单 if(c.getModulePath()==null||c.getModulePath().trim().equals("")){ //如果它的路径是空时,即这个module是个二级目录 resetModules2(c,ms); //继续找这个二级目录下的菜单. if(c.getChildren().size()>0){ //如果module的子菜单大于0时 m.getChildren().add(c); //把这个二级菜单c加入到m中 } }else if(c.getModulePath()!=null&&!c.getModulePath().trim().equals("")){ //当路径不为空时,即是m的子菜单. m.getChildren().add(c); //直接加入到m } } } } }

前端

    //递归菜单
  function RecMenu(m){
      var result = '';
      
      result +="<li>";
      if(m.children!=null&&m.children.length>0){    //当菜单有子集时
          //菜单为文件夹
          result +='<a href="#"> <i class="fa fa-check"></i> <span class="nav-label">'+m.moduleName+'</span> <span class="fa arrow"></span></a>';
          result +='<ul class="nav nav-second-level">';
          //遍历子集
          for(var i=0,len=m.children.length;i<len;i++){
              result+= RecMenu(m.children[i]);  //继续建立子集树形菜单
          }
          result +='</ul>';
      }else{
          result+= '<a class="J_menuItem" onclick="javascript:reloadMenu(this);" href="/${appName}/'+m.modulePath+'">'+m.moduleName+'</a>'
      }
      result +="</li>";
      
      return result;
  }

$.ajax({
    url:'/${appName}/manager/LoginController/loadpermissions',
    type:'post',
    async: false,
    cache:false,
    data:{userId:userId},
    dataType:'json',
    success: function(data){   //返回的data为一级菜单集合
        for(var i=0,len=data.length;i<len;i++){   //遍历一级菜单
            var ps = data[i];   //一级菜单
            if(ps.children.length>0){   //如果一级菜单下有子菜单时
                var result = RecMenu(ps);   //将菜单中的子菜单转为树形
                $('#side-menu').append(result);
            }
        }
    },
    error: function (aa, ee, rr) {
      }
});

猜你喜欢

转载自www.cnblogs.com/aeolian/p/9204524.html