OA系统开发(八)

115 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情

1.新建Node实体类

作用:用来定义返回节点的实体对象 image.png

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来获取登录用户的菜单权限 image.png

<?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:用来去重,因为一个用户可能有多个角色身份 image.png

3.mybatis-config.xml新增mapper

image.png

4.新建RbacDao

image.png

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的方法

image.png

public List<Node> selectNodeByUserId(Long userId){
    List<Node> nodeList = rbacDao.selectNodeByUserid(userId);
    return  nodeList;
}

6.单元测试

image.png

7.登录接口保存session

image.png

//设置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.登录界面进行页面重定向

image.png

9.新建indexServlet

作用:用来进行登录用户身份的认证和菜单权限的获取 image.png

@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

作用:后台首页模板 image.png

<!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 image.png s6账号 image.png 看到不同用户登录的权限不同