VUE2后台管理系统--权限管理、按钮管理

news/2024/11/27 8:48:50/

1、做法

在项目接手时候想的还是根据花裤衩大佬的方法进行,后端返回异步路由进行加载。后来和后端一起确认并且查阅了其他项目做法后,采用的是所有路由在前端的异步路由中进行对比查找赋值,再通过动态路由添加。

2、思路

在用户进行登录时候,在路由守卫中调用后端接口返回该用户的相关权限列表,权限按钮、权限名称。再根据相关权限进行查找赋与addrouters

3、判断逻辑:

所有的都在路由守卫中进行,不存储在本地缓存中

3.1首先判断有无token,

如果不存在token  判断是不是在白名单中 如果在白名单中就放行,不然就跳转到登录页

3.2如果存在token,判断有无权限名称。

                             存在权限名 放行(这一步是在用户登录成功后的所有逻辑)

                             不存在权限名称,进行查询,调用vuex中的获取用户权限登录数据

                              查询到数据后,将权限名称、菜单列表、按钮列表存入vuex中

因为有一个管理员,如果他的权限名称为管理员,赋予本地的全部asyncRouters,不进行判断。

如果是其他权限名称。就将拿到的菜单列表与异步路由进行对比赋值,再添加到动态路由中

4、代码

// 导航守卫
router.beforeEach(async (to, from, next) => {// document.title = getTitle(to.meta.title)//如果去登录页进行跳转if (to.path === '/login') {// 如果login 页面没有重定向 手动重定向if (!Object.keys(to.query).length) {next({path: '/login',query: {redirect: '/'}})} else {next()}} else {//查询有没有tokenif (store.getters.token) {const roleName = store.getters.roleName//这里判断是否有一级菜单导航//判断有无权限名 有就放行if (roleName) {next()} else {// 没有权限名进行api调用,获取当前用户所拥有权限try {//try执行一些可能会抛出的错误// 这是一个错误处理机制,用于捕获 JavaScript 代码中的错误并执行相应的处理程序,catch() 方法接受一个函数作为参数,该函数在发生错误时被调用并传递错误消息作为参数// 将接口查询到的东西都存入vuex中const data = await store.dispatch('user/_getInfo')const menuList = store.getters.menuList//  将获取到的菜单列表与本地的路由进行对比赛选const addRoutes = await store.dispatch('permission/getAsyncRoutes',menuList)router.addRoutes(addRoutes)next({ ...to, replace: true })} catch (error) {// 抛出错误if (error) {Message.error(error)}}}} else if (whiteList.indexOf(to.path) !== -1) {next()} else {next({path: '/login',query: {redirect: to.fullPath}})}}
})

user的vuex

  //获取后端接口得到用户登录权限数据_getInfo({ commit }) {return new Promise((resolve, reject) => {getInfo().then(res => {if (res.data) {// 如果查询成功了跳转到主页router.push('/home')//结构权限名与菜单列表、按钮列表const { roleName, menuList, permissionList } = res.data//2将用户数据储存到vuex里面用于使用时取值commit('SET_ROLE_NAME', roleName)commit('SET_MENU_LIST', menuList)commit('SET_PERMISSION_LIST', permissionList)} else {Message.error(res.msg)}resolve(res.data)}).catch(error => {if (error.msg) {Message.error(error.msg)}reject(error)})})}
  SET_ROLE_NAME(state, payload) {state.roleName = payload},SET_INTRODUCE(state, payload) {state.introduce = payload},SET_MENU_LIST(state, payload) {state.menuList = payload},SET_PERMISSION_LIST(state, payload) {state.permissionList = payload}

最重要的路由处理因为后端返回的都是权限名称,所以用不到树状结构数据

import { asyncRoutes, currencyRoutes } from '@/router'const state = {routes: [],addRoutes: []
}
const mutations = {SET_ROUTES(state, payload) {// 存入整合后的所有路由方便后续使用state.routes = [...currencyRoutes, ...payload]// 需要动态路由添加的路由state.addRoutes = payload}
}
//遍历asyncRoutes动态路由
function forSearchArr(route, routerName) {let arrNew = []for (let item of route) {// 将其复制到一个新的对象中,从而实现对象的浅拷贝(只拷贝对象中的属性,而不包括属性所引用的对象)let itemNew = { ...item } // includes() 是 JavaScript 中字符串、数组和类数组对象内置的方法之一,用于判断一个对象中是否包含指定的元素。// 对于字符串和数组对象,该方法会遍历整个对象,判断其中是否包含指定的元素,返回一个布尔值用于表示结果。// 对于类数组对象,该方法会将其转换为数组对象后再进行比较if (routerName.includes(itemNew.name)) {// 如果存在子元素,进行递归调用if (itemNew.children) {itemNew.children = forSearchArr(itemNew.children, routerName)}arrNew.push(itemNew)}}return arrNew
}const actions = {getAsyncRoutes({ commit, rootGetters }, menuList) {return new Promise(resolve => {let routes = []// 管理员拥有所有的路由,菜单权限if (rootGetters.roleName === '管理员') {routes = asyncRoutes || ''} else {// 不是管理员,进行异步路由和获取的菜单列表进行对比重组routes = forSearchArr(asyncRoutes, menuList)}commit('SET_ROUTES', routes)resolve(routes)})}
}
export default {namespaced: true,state,mutations,actions
}


http://www.ppmy.cn/news/483684.html

相关文章

python:使用Scikit-image中的滤波函数对遥感影像做空间滤波(中值,高斯,Sobel,Laplace,Scharr等)

作者:CSDN @ _养乐多_ 本文将介绍使用Scikit-image中的滤波函数对遥感影像做空间滤波的代码。滤波方法包括:中值滤波器,高斯滤波器,Sobel滤波器,Laplace滤波器,Scharr滤波器等。并将原始影像和结果影像绘制成图。 结果如下图所示, 文章目录 一、空间滤波函数详解二、…

ipad吃鸡用什么蓝牙耳机?高性价比无线蓝牙耳机品牌

如今蓝牙耳机品牌泛滥,溢价严重,要如何挑选适合自己的蓝牙耳机呢?有没性价比高,口碑好的蓝牙耳机呢?今天给大家推荐几款性价比高性能好的蓝牙耳机,口碑,使用感受都非常不错。 一、南卡Lite Pro…

如何选一款支持iPadh和拯救者R7000的有线耳机

iPad Air 4 和 最近的几款Pro机型都有type- C接口 拯救者R7000也配有一个type- C口 但是常常发现不是每个type- C耳机都是插上去就能用的 查了一下资料,发现网上很多人都说只有华为送的耳机可以。 但价格感人。。而且还常常缺货 所以,深挖了一番&#xf…

ipad吃鸡用什么耳机好?低延迟性价比高的蓝牙耳机推荐

在科技发展下,我们的生活也变得科技起来,如今也越来越多的人不再选择传统的有线耳机了,而是选择了高大上的蓝牙耳机,不管是运动中听音乐、还是上下班路上,戴上蓝牙耳机更显的方便。那市场上什么牌子的蓝牙耳机好你知道…

最长回文子串

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。 示例 1: 输入: “babad” 输出: “bab” 注意: "aba"也是一个有效答案。 示例 2: 输入: “cbbd” 输出: “bb” class Solution:def longestPalind…

前后端传值不区分大小写

在大多数编程语言和技术中,前端和后端传递的值是区分大小写的。大小写敏感性意味着变量名、对象属性或其他标识符的大小写必须精确匹配才能正确传递和识别值。 然而,有些编程语言或框架在处理传值时可以进行不区分大小写的比较。这通常是通过特定的配置…

【AUTOSAR】UDS协议的代码分析与解读(十一)----UDS例程控制31h请求下载 34h

8.15 例程控制 RoutineControl (31h) 此服务用于启动程序 、停止程序和请求程 序执行结果。例程由 两字节的例程标识符 (RoutineIdentifier)来确定。 8.15.1 报文格式 表 71 例程控制服务的请求报文 Byte Name Cvt Value (Hex) #1 RequestServiceIdentifier M 31 #2 …

RobotFrameWork Web自动化测试之测试环境搭建

前言 Robot Framework是一款python编写的功能自动化测试框架。具备良好的可扩展性,支持关键字驱动,可以同时测试多种类型的客户端或者接口,可以进行分布式测试执行。主要用于轮次很多的验收测试和验收测试驱动开发(ATDD&#xff…