目录
一.后台角色管理(下)
1.查询角色权限
2.修改角色权限
3.优化侧边栏菜单
二.后台权限管理
1.权限列表
2.新增权限
3.修改权限
4.删除权限
一.后台角色管理(下)
1.查询角色权限
先新建一个bean类型的实体类:
package com.first.travel.bean;
import lombok.Data;
// 带有状态的权限,状态表示角色是否拥有该权限
@Data
public class PermissionWithStatus {
private Integer pid;
private String permissionName; // 权限名
private String permissionDesc;//权限详情
private Boolean roleHas; //角色是否拥有该权限
}
然后在mapper包下新建一个接口PermissionMapper
public interface PermissionMapper extends BaseMapper<Permission> {
//查找某个角色的拥有的所有权限的id
List<Integer> findPermissionIdByRole(Integer rid);
}
然后编写配置文件PermissionMapper.xml(还是在resources下和java文件夹的对应路径中)
<?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="com.first.travel.mapper.PermissionMapper">
<select id="findPermissionIdByRole" parameterType="int" resultType="int">
select pid from role_permission where rid = #{rid}
</select>
</mapper>
service层:
// 查询角色的权限情况
public List<PermissionWithStatus> findPermission(Integer rid){
// 查询所有权限
List<Permission> permissions = permissionMapper.selectList(null);
// 查询角色拥有的权限id
List<Integer> pids = permissionMapper.findPermissionIdByRole(rid);
// 构建带有状态的权限结合
List<PermissionWithStatus> permissionList = new ArrayList();
for (Permission permission : permissions) {
// 创建带有状态的权限
PermissionWithStatus permissionWithStatus = new PermissionWithStatus();
BeanUtils.copyProperties(permission,permissionWithStatus);
// 判断角色是否拥有该权限
if(pids.contains(permission.getPid())){
permissionWithStatus.setRoleHas(true);
}else{
permissionWithStatus.setRoleHas(false);
}
permissionList.add(permissionWithStatus);
}
return permissionList;
}
controller层:
// 查询角色的权限情况
@RequestMapping("/findPermission")
public ModelAndView findRole(Integer rid) {
List<PermissionWithStatus> permissions = roleService.findPermission(rid);
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("permissions", permissions);
modelAndView.addObject("rid", rid);
modelAndView.setViewName("/backstage/role_permission");
return modelAndView;
}
前端代码省略。
2.修改角色权限
在RoleMapper.java下添加两个接口
//删除角色的所有权限
void deleteRoleAllPermission(Integer rid);
//给角色添加权限
void addRolePermission(@Param("rid") Integer rid,@Param("pid") Integer pid);
然后在这个映射文件的配置文件(RoleMapper.xml)中添加接口的的功能
<delete id="deleteRoleAllPermission" parameterType="int">
DELETE
FROM role_permission
WHERE rid = #{rid}
</delete>
<insert id="addRolePermission">
INSERT INTO role_permission
values (#{rid}, #{pid})
</insert>
service层:
// 给角色重新分配权限
//ids中存放的就是本次要给这个角色分配的权限
public void updatePermissions(Integer rid,Integer[] ids){
// 删除角色的所有权限
roleMapper.deleteRoleAllPermission(rid);
// 重新给角色添加权限
for (Integer pid : ids) {
roleMapper.addRolePermission(rid,pid);
}
}
controller层:
@RequestMapping("/updatePermission")
public String updatePermission(Integer rid, Integer[] ids) {
roleService.updatePermissions(rid, ids);
return "redirect:/backstage/role/all";
}
3.优化侧边栏菜单
之前每次发送请求时,侧边栏菜单都会合起来,用户体验较差,我们希望点击侧边栏菜单
后,浏览器记住我们点击的内容,在点击其他菜单前,该内容处于被选中状态。
查看源码后,我们知道侧边栏的标签在被选中时cassactive',我们可以利用sessionStorage
保存被选中的菜单,让它- -直处于被选中的状态。
sessionStorage是HTML 5新增的一个会话存储对象,用于临时保存同一窗口(或标签页)
的数据,在关闭窗口或标签页之后将会删除这些数据。在JavaScript语言中可通过
window.sessionStorage或sessionStorage调用此对象。
<!-- /.sidebar -->
<script>
$(function () {
// 点击外层菜单时记录他的id
$(".treeview").click(function () {
sessionStorage.menu = $(this).attr("id");
})
// 点击内存菜单时记录他的id
$(".treeview li").click(function () {
sessionStorage.menu2 = $(this).attr("id");
})
// 对已点击的外层菜单添加class属性
$("#" + sessionStorage.menu).addClass("active")
// 对已点击的内层菜单添加css样式
$("#" + sessionStorage.menu2 + " a").css("color", "white")
})
</script>
将上面的代码添加到公共侧边栏的那个前端文件中。
二.后台权限管理
1.权限列表
编写permission的service层代码:
@Service
@Transactional
public class PermissionService {
@Autowired
private PermissionMapper permissionMapper;
public Page<Permission> findPage(int page, int size){
Page selectPage = permissionMapper.selectPage(new Page(page, size), null);
return selectPage;
}
}
controller层代码:
@Controller
@RequestMapping("/backstage/permission")
public class PermissionController {
@Autowired
private PermissionService permissionService;
@RequestMapping("/all")
public ModelAndView all(@RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "10") int size){
Page<Permission> permissionPage = permissionService.findPage(page, size);
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("permissionPage",permissionPage);
modelAndView.setViewName("/backstage/permission_all");
return modelAndView;
}
}
前端代码略。
运行项目:
2.新增权限
前端代码略。
service层:
public void add(Permission permission){
permissionMapper.insert(permission);
}
controller层:
@RequestMapping("/add")
public String add(Permission permission){
permissionService.add(permission);
return "redirect:/backstage/permission/all";
}
运行项目:
3.修改权限
service层:
public Permission findById(Integer pid){
return permissionMapper.selectById(pid);
}
public void update(Permission permission){
permissionMapper.updateById(permission);
}
controller层:
@RequestMapping("/edit")
public ModelAndView edit(Integer pid){
Permission permission = permissionService.findById(pid);
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("permission",permission);
modelAndView.setViewName("/backstage/permission_edit");
return modelAndView;
}
@RequestMapping("/update")
public String update(Permission permission){
permissionService.update(permission);
return "redirect:/backstage/permission/all";
}
前端代码略。运行项目,可以修改权限。
4.删除权限
前端代码略。
service层:
public void delete(Integer pid){
permissionMapper.deleteById(pid);
}
controller层:
@RequestMapping("/delete")
public String delete(Integer pid){
permissionService.delete(pid);
return "redirect:/backstage/permission/all";
}
运行项目,删除成功。