1. 程式人生 > >動態菜單加載過程

動態菜單加載過程

second SM mission 位置 BE 模塊 nco result parent

根據登錄的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) {
      }
});

動態菜單加載過程