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


    目录

    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 findAllByUserId(@Param("uid") String uid);

    • 编写service

      • 接口

         

        List findAllByLoginUser(TbUser loginUser);

      • 实现

        ​
            @Override
            public List findAllByLoginUser(TbUser loginUser) {
        ​
                //1 查询指定用户的所有权限
                List permList = baseMapper.findAllByUserId(loginUser.getUid());
        ​
                //2 处理权限--父子关系
                List resultList = new ArrayList<>();
                Map 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 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 findAllByLoginUser(TbUser loginUser) {
    ​
            // 1. 查询用户的角色  [1,2]
            QueryWrapper sysUserRoleQueryWrapper = new QueryWrapper<>();
            sysUserRoleQueryWrapper.eq("user_id", loginUser.getUid());
            List sysUserRoleList = sysUserRoleMapper.selectList(sysUserRoleQueryWrapper);
            List roleIdList = sysUserRoleList.stream().map(sysUserRole -> sysUserRole.getRoleId()).collect(Collectors.toList());
    ​
    ​
            // 2. 查询指定角色们的权限id  DISTINCT 去重   [1,2,3,4,5]
            QueryWrapper sysRolePermissionQueryWrapper = new QueryWrapper<>();
            sysRolePermissionQueryWrapper.in("role_id", roleIdList);
            List sysRolePermissionList = sysRolePermissionMapper.selectList(sysRolePermissionQueryWrapper);
            List permIdList = sysRolePermissionList.stream().map(sysRolePermission -> sysRolePermission.getPermId()).collect(Collectors.toList());
    ​
    ​
            // 3. 查询指定权限id的权限详情
            QueryWrapper sysPermissionQueryWrapper = new QueryWrapper<>();
            sysPermissionQueryWrapper.in("id", permIdList );
            List permList = baseMapper.selectList(sysPermissionQueryWrapper);
    ​
    ​
            // 4 处理权限--父子关系
            List resultList = new ArrayList<>();
            Map 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)前端

     

    
    
  • 相关阅读:
    【读书笔记】高级FPGA设计之高速率结构设计
    vue2 项目中嵌入视频
    QLExpress学习使用总结
    3d激光SLAM:LIO-SAM框架---IMU预积分流程
    Codeforces Round #796 (Div. 2)(A~E题题解)
    浅谈余压监控系统在某高层住宅的应用方案
    1 快速排序的应用
    服务端Skynet(五)——如何搭建一个实例
    用pytorch给深度学习加速:正交与谱归一化技术
    QGIS+qt+二次开发之要素的移动
  • 原文地址:https://blog.csdn.net/weixin_45481821/article/details/127453376