当前位置: 首页 > news >正文

【学生管理系统】权限管理

目录

6.4 权限管理(菜单管理)

6.4.1 查询所有(含孩子)

6.4.2 添加权限

6.4.3 核心3:查询登录用户的权限,并绘制菜单

6.4 权限管理(菜单管理)

6.4.1 查询所有(含孩子)

6.4.2 添加权限

6.4.3 核心3:查询登录用户的权限,并绘制菜单

1)后端:SQL版

  • 获得登录用户

  • 通过登录用户获得角色们

  • 通过角色们查询所有的权限

  • 分析

    ​
    # 1. 查询用户的角色
    SELECT role_id FROM sys_user_role WHERE user_id = 'u001'
    # 结果角色id:[1,2]
    ​
    ​
    # 2. 查询指定角色们的权限id  DISTINCT 去重
    SELECT DISTINCT perm_id FROM sys_role_permission WHERE role_id IN (1,2)
    # 结果权限id:[1,2,3,4,5] 
    ​
    ​
    # 3. 查询指定权限id的权限详情
    SELECT * FROM sys_permission WHERE id IN (1,2,3,4,5)
    ​
    # 使用子查询将3条语句整合
    SELECT * FROM sys_permission WHERE id IN (SELECT DISTINCT perm_id FROM sys_role_permission WHERE role_id IN (SELECT role_id FROM sys_user_role WHERE user_id = 'u001'))

  • 编写mapper

     

    @Select("SELECT * FROM sys_permission WHERE id IN (SELECT DISTINCT perm_id FROM sys_role_permission WHERE role_id IN (SELECT role_id FROM sys_user_role WHERE user_id = #{uid}))")
        List<SysPermission> findAllByUserId(@Param("uid") String uid);

  • 编写service

    • 接口

       

      List<SysPermission> findAllByLoginUser(TbUser loginUser);

    • 实现

      ​
          @Override
          public List<SysPermission> findAllByLoginUser(TbUser loginUser) {
      ​
              //1 查询指定用户的所有权限
              List<SysPermission> permList = baseMapper.findAllByUserId(loginUser.getUid());
      ​
              //2 处理权限--父子关系
              List<SysPermission> resultList = new ArrayList<>();
              Map<Integer, SysPermission> cache = new HashMap<>();
              for (SysPermission sysPermission : permList) {
                  SysPermission permParent = cache.get(sysPermission.getParentId());
                  if(permParent == null) {
                      // 一级添加结果
                      resultList.add(sysPermission);
                  } else {
                      permParent.getChildren().add(sysPermission);
                  }
                  // 将自己存放,让孩子可以获得
                  cache.put(sysPermission.getId(), sysPermission);
              }
      ​
              return resultList;
          }

  • 编写controller

     

        @Resource
        private HttpServletRequest request;
        @Resource
        private JwtProperties jwtProperties;
    ​
        @GetMapping("/login")
        public BaseResult findAllByLoginUser() {
            try {
                // 1 获得登录用户
                String token = request.getHeader("Authorization");
                TbUser loginUser = JwtUtils.getObjectFromToken(token, jwtProperties.getPublicKey(), TbUser.class);
    ​
                // 2 获得所有的权限
                List<SysPermission> list = sysPermissionService.findAllByLoginUser(loginUser);
    ​
                // 3 返回
                return BaseResult.ok("查询成功", list);
            } catch (Exception e) {
                e.printStackTrace();
                return BaseResult.error("获得菜单失败");
            }
        }

2)后端:对象版

  • service层使用通过mapper进行一系列的查询,不用写SQL语句

    //1. 查询用户的角色
    //2. 查询指定角色们的权限id  DISTINCT 去重
    //3. 查询指定权限id的权限详情

    @Override
    public List<SysPermission> findAllByLoginUser(TbUser loginUser) {
​
        // 1. 查询用户的角色  [1,2]
        QueryWrapper<SysUserRole> sysUserRoleQueryWrapper = new QueryWrapper<>();
        sysUserRoleQueryWrapper.eq("user_id", loginUser.getUid());
        List<SysUserRole> sysUserRoleList = sysUserRoleMapper.selectList(sysUserRoleQueryWrapper);
        List<Integer> roleIdList = sysUserRoleList.stream().map(sysUserRole -> sysUserRole.getRoleId()).collect(Collectors.toList());
​
​
        // 2. 查询指定角色们的权限id  DISTINCT 去重   [1,2,3,4,5]
        QueryWrapper<SysRolePermission> sysRolePermissionQueryWrapper = new QueryWrapper<>();
        sysRolePermissionQueryWrapper.in("role_id", roleIdList);
        List<SysRolePermission> sysRolePermissionList = sysRolePermissionMapper.selectList(sysRolePermissionQueryWrapper);
        List<Integer> permIdList = sysRolePermissionList.stream().map(sysRolePermission -> sysRolePermission.getPermId()).collect(Collectors.toList());
​
​
        // 3. 查询指定权限id的权限详情
        QueryWrapper<SysPermission> sysPermissionQueryWrapper = new QueryWrapper<>();
        sysPermissionQueryWrapper.in("id", permIdList );
        List<SysPermission> permList = baseMapper.selectList(sysPermissionQueryWrapper);
​
​
        // 4 处理权限--父子关系
        List<SysPermission> resultList = new ArrayList<>();
        Map<Integer, SysPermission> cache = new HashMap<>();
        for (SysPermission sysPermission : permList) {
            SysPermission permParent = cache.get(sysPermission.getParentId());
            if(permParent == null) {
                // 一级添加结果
                resultList.add(sysPermission);
            } else {
                permParent.getChildren().add(sysPermission);
            }
            // 将自己存放,让孩子可以获得
            cache.put(sysPermission.getId(), sysPermission);
        }
​
        return resultList;
    }

3)前端

 

<template>
  <el-container>
    <el-header>
      <el-row>
        <el-col :span="22" class="title">
          学生管理系统(SMS)
        </el-col>
        <el-col :span="2">
​
          <!-- <el-popover
            placement="top-start"
            width="200"
            trigger="hover"
            content="这是一段内容,这是一段内容,这是一段内容,这是一段内容。">
            <el-avatar slot="reference" size="large" src="/5.jpg"></el-avatar>
            <div class="avatarItem">用户详情</div>
            <div class="avatarItem">修改密码</div>
            <div class="avatarItem">退出登录</div>
          </el-popover> -->
          <el-dropdown>
            <span class="el-dropdown-link">
              <el-avatar :size="50" src="/5.jpg"></el-avatar>
            </span>
            <el-dropdown-menu slot="dropdown">
              <el-dropdown-item>用户详情</el-dropdown-item>
              <el-dropdown-item>修改密码</el-dropdown-item>
              <el-dropdown-item>退出登录</el-dropdown-item>
            </el-dropdown-menu>
          </el-dropdown>
        </el-col>
      </el-row>
    </el-header>
    <el-container>
      <el-aside width="200px">
        <!-- 菜单start -->
        <el-menu
          :default-active="$route.path"
          router
          background-color="#545c64"
          text-color="#fff"
          active-text-color="#ffd04b">
          <el-menu-item index="/">
            <i class="el-icon-menu"></i>
            <span slot="title">首页</span>
          </el-menu-item>
​
          <el-submenu v-for="(onePerm,oi) in permList" :key="oi" :index="onePerm.path">
            <template slot="title">
              <span>{{onePerm.permName}}</span>
            </template>
            <el-menu-item v-for="(twoPerm, ti) in onePerm.children" :key="ti" :index="twoPerm.path">{{twoPerm.permName}}</el-menu-item>
          </el-submenu>
​
          <!--
          <el-submenu index="/classes">
            <template slot="title">
              <i class="el-icon-location"></i>
              <span>班级管理</span>
            </template>
            <el-menu-item index="/classes/classesAdd">添加班级</el-menu-item>
            <el-menu-item index="/classes/classesList">班级列表</el-menu-item>
          </el-submenu>
          <el-submenu index="/student">
            <template slot="title">
              <span>学生管理</span>
            </template>
            <el-menu-item index="/student/studentList">学生列表</el-menu-item>
          </el-submenu>
          <el-submenu index="/perm">
            <template slot="title">
              <span>权限管理</span>
            </template>
            <el-menu-item index="/user/userList">用户列表</el-menu-item>
            <el-menu-item index="/perm/roleList">角色列表</el-menu-item>
            <el-menu-item index="/perm/permList">权限列表</el-menu-item>
          </el-submenu>
          -->
        </el-menu>
        <!-- 菜单end -->
      </el-aside>
      <el-main>
        <!-- 视图显示 -->
        <nuxt/>
      </el-main>
    </el-container>
    <el-footer>传智专修学院</el-footer>
  </el-container>
</template>
​
<script>
export default {
  data() {
    return {
      permList: []
    }
  },
  methods: {
    async findAllPerm() {
      let { data:baseResult } = await this.$axios.get('/user-service/perm/login')
      this.permList = baseResult.data
    }
  },
  mounted() {
    this.findAllPerm()
  },
}
</script>
​
<style>
  html, body, #__nuxt, #__layout, .el-container {
    height: 100%;
  }
  body {
    margin: 0;
  }
  .avatarItem {
    width: 100px;
    display: inline-block;
    margin: 5px 0;
  }
  .title {
    font-size: 30px;
    font-weight: bold;
  }
  .el-header, .el-footer {
    background-color: #B3C0D1;
    color: #333;
    text-align: center;
    line-height: 60px;
  }
  
  .el-aside {
    background-color: #545c64;
    color: #fff;
  }
  
  .el-main {
    background-color: #E9EEF3;
    color: #333;
  }
</style>

相关文章:

  • NLP学习之:Bert 模型复现(1)任务分析 + 训练数据集构造
  • 【PTA】《数据结构与算法》线性结构复习题
  • Java利用工具类提升写报表效率
  • RFSoC应用笔记 - RF数据转换器 -14- RFSoC自动增益控制与NCO跳频功能
  • 大数据Hadoop之——Apache Hudi 数据湖实战操作(Spark,Flink与Hudi整合)
  • 智能机器人项目,安装人脸识别face_recognition报错解决
  • EMQX(emqtt)安装与入门
  • ansible常用模块的用法和ansible基于模块方式实现LNMP
  • ArcGIS || ENVI:如何将彩色影像拆分为R、G、B以及H、S、I(B/V)影像?
  • 【英语:基础进阶_原著扩展阅读】J6.原著阅读实战训练
  • SpringBoot学习1—安装与配置
  • 10月笔试面试记录
  • 【概率论与数理统计(研究生课程)】知识点总结9(回归分析)
  • 1-2Java程序运行机制以及运行过程
  • 初次使用Ubuntu18.04遇到的问题——笔记4 (Ubuntu18.04+Anaconda+Pycharm+Pytorch)
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • C学习-枚举(九)
  • HashMap剖析之内部结构
  • MySQL几个简单SQL的优化
  • Solarized Scheme
  • spring security oauth2 password授权模式
  • 爱情 北京女病人
  • 飞驰在Mesos的涡轮引擎上
  • 分布式熔断降级平台aegis
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 如何合理的规划jvm性能调优
  • 手机端车牌号码键盘的vue组件
  • 数组的操作
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • 如何在招聘中考核.NET架构师
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (10)ATF MMU转换表
  • (5)STL算法之复制
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (Ruby)Ubuntu12.04安装Rails环境
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (转)memcache、redis缓存
  • *1 计算机基础和操作系统基础及几大协议
  • .a文件和.so文件
  • .bashrc在哪里,alias妙用
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)
  • .NET序列化 serializable,反序列化
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...