OA系统十一:登录成功后跳转到默认首页,初始化默认首页的左侧功能菜单;

本篇博客需要特别注意的内容有:(1)查询功能节点的【表的关联查询】是本篇博客的核心内容;(2)登录的用户信息存储到了Session对象中;(3)注意一下,页面跳转过程中,前台文件和后台文件的跳转逻辑;

本篇博客内容说明: 不同的用户登录系统后,系统首页的显示内容是不同的。

【如果用户是业务岗角色】其显示内容是:通知公告,请假申请。

【如果用户是管理岗角色】其显示内容是:通知公告,请假申请,请假审批

所以,本篇博客的主要内容是【根据登录用户的角色的不同,动态的显示功能菜单】 


目录

0.【角色不同,功能不同】的SQL逻辑(这部分是这个功能的核心!!!)

1.首先:创建Node类:承接和存储【根据用户查询的功能】的结果

2.然后,定义数据查询所需的【Mapper XML】和编写【SQL语句】

3.然后,根据MVC设计原则,编写Model(模型)中的DAO类

4.然后,根据MVC设计原则,编写Model(模型)中的Service类

如何验证写的这个Service能不能用?

5.然后,编写LoginServlet和login.html,处理【登录成功后向默认首页的跳转】的逻辑

6.然后,根据MVC设计原则,编写Controller(控制器):Servlet类:去接受并处理登录页的请求

7.然后,根据MVC设计原则,编写和完善View(视图):前端文件:默认首页的index.ftl

 8.最后,看一下效果


0.【角色不同,功能不同】的SQL逻辑(这部分是这个功能的核心!!!)

用户登录的时候,不同的角色其功能菜单显示内容是不同的。

所以,其SQL语句为:按照用户ID,去获取对应的功能节点:

SELECT  DISTINCT n.*
FROM sys_role_user ru , sys_role_node rn ,sys_node n
WHERE ru.role_id=rn.role_id AND ru.user_id = 3 AND rn.node_id=n.node_id
ORDER BY n.node_code

说明:

(1)为什么需要DISTINCT:

如果不使用DISTINCT时:

2021-06-07补:DISTINCT十分重要,在实际更加复杂的系统中,为了应对复杂的业务,会有好多种角色,自然会存在同一个用户可能身兼多个角色的情况。所以,就必须要使用DISTINCT关键字,否则会出现重复字段!!!

(2)上述的SQL语句,在连接表的时候省略了JOIN关键字;以后自己尽量不要这样写:

(3)2021-06-07补充:通过这个例子更能感受到RBAC表设计的妙处。

查询结果:


1.首先:创建Node类:承接和存储【根据用户查询的功能】的结果

Node类:

package com.imooc.oa.entity;

public class Node {
    private Long nodeId;  // 节点编号
    private Integer nodeType; //节点类型
    private String nodeName; //节点名称
    private String url; // 功能地址
    private Integer nodeCode; //节点编码,用于排序
    private Long parentId; //父节点编号

    public Long getNodeId() {
        return nodeId;
    }

    public void setNodeId(Long nodeId) {
        this.nodeId = nodeId;
    }

    public Integer getNodeType() {
        return nodeType;
    }

    public void setNodeType(Integer nodeType) {
        this.nodeType = nodeType;
    }

    public String getNodeName() {
        return nodeName;
    }

    public void setNodeName(String nodeName) {
        this.nodeName = nodeName;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public Integer getNodeCode() {
        return nodeCode;
    }

    public void setNodeCode(Integer nodeCode) {
        this.nodeCode = nodeCode;
    }

    public Long getParentId() {
        return parentId;
    }

    public void setParentId(Long parentId) {
        this.parentId = parentId;
    }
}

说明:

(1)上面是一个普通的实体类,与数据库的sys_node表对应;编写类属性名字的时候,最好按照驼峰命名的方式,对比着sys_node表的列名来写。其他的没什么好说的;


2.然后,定义数据查询所需的【Mapper XML】和编写【SQL语句】

rbac.xml:

<?xml versio
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值