根据角色加载菜单的思路(推荐使用)
来源:互联网 发布:足球战术设计软件 编辑:程序博客网 时间: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、
/**
* 查看角色权限列表,由于访问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<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;
}
- 根据角色加载菜单的思路(推荐使用)
- if标签的使用使根据不同角色登陆而呈现不同菜单项
- 控制菜单的比较麻烦的一种思路(不推荐使用),后面还有较为好点的
- 根据用户权限和角色拼接菜单
- 解析: Flex初始化时、加载进度监控的设计思路: (4)涉及到的角色和流程图
- 让菜单充满活力:ASP.NET根据角色动态分配菜单+权限
- ExtJS4 根据登录后不同的角色分配不同的树形菜单
- [ASP.NET 2.0]sitemap中根据角色自动隐藏菜单项的小提示
- c#实现按用户角色分配菜单的使用权限(WinForm)
- c#实现按用户角色分配菜单的使用权限(WinForm)
- c#实现按用户角色分配菜单的使用权限(WinForm) 转载
- c#实现按用户角色分配菜单的使用权限(WinForm)
- Spring Security 根据角色显示菜单是否可见
- 使用Unity制作GTA武器菜单的简单思路
- 菜单、角色、权限的管理(新致)
- 预加载(加载中) + 推荐移动端网页使用的图片懒加载(预加载)插件
- 论坛源码推荐(1月20日):加载解析RSS的Objective-C框架 Pininterest 弹出菜单的方式
- 源码推荐(1月20日):加载解析RSS的Objective-C框架 Pininterest 弹出菜单的方式
- 第六章 –– 常见类之Object和System
- 【今日头条2017内推笔试题】二维平面整数点集
- 【Unity3D】刚体自动寻路的抖动问题和运动边界、空气墙的制作
- electron + vue 实践项目
- 虚拟机安装centos6.4教程和安装oracle11g教程整合
- 根据角色加载菜单的思路(推荐使用)
- 【Unity3D技术文档翻译】第1.1篇 AssetBundle 工作流
- 四、Matplotlib系列---pyplot的文本显示
- 浅谈Java中的hashcode方法
- LightOJ 1234 Harmonic Number
- JDBC方式连接Hive获取进度信息
- linux系统离线安装mysql
- Junit4测试Controller
- 拆轮子系列:拆 Retrofit