vue后台管理系统权限

1.权限问题:用户和管理员进入管理系统看到的模块是不一样的,管理员看的的要比用户看到的多。需要用到动态加载路由,router.addRouters()来动态的挂载路由

// 1.先登录将获取到的用户的token存储起来

// store/index.js

// 封装的api接口方法
import { getLogin, getUserInfo } from '../api/index' state: {
roles: [],
token: window.localStorage.getItem('token') || ''
}, mutations: { // 将获取到的token存储到本地
SET_TOKEN (state, token) {
state.token = token
window.localStorage.setItem('token', state.token)
}
}, actions: { userLogin ({ commit }, userInfo) { // 返回一个异步回调,promise
return new Promise((resolve, reject) => { // 调用封装好的请求数据的方法
getLogin(userInfo).then(res => {
const data = res.data
if (data.code === 200) { // 调用mutations中的方法,将token存储到本地中
commit('SET_TOKEN', data.token)
}
resolve(res.data)
}).catch(error => {
reject(error)
})
})
}, // 根据用户的token获取用户的个人信息,里面包含了权限信息 getUserInfo ({ state }) { // 返回一个异步回调,promise
return new Promise((resolve, reject) => { // 调用接口方法获取数据
getUserInfo(state).then(res => { // 将获取到的信息放到数组中存储
state.roles.push(res.data)
resolve(res.data)
}).catch(error => {
reject(error)
})
})
}
} // 在login/index.vue中使用,点击按钮触发
userLogin () { this.$store.dispatch('userLogin', this.userInfo).then(res => {
// 登陆成功跳转主页
this.$router.push('/home')
}).catch(error => {
console.log(error)
})
} // vuex的计算属性 getters: {
// 将用户数据放到计算属性中,一旦数据发生变化,可以重新计算
roles (state) {
return state.roles
},
token (state) {
return state.token
}
}, // 权限模块的处理 // router/index.js // 路由中的配置 // 静态路由,没有权限的所有用户都可以看到 // 引入登陆页面
import Login from '../views/Login' export const staticRoutes = [
{
path: '/login',
name: 'login',
component: Login
},
{
path: '/home',
name: 'home',
component: () => import('../views/Home')
}
] // 异步(动态)挂载的路由,根据权限展示
export const asyncRouteMap = [
{
path: '/details',
name: 'details',
component: () => import('../views/Details'),
meta: {
role: ['admin', 'super_editor'] // 页面需要的权限
},
children: [
{
path: 'index',
name: 'index',
component: () => import('../views/Details/Child'),
meta: {
role: ['admin', 'super_editor'] // 页面需要的权限
},
children: [
{
path: '/next',
name: 'next',
meta: {
role: ['admin', 'super_editor'] // 页面需要的权限
}
}
]
}
]
},
{
path: '/error',
component: () => import('../views/404'),
name: 404
},
{ path: '*', redirect: '/error', hidden: true }
] // 因为可以动态的挂载路由,但是不能动态删除路由。所以才考略到,
// 在需要动态清空动态挂载路由的话,直接将一个新的路由对象赋值给旧的路由对象,这样就可以达到动态清除的工作 const createRouter = () => new VueRouter({
scrollBehavior: () => ({ y: 0 }),
routes: staticRoutes
}) const router = createRouter() // 调用该方法动态清除动态挂载路由
export function resetRouter () {
const newRouter = createRouter()
router.matcher = newRouter.matcher // reset router
} export default router // store/permission.js // 引入权限路由,和公共路由
import { staticRoutes, asyncRouteMap } from '../router/index' // 用来筛选后端返回来的权限数据,和权限路由中的meta里面的数据匹配,匹配成功返回true,失败为false function hasPerMission (roles, route) {
if (route && route.meta.role) {
return roles.some(role => route.meta.role.indexOf(role) >= 0)
} else {
return true
}
} const permission = {
state: {
routers: staticRoutes,
addRouters: []
},
mutations: { // 将匹配成功的权限路由拼接到公共路由中
SET_ROUTERS (state, routers) {
state.addRouters = routers
state.routers = staticRoutes.concat(routers)
}
},
actions: { // 对后台返回来的权限和动态路由权限匹配
GenerateRoutes ({ commit }, data) { // 返回一个异步回调promise
return new Promise((resolve, reject) => { // 遍历权限路由数组
const accessedRoutes = asyncRouteMap.filter(v => { // 判断如果后台返回的权限中包含admin就是管理员,可以进入权限路由页面
if (data.indexOf('admin') >= 0) return true // 之后就是调用hasPerMission函数对象权限动态路由和后台返回的用户权限进行严格匹配
if (hasPerMission(data, v)) { // 判断是否有权限路由是否有子路由,有子路由继续遍历
if (v.children && v.children.length > 0) {
v.children = v.children.filter(child => { // 对权限子路由和后台返回的用户权限数据,在进行匹配,匹配成功返回
if (hasPerMission(data, child)) {
return child
} // 失败返回false
return false
}) // 并且要把权限的父路由返回来,不光要把权限子路由返回,无论权限子路有还是没有,都应该把权限父路由返回来
return v
} else { // 权限父路由匹配成功返回
return v
}
} // 如果每一个判断都没有进,说明该用户没有任何权限,返回false
return false
})
commit('SET_ROUTERS', accessedRoutes)
resolve()
})
}
},
getters: { // 只要权限路由数组发生变化就重新计算
addRouters (state) {
return state.addRouters
}
}
}
export default permission // 在store/index.js // 引入另一个模块使用
import permission from './permission' modules: { // 我们还需要用到另一个模块配合完成
permission
} // 之后创建一个js文件单独放到全局路由导航,之后在main.js中引入执行 // gloab/index.js // 先把路由和vuex引进来使用
import router from '../router'
import store from '../store' const whiteList = ['/login'] // 不重定向白名单 router.beforeEach((to, from, next) => {
if (store.getters.token) {
// 判断如果是去登陆页面的话,返回主页,不让他返回登录页
if (to.path === '/login') {
next({ path: '/home' })
} else {
// 否则判断一下用户的个人信息是否已经拉取完毕
if (store.getters.roles.length === 0) {
// 拉取用户个人信息
store.dispatch('getUserInfo').then(res => {
// 拿到用户后台返回的权限数据
const roles = res.role
// 调用 permission.js方法中的GenerateRoutes方法,将后台返回的用户的权限数据,传递回去进行筛选处理
store.dispatch('GenerateRoutes', roles).then(() => { // 生成可访问的路由表
// 将筛选的权限路由数组动态挂载
router.addRoutes(store.getters.addRouters) // 动态添加可访问路由表
next({ ...to, replace: true }) // hack方法 确保addRoutes添加完成
})
}).catch(error => {
console.log(error)
// 验证失败重新登陆
next({ path: '/login' })
})
} else {
next() // 当有用户权限的时候,说明所有可访问路由已生成 如访问没权限的页面会自动进入404页面
}
}
} else {
// 如果已经去了登陆页面了,就不需要再next到登陆页面了,这就是重定向白名单
if (whiteList.indexOf(to.path) !== -1) {
next()
} else {
next('/login') // 否则全部重定向到登录页
}
}
})

vue后台管理系统权限处理的更多相关文章

  1. VUE 后台管理系统权限控制

    谈一谈VUE 后台管理系统权限控制 前端权限从本质上来讲, 就是控制视图层的展示,比如说是某个页面或者某个按钮,后端权限可以控制某个用户是否能够查询数据, 是否能够修改数据等操作,后端权限大部分是基于 ...

  2. springboot学习笔记:11.springboot+shiro+mysql+mybatis(通用mapper)+freemarker+ztree+layui实现通用的java后台管理系统(权限管理+用户管理+菜单管理)

    一.前言 经过前10篇文章,我们已经可以快速搭建一个springboot的web项目: 今天,我们在上一节基础上继续集成shiro框架,实现一个可以通用的后台管理系统:包括用户管理,角色管理,菜单管理 ...

  3. vue 后台管理系统菜单权限管理

    来自:https://www.cnblogs.com/fqh123/p/11094296.html 侵删 login登录方法 login() { if (!this.username) { retur ...

  4. 从壹开始前后端 [vue后台] 之一 || 权限后台系统 1.0 正式上线

    缘起 哈喽各位小伙伴周三好,春节已经过去好多天了,群里小伙伴也各种催搞了,新年也接了新项目,比较忙,不过还是终于赶上这个二月的尾巴写了这篇文章,也把 vue 权限后台上线了(项目地址:http://1 ...

  5. 我的第一个python web开发框架(34)——后台管理系统权限设计

    框架底层和接口终于改造完成了,小白再次找到老菜. 小白:老大,上次你对后台权限系统简单的讲了一下,我一点头绪都没有,现在有空完整的说一说吗? 老菜:说到权限系统,要讲明白真不容易,权限系统并不是越复杂 ...

  6. 完整开发vue后台管理系统小结

    最近业余帮朋友做两个vue项目,一个是面向用户纯展示系列的(后统称A项目),一个是后端管理系统类的(后统称B项目).两者在技术上都没难度,这里对开发过程遇到的问题.取舍等做一个小节. 关于项目搭建 目 ...

  7. vue后台管理系统兼容问题

    1.兼容 兼容问题主要是指ie9以下的ie浏览器. 2.兼容问题原因 (1)低版本ie不支持编译后的es5 (2)低版本ie不支持Promise 3.解决方法 (1)引入es6-promise &am ...

  8. vue后台管理系统遇到的注意事项以及总结

    地址栏加#号问题:Vue-router 中有hash模式和history模式,vue的路由默认是hash模式,一般开发的单页应用的URL都会带有#号的hash模式第一步在router/index.js ...

  9. vue后台管理系统组件弹窗

    //addFormVisibleIcon可在data中设置true与falsehttps://element.eleme.io/#/zh-CN/component/installation <e ...

随机推荐

  1. mybatis-generator二次开发总结

    二次开发(此文只作记录,具体代码及文章在内网,copy不出来) 自定义生成代码需求: 1.去除默认生成的example接口方法: (1)配置generatorConfig.xml (2)修改源码tab ...

  2. Ubuntu在没用root权限下如何创建sudo用户

    起因 安装openCryptoki之后,如果想执行相关命令的话,那么该用户必须在pkcs11用户组中,于是执行 sudo uersmod -G pkcs11 $(whoami) 之后重启系统,执行 s ...

  3. FBI今年最重要的任务:招募黑客

    ​ 当FBI(联邦调查局)一次又一次被爆出丑闻的时候,面临着一个又一个的尴尬局面.在这样的情况下,FBI发现了自己的一个巨大问题,那就是以前都依靠隐秘行动和人员的保密性来保证国家的安全,现在必须依靠更 ...

  4. C++扬帆远航——1

    问题及代码: /* * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:test.cpp * 作者:常轩 * 完成日期:2 ...

  5. Context与ApplicationContext的区别

    ApplicationContext并没有这个类,其实更应该叫做:Activity与Application在作为Context时的区别.嗯,的确是这样的,大家在需要Context的时候,如果是在Act ...

  6. 整合 KAFKA+Flink 实例(第一部分,趟坑记录)

    2017年后,一大波网络喧嚣,说流式处理如何牛叉,如何高大上,抱歉,工作满负荷,没空玩那个: 今年疫情隔离在家,无聊,开始学习 KAFKA+Flink ,目前的打算是用爬虫抓取网页数据,传递到Kafk ...

  7. 小程序开发技巧(三)-- 云开发时效数据刷新和存储 (access_token等)

    小程序云开发时效数据刷新和存储 (access_token等) 1.问题描述 小程序中经常有需要进行OCR识别,或者使用外部api例如百度AI识别等接口,请求调用这些接口需要令牌,即一些具有时效性的数 ...

  8. 处理 Vue 单页面 SEO 的另一种思路

    vue-meta-info 官方地址: https://github.com/monkeyWang... (设置vue 单页面meta info信息,如果需要单页面SEO,可以和 prerender- ...

  9. 从输入URL到页面展示

    当我们输入 URL 并按回车后,浏览器会对 URL 进行检查,首先判断URL格式,比如是ftp http ed2k等等,我们这里假设这个URL是http://hellocassie.cn,那么浏览器会 ...

  10. 前端每日实战:149# 视频演示如何用纯 CSS 创作一个宝路薄荷糖的动画

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/oagrvz 可交互视频 此视频是可 ...