返回 1. 创建
2. 在
1. 创建
Vue-Element-Admin 权限管理和动态菜单构建之心得
见解分享
2023-09-17 21:00:20
前言
Vue-Element-Admin 是一个基于 Vue.js 的后台管理系统框架,它提供了丰富的组件和开箱即用的功能,帮助开发者快速构建后台管理系统。本文将重点介绍如何在 Vue-Element-Admin 项目中实现动态路由权限管理和菜单渲染,让你轻松实现权限控制和动态菜单构建,为你的项目添加更多灵活性和安全性。
动态路由权限管理
在 Vue-Element-Admin 项目中,动态路由权限管理是通过使用 permission.js
文件来实现的。这个文件定义了系统中的所有路由权限,并根据用户角色进行权限分配。当用户登录系统后,系统会根据用户的角色获取其对应的路由权限,并动态生成路由表。
1. 创建 permission.js
文件
在 src
目录下创建一个 permission.js
文件,并按照以下格式定义路由权限:
const permission = {
// 管理员权限
admin: {
// 首页
home: {
path: '/home',
name: 'Home',
component: 'Home'
},
// 用户管理
user: {
path: '/user',
name: 'User',
component: 'User'
},
// 角色管理
role: {
path: '/role',
name: 'Role',
component: 'Role'
}
},
// 普通用户权限
user: {
// 首页
home: {
path: '/home',
name: 'Home',
component: 'Home'
},
// 个人中心
profile: {
path: '/profile',
name: 'Profile',
component: 'Profile'
}
}
};
在这个示例中,我们定义了两个用户角色:管理员和普通用户。管理员拥有对所有页面的访问权限,而普通用户只能访问首页和个人中心。
2. 在 main.js
文件中引入 permission.js
文件
在 main.js
文件中引入 permission.js
文件,并将其作为路由守卫使用,以确保只有具有相应权限的用户才能访问页面。
import Vue from 'vue'
import VueRouter from 'vue-router'
import permission from './permission'
Vue.use(VueRouter)
const router = new VueRouter({
// 路由配置
})
// 路由守卫
router.beforeEach((to, from, next) => {
// 获取当前用户的角色
const role = localStorage.getItem('role')
// 根据角色获取对应的路由权限
const permissions = permission[role]
// 检查用户是否具有访问当前页面的权限
if (permissions.includes(to.name)) {
next()
} else {
next({ path: '/403' })
}
})
这样,当用户访问某个页面时,系统会首先检查用户是否具有访问该页面的权限,如果没有,则会将用户重定向到 403 页面。
动态菜单渲染
在 Vue-Element-Admin 项目中,动态菜单渲染是通过使用 menu.js
文件来实现的。这个文件定义了系统中的所有菜单项,并根据用户角色进行菜单分配。当用户登录系统后,系统会根据用户的角色获取其对应的菜单项,并动态生成菜单。
1. 创建 menu.js
文件
在 src
目录下创建一个 menu.js
文件,并按照以下格式定义菜单项:
const menu = {
// 管理员菜单
admin: [
{
path: '/home',
name: 'Home',
component: 'Home',
meta: {
title: '首页'
}
},
{
path: '/user',
name: 'User',
component: 'User',
meta: {
title: '用户管理'
}
},
{
path: '/role',
name: 'Role',
component: 'Role',
meta: {
title: '角色管理'
}
}
],
// 普通用户菜单
user: [
{
path: '/home',
name: 'Home',
component: 'Home',
meta: {
title: '首页'
}
},
{
path: '/profile',
name: 'Profile',
component: 'Profile',
meta: {
title: '个人中心'