不好意思来晚了,权限设计我已经做出来了,具体的功能设计是这样的:
用户sys_user可以有多个角色, 一个角色sys_role可以有多个菜单sys_menu(这里也包括操作动作哦),
下面的是数据库表:
Sys_user, sys_role, sys_user_role, sys_menu, sys_role_menu
sys_user_role表里有两个关联字段roleId,userId,
sys_role_menu表里有两个关联字段roleId,menuId.
主要介绍一下sys_menu表,表中有"rank字段代表等级0=上级菜单1=下级菜单2=操作动作3=查看动作",
"pId字段里面是父类的ID,如果是最上级菜单的话,pId=0,默认是0"
那么怎么才能生成动态的菜单呢??
请看我的思路(我用的Java语言)
1,用户登录成功-获取到该用户的全部角色,
Set<Role> roleSet = userEntity.getRole(); //通过sys_user_role这张表去获取该用户的全部角色
2,通过该用户角色,循环遍历当前角色的全部菜单(这里也包括操作动作哦)
//不会重复并且有序
LinkedHashSet linkSet = new LinkedHashSet();
for(Ieterator roleIt=roleSet.iterator;roleIt.hashNext;){
//通过sys_role_menu这张表去获取该角色的全部菜单(这里也包括操作动作哦),
RoleEntity roleEntity = (RoleEntity)roleIt.next();
Set menuSet = roleEntity .getMenu();
//将该角色的菜单遍历的插入到新的Set里面,这里我们使用不会有重复的并且有循序的LinkedHashSet类,这时的linkSet面已经存在不重复并且有序的菜单(这里也包括操作动作哦)啦
for(Ieterator menuIt=menuSet.iterator;menuIt.hashNext;){
MenuEntity menuEntity = (MenuEntity)menuIt.next();
linkSet.add(menuEntity);
}
}
<!-- jsp页面动态生成菜单 -->
<!-- 树形菜单 -->
<div data-options="region:'west',split:true,title:'功能导航'" style="width:200px;">
<div id="tree-box" class="easyui-accordion" data-options="fit:true,border:false">
<%
LinkedHashSet set = (LinkedHashSet)request.getSession().getAttribute("menu");
for(Iterator ite=set.iterator();ite.hasNext();){
MenuEntity menu = (MenuEntity)ite.next();
//out.println(menu.getName());
//获取上级菜单
if(menu.getRank() == 0){
%>
<div title="<%=menu.getName() %>">
<%
//获取下级菜单
for(Iterator i=set.iterator();i.hasNext();){
MenuEntity chiMen = (MenuEntity)i.next();
if(chiMen.getParentId() == menu.getId() && chiMen.getRank() == 1){
%>
<a class="menu-item" href="<%= basePath %><%= chiMen.getActions() %>"><%= chiMen.getName() %></a>
<%
}
}
%>
</div>
<%
}
}
%>
</div>
</div>
---------------------------------------无敌分隔符------------------------------------
就写到这里吧,我已经做好了一个开源的项目,JSSHE,就是这样实现的,如果有什么不懂的话,可以给我发邮箱[email protected]