16-Vue3 动态路由权限控制

article/2025/9/17 23:20:53

Vite2+Vue3+TypeScript+Element-plus脚手架搭建系列

✅01-初始化 Vite 项目
✅02-配置 Vite2 环境变量
✅03-Vite2 配置及说明
✅04-Vue3 使用 SCSS
✅05-Vue3 路由配置
✅06-TypeScript 配置及说明
✅07-Vue3 使用 axios
✅08-Vue3 axios 对象封装
✅09-ESLint 配置及说明
✅10-ESLint 与 Prettier 集成配置及说明
✅11-Mock.js 模拟接口数据
✅12-Vite2 引入 Element-Plus 框架
✅13-渐变+透明样式实现清爽登录页
✅14-Element-Plus 实现后台管理系统布局
✅15-Pinia 实现 store 状态管理
✅16-Vue3 动态路由权限控制


文章目录

  • Vue3 动态路由权限控制
    • 🎯 目标
    • 😴 功课
      • 权限控制相关流程
      • 路由导航守卫
    • 🍸 准备
      • 安装依赖
      • 调整文件&目录
    • 🌈 Coding
      • Token 管理
      • 实例化 NProgress
      • 修改 Login Mock 数据
      • 修改登录逻辑
      • 修改登出逻辑
      • 动态路由
      • 在路由中添加导航守卫
    • 🎭 结果

源码地址:GitHub / 码云


Vue3 动态路由权限控制

🎯 目标

  • 实现登录用户与非登录用户权限控制:非登录用户只能访问登录页面 。
  • 实现管理员与普通用户的权限控制:管理员能访问用户管理和角色管理页面,普通用户只能用户管理页面。

😴 功课

权限控制相关流程

  • 登录成功流程
    在这里插入图片描述

  • 鉴权流程
    在这里插入图片描述

  • 登出流程
    在这里插入图片描述

路由导航守卫

vue-router 提供的导航守卫主要用来通过跳转或取消的方式守卫导航。你可以使用 router.beforeEach 注册一个全局前置守卫:

const router = createRouter({ ... })router.beforeEach((to, from) => {// ...// 返回 false 以取消导航return false
})

当一个导航触发时,全局前置守卫按照创建顺序调用。守卫是异步解析执行,此时导航在所有守卫 resolve 完之前一直处于等待中。

每个守卫方法接收两个参数:
to:即将要进入的目标
from:当前导航正要离开的路由


你也可以注册全局后置钩子,然而和守卫不同的是,这些钩子不会接受 next 函数也不会改变导航本身:

router.afterEach((to, from) => {// 后置处理逻辑
})

其它详情请查看 Vue Router 官方文档

🍸 准备

安装依赖

安装 cookie 操作依赖和进度条依赖。

npm install -S js-cookie @types/js-cookie nprogress @types/nprogress

调整文件&目录

添加 src/utils/cookie/index.ts 文件,存放 token 管理工具方法。
添加 src/utils/progress/index.ts 文件,存放进度条实例。

目录结构如下:

📁 src

----📁 utils

--------📁 token

------------📄 index.ts

--------📁 progress

------------📄 index.ts


🌈 Coding

💡 只粘贴了部分核心代码,完整代码可去 GitHub / 码云 获取

Token 管理

src/utils/token/index.ts Token 管理工具方法代码如下:

import Cookies from 'js-cookie'// ↓cookie 中保存 token 的键
export const tokenKey = 'bee-token'// ↓获取token
export const getToken = (): string | undefined => {return Cookies.get(tokenKey)
}// ↓设置token
export const setToken = (token: string): string | undefined => {return Cookies.set(tokenKey, token)
}// ↓删除token
export const removeToken = (): void => {return Cookies.remove(tokenKey)
}// ↓判断token是否存在
export const existToken = (): boolean => {return getToken() !== undefined
}

实例化 NProgress

src\utils\progress\index.ts 实例化 NProgress 对象代码如下:

import NProgress from 'nprogress'
import 'nprogress/nprogress.css'NProgress.configure({easing: 'ease', // 动画方式speed: 500, // 递增进度条的速度showSpinner: false, // 是否显示加载icotrickleSpeed: 200, // 自动递增间隔minimum: 0.3, // 初始化时的最小百分比
})
export default NProgress

修改 Login Mock 数据

src/mock/login/index.ts

  • 将登录的 mock 数据改为随机生成的 token。且 admin 用户和普通用户返回 token 长度不一致
  • 将获取用户信息的 mock 数据改成 admin 用户和普通用户两种

💡 模拟后端解析 token 返回的权限数据,用 token 长度不一致来区分

......
'adminToken|1': [{token: '@STRING( "lower", 24 )',},
],
'zhangsanToken|1': [{token: '@STRING( "lower", 12 )',},
],
'adminInfo|1': [{id: '@INCREMENT()',username: 'admin',name: '超级管理员',avatar: '@IMAGE(100, "#ffc72d", "Code-Bee"),',menus: [{id: 1,name: '权限管理',icon: 'el-icon-menu',children: [{ id: 2, name: '用户管理', path: '/sys/user', component: '/sys/User.vue' },{ id: 3, name: '角色管理', path: '/sys/role', component: '/sys/Role.vue' },{ id: 4, name: '菜单管理', path: '/sys/menu' },],},{id: 5,name: '系统管理',icon: 'el-icon-setting',children: [{ id: 6, name: '系统字典', path: '/sys/dict' },{ id: 7, name: '参数配置', path: '/sys/config' },{ id: 8, name: '通知公告', path: '/sys/notice' },{ id: 9, name: '日志审计', path: '/sys/log' },],},],},
],
'zhangsanInfo|1': [{id: '@INCREMENT()',username: 'zhangsan',name: '张三',avatar: '@IMAGE(100, "#ffc72d", "张三"),',menus: [{id: 1,name: '权限管理',icon: 'el-icon-menu',children: [{ id: 2, name: '用户管理', routeName: 'sys-user', path: '/sys/user', component: '/sys/User.vue' }],},],},
],
......

修改登录逻辑

修改 Login.vue 中登录逻辑,登录成功后将 token 保存到 cookie:

......
const signin = () => {if (!form.username) {errorMessage('用户名为空')} else if (!form.password) {errorMessage('密码为空')} else {loginApi.signin(form).then((res: any) => {// ↓保存tokensetToken(res.data.token)router.push('/')})}
}
......

修改登出逻辑

修改 src/components/layout/header/index.vue 中登出逻辑,登出时将 token 删除:

......
const signout = () => {// ↓将store重置为初始值useUserInfoStore().$reset()// ↓删除tokenremoveToken()router.push('/login')
}
......

动态路由

src\store\user-info.ts保存用户信息到 store 时,动态添加路由:

......
actions: {setAll(userinfo: any) {const { id, username, name, avatar, menus } = userinfothis.id = idthis.username = usernamethis.name = namethis.avatar = avatarthis.menus = menusmenus.forEach((menu: any) => {if (menu.children) {menu.children.forEach((sub: any) => {// ↓动态添加路由router.addRoute('root', {path: sub.path,component: modulesRoutes[`/src/views${sub.component}`],})})}})},
},
......

在路由中添加导航守卫

src/router/index.ts 将添加全局前置守卫(beforeEach)与全局后置钩子(afterEach):

......
// ↓全局前置守卫
router.beforeEach(async (to) => {NProgress.start()// ↓如果请求地址不是白名单if (whiteList.indexOf(to.path) === -1) {// ↓如果token存在检查store,否则跳转到登录页if (existToken()) {// ↓从store获取用户信息const userInfoStore = useUserInfoStore()// ↓如果没有用户信息,查询用户信息if (!userInfoStore.id) {// ↓查询成功保存用户信息且跳转到目标页try {await loginApi.userInfo().then((res: any) => {console.log(res)userInfoStore.setAll(res.data)})} catch (error) {// ↓移除token无效removeToken()return { name: 'login', query: { redirect: `${to.path}` } }}}} else {// ↓非白名单且token不存在return { name: 'login', query: { redirect: `${to.path}` } }}}
})// ↓全局后置钩子
router.afterEach(() => {NProgress.done()
})
......

将静态路由用户管理 sys-user 注释,因为该路由已经 mock 了,会动态添加

🎭 结果

  • 未登录时访问首页会自动跳转到登录页
  • 用户登录后可访问首页
  • 如果登录 admin 用户,能看到多个菜单,且能访问用户管理和角色管理页面
  • 如果登录 zhangsan 用户,能看到用户管理菜单且能访问页面,但在浏览器地址栏输入http://127.0.0.1:3000/#/sys/role 访问角色管理页面,会显示404页面:
    在这里插入图片描述

本文为博主原创文章,任何个人、团体、机构转载和摘录,请注明出处。


http://chatgpt.dhexx.cn/article/1laAmU7i.shtml

相关文章

【Vue路由守卫】

Vue路由守卫 Vue路由守卫全局路由守卫全局前置守卫全局后置守卫实例代码: 独享守卫组件内守卫总结 Vue路由守卫 路由守卫,简单理解来说就是,当用户要进行一些操作时,我需要用户的一些信息或数据或行为,我判断过后&…

vue 动态路由实现 后端控制权限时的前端处理

前端思路: 上图中 获取路由信息 ,可以是后端控制的,可以是前端根据用户信息从路由表中筛选的。 此处只讲解后端存储路由信息的情况 组织路由信息 请求后台,获取返回结果,结果有两种可能,一种是组合好的…

vue-router路由权限控制的两种实现方案

前言 最近在抽时间写一套后台管理系统框架模板(vueelement-ui),记录一些问题的解决方案。文章没什么顺序,就想到什么写什么了,也都是之前工作上碰到的问题。 抛出问题 Vue项目路由权限控制怎么实现? 实现…

Vue路由

目录 一、路由的概念 二、事前准备 三、 路由的相关知识点 3.1 路由的基本认识 3.2 路由小案例 3.3 路由模式的切换 3.4 指定路由的渲染位置 3.5 声明式导航 3.5.1 无参模式 3.5.2 传参模式 3.5.3 $route 与$router的区别 3.6 编程式导航 3.6.1 第一种get方…

Vue动态路由使用(后端控制)

使用VUE开发后台管理系统 完全由后端控制左边菜单项思路 在传统开发后台管理系统时,都会涉及权限控制这一功能需求 即:根据不同登录的角色账号来使用该账号拥有的功能,也就是说系统左边的菜单栏不是固定不变的,而是根据登录账号的…

Vue学习:路由

2. 路由 2.1 前端路由的发展历程 2.1.1 认识前端路由 路由其实是网络工程中的一个术语: 在架构一个网络时,非常重要的两个设备就是路由器和交换机。 ​ 当然,目前在我们生活中路由器也是越来越被大家所熟知,因为我们生活中都…

vue权限控制和动态路由

思路 登录:当用户填写完账号和密码后向服务端验证是否正确,验证通过之后,服务端会返回一个token,拿到token之后(我会将这个token存贮到localStore中,保证刷新页面后能记住用户登录状态)&#xf…

Vue 路由权限控制

当我们在做后台管理系统的时候,都会涉及到系统左侧的菜单树如何动态显示的问题。目前基本上都是RBAC的解决方案,即Role-Based Access Control,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了…

【Git CMD】Git常用命令总结

目录 0 git的工作区、暂存区、本地仓库和远程仓库0.1 图解0.2 解析 1 本地仓库1.1 创建版本库1.2 分支1.2.1 查看本地仓库的分支信息1.2.2 创建分支1.2.3 切换分支1.2.4 重命名分支1.2.5 合并分支1.2.6 删除分支 1.3 添加文件到暂存区1.3.1 添加单个文件1.3.2 添加多个文件1.3.…

Git常用命令大全(从入门到使用,学不会评论区骂我)

Git常用命令大全 1:Git全局设置 当安装Git后首先要做的事情是设置用户名称和email地址。这是非常重要的,因为每次Git提交都会使用该用户信息。在Git 命令行中执行下面命令: 设置用户信息 git config --global user.name “你的用户名” …

Git常用命令及方法大全

下面是我整理的常用 Git 命令清单。几个专用名词的译名如下。 Workspace:工作区Index / Stage:暂存区Repository:仓库区(或本地仓库)Remote:远程仓库 本地分支关联远程:git branch --set-upstre…

Git 常用命令大全

一、 Git 常用命令速查 git branch 查看本地所有分支git status 查看当前状态 git commit 提交 git branch -a 查看所有的分支git branch -r 查看远程所有分支git commit -am "init" 提交并且加注释 git remote add origin git192.168.1.119:ndshowgit push origin …

Git常用命令大全

Git常用命令大全 下面是我整理的常用 Git 命令清单。几个专用名词的译名如下。 Workspace:工作区Index / Stage:暂存区Repository:仓库区(或本地仓库)Remote:远程仓库 本地分支关联远程 git branch --set-u…

git常用命令总结

1 git概述 1.1 简介 git是分布式版本控制系统(Distributed Version Control System,简称DVCS),分为两种仓库 :本地仓库和远程仓库。 本地仓库:是在开发人员自己电脑上的Git仓库远程仓库:是在…

20 个最常用的 Git 命令用法说明及示例

在这篇文章中,我将介绍在使用 Git 时最常使用的 20 个命令。 作者 | Sahiti Kappagantula 译者 | 弯月,责编 | 屠敏 出品 | CSDN(ID:CSDNnews) 以下为译文: 以下是这些Git命令: git config git…

Git基本命令大全

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶” 重磅干货&#xff0c;第一时间送达 1、git clone -b <指定分支名> <远程仓库地址> 克隆指定分支 如&#xff1a; git clone -b bestore_master ssh://gitgit-ssh.xxx.com/xxx.git 2、 git bra…

常用git命令总结大全

目录 一、常用命令 1、git init 2、git add 文件名 3、git commit -m “备注” 4、git status 与 git diff 5、git show commit_id 查看某次修改 6、git log 与 git reflow 7、git pull (--rebase) 8、git push (-u) 与 git branch (-u) 9、git reset --hard 与 git…

Git常用命令

这是一篇笔记 //查看某个命令文档 git help <command> git <command> -h git <command> --help1.基本操作 用户配置 git config --global user.name "bettyaner" git config --global user.email bettyaner163.com配置级别 –local&#xff08…

Git 常用命令速查表(收藏大全)

目录 一、新建代码库 二、配置 三、增加/删除/修改文件 四、代码提交 五、分支 六、标签 七、查看信息 八、远程操作 九、撤销 十、其他 名词 master: 默认开发分支 origin: 默认远程版本库 Index / Stage&#xff1a;暂存区 Workspace&#xff1a;工作区 Reposito…

【深度学习】ResNet50

结构 ResNet50结构&#xff1a; 推荐查看&#xff1a;caffe可视化版 resnet50中1x1filter的作用&#xff1a; 1、在shortcut connection block的残差层中使用1x1的fiter先降维&#xff08;channel&#xff09;&#xff0c;然后再使用1x1的fiter升维,使残差层输出与恒等映射…