Vue前端项目-首页-获取角色

2023-11-05

目录

Vue端代码

1、前端守卫设置

2、Vuex中定义getter

3、新建 getters.js 文件

4、定义 GetInfo 方法获取用户角色信息

5、获取用户信息API

6、请求拦截器

SpringBoot 端

1、Controller层

2、Service 层

3、Mapper接口

4、映射描述文件


描述:

当我们登陆完成后,进去到首页, 在重定向到首页之前需要检查一下vuex 中是否获取了角色信息?

如果vuex的store中还没有 角色信息,需要发送异步请求获取角色信息

Vue端代码

1、前端守卫设置

  • 引入 store 
  • 在未获取角色时, 发起异步请求
import store from '@/store'

// 挂载前端路由导航
router.beforeEach((to, from, next) => {
  if (getToken()) {
    if (to.path === '/login') {
      next({ path: '/' })
    } else {
      if (store.getters.roles.length === 0) {
        // 判断当前用户是否已拉取完user_info信息
        store.dispatch('GetInfo').then(res => {
          // 拉取user_info
          const roles = res.roles
          console.log(roles)
        }).catch(err => {
          console.log(err)
        })
      }
      next()
    }
  } else {
    // 没有 token
    if (whiteList.indexOf(to.path) !== -1) {
      // 在免登陆白名单, 直接进入
      next()
    }
    next(`/login?redirect=${to.path}`)
  }
})

2、Vuex中定义getter

src / store / index.js 中,定义并引入 getter

import Vue from 'vue'
import Vuex from 'vuex'
import user from './modules/user'
import getters from './getters'
Vue.use(Vuex)

export default new Vuex.Store({
  state: {
  },
  mutations: {
  },
  actions: {
  },
  modules: {
    user
  },
  getters
})

3、新建 getters.js 文件

新建 src / store / getters.js 文件, 文件定义getter 方法,并向外暴露 getters对象

const getters = {
  roles: state => state.user.roles
}
export default getters

4、定义 GetInfo 方法获取用户角色信息

在步骤1中,我们调用了store.dispatch('GetInfo') 方法,但还没有定义,现再来定义已经这个方法

在 src / store / modules / user.js 中的 actions 里定义 GetInfo(获取用户角色方法)

// 1.导入 getInfo 获取角色API
import { login, getInfo } from '@/api/login'  

// 2. set方法    
mutations: {
    SET_TOKEN: (state, token) => {
      state.token = token
    },
    SET_ROLES: (state, roles) => {
      state.roles = roles
    },
    SET_PERMISSIONS: (state, permissions) => {
      state.permissions = permissions
    },
    SET_NAME: (state, name) => {
      state.name = name
    }
  }    

    // 3.获取用户信息
    GetInfo({ commit, state }) {
      return new Promise((resolve, reject) => {
        getInfo(state.token).then(res => {
          const user = res.user
          // const avatar = user.avatar == "" ? require("@/assets/image/profile.jpg") : process.env.VUE_APP_BASE_API + user.avatar;
          if (res.roles && res.roles.length > 0) { // 验证返回的roles是否是一个非空数组
            commit('SET_ROLES', res.roles)
            commit('SET_PERMISSIONS', res.permissions)
          } else {
            commit('SET_ROLES', ['ROLE_DEFAULT'])
          }
          commit('SET_NAME', user.username)
          // commit('SET_AVATAR', avatar)
          resolve(res)
        }).catch(error => {
          reject(error)
        })
      })
    }

5、获取用户信息API

在 src / api / login.js文件中, 新增

// 获取用户详细信息
export function getInfo() {
  return request({
    url: '/getInfo',
    method: 'get'
  })
}

6、请求拦截器

在 src / utils / request.js 中新增请求拦截器

// request拦截器
service.interceptors.request.use(
  config => {
    if (getToken()) {
      config.headers['Authorization'] = 'Bearer ' + getToken()
    }
    return config
  },
  error => {
    console.log(error)
    Promise.reject(error)
  }
)

注意: foo['a'] 这种写法 elist 会报错, 他建议 这么写 foo.a

如果不想它报错,在 .eslintrc.js 文件的 rules 规则中添加

    "dot-notation": [0, { "allowKeywords": true }]  //避免不必要的方括号

SpringBoot 端

1、Controller层

package com.ruoyi.project.system.controller;

/**
 * 登录验证
 *
 * @author ruoyi
 */
@RestController
@CrossOrigin
public class SysLoginController {

    @Resource
    private SysLoginService loginService;

    @Resource
    private ISysMenuService menuService;

    @Resource
    private SysPermissionService permissionService;

    @Resource
    private TokenService tokenService;

    @PostMapping("/login")
    public AjaxResult login(String username, String password, String code, String uuid) {
        AjaxResult ajax = AjaxResult.success();
        // 生成令牌
        String token = loginService.login(username, password, code, uuid);
        ajax.put(Constants.TOKEN, token);
        return ajax;
    }


    /**
     * 获取用户信息
     *
     * @return 用户信息
     */
    @GetMapping("/getInfo")
    public AjaxResult getInfo() {
        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
        SysUser user = loginUser.getUser();
        // 角色集合
        Set<String> roles = permissionService.getRolePermission(user);
        // 权限集合
        Set<String> permissions = permissionService.getMenuPermission(user);
        AjaxResult ajax = AjaxResult.success();
        ajax.put("user", user);
        ajax.put("roles", roles);
        ajax.put("permissions", permissions);
        return ajax;
    }

}

2、Service 层

package com.ruoyi.framework.security.service;
/**
 * 用户权限处理
 *
 * @author ruoyi
 */
@Component
public class SysPermissionService {
    @Resource
    private ISysMenuService menuService;

    @Resource
    private ISysRoleService roleService;

    /**
     * 获取菜单数据权限
     *
     * @param user 用户信息
     * @return 菜单权限信息
     */
    public Set<String> getMenuPermission(SysUser user) {
        Set<String> roles = new HashSet<String>();
        // 管理员拥有所有权限
        if (user.isAdmin()) {
            roles.add("*:*:*");
        } else {
            roles.addAll(menuService.selectMenuPermsByUserId(user.getUserId()));
        }
        return roles;
    }

    /**
     * 获取角色数据权限
     *
     * @param user 用户信息
     * @return 角色权限信息
     */
    public Set<String> getRolePermission(SysUser user) {
        Set<String> roles = new HashSet<String>();
        // 管理员拥有所有权限
        if (user.isAdmin()) {
            roles.add("admin");
        } else {
            roles.addAll(roleService.selectRolePermissionByUserId(user.getUserId()));
        }
        return roles;
    }
}

3、Mapper接口

package com.ruoyi.project.system.service;

import java.util.Set;

/**
 * 角色业务层
 *
 * @author ruoyi
 */
public interface ISysRoleService {

    /**
     * 根据用户ID查询角色
     *
     * @param userId 用户ID
     * @return 权限列表
     */
    public Set<String> selectRolePermissionByUserId(Long userId);

}

4、映射描述文件

<?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.ruoyi.project.system.mapper.SysRoleMapper">

	<resultMap type="SysRole" id="SysRoleResult">
		<id     property="roleId"       column="role_id"        />
		<result property="roleName"     column="role_name"      />
		<result property="roleKey"      column="role_key"       />
		<result property="roleSort"     column="role_sort"      />
		<result property="dataScope"    column="data_scope"     />
		<result property="status"       column="status"         />
		<result property="delFlag"      column="del_flag"       />
		<result property="createBy"     column="create_by"      />
		<result property="createTime"   column="create_time"    />
		<result property="updateBy"     column="update_by"      />
		<result property="updateTime"   column="update_time"    />
		<result property="remark"       column="remark"         />
	</resultMap>
	
	<sql id="selectRoleVo">
	    select distinct r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope,
            r.status, r.del_flag, r.create_time, r.remark 
        from sys_role r
	        left join sys_user_role ur on ur.role_id = r.role_id
	        left join sys_user u on u.user_id = ur.user_id
	        left join sys_dept d on u.dept_id = d.dept_id
    </sql>
    
	<select id="selectRolePermissionByUserId" parameterType="Long" resultMap="SysRoleResult">
		<include refid="selectRoleVo"/>
		WHERE r.del_flag = '0' and ur.user_id = #{userId}
	</select>
	

 	
</mapper> 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vue前端项目-首页-获取角色 的相关文章

随机推荐

  • 分享一个去水印接口,完全免费,早点下手啊

    上传到任意空间或者服务器 访问即可用 目前支持很多平台 抖音 快手 皮皮虾 西瓜 红书 微视 最右 哔哩哔哩 皮皮搞笑等常见平台 而且还是免费的 该接口测试 完全免费 如果那天收费了 大家可以直接放弃使用
  • linux下如何清理缓存

    手头的路由本身内存就比较少 上面又跑了一个nginx php的环境 简直慢的爆炸 check的时候发现内存经常被占了很多 linux的虚拟内存机制 很多时候回导致内存得不到及时释放 有时候内存很少了 kill了很多进程 但是内存还是没有释放
  • React_井字棋

    该项目是跟着react官网写的 由于是初学 就只用来记录自己的代码 如果和我一样是初学react建议看官网 react import React from react import ReactDOM from react dom clien
  • C++的范围for语句详解 附易错实例

    博客内容 C 读取一行内个数不定的整数的方式 作 者 陈大大陈 个人简介 一个正在努力学技术的准前端 专注基础和实战分享 欢迎私信 欢迎大家 这里是CSDN 我总结知识和写笔记的地方 喜欢的话请三连 有问题请私信 范围for语句是C 引入的
  • 深度学习做分类时出现list index out of range解决办法之一

    error list index out of range 索引出了问题 首先检查一下自己的数组索引是不是真的有问题 如果没问题就是自己读入的文件里包含不能识别的字符 比如空格 参考 https blog csdn net weixin 3
  • Ubuntu 12.04 下安装ncurses-devel

    解决Ubuntu 12 04 使用 make menuconfig 配置Linux 内核时 出现缺少 ncurses devel 库支持 Unable to find the ncurses libraries or the require
  • Instrusive 【HDU - 5040】【2014 北京 BFS】

    题目链接 一道有着很多需要细节的地方需要注意的题 挺不错的 这题的数据也是给的很好 然后讲一下题意吧 题意 有一个N N的网格 有起点M和终点T 我们从起点需要走到终点 每一步需要花费的时间是单位一 但是呢 我们不能被摄影机拍摄到 摄影机是
  • halcon21.11安装教程详解

    文章目录 1 软件下载 2 安装过程 halcon21 11安装教程详解 1 软件下载 a 官网 https www mvtec com cn b 百度网盘下载 链接 https pan baidu com s 1 Bdz1l54PQWxb
  • Pycharm-Python 下载安装第三方库

    Pycharm Python 下载安装第三方库 一 安装第三方库 00 新建项目 02 两种安装方式 通过代码提示安装 pip install 安装 二 小结 最近我使用 pip install 安装第三方库时出现了一些问题 不知道为什么
  • nvidia自动更新带来的问题

    实验室的ubuntu 14 04 lts server 上的gpu突然不能用了 使用 nvidia smi 查看gpu信息时显示 Failed to initialize NVML GPU access blocked by the ope
  • leetcode 54. 螺旋矩阵 python

    题目描述 题解 1 逆时针的遍历顺序为 右 下 左 上 定义一个directions的list 分别对应这四个方向 如果当前方向的下一个位置到达matrix边界或者已经被访问过 则变换为下一个方向 2 定义一个和输入matrix大小相同的f
  • scala学习-Description Resource Path Location Type value toDF is not a member of org.apache.spark.rdd.R

    编译如下代码时 出现value toDF is not a member of org apache Spark rdd RDD People 错误 val rdd RDD People sparkSession sparkContext
  • 单例模式详解----懒汉式/饿汉式(C++实现)

    单例模式 单例模式是一种常用的软件设计模式 它的核心结构中只包含一个被称为单例的特殊类 通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问 从而方便对实例个数的控制并节约系统资源 如果希望在系统中某个类的对象只能存在一个 单
  • 强化学习算法回顾 Q-learning 玩 OpenAI 的 Taxi 游戏

    这里使用的是 OpenAI Taxi V3 环境 这里有 4 个地点 分别用 4 个字母表示 任务是要从一个地点接上乘客 送到另外 3 个中的一个放下乘客 越快越好 成功运送一个客人获得 20 分奖励 每走一步损失 1 分 希望尽快送到目的
  • JVM内存泄露与溢出

    内存泄漏和内存溢出 内存泄露 申请的内存空间没有被正确释放 导致内存空间被占用 并且之后也不会使用 内存溢出 申请的内存空间超过了空闲内存空间 即内存不够使用 所以说 内存泄漏可能会导致内存溢出 我们需要注意有可能会导致内存泄漏的情况 常见
  • 手把手带你linux部署清华大学大模型最新版 chaglm2-6b

    准备工作 下载项目源代码 git clone https github com THUDM ChatGLM2 6B 切换到项目根目录 cd ChatGLM2 6B 安装依赖 pip install r requirements txt 安装
  • 华为免费虚拟服务器,免费虚拟服务器试用一年

    免费虚拟服务器试用一年 内容精选 换一换 本文介绍了存储容灾SDRS各特性版本的功能发布和对应的文档动态 新特性将在各个区域 Region 陆续发布 欢迎体验 购买服务及配置特性时 操作步骤中未框选的配置项请保持默认值 申请服务时 未开通企
  • Ubuntu18.04下OpenCV3.4.11的安装及使用示例

    目录 一 认识 OpenCV 二 安装 OpenCV 1 安装包 2 配置环境 三 使用示例 图片 四 使用示例 视频 1 虚拟机获取摄像头权限 2 播放视频 3 录制视频 五 总结 六 参考资料 安装环境 VMware虚拟机安装的Ubun
  • Pytest系列-失败重跑插件pytest-rerunfailures的使用(9)

    前提条件 以下先决条件才能使用pytest rerunfailures Python 3 5 最高 3 8 or PyPy3 pytest 5 0或更高版本 安装 pip3 install pytest rerunfailures i ht
  • Vue前端项目-首页-获取角色

    目录 Vue端代码 1 前端守卫设置 2 Vuex中定义getter 3 新建 getters js 文件 4 定义 GetInfo 方法获取用户角色信息 5 获取用户信息API 6 请求拦截器 SpringBoot 端 1 Control