目录

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_infoconst roles = res.rolesconsole.log(roles)}).catch(err => {console.log(err)})}next()}} else {// 没有 tokenif (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 {@Resourceprivate SysLoginService loginService;@Resourceprivate ISysMenuService menuService;@Resourceprivate SysPermissionService permissionService;@Resourceprivate 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 {@Resourceprivate ISysMenuService menuService;@Resourceprivate 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 rleft join sys_user_role ur on ur.role_id = r.role_idleft join sys_user u on u.user_id = ur.user_idleft 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> 

Vue前端项目-首页-获取角色相关推荐

  1. Vue前端项目-Vuex实战使用

    目录 1.创建 vue-cli 脚手架项目 2.安装 vuex 3.将 store 实例注册到 Vue对象 4. store 实例对象 5.将 store 分割成模块化(Module) 6.项目中的模 ...

  2. VUE项目学习(一):搭建VUE前端项目

    VUE项目学习(一):搭建VUE前端项目 1.安装node.js环境 (1)下载node.js,下载地址为:https://nodejs.org/en/ (2)按照默认选项安装node,检查安装版本 ...

  3. vue 前端项目部署阿里云服务器

    vue 前端项目部署阿里云服务器 one 前期准备 two 代码打包 扔服务器 one 前期准备 首先两个软件应该下载(Xftp Xshell),如果有其他类似的软件也可以. 打开xftp,新建一个会 ...

  4. cmd搭建vue前端项目详细过程

    cmd 搭建vue前端项目 下载nods.js node.js下载(Windows版本) next 安装完毕! 配置node.js环境变量 进入找到Path进入 这里填你的node.js的安装路径 验 ...

  5. Vue前端项目【尚品汇】

    Vue前端项目[尚品汇] 1. 说明 2. 对项目创建 3.结构 4. 项目运行起来时,浏览器自动打开 5.关闭ESLint校验功能 5.路由分析 6.路由元信息 7. 路由传参 7.1 路由的跳转方 ...

  6. Vue前端项目自适应布局

    Vue前端项目自适应布局 一.单位尺寸 二.基于rem实现自适应布局 一.单位尺寸 px % vw.vh: 窗口 em: 针对父元素的font-size rem:"root em" ...

  7. B站云E办Springboot+vue——前端项目完整版(含源码)

    一.项目简介 项目背景:受疫情的影响,许多企业由线上办公转为线下办公.随着线上办公的人数的增多,线上办公的优点逐步凸显:通过实现工作流程的自动化.节省企业办公费用.实现绿色办公,同时提升办公效率. 项 ...

  8. Vue前端项目部署在tomcat

    第一步 配置java环境,下载tomcat后解压,然后将webapps里的默认文件删掉 第二步 修改vue项目下config/index.js,注意dev和build都要改assetsPublicPa ...

  9. 为什么vue前端项目要使用nodejs

    一.传统的JavaScript 传统的js是运行在浏览器上的,因为浏览器内核分为两个部分: 渲染引擎---渲染HTML和CSS, JavaScript 引擎---负责运行 JavaScript 随着技 ...

最新文章

  1. 最全 Neo4j 可视化图形数据库的工具!
  2. np.random.rand()用法
  3. java 18 -4 LinkedHashMap集合
  4. PHP漏洞全解(二)-命令注入攻击
  5. Java 帝国对 Python 的渗透能成功吗?
  6. 小米进军欧洲智能手机市场:一面是狂欢,一面是考验
  7. 区块链(BlockChain)基础概念
  8. GPS接收天线 GPS天线原理(有源天线供电通常由接收机前端通过RF同轴电缆供电。)实际测试GPS接收芯片的SMA天线底座中心孔和底座之间电压3.3V,可以通过SMA接口对天线供电2022.3.30
  9. IMG镜像写盘工具physdiskwrite,用于MikroTik RouterOS的安装(Windows)
  10. 汉字编码-GB2312-GBK-GB18030-Big5
  11. 映美精IC Imageing Control .net控件调试问题
  12. 小孩子都喜欢的卡通影视角色原来是用maya软件制作出来的
  13. 高德地图,根据经纬度定位到某个地方(位置标注)
  14. MongoDB填充因子和更新优化
  15. c语言英文版孤独怎么说,孤独的伤感的英文句子
  16. Polar码引发舆论狂欢 5G标准远未定局
  17. 4.输入10个字符,统计里面大写英文的个数
  18. 面向对象——类与对象的概念
  19. hadoop3.0 启动后输入 jps没有进程
  20. Verilog固定优先级仲裁器——Fixed Priority Arbiter

热门文章

  1. RAID6 Vs RAID-DP比较
  2. Matplotlib绘图的简单使用(2)
  3. [鸿蒙harmony开发]主题无标题栏设置
  4. 数据库实训(Oracle)
  5. 时光机——svn概念篇
  6. 管网漏损检测其他新型方法|探地雷达法
  7. 创梦天地关嵩:借力腾讯云,打造文娱新生态——云+未来峰会回顾
  8. SQLZOO习题详解(06)——The JOIN operation
  9. Android开发如何高效学习系统底层原理
  10. mysql内存持续上涨_MySql内存增长过快导至崩溃的问题