本次要分享的内容是之前教务系统中系统管理模块下的权限列表功能,包括对权限信息进行增删改查以及对不同的角色身份进行的不同权限分配(重点讲解)。
首先还是需要使用mysql数据库准备一张权限表,建表语句如下:
DROP TABLE IF EXISTS `sys_permission`;
CREATE TABLE `sys_permission` (
`permission_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '权限ID',
`p_id` int(11) DEFAULT NULL COMMENT '权限ID',
`permission_name` varchar(255) DEFAULT NULL COMMENT '名称',
`url` varchar(255) DEFAULT NULL COMMENT 'URL',
`description` varchar(255) DEFAULT NULL COMMENT '描述',
`icon` varchar(255) DEFAULT NULL COMMENT '图标',
`permission_code` varchar(255) DEFAULT NULL COMMENT '权限码',
PRIMARY KEY (`permission_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='权限';
由于还要涉及到对不同角色的权限的分配问题所以还需要创建一张管理角色权限分配的中间表,建表语句如下:
DROP TABLE IF EXISTS `sys_role_permission`;
CREATE TABLE `sys_role_permission` (
`role_permission_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '角色权限ID',
`role_id` int(11) DEFAULT NULL COMMENT '角色ID',
`permission_id` int(11) DEFAULT NULL COMMENT '权限ID',
PRIMARY KEY (`role_permission_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='角色权限表';
因为要承载数据库的权限数据,所以需要一个权限实体类,系统权限实体类代码:
package com.cdtu.system.domain;
public class SysPermission {
private int permission_id;//权限ID
private int p_id;//权限父ID
private String permission_name;//权限名称
private String url;//URL
private String description;//描述
private String icon;//图标
private String permission_code;//权限码
public SysPermission() {
}
public SysPermission(int permission_id, int p_id, String permission_name, String url, String description, String icon, String permission_code) {
this.permission_id = permission_id;
this.p_id = p_id;
this.permission_name = permission_name;
this.url = url;
this.description = description;
this.icon = icon;
this.permission_code = permission_code;
}
public int getPermission_id() {
return permission_id;
}
public void setPermission_id(int permission_id) {
this.permission_id = permission_id;
}
public int getP_id() {
return p_id;
}
public void setP_id(int p_id) {
this.p_id = p_id;
}
public String getPermission_name() {
return permission_name;
}
public void setPermission_name(String permission_name) {
this.permission_name = permission_name;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getIcon() {
return icon;
}
public void setIcon(String icon) {
this.icon = icon;
}
public String getPermission_code() {
return permission_code;
}
public void setPermission_code(String permission_code) {
this.permission_code = permission_code;
}
@Override
public String toString() {
return "SysPermission{" +
"permission_id=" + permission_id +
", p_id=" + p_id +
", permission_name='" + permission_name + '\'' +
", url='" + url + '\'' +
", description='" + description + '\'' +
", icon='" + icon + '\'' +
", permission_code='" + permission_code + '\'' +
'}';
}
}
因为有中间表的参与,所以也需要把中间作为一个实体类,角色权限类代码:
package com.cdtu.system.domain;
public class SysRolePermission {
private int role_permission_id;
private int role_id;
private int permission_id;
public SysRolePermission() {
}
public SysRolePermission(int role_permission_id, int role_id, int permission_id) {
this.role_permission_id = role_permission_id;
this.role_id = role_id;
this.permission_id = permission_id;
}
public int getRole_permission_id() {
return role_permission_id;
}
public void setRole_permission_id(int role_permission_id) {
this.role_permission_id = role_permission_id;
}
public int getRole_id() {
return role_id;
}
public void setRole_id(int role_id) {
this.role_id = role_id;
}
public int getPermission_id() {
return permission_id;
}
public void setPermission_id(int permission_id) {
this.permission_id = permission_id;
}
@Override
public String toString() {
return "SysRolePermission{" +
"role_permission_id=" + role_permission_id +
", role_id=" + role_id +
", permission_id=" + permission_id +
'}';
}
}
到此权限列表需要的基本的数据准备工作已经差不多了,现在进入到项目中,通过业务分析,首先需要创建一个页面用来显示权限列表首页,通过编写jsp代码进行实现,权限列表首页效果图如下:
jsp代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<div align="center">
<h1>欢迎进入权限列表</h1>
<p><a href="${pageContext.servletContext.contextPath}/sysPermissionController?method=addUI">增加</a></p>
<table border="1px" width="90%">
<tr>
<td>权限ID</td>
<td>权限父ID</td>
<td>权限名称</td>
<td>URL</td>
<td>描述</td>
<td>图标</td>
<td>权限码</td>
<td colspan="2">操作</td>
</tr>
<c:forEach items="${sysPermissionList}" var="Permission">
<tr>
<td>${Permission.permission_id}</td>
<td>${Permission.p_id}</td>
<td>${Permission.permission_name}</td>
<td>${Permission.url}</td>
<td>${Permission.description}</td>
<td>${Permission.icon}</td>
<td>${Permission.permission_code}</td>
<td><a href="${pageContext.servletContext.contextPath}/sysPermissionController?method=updateUI&id=${Permission.permission_id}">修改</a></td>
<td><a href="${pageContext.servletContext.contextPath}/sysPermissionController?method=delete&id=${Permission.permission_id}">删除</a></td>
</tr>
</c:forEach>
</table>
<p> </p>
</div>
</body>
</html>
前端页面架子搭好后,我们就需要去后台一一实现其中的功能,首先是权限的列表的显示功能,通过点击权限列表后跳转到权限首页自动调用查询权限全部信息的方法并返回查找的数据集合在权限首页页面上显示,查询全部权限控制层代码:
/**
* 查询权限列表
* @param req
* @param resp
* @return
*/
public String list(HttpServletRequest req, HttpServletResponse resp){
List<SysPermission> sysPermissionList = permissionService.queryAllPermission();
//返回数据
req.setAttribute("sysPermissionList",sysPermissionList);
// 跳转页面
return "view/system/syspermission/syspermission.jsp";
}
通过控制层去调用服务层的方法最终去调用数据层的sql查询语句拿取数据库中的权限数据。
其次要实现的就是增加权限的功能,通过点击页面上的添加按钮跳转到增加页面,通过输入相应的权限信息然后提交,自动跳转到首页后显示加入后的所有权限信息。权限角色效果图如下:
由于在数据库设计的时候考虑到要根据用户所属的不同角色分配不同的管理权限,所以设计了一个权限父id字段用来规定属于哪一个模块下的东西,前台选择添加新的权限信息时必须选择一个父级权限进行绑定,实现权限的树形分层结构。通过控制层去调用服务层的方法并传入添加的权限信息对象最终去调用数据层的sql添加语句在数据库的添加一条权限数据。前端代码可参照前面内容自行修改,本文后面不在展示。
添加权限控制层代码:
/**
* 跳转页面
* @param req
* @param resp
* @return
*/
public String addUI(HttpServletRequest req, HttpServletResponse resp) {
List<SysPermission> sysPermissionList = permissionService.queryAllPermission();
//返回数据
req.setAttribute("sysPermissionList",sysPermissionList);
return "view/system/syspermission/addSysPermission.jsp";
}
/**
* 添加权限
* @param req
* @param resp
* @return
*/
public String add(HttpServletRequest req, HttpServletResponse resp) {
SysPermission sysPermission = new SysPermission();
// 接收数据
//获取父级权限id设置为分配的父级id
String p_id = req.getParameter("sysPermission.p_id");
Integer parentId = Integer.valueOf(p_id);
String permission_name = req.getParameter("permission_name");
String url = req.getParameter("url");
String description = req.getParameter("description");
String icon = req.getParameter("icon");
String permission_code = req.getParameter("permission_code");
//封装数据
sysPermission.setP_id(parentId);
sysPermission.setPermission_name(permission_name);
sysPermission.setUrl(url);
sysPermission.setDescription(description);
sysPermission.setIcon(icon);
sysPermission.setPermission_code(permission_code);
int n = permissionService.addPermission(sysPermission);
this.list(req, resp);
return "view/system/syspermission/syspermission.jsp";
}
然后是实现删除权限的功能,通过点击页面上的删除按钮,删除对应的一行权限信息,然后自动刷新首页的所有权限信息,通过控制层去调用服务层的方法并传入前端页面发送过来的权限的id标识最终去调用数据层的sql删除语句在数据库的删除对应的权限数据。由于删除操作直接就在首页界面上进行操作所以没有多余的页面,直接来看删除权限控制层代码:
/**
* 删除权限
* @param req
* @param resp
* @return
*/
public String delete(HttpServletRequest req, HttpServletResponse resp){
String id = req.getParameter("id");
Integer permission_id = Integer.valueOf(id);
int n = permissionService.deletePermission(permission_id);
this.list(req,resp);
return "view/system/syspermission/syspermission.jsp";
}
再然后就是实现修改权限的功能,通过点击修改按钮,弹出修改界面,回显该权限对象在页面上的原来内容,通过修改其中的内容提交,然后自动刷新并显示首页修改后的所有权限信息,修改权限效果图如下:
通过控制层获取前台传递的权限的id信息去调用服务层的方法并传入前端页面发送过来的权限的id标识最终去调用数据层的根据id查询对应的权限数据的sql语句,把数据库的拿出对应的权限数据封装成对象返回给真正的修改界面。真正的修改控制层获取前台修改后传递的权限对象的信息去调用服务层的方法并传入封装好的权限对象最终去调用数据层的根据id设置对应的权限信息的sql语句。
修改权限控制层代码:
/**
* 跳转修改权限界面
* @param req
* @param resp
* @return
*/
public String updateUI(HttpServletRequest req, HttpServletResponse resp){
//接收数据
String id = req.getParameter("id");
Integer permission_id = Integer.valueOf(id);
//调用业务,根据id查询权限对象
SysPermission sysPermission = permissionService.queryPermissionById(permission_id);
List<SysPermission> sysPermissionList = permissionService.queryAllPermission();
//返回数据
req.setAttribute("sysPermissionList",sysPermissionList);
req.setAttribute("sysPermission",sysPermission);
//跳转页面
return "view/system/syspermission/updateSysPermission.jsp";
}
/**
* 修改权限
* @param req
* @param resp
* @return
*/
public String update(HttpServletRequest req, HttpServletResponse resp) throws ParseException {
//接收数据
SysPermission sysPermission = new SysPermission();
String permission_idStr = req.getParameter("permission_id");
Integer permission_id = Integer.valueOf(permission_idStr);
String p_id = req.getParameter("p_id");
Integer parentId = Integer.valueOf(p_id);
String permission_name = req.getParameter("permission_name");
String url = req.getParameter("url");
String description = req.getParameter("description");
String icon = req.getParameter("icon");
String permission_code = req.getParameter("permission_code");
//封装数据
sysPermission.setPermission_id(permission_id);
sysPermission.setP_id(parentId);
sysPermission.setPermission_name(permission_name);
sysPermission.setUrl(url);
sysPermission.setDescription(description);
sysPermission.setIcon(icon);
sysPermission.setPermission_code(permission_code);
// 调用业务
int n = permissionService.updatePermission(sysPermission);
this.list(req, resp);
//跳转页面
return "view/system/syspermission/syspermission.jsp";
}
最后最重要的是实现对不同角色权限分配的功能,通过点击角色列表界面上的权限分配,可以给对应的角色分配操作不同模块的权限,如果已经分配过就回显对应的权限名称信息,点击提交分配权限按钮后会重新分配选中的权限,并返回权限列表首页。由于之前设置的角色只有学生、老师和管理员三个角色,所以分配的时候为了展示效果,把学生角色只分配了选课管理模块下的权限,老师则分配了邮件系统和选课系统的权限,管理员则是拥有最高权限所有模块都能进行操作。分配权限的整体效果如下:
一、学生角色权限登录后的效果(只显示选课管理模块):
二、教师角色权限登录后的效果(只显示邮件模块和选课管理模块):
三、管理员角色权限登录后的效果(显示所有模块):
通过控制层获取前台传递的角色的id信息去调用服务层的方法并传入当前选中角色的id标识最终去调用数据层的根据id查询对应的角色的sql语句在数据库的拿出对应的角色数据和调用权限信息全查询获取所有的权限信息,把查询到的角色对象、权限信息集合一并返回给真正的权限分配界面。真正的权限分配控制层获取前台传递过来地角色id和权限id数组,在调用业务之前先根据角色id进行删除,保证中间表中角色权限的为一项,再调用服务层的方法并传入角色id和权限id封装成角色权限对象,根据权限id数组循环调用数据层的添加sql语句加入到中间表中进行维护,最后再刷新数据,跳转到角色列表首页
分配权限控制层代码:
/**
* 跳转分配权限界面
* @param req
* @param resp
* @return
* @throws ParseException
*/
public String fpPermissionUI(HttpServletRequest req, HttpServletResponse resp) throws ParseException {
//接收数据
//根据用户Id获取用户对象,并返回给页面
String id = req.getParameter("id");
Integer role_id = Integer.valueOf(id);
SysRole sysRole = RoleService.queryRoleById(role_id);
req.setAttribute("sysRole",sysRole);
//获取权限列表,并返回给页面
List<SysPermission> sysPermissionList = permissionService.queryAllPermission();
req.setAttribute("sysPermissionList",sysPermissionList);
//封装数据
// 调用业务
//跳转页面
return "view/system/syspermission/fppermission.jsp";
}
/**
* 分配权限
* @param req
* @param resp
* @return
*/
public String fpPermission(HttpServletRequest req, HttpServletResponse resp){
//接收数据
String role_id = req.getParameter("role_id");
Integer roleId = Integer.valueOf(role_id);
// 分配之前先根据角色id进行删除
int m = sysRolePermissionService.deleteRolePermissionByRole_id(roleId);
String[] permission_ids = req.getParameterValues("permission_ids");
for (String permission_idStr : permission_ids) {
Integer permission_id = Integer.valueOf(permission_idStr);
SysRolePermission sysRolePermission = new SysRolePermission();
sysRolePermission.setPermission_id(permission_id);
sysRolePermission.setRole_id(roleId);
int n = sysRolePermissionService.addRolePermission(sysRolePermission);
}
//刷新数据
List<SysRole> roleList = RoleService.queryAllRole();
//返回数据
req.setAttribute("roleList",roleList);
//跳转页面
return "view/system/sysrole/sysrole.jsp";
}
到此权限列表下的所有功能实现完毕。
标签:JavaWeb,permission,教务,req,public,权限,Servlet,id,String From: https://blog.51cto.com/u_15101214/7052129