saas-export项目-动态菜单

动态菜单分析

  • 分析
    不同的用户进入主页,看到的左侧菜单是不同的
    其实是,根据用户等级RBAC查询用户的权限

动态菜单等级

等级与模块的对应关系

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

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

  • (1)userId查询它的degree

  • (2)对degree值进行判断

  • degree=0
    在这里插入图片描述

  • degree=1
    在这里插入图片描述

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

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

# 三种用户
# 平台管理员 -Sass菜单 degree==0
select * from pe_user where degree=0;
# 0作为belong查模块表
select * from ss_module where belong='0'
# 企业管理员 -除了Sass菜单之外的所有 degree==1
select * from pe_user where degree=1;
select * from ss_module where belong='1'
# 用户 查RBAC
select * from pe_user where degree not in(0,1);
# 连接3张表
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 rm.module_id=m.module_id
where ru.user_id='0f1f71fe-fe7c-4a44-a952-4f08bf5aa990'
order by module_id

实现2:子查询

代码实现

TestModuleService

@Test
public void test07() {
    //给一个用户数据到service,service自己判断
    User user=new User();
    user.setUserId("0f1f71fe-fe7c-4a44-a952-4f08bf5aa990");
    //user.setDegree(0); //平台管理员
    //user.setDegree(1); //企业管理员
    user.setDegree(4); //普通用户
    //一个 Module对象 就是左侧栏上的一个菜单项
    List<Module> menus=service.findModulesByUser(user);
    l.info("test07 menus="+menus);
}

IModuleService

List<Module> findModulesByUser(User user);

ModuleServiceImpl

@Override
public List<Module> findModulesByUser(User user) {
    //degree ==0 平台管理员 只能看 Sass菜单
    //degree ==1 企业管理员 只能看 Sass菜单以外
    //degree ==其他 普通用户 根据RBAC表查询
    if(user.getDegree()==0){
        return dao.findByBelong("0");
    }else if(user.getDegree()==1){
        return dao.findByBelong("1");
    }else {
        return dao.findByUserId(user.getUserId());
    }
}

IModuleDao

List<Module> findByBelong(String s);

List<Module> findByUserId(String userId);

IModuleDao.xml

<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 rm.module_id=m.module_id
    where ru.user_id=#{userId}
    order by module_id
</select>

显示动态菜单

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

UserController

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

left_menu.jsp

<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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值