项目实战之旅游网(五)后台角色管理(下) 后台权限管理

news2024/12/24 21:50:39

目录

一.后台角色管理(下)

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";
    }

运行项目,删除成功。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/115670.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

单商户商城系统功能拆解53—数据分析

单商户商城系统&#xff0c;也称为B2C自营电商模式单店商城系统。可以快速帮助个人、机构和企业搭建自己的私域交易线上商城。 单商户商城系统完美契合私域流量变现闭环交易使用。通常拥有丰富的营销玩法&#xff0c;例如拼团&#xff0c;秒杀&#xff0c;砍价&#xff0c;包邮…

一文清晰带你弄清楚Spring IOC 循环依赖问题是如何解决的

什么是循环依赖 循环依赖又被成为循环引用,即两个或者多个bean相互之间的持有对方,比如A 引用B,B引用C,C 又引用A,则它们最终反映为一个环,如下图所示: 循环依赖是对象之间的相互依赖关系,循环依赖就是一个死循环,除非有终结条件,否则就是死循环,最终导致内存溢出错误. 解决…

【Java 数据结构】优先级队列

篮球哥温馨提示&#xff1a;编程的同时不要忘记锻炼哦&#xff01;谁是你的优先级呢&#xff1f; 目录 1、优先级队列 1.1 优先级队列概念 1.2 堆的概念 1.3 堆的存储结构 2、模拟实现优先级队列 2.1 成员变量的设定 2.2 根据数组构造出一个堆 2.3 向下调整 2.4 creat…

电压放大器如何测试线性稳压器

有不少的电子工程师咨询电压放大器如何测试线性稳压器&#xff0c;那么这种要怎么做呢&#xff0c;下面让安泰电子来为大家介绍。 一、什么是低压差线性稳压器&#xff1f; 低压差线性稳压器是集成电路稳压器&#xff0c;经常用来电流主通道控制&#xff0c;芯片上集成导通电阻…

SQL 事务基础

事务基础 1 事务概念 所谓事务就是用户定义的一个数据库操作序列&#xff0c;这些操作要么全做&#xff0c;要不全不做&#xff0c;是一个不可分割的工作单位。 2 事务的特性&#xff08;ACID&#xff09; 原子性&#xff08;atomicity&#xff09; 事务是数据库工作的逻辑…

数据,信息,知识,智慧

数据&#xff0c;信息&#xff0c;知识&#xff0c;智慧 知识管理的对象有数据、信息、知识、智慧&#xff0c;而不仅仅是知识。将这些联系起来处理&#xff0c;就能期待综合效果。 作为知识资产的知识 传统的资源以人、物、钱为代表。但是&#xff0c;在经济活动的现场&…

2023年全国管理类联考英语二真题及解析

Section Ⅰ Use of English Here’s a common scenario that any number of entrepreneurs face today: you’re the CEO of a small business and though youre making a nice 1 , you need to find a way to take it to the next level. what you need to do is 2 growth by …

MobPush:社交app硝烟再起,如何突出重围?

推送&#xff0c;能够在产品和用户之间建立有效的连接。好的推送能够传达有价值的信息和提供好用的功能&#xff0c;让企业和用户沟通&#xff0c;把准确的信息第一时间传达。然而很多企业都没有意识到这一点&#xff0c;对于推送的频率&#xff0c;内容&#xff0c;以及针对各…

辗转相除法求最大公因数-C语言

辗转相除法&#xff0c;又名欧几里德算法&#xff0c;是求最大公约数的一种方法。以除数和余数反复做除法运算&#xff0c;最终当余数为0时&#xff0c;取当前算式除数为最大公约数。 例1&#xff1a;求2015和15的最大公因数。 2015 15 * 134 5 15 5 * 3 0 因此&#xff0…

亚马逊云科技 Build On - 咖啡厅Demo学习stepfunction serverless应用

荣幸参与和csdn和aws联合举办的buildon实验活动&#xff0c;主要目的还是学习stepfucntion的使用&#xff0c;这个服务能够集成大量aws service感觉可以出现很多有趣的用法。官方给出的文档已经非常详细了&#xff0c;这里只是对一些比较难理解的点进行了记录和解释&#xff0c…

restricted isometry property 稀疏 (CSDN_0002_20220908)

目录 1. 稀疏问题的引出 2. RIP 说明&#xff1a; 1. 由于参考多篇文献&#xff0c;所以本文的符号与原文略有不同。 2. 由于原文公式较多&#xff0c;所以本文采用了截图的形式&#xff0c;如需要电子版文档&#xff0c;可私信或留言。 1. 稀疏问题的引出 2. RIP 关于1-…

MySQL存储过程高级SQL语句总结

MySQL高级SQL语句&#xff08;存储过程&#xff09; 一、存储过程的概述 1.1 什么是存储过程 存储过程是一组为了完成特定功能的SQL语句集合。 存储过程在使用过程中是将常用或者复杂的工作预先使用SQL语句写好并用一个指定的名称存储起来&#xff0c;这个过程经编译和优化后…

Quarkus构建一个原生可执行文件

先决条件 大概15分钟 编辑器 安装GraalVM&#xff0c;并正确配置 Apache Maven 3.8.1 可以工作的容器 (Docker或者Podman) 一个 C语言工作开发环境 Quarkus应用程序代码 支持在C语言中进行原生编译 拥有一个C语言工作开发者环境意味着什么&#xff1f; 在Linux上&#xf…

华为手机恢复出厂设置后如何恢复数据

当您恢复出厂设置时&#xff0c;手机上存储的所有数据都会被清空。这是因为恢复出厂设置基本上是您从头开始设置手机的一种方式。 众所周知&#xff0c;重置手机会清除手机上的现有数据。如果这种强制删除让你丢失了重要数据&#xff0c;那么恢复出厂设置后数据还能恢复吗&…

企企通:如何利用数字化之道,赋能汽车行业供应链创新?

汽车是国民经济的支柱性企业&#xff0c;产业链长&#xff0c;涉及面广、带动性强&#xff0c;国际化程度高&#xff0c;在全球主要经济大国的产业体系中一直占据着重要地位。 我国汽车行业通过几十年的高速发展之后&#xff0c;从量变到质变&#xff0c;逐渐向低速增长的模式开…

把TeamTalk(即时通讯项目)中的线程池连接池拆出来单独测试。

研究过Teamtalk的伙伴会发现它的线程池和连接池与很多文件有关联&#xff0c; 这篇文章主要写&#xff0c;把它的线程池连接池拆出来需要用到哪些文件。 其实我本来只想测试它的连接池的&#xff0c;但发现连接池里套的有线程池&#xff0c;于是就一起拆出来了。 整个工程的树…

基于SpringBoot的社区小型图书管理系统的设计与实现

作者主页&#xff1a;Designer 小郑 作者简介&#xff1a;Java全栈软件工程师一枚&#xff0c;来自浙江宁波&#xff0c;负责开发管理公司OA项目&#xff0c;专注软件前后端开发&#xff08;Vue、SpringBoot和微信小程序&#xff09;、系统定制、远程技术指导。CSDN学院、蓝桥云…

有效操作:Ubuntu上已经安装最新node但是node -v返回的版本号确实错的;ubuntu第一次启动vue项目报npm版本错误

** 如已经安装过最新版的node话可直接跳到操作6&#xff1a; 1.查看node版本&#xff0c;没安装的请先安装&#xff1b; node -v 如果安装成功的话会返回版本号&#xff1a; 2.如果nodejs包出错需要重新安装的话&#xff0c;删除不干净会有可能出现问题&#xff0c;下面就介…

应用出海活跃,开发教程

移动应用行业在国内显现出用户增量放缓的趋势&#xff0c;多种类型的应用渗透率也渐趋饱和。随着政策支持力度的加大&#xff0c;越来越多移动应用走向了海外市场&#xff0c;拓宽用户群。 根据艾瑞咨询在《2022年移动应用出海趋势洞察白皮书》中指出&#xff0c;游戏类占出海…

开源项目-CRM客户关系管理系统

哈喽&#xff0c;大家好&#xff0c;今天给大家带来一个开源系统-CRM客户关系管理系统 主要功能包括客户管理&#xff0c;客户流失&#xff0c;销售机会&#xff0c;客户关怀等模块 系统开发环境以及版本 操作系统&#xff1a; Windows_7集成开发工具&#xff1a; Eclipse EE_…