第二十七节:进阶:路由权限控制 + 404 / 401 全局异常页面开发

发布时间:2026/9/6 2:19:59

第二十七节:进阶:路由权限控制 + 404 / 401 全局异常页面开发
第二十七节进阶路由权限控制 404 / 401 全局异常页面开发本节目标开发 404 页面页面不存在、401 无权限页面完善路由守卫实现路由权限校验区分登录校验、角色 / 权限校验、不存在页面跳转逻辑处理白名单路由登录页不用登录也能访问模拟无权限访问页面跳转 401访问不存在路由跳转 404前面v‑perm控制按钮显示隐藏路由权限控制整个页面能不能进。步骤 1新建两个异常页面① src/views/error/404.vuetemplate div classerror-page div classcode404/div div classdesc抱歉你访问的页面不存在/div el-button typeprimary click$router.push(/dashboard)返回工作台/el-button /div /template script setup/script style scoped .error-page{ height: 100%; display:flex; flex-direction:column; align-items:center; justify-content:center; } .code{ font-size:80px; font-weight:bold; color:#909399; } .desc{ font-size:16px; color:#666; margin:16px 0 24px; } /style② src/views/error/401.vuetemplate div classerror-page div classcode401/div div classdesc抱歉你没有权限访问该页面/div el-button typeprimary click$router.push(/dashboard)返回工作台/el-button /div /template script setup/script style scoped .error-page{ height: 100%; display:flex; flex-direction:column; align-items:center; justify-content:center; } .code{ font-size:80px; font-weight:bold; color:#E6A23C; } .desc{ font-size:16px; color:#666; margin:16px 0 24px; } /style步骤 2配置路由 src/router/index.jsimport { createRouter, createWebHistory } from vue-router import Layout from /layout/index.vue // 常量路由所有用户都可以访问不需要权限 export const constantRoutes [ { path: /login, component: () import(/views/login/index.vue), meta: { title: 登录 } }, { path: /, component: Layout, redirect: /dashboard, children: [ { path: /dashboard, component: () import(/views/dashboard/index.vue), meta: { title: 工作台, icon: DataBoard } } ] }, // 无权限页面 { path: /401, component: () import(/views/error/401.vue) }, // 404页面必须放在路由数组最后 { path: /:pathMatch(.*)*, component: () import(/views/error/404.vue) } ] // 需要权限的业务路由后续动态追加 export const asyncRoutes [ { path: /system, component: Layout, meta: { title: 系统管理, icon: Setting }, children: [ { path: user, component: () import(/views/system/user/index.vue), meta: { title: 用户管理, icon: User } } ] } ] const router createRouter({ history: createWebHistory(), routes: constantRoutes }) export default router步骤 3编写路由守卫 src/permission.js新建src/permission.js全局路由拦截逻辑import router from /router import { useUserStore } from /stores/user // 白名单不需要登录就可以访问的页面 const whiteList [/login,/401,/404] router.beforeEach(async(to, from, next) { const userStore useUserStore() const token userStore.token // 1、有token已经登录 if(token){ if(to.path /login){ // 已经登录访问登录页直接跳工作台 next(/dashboard) }else{ // 判断是否已经获取用户信息 if(!userStore.username){ try { // 这里可以调用接口获取用户信息存入pinia // await getUserInfoApi() // 把动态权限路由追加到路由表 // router.addRoute(asyncRoutes) next({ ...to, replace:true }) }catch(err){ // token失效清空状态回到登录 userStore.logout() next(/login) } }else{ // 已拿到用户信息放行 next() } } }else{ // 2、没有token未登录 if(whiteList.includes(to.path)){ // 在白名单直接放行 next() }else{ // 不在白名单跳登录页 next(/login) } } })步骤 4在 main.js 引入 permission让守卫生效import { createApp } from vue import App from ./App.vue import /permission // ✅导入路由守卫必须写在createApp之前 import ElementPlus from element-plus import element-plus/dist/index.css import * as ElementPlusIconsVue from element-plus/icons-vue import { perm } from /directive/perm const app createApp(App) for (const [key, component] of Object.entries(ElementPlusIconsVue)) { app.component(key, component) } app.directive(perm, perm) app.use(ElementPlus) app.mount(#app)步骤 5动态路由追加重点根据权限动态挂载路由现在所有路由全部写死真正后台项目登录拿到用户权限再调用router.addRoute把有权限的路由注册进去。修改src/permission.js演示动态路由逻辑import router from /router import { useUserStore } from /stores/user import { asyncRoutes } from /router const whiteList [/login,/401,/404] // 模拟过滤路由根据用户权限过滤出可以访问的路由 function filterAsyncRoutes(routes, permissions){ const res [] routes.forEach(route { const temp { ...route } // 简单演示如果是admin直接全部放行 res.push(temp) }) return res } router.beforeEach(async(to, from, next) { const userStore useUserStore() const token userStore.token if(token){ if(to.path /login){ next(/dashboard) }else{ if(!userStore.username){ try { // 模拟登录后获取用户信息这里是mock已经存好 // 根据权限过滤动态路由 const accessRoutes filterAsyncRoutes(asyncRoutes, userStore.permissions) // 将过滤后的路由添加进路由实例 accessRoutes.forEach(item{ router.addRoute(item) }) // addRoute之后必须带上replace:true防止路由404 next({ ...to, replace:true }) }catch(err){ userStore.logout() next(/login) } }else{ next() } } }else{ if(whiteList.includes(to.path)){ next() }else{ next(/login) } } })✅测试验证清单未登录状态直接访问/dashboard、/system/user自动跳转到登录页面访问不存在地址例如http://localhost:5173/xxxabc跳转到 404 页面访问 /401正常渲染无权限页面登录成功动态路由/system/user被 addRoute 注册侧边栏自动渲染系统管理菜单已经登录后手动访问/login自动跳转到工作台关键知识点/:pathMatch(.*)*404 路由必须放在路由数组最后如果写在前面所有页面都会命中 404。router.addRoute()添加动态路由之后next({...to,replace:true})必不可少否则新增路由会报 404。白名单路由不需要 token 也能进入。前端路由权限只是拦截跳转接口层面依旧需要后端做权限校验。踩坑点/permission需要在 main.js 尽早导入要在createApp(App)之前引入守卫才生效。刷新页面 pinia 状态丢失搭配 pinia 持久化插件token、用户信息刷新页面不丢失。

相关新闻

量化加剪枝把推理延迟从 200ms 降到 240ms,我补完深度学习入门才查到模型里的那个死胡同

量化加剪枝把推理延迟从 200ms 降到 240ms,我补完深度学习入门才查到模型里的那个死胡同

2026/9/6 2:19:59

量化加剪枝把推理延迟从 200ms 降到 240ms,我补完深度学习入门才查到模型里的那个死胡同 领导给的时间只够改一版模型,我拍胸脯说量化加剪枝能把推理延迟压到 50ms 以内。INT8 量化跑完,模型尺寸直接砍到三分之一,结构化剪枝砍掉 60% 的通道,单次推理的参数量比原版少了一大半…

【Vector DB】Milvus快速上手介绍

【Vector DB】Milvus快速上手介绍

2026/9/6 2:19:59

它是目前全球最流行的开源向量数据库之一,由 Zilliz 开发并捐赠给 LF AI & Data 基金会。 在 AI 和大模型(LLM)时代,Milvus 扮演着“长期记忆”和“语义搜索引擎”的关键角色。下面我将从定义、SQL 映射、解决的问题以及优缺点…

大语言模型工程化落地:5个核心方法与Python代码实操

大语言模型工程化落地:5个核心方法与Python代码实操

2026/9/6 2:19:59

大语言模型本质上是一个基于深度学习的概率模型,可以将其理解为一台超级文字接龙机器。它通过阅读海量文本,学习词语之间的概率分布,从而预测下一个最可能出现的词。要真正用好这台机器,我们需要掌握从基础交互到工程化落地的具体…

用Skill给AI安排岗位:30+技能归并成8个角色的AI团队实战

用Skill给AI安排岗位:30+技能归并成8个角色的AI团队实战

2026/9/6 3:20:01

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

Scout Bowie:基于Sleeper API的梦幻体育选秀与阵容优化实战

Scout Bowie:基于Sleeper API的梦幻体育选秀与阵容优化实战

2026/9/6 3:20:01

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

SSH客户端自带SFTP够用吗?四款主流工具深度对比与选型指南

SSH客户端自带SFTP够用吗?四款主流工具深度对比与选型指南

2026/9/6 3:20:01

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

动力电池Pack设计全解:从热管理到CCS电芯连接系统

动力电池Pack设计全解:从热管理到CCS电芯连接系统

2026/9/6 3:20:01

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

推荐一款开源局域网 TV 投屏助手:DLNA m3u8 + 浏览器 Network 检测

推荐一款开源局域网 TV 投屏助手:DLNA m3u8 + 浏览器 Network 检测

2026/9/6 3:20:01

做局域网投屏的时候,我常遇到两类麻烦:电视在同一 Wi-Fi 里,但手机找不到;网页里明明有 HLS 流,却要把 m3u8 从开发者工具里抠出来再手动填。TV 投屏助手把这两步收进同一个 App:扫描局域网电视&#xff0c…

基于MLP的反派角色实力评估:机器学习在动漫游戏数据分析中的应用

基于MLP的反派角色实力评估:机器学习在动漫游戏数据分析中的应用

2026/9/6 3:10:01

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

中国人民大学杨琳团队《Nature Communications》 | 全球潮汐湿地土壤有机碳时空格局与环境驱动:一项2009-2020年的全球评估

中国人民大学杨琳团队《Nature Communications》 | 全球潮汐湿地土壤有机碳时空格局与环境驱动:一项2009-2020年的全球评估

2026/9/6 1:19:56

本文首发于“生态学者”!从“湿地面积”到“土壤碳密度”:为什么需要重新认识潮汐湿地蓝碳变化?潮汐湿地位于陆地与海洋的交汇地带,包括红树林、盐沼和潮滩,是全球重要的蓝碳生态系统。其土壤能够长期储存大量有机碳&a…

adb抓包

adb抓包

2026/9/6 1:19:56

前言 本文介绍如何通过 tcpdump 在 Android 手机上抓取网络数据包,并在电脑端使用 Wireshark 进行分析。适用于需要排查 App 网络请求、分析接口调用或调试网络问题的开发与测试场景。1. 手机要有 root 权限2. 下载 tcpdump3. adb push C:\Users\zhangkuixun\Downlo…

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战

2026/9/6 1:19:56

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战 在云原生基础设施中,容器镜像体积直接决定了服务的部署速度与弹性扩容敏捷度。对于传统的 Go / Java 微服务,镜像体积通常被严格控制在 50MB 到 200MB 以内,拉取镜像只…

中国人民大学杨琳团队《Nature Communications》 | 全球潮汐湿地土壤有机碳时空格局与环境驱动:一项2009-2020年的全球评估

中国人民大学杨琳团队《Nature Communications》 | 全球潮汐湿地土壤有机碳时空格局与环境驱动:一项2009-2020年的全球评估

2026/9/6 1:19:56

本文首发于“生态学者”!从“湿地面积”到“土壤碳密度”:为什么需要重新认识潮汐湿地蓝碳变化?潮汐湿地位于陆地与海洋的交汇地带,包括红树林、盐沼和潮滩,是全球重要的蓝碳生态系统。其土壤能够长期储存大量有机碳&a…

adb抓包

adb抓包

2026/9/6 1:19:56

前言 本文介绍如何通过 tcpdump 在 Android 手机上抓取网络数据包,并在电脑端使用 Wireshark 进行分析。适用于需要排查 App 网络请求、分析接口调用或调试网络问题的开发与测试场景。1. 手机要有 root 权限2. 下载 tcpdump3. adb push C:\Users\zhangkuixun\Downlo…

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战

2026/9/6 1:19:56

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战 在云原生基础设施中,容器镜像体积直接决定了服务的部署速度与弹性扩容敏捷度。对于传统的 Go / Java 微服务,镜像体积通常被严格控制在 50MB 到 200MB 以内,拉取镜像只…

远程协作的工作台整理

远程协作的工作台整理

2026/9/3 6:56:24

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/4 7:42:10

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/5 23:14:13

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…