Vue前端项目-首页-获取角色
目录
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前端项目-首页-获取角色相关推荐
- Vue前端项目-Vuex实战使用
目录 1.创建 vue-cli 脚手架项目 2.安装 vuex 3.将 store 实例注册到 Vue对象 4. store 实例对象 5.将 store 分割成模块化(Module) 6.项目中的模 ...
- VUE项目学习(一):搭建VUE前端项目
VUE项目学习(一):搭建VUE前端项目 1.安装node.js环境 (1)下载node.js,下载地址为:https://nodejs.org/en/ (2)按照默认选项安装node,检查安装版本 ...
- vue 前端项目部署阿里云服务器
vue 前端项目部署阿里云服务器 one 前期准备 two 代码打包 扔服务器 one 前期准备 首先两个软件应该下载(Xftp Xshell),如果有其他类似的软件也可以. 打开xftp,新建一个会 ...
- cmd搭建vue前端项目详细过程
cmd 搭建vue前端项目 下载nods.js node.js下载(Windows版本) next 安装完毕! 配置node.js环境变量 进入找到Path进入 这里填你的node.js的安装路径 验 ...
- Vue前端项目【尚品汇】
Vue前端项目[尚品汇] 1. 说明 2. 对项目创建 3.结构 4. 项目运行起来时,浏览器自动打开 5.关闭ESLint校验功能 5.路由分析 6.路由元信息 7. 路由传参 7.1 路由的跳转方 ...
- Vue前端项目自适应布局
Vue前端项目自适应布局 一.单位尺寸 二.基于rem实现自适应布局 一.单位尺寸 px % vw.vh: 窗口 em: 针对父元素的font-size rem:"root em" ...
- B站云E办Springboot+vue——前端项目完整版(含源码)
一.项目简介 项目背景:受疫情的影响,许多企业由线上办公转为线下办公.随着线上办公的人数的增多,线上办公的优点逐步凸显:通过实现工作流程的自动化.节省企业办公费用.实现绿色办公,同时提升办公效率. 项 ...
- Vue前端项目部署在tomcat
第一步 配置java环境,下载tomcat后解压,然后将webapps里的默认文件删掉 第二步 修改vue项目下config/index.js,注意dev和build都要改assetsPublicPa ...
- 为什么vue前端项目要使用nodejs
一.传统的JavaScript 传统的js是运行在浏览器上的,因为浏览器内核分为两个部分: 渲染引擎---渲染HTML和CSS, JavaScript 引擎---负责运行 JavaScript 随着技 ...
最新文章
- 最全 Neo4j 可视化图形数据库的工具!
- np.random.rand()用法
- java 18 -4 LinkedHashMap集合
- PHP漏洞全解(二)-命令注入攻击
- Java 帝国对 Python 的渗透能成功吗?
- 小米进军欧洲智能手机市场:一面是狂欢,一面是考验
- 区块链(BlockChain)基础概念
- GPS接收天线 GPS天线原理(有源天线供电通常由接收机前端通过RF同轴电缆供电。)实际测试GPS接收芯片的SMA天线底座中心孔和底座之间电压3.3V,可以通过SMA接口对天线供电2022.3.30
- IMG镜像写盘工具physdiskwrite,用于MikroTik RouterOS的安装(Windows)
- 汉字编码-GB2312-GBK-GB18030-Big5
- 映美精IC Imageing Control .net控件调试问题
- 小孩子都喜欢的卡通影视角色原来是用maya软件制作出来的
- 高德地图,根据经纬度定位到某个地方(位置标注)
- MongoDB填充因子和更新优化
- c语言英文版孤独怎么说,孤独的伤感的英文句子
- Polar码引发舆论狂欢 5G标准远未定局
- 4.输入10个字符,统计里面大写英文的个数
- 面向对象——类与对象的概念
- hadoop3.0 启动后输入 jps没有进程
- Verilog固定优先级仲裁器——Fixed Priority Arbiter