持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情
1.新建Node实体类
作用:用来定义返回节点的实体对象
package com.imooc.oa.entity;
public class Node {
private long nodeId;
private long nodeType;
private String nodeName;
private String url;
private Long noteCode;
private Long parentId;
//getter和setter方法就自行通过idea创建
}
2.新建rbacmapper
作用:通过userId来获取登录用户的菜单权限
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="rbacmapper">
<select id="selectNodeByUserId" parameterType="Long" resultType="com.imooc.oa.entity.Node">
SELECT
DISTINCT sn.*
FROM
sys_role_user ru,
sys_role_node rn,
sys_node sn
WHERE
rn.role_id = ru.role_id
AND sn.node_id = rn.node_id
AND ru.user_id =#{userId}
</select>
</mapper>
代码说明:
- DISTINCT:用来去重,因为一个用户可能有多个角色身份
3.mybatis-config.xml新增mapper
4.新建RbacDao
public class RbacDao {
public List<Node> selectNodeByUserid(long userId) {
return (List)MybatisUtils.executeQuery(sqlSession -> sqlSession.selectList("rbacmapper.selectNodeByUserId", userId));
}
}
代码说明:
- sqlSession.selectList:返回list,因为一个用户可能有多个节点
5.userService调用dao的方法
public List<Node> selectNodeByUserId(Long userId){
List<Node> nodeList = rbacDao.selectNodeByUserid(userId);
return nodeList;
}
6.单元测试
7.登录接口保存session
//设置session
HttpSession session = request.getSession();
session.setAttribute("login_user",user);
result.put("redirect_index","/index");
代码说明:
- session.setAttribute("login_user",user):设置名字为login_user的session,用来跳转首页进行用户判断
- result.put("redirect_index","/index"):登录接口返回跳转后台首页
8.登录界面进行页面重定向
9.新建indexServlet
作用:用来进行登录用户身份的认证和菜单权限的获取
@WebServlet(name = "IndexServlet", value = "/index")
public class IndexServlet extends HttpServlet {
RbacDao rbacDao = new RbacDao();
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
User user = (User) session.getAttribute("login_user");
List<Node> nodeList = rbacDao.selectNodeByUserid(user.getUserId());
request.setAttribute("node_list",nodeList);
request.getRequestDispatcher("/index.ftl").forward(request,response);
}
}
代码说明:
- User user = (User) session.getAttribute("login_user"):获取session
- request.setAttribute("node_list",nodeList):菜单权限属性设置
- request.getRequestDispatcher("/index.ftl").forward(request,response):设置赋值的模板文件
10.新建index.ftl
作用:后台首页模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>慕课网办公OA系统</title>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="/resources/layui/css/layui.css">
</head>
<body class="layui-layout-body">
<!-- Layui后台布局CSS -->
<div class="layui-layout layui-layout-admin">
<!--头部导航栏-->
<div class="layui-header">
<!--系统标题-->
<div class="layui-logo" style="font-size:18px">慕课网办公OA系统</div>
<!--右侧当前用户信息-->
<ul class="layui-nav layui-layout-right">
<li class="layui-nav-item">
<a href="javascript:void(0)">
<!--图标-->
<span class="layui-icon layui-icon-user" style="font-size: 20px">
</span>
<!--用户信息-->
姓名[部门-职务]
</a>
</li>
<!--注销按钮-->
<li class="layui-nav-item"><a href="#">注销</a></li>
</ul>
</div>
<!--左侧菜单栏-->
<div class="layui-side layui-bg-black">
<!--可滚动菜单-->
<div class="layui-side-scroll">
<!--可折叠导航栏-->
<ul class="layui-nav layui-nav-tree">
<#list node_list as node>
<#if node.nodeType==1>
<!--父节点-->
<li class="layui-nav-item layui-nav-itemed">
<a href="javascript:void(0)">${node.nodeName}</a>
<dl class="layui-nav-child module" data-node-id="${node.nodeId}"></dl>
</li>
</#if>
<!--子节点-->
<#if node.nodeType==2>
<dd class="function" data-parent-id="${node.parentId}">
<a href="javascript:void(0)" target="ifmMain">${node.nodeName}</a>
</dd>
</#if>
</#list >
</ul>
</div>
</div>
<!--主体部分采用iframe嵌入其他页面-->
<div class="layui-body" style="overflow-y: hidden">
<iframe name="ifmMain" style="border: 0px;width: 100%;height: 100%"></iframe>
</div>
<!--版权信息-->
<div class="layui-footer">
Copyright © imooc. All Rights Reserved.
</div>
</div>
<!--LayUI JS文件-->
<script src="/resources/layui/layui.js"></script>
<script>
//将所有功能根据parent_id移动到指定模块下
layui.$(".function").each(function () {
var func = layui.$(this);
var parentId = func.data("parent-id");
layui.$("dl[data-node-id=" + parentId + "]").append(func);
})
//刷新折叠菜单
layui.element.render('nav');
</script>
</body>
</html>
11.重启项目
登录m8
s6账号
看到不同用户登录的权限不同