本篇博客需要特别注意的内容有:(1)查询功能节点的【表的关联查询】是本篇博客的核心内容;(2)登录的用户信息存储到了Session对象中;(3)注意一下,页面跳转过程中,前台文件和后台文件的跳转逻辑;
本篇博客内容说明: 不同的用户登录系统后,系统首页的显示内容是不同的。
【如果用户是业务岗角色】其显示内容是:通知公告,请假申请。
【如果用户是管理岗角色】其显示内容是:通知公告,请假申请,请假审批
所以,本篇博客的主要内容是【根据登录用户的角色的不同,动态的显示功能菜单】
目录
0.【角色不同,功能不同】的SQL逻辑(这部分是这个功能的核心!!!)
1.首先:创建Node类:承接和存储【根据用户查询的功能】的结果
2.然后,定义数据查询所需的【Mapper XML】和编写【SQL语句】
3.然后,根据MVC设计原则,编写Model(模型)中的DAO类
4.然后,根据MVC设计原则,编写Model(模型)中的Service类
5.然后,编写LoginServlet和login.html,处理【登录成功后向默认首页的跳转】的逻辑
6.然后,根据MVC设计原则,编写Controller(控制器):Servlet类:去接受并处理登录页的请求
7.然后,根据MVC设计原则,编写和完善View(视图):前端文件:默认首页的index.ftl
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