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

来源:互联网 发布:足球战术设计软件 编辑:程序博客网 时间:2024/05/03 17:36

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

 

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

          <divid="ordinary_content">
                <div>
                   <li>
                       <a id="content1" style="display:none" title="目录一">
                          <i class="glyph-iconicon-linecons-tv"></i>
                          <span>目录一</span>
                       </a>
                       <ul id="content1_menu">
                          <li id="hellotestdo" style="display:none"><ahref="/ps_admin/hellotest.do" title="菜单11"><span>菜单11</span></a></li>
                          <li id="hellotest2do" style="display:none"><ahref="/ps_admin/hellotest2.do" title="菜单12"><span>菜单12</span></a></li>
                       </ul>
                   </li>
                </div>
                <div>
                   <li>
                       <a id="content2" style="display:none" title="目录二">
                          <i class="glyph-icon icon-linecons-tv"></i>
                          <span>目录二</span>
                       </a>
                       <ul id="content2_menu">
                          <li id="hellotest3do" style="display:none"><ahref="/ps_admin/hellotest3.do" title="菜单21"><span>菜单21</span></a></li>
                          <li id="hellotest4do" style="display:none"><ahref="/ps_admin/hellotest4.do" title="菜单22"><span>菜单22</span></a></li>
                          <li id="hellotest5do" style="display:none"><ahref="/ps_admin/hellotest5.do" title="菜单23"><span>菜单23</span></a></li>
                       </ul>
                   </li>
                </div>
            </div>

 

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<len-1;i++)//最后一个为空,所以减1
                     {
                               var id = showIdArr[i];
                               $("#"+id).css("display","block");
                               var lenOfZtree =ztree.length;//从这里开始是为了显示一级菜单的,如果有任意的二级菜单显示,则会显示该二级菜单的一级菜单,否则不显示
                               for(varj=0;j<lenOfZtree;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<len;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("\\]", "");
        List<String>roleOfResource =  filterService.getRoleForResource(roleName);
        int len = roleOfResource.size();
        String idString = "";
        for(int i=0;i<len;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<String> 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";
        List<String>list = urlJdbcTemplate.query(sql, new Object[]{authorities}, newRowMapper<String>() {
            @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;
    }

 

阅读全文
0 0
原创粉丝点击