与前面控制菜单的思路相比,这个思路的特点就是自动获取,增加菜单后会自动获取新的菜单与数据库中该角色的可访问url对比,如果是可允许访问的菜单就会显示,否则不显示,只要改变前端的ftl文件即可。
1、index.ftl:初始化的时候一级二级菜单都是不可见的。
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
{
var id = showIdArr[i];
$("#"+id).css("display","block");
var lenOfZtree =ztree.length;//从这里开始是为了显示一级菜单的,如果有任意的二级菜单显示,则会显示该二级菜单的一级菜单,否则不显示
for(varj=0;j
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、
/**
* 查看角色权限列表,由于访问json的url也是受控制的,故定义一个global的url供所有角色使用
* */
@RequestMapping("controlMenu.json")
public StringcontrolMenu(ModelMap modelMap, HttpServletRequest request){
String roleName =request.getParameter("roleName");
roleName =roleName.replaceAll("\\[", "");
roleName =roleName.replaceAll("\\]", "");
List
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
{
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
@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;
}