0
点赞
收藏
分享

微信扫一扫

Day38项目saas-export项目-动态菜单**


动态菜单分析

  • (1)分析
    不同的用户进入主页,看到的左侧菜单是不同的
    其实,根据用户等级RBAC查询用户的权限
  • Day38项目saas-export项目-动态菜单**_数据库


  • Day38项目saas-export项目-动态菜单**_数据库_02

动态菜单等级

Day38项目saas-export项目-动态菜单**_数据库_03

等级与模块的对应关系

》如果User的degree=0, 说明是saas管理员,查询saas管理员所属模块
》如果User的degree=1, 说明是租用企业的管理员,查询租用企业的管理员所属模块
》其他的用户类型。统一根据用户的userId查询RBAC的表,查询其拥有的模块。(先看效果)

等级与模块的对应关系Sql实现

  • (1)userId查询它的degree
  • (2)对degree值 进行判断
  • degree=0
  • Day38项目saas-export项目-动态菜单**_mysql_04

  • degree=1
  • Day38项目saas-export项目-动态菜单**_企业管理_05

  • degree=其他
    使用5张表来查询

实现1:连接查询(推荐使用,效率更高)

#三种用户
# 平台管理员 -Sass菜单 degree==0
# 企业管理员 -除了Sass菜单之外的所有 degree==1
# 用户 查RBAC
select * from pe_user where degree=0;
# 0作为belong查模块表
select * from ss_module where belong=0

select * from pe_user where degree=1;
select * from ss_module where belong=1

select * from pe_user where degree not in(0,1);

select distinct m.* from
pe_role_user ru
inner join pe_role_module rm
on ru.role_id=rm.role_id
inner join ss_module m
on m.module_id=rm.module_id
where ru.user_id='0f1f71fe-fe7c-4a44-a952-4f08bf5aa990'
order by module_id asc;

实现2:子查询

代码实现

TestModuleService

@Test
public void test08(){

User user = new User();
user.setUserId("0f1f71fe-fe7c-4a44-a952-4f08bf5aa990");
//user.setDegree(0);
//user.setDegree(1);//企业管理员
user.setDegree(4);//普通用户
//一个 Module对象 就是左侧栏上的一个菜单项
List<Module> menus = iModuleService.findModulesByUser(user);
l.info("test08 menus="+menus);

}

IModuleService,ModuleServiceImpl

<Module> findModulesByUser(User user);


@Override
public List<Module> findModulesByUser(User user) {
//degree ==0 平台管理员 只能看 Sass菜单
//degree ==1 企业管理员 只能看 Sass菜单以外
//degree ==其他 用户员 根据RBAC表查询
//给一个用户数据到service,service自己判断
if (user.getDegree() == 0) {//平台管理员
return iModuleDao.findByBelong("0");
} else if (user.getDegree() == 1) {//企业管理员
return iModuleDao.findByBelong("1");
} else {
return iModuleDao.findByUserId(user.getUserId());
}

}

IModuleDao,IModuleDao.xml

<Module> findByBelong(String belong);//0平台管理1企业管理
List<Module> findByUserId(String userId);//使用RBAC

<select id="findByBelong" parameterType="string" resultMap="moduleMap">
select * from ss_module where belong = #{belong};
</select>

<select id="findByUserId" parameterType="string" resultMap="moduleMap">
select distinct m.*
from
pe_role_user ru
inner join pe_role_module rm on ru.role_id=rm.role_id
inner join ss_module m on m.module_id=rm.module_id
where ru.user_id=#{userId}
order by module_id asc;
</select>

显示动态菜单

UserController

在用户登录成功的时候,保存用户的对象 ,还保存用户的module数据

//保存用户信息
session.setAttribute("loginUser",user);
//一个 Module对象 就是左侧栏上的一个菜单项
List<Module> menus = iModuleService.findModulesByUser(user);
session.setAttribute("menus",menus);

left_menu.jsp

如果module对象的ctype==0表示一级菜单 ,其他的就是二级菜单

<c:forEach items="${sessionScope.menus}" var="item">
<c:if test="${item.ctype==0}">
<li class="treeview">
<%--一级菜单 --%>
<a href="#">
<i class="fa fa-cube"></i> <span>${item.name}</span>
<span class="pull-right-container"><i class="fa fa-angle-left pull-right"></i></span>
</a>
<ul class="treeview-menu">
<c:forEach items="${sessionScope.menus}" var="item2">
<%-- 一级菜单的ctype==0 二级菜单的ctype==1--%>
<%-- 二级的parentId肯定与一级的moduleId是相等,才能显示在该菜单下面--%>
<c:if test="${item2.ctype==1 && item2.parentId == item.moduleId}">
<%-- 二级菜单 --%>
<li id="${item2.moduleId}">
<!-- 此处的链接 先加项目地址再加数据库中的curl-->
<a onclick="setSidebarActive(this)" href="${path}/${item2.curl}"
target="iframe">
<i class="fa fa-circle-o"></i>${item2.name}
</a>
</li>
</c:if>
</c:forEach>
</ul>
</li>
</c:if>
</c:forEach>
<!--Ctrl+Alt+L整理代码格式的作用 -->


举报

相关推荐

0 条评论