根据角色加载菜单的思路(推荐使用)

与前面控制菜单的思路相比,这个思路的特点就是自动获取,增加菜单后会自动获取新的菜单与数据库中该角色的可访问url对比,如果是可允许访问的菜单就会显示,否则不显示,只要改变前端的ftl文件即可。

 

1、index.ftl:初始化的时候一级二级菜单都是不可见的。

         
               


                   

  •                         style="display:none" title="目录一">
                              
                              目录一
                          

                          

                                
    • style="display:none">菜单11

    •                           
    • style="display:none">菜单12

    •                       

                       

  •                

                   

                       

  •                         style="display:none" title="目录二">
                              
                              目录二
                          

                          

                                
    • style="display:none">菜单21

    •                           
    • style="display:none">菜单22

    •                           
    • style="display:none">菜单23

    •                       

                       

  •                

               

     

    2、用js来处理菜单显示的问题

     

    //初始化右侧菜单
    $(document).ready(function(){
        var roleName = $("#authorize").val();
        if(roleName.indexOf("ROLE_ADMIN")>-1)//如果角色是admin则显示所有菜单
        {
            $("#ordinary_content").find("li").css("display","block");
            $("#ordinary_content").find("a").css("display","block");
        }
        else//如果不是admin就到后台访问数据库,获取该用户可访问的url,返回的数据为对应菜单的id
        {
            var ztree =getContentAndMenu();
            var url ="controlMenu.json?roleName=" + roleName;
            $.ajax({
                url: url,// 跳转到 action
                success: function (data) {
                    if (data.status) {
                         var showId = data.showId;
                         var showIdArr = showId.split("");
                         var len = showIdArr.length;
                         for(var i=0;i//最后一个为空,所以减1
                         {
                                   var id = showIdArr[i];
                                   $("#"+id).css("display","block");
                                   var lenOfZtree =ztree.length;//从这里开始是为了显示一级菜单的,如果有任意的二级菜单显示,则会显示该二级菜单的一级菜单,否则不显示
                                   for(varj=0;j                                          var menu =ztree[j].menu;
                                             var content = ztree[j].content;
                                             if(menu.indexOf(id)>-1)
                                       {
                                                      $("#"+content).css("display","block");
                                       }
                                   }
                         }
                    }
                    else {
                       alert("获取要显示的菜单id失败!!!");
                    }


                },
                error: function () {
                    alert("异常!");
                }
            });
        }
        
    });

     

    //获取菜单中一级菜单与二级菜单的对应关系
    function getContentAndMenu(){
             var zNodes = [];
             var len1 =$("#ordinary_content").children("div").length;
             for(var j=1;j<=len1;j++)
             {
                       var map = {};
                       map['content']="content"+j;
                       var menu ="";
                       var len =$("#content"+j+"_menu").children("li").length;
                       for(vari=0;i                             
                                menu =menu+$("#content"+j+"_menuli").eq(i).attr("id")+"_";
                       }
                       map['menu']=menu;
                       zNodes.push(map);
             }
             return zNodes;
    }

     

     

    3、

    /**
              * 查看角色权限列表,由于访问jsonurl也是受控制的,故定义一个globalurl供所有角色使用
              * */
             @RequestMapping("controlMenu.json")
             public StringcontrolMenu(ModelMap modelMap, HttpServletRequest request){
                       String roleName =request.getParameter("roleName");
                       roleName =roleName.replaceAll("\\[", "");
                       roleName =roleName.replaceAll("\\]", "");
            ListroleOfResource =  filterService.getRoleForResource(roleName);
            int len = roleOfResource.size();
            String idString = "";
            for(int i=0;i         {
                    StringmenuControl = roleOfResource.get(i);
                    idString+=menuControl+"";
            }
            modelMap.put("showId", idString);
            modelMap.put("status",true);
                       return"JSON";
             }

     

    //获取角色可访问的URL并将URL改变为前端对应的id,例如URL/ps_admin/hellotest.do,返回的数据为hellotestdo,就与前端的菜单id对应上了

    public List getRoleForResource(String authorities)
        {
            String sql ="select t1.value from ps_resource t1,ps_role t2,ps_role_resource t3 wheret2.role_name=? and t2.id=t3.role_id and t3.resource_id=t1.id";
            Listlist = urlJdbcTemplate.query(sql, new Object[]{authorities}, newRowMapper() {
                @Override
                public String mapRow(ResultSet rs,int i) throws SQLException {
                  Stringurl = rs.getString("value");
                  StringmenuControl = url.replaceAll("/", "");
                  menuControl= menuControl.replaceAll("\\.", "");
                  menuControl= menuControl.replaceAll("ps_admin", "");
                    return menuControl;
                }
            });
            return list;
        }

    你可能感兴趣的:(Spring)