vue-element-admin vue设置动态路由 刷新页面后出现跳转404页面Bug 解决方法

做项目时遇到的这个bug,因为除了跳404之外也没太大影响,之前就一直放着没管,现在项目基本功能实现了,转头处理了一下,现在在这里记录一下解决方法

这个bug的具体情况是:设置了动态路由之后,不同的用户登录之后显示了不同的侧边栏,在侧边栏点击菜单,渲染对应路由页面没有任何问题,但是在动态路由上当我刷新浏览器时会出现404(这种情况只出现在动态路由上,静态路由刷新没问题)。

动态路由设置不成功的可以看我之前的文章:vue-element-template 设置权限管理配置文件 \ vue用户权限管理_vue template设置-CSDN博客

解决方法一

        由于通配路由需要放在整个路由的最后,所以不能放在asyncRouterMap的最后,但是也不能直接放在constantRoutes的最后,因为在动态路由在刷新时会跳转到404,因为刷新是动态路由还没加载进来,但是页面已经进行了跳转,找不到匹配的路由,最后会去到通配路由。

解决方法:

把下面这个路由从constantRoutes的最后一行转移到asyncRoutes的最后一行即可!

// 404 page must be placed at the end !!!
{ path: '*', redirect: '/404', hidden: true }

解决方法二:

        在使用的过程中,加入权限模块后,刷新后权限控制的页面就默认跳转到404页面了,原因是权限控制的路由模块是动态添加进去的,而我的404监听路由是在默认路由里面的,优先级比动态路由要高,所以刷新后默认先被404接管了,改一下,把404监听路由注释掉需要手动在动态路由加载后,再把通配路由加上去,所以有了解决方法二
解决方法二:
src/router/index.js,去静态路由里把404路由注释掉

// 静态路由,所有人可见
export const constantRoutes = [{path: '/login',component: () => import('@/views/login/index'),// hidden为true表示在侧边栏不显示hidden: true},{path: '/',component: Layout,redirect: '/dashboard',// 二级路由children: [{path: 'dashboard',name: 'Dashboard',component: () => import('@/views/dashboard/index'),meta: { title: '首页', icon: 'dashboard' }}]},{path: '/404',component: () => import('@/views/404'),hidden: true},// 把这里注释掉,或者删掉// { path: '*', redirect: '/404', hidden: true }
]

然后修改文件: /src/permission.js,具体位置是下面这段代码中注释后面两行

const res = await store.dispatch('user/getInfo')
let roles = res.info.auth_list
const accessRoutes = await store.dispatch('permission/GenerateRoutes', roles)
let old = JSON.parse(JSON.stringify(router.options))
router.addRoutes(accessRoutes)// 在这动态添加最后的通配路由,确保先有动态路由、再有通配路由,解决动态路由刷新会跳转到404问题
let lastRou = [{ path: '*', redirect: '/404' }]
router.addRoutes(lastRou)let newr = JSON.parse(JSON.stringify(router.options))
next({ ...to, replace: true })

/src/permission.js完整代码【可能每个人的不同,建议对照修改而不是复制】

// 引入路由器router
import router from './router'
// 引入仓库
import store from './store'
// 引入ele的提示组件
import { Message } from 'element-ui'
// 引入交互进度条
import NProgress from 'nprogress' // progress bar
import 'nprogress/nprogress.css' // progress bar style
// 从cookie中获取token,登录了就有cookie
import { getToken } from '@/utils/auth' // get token from cookie
// 得到页面的title
import getPageTitle from '@/utils/get-page-title'// 配置nprogress
NProgress.configure({ showSpinner: false }) // NProgress Configuration// 白名单,不需要登录就能进入的路由
const whiteList = ['/login'] // no redirect whitelist// 全局前置路由守卫
router.beforeEach(async(to, from, next) => {//开启进度条NProgress.start()//给页面的title赋值document.title = getPageTitle(to.meta.title)// 从cookie中拿到token,有的话就放行,determine whether the user has logged inconst hasToken = getToken()if (hasToken) {if (to.path === '/login') {// if is logged in, redirect to the home pagenext({ path: '/' })NProgress.done()} else {// 获取用户信息// const hasGetUserInfo = store.getters.nameconst hasRoles = store.getters.roles && store.getters.roles.length > 0// 权限控制console.log('roles:',store.getters.roles)// if (hasGetUserInfo) {if (hasRoles) {console.log('执行了1')next()} else {console.log('执行了2')try {// get user info 重新获取用户信息// await store.dispatch('user/getInfo')// 权限控制console.log('tore.getters.roles:',store.getters.roles)const { roles } = await store.dispatch('user/getInfo')// 在角色权限基础上生成动态路由表const accessRoutes = await store.dispatch('permission/generateRoutes', roles)console.log('accessRoutes:',accessRoutes)router.options.routes = store.getters.permission_routes // 动态添加可访问路由router.addRoutes(accessRoutes)// 在这动态添加最后的通配路由,确保先有动态路由、再有通配路由,解决动态路由刷新会跳转到404问题let lastRou = [{ path: '*', redirect: '/404' }]router.addRoutes(lastRou)console.log('输出的store:',store)next({...to, replace: true })// next()} catch (error) {// remove token and go to login page to re-loginawait store.dispatch('user/resetToken')Message.error(error || 'Has Error')next(`/login?redirect=${to.path}`)NProgress.done()}}}} else {/* has no token*/if (whiteList.indexOf(to.path) !== -1) {// in the free login whitelist, go directlynext()} else {// other pages that do not have permission to access are redirected to the login page.next(`/login?redirect=${to.path}`)// 关闭进度条NProgress.done()}}
})// 全局后置路由守卫
router.afterEach(() => {// finish progress barNProgress.done()
})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/640045.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FPGA - ZYNQ 基于Axi_Lite的PS和PL交互

前言 在FPGA - ZYNQ 基于EMIO的PS和PL交互中介绍了ZYNQ 中PS端和PL端交互的开发流程,接下来构建基于基于Axi_Lite的PS和PL交互。 开发流程 Axi_Lite从机 在FPGA - AXI4_Lite(实现用户端与axi4_lite之间的交互逻辑)中,详解介绍…

微信小程序:基于MySQL+Nodejs的汽车品牌管理系统

各位好,接上期,今天分享一个通过本地MySQLNodejs服务器实现CRUD功能的微信小程序,一起来看看吧~ 干货!微信小程序通过NodeJs连接MySQL数据库https://jslhyh32.blog.csdn.net/article/details/137890154?spm1001.2014.3001.5502 …

针对窗口数量多导致窗口大小显示受限制的问题,使用滚动条控制窗口

建议:首先观察结果展示,判断是否可以满足你的需求。 目录 1. 问题分析 2. 解决方案 2.1 界面设计 2.2 生成代码 2.3 源码实现 3. 结果展示 1. 问题分析 项目需要显示的窗口数量颇多,主界面中,如果一次性显示全部窗口&#x…

飞书小技巧:markdown导出

文章目录 下载Feishu2Md飞书应用配置配置feishu2md工具绑定应用导出markdown 下载Feishu2Md Feishu2Md 飞书应用配置 进入飞书开发者后台 https://open.feishu.cn/app。 点击“创建企业自建应用”,并填写应用名称等信息。而后点击创建。 PS: 此处作者创建应用名…

面向对象设计与分析40讲(25)中介模式、代理模式、门面模式、桥接模式、适配器模式

文章目录 门面模式代理模式中介模式 之所以把这几个模式放到一起写,是因为它们的界限比较模糊,结构上没有明显的差别,差别只是语义上。 这几种模式在结构上都类似: 代理将原本A–>C的直接调用变成: A–>B–>…

网渲应用领域有哪些?渲染100邀请码1a12

网渲是一种利用云计算技术把本地渲染上传到云端进行的过程,它极大提高了渲染效率,摆脱了本地限制,使用网渲的领域有很多,这里我们列举下。 1、影视制作 在影视制作当中,对于需要大量特效和动画效果的电影来说&#x…

【STM32】嵌入式实验二 GPIO 实验:数码管

实验内容: 编写程序,在数码管上显示自己的学号。 数码管相关电路: PA7对应的应该是段码,上面的图写错了。 注意:选中数码管是低电平选中;并且用74HC595模块驱动输出的段码, 这个模块的学习可以…

太奇怪了!99%的人没见过的Oracle故障:网络恢复后,集群的监听和vip无法启动

故障描述 15:46操作系统日志出现net4、net5网卡down,15:53分钟的网络恢复。网络中断是由于db汇聚交换机出现了问题。 网络恢复后,节点1的监听和vip无法启动。 故障分析 查看grid alert日志可以看到监听资源确实没有正常启动。 由于监听资源是crs的Ora…

有了可视化工具,你定制设计得瑟瑟发抖了吧,其实你想多了。

目前市面上有N多可视化的工具,可以做成可视化大屏,甚至有很多B端系统也附带可视化页面,据此就有很多人开始怀疑我们这些做定制开发的,还有啥生存空间。 其实你真的多虑了,存在即合理,我们承认可视化工具的标…

weblogic反序列化漏洞(CVE-2017-10271)复现

直接用vuluhub搭建现成的靶场做 访问靶场 打开是这样表示成功 想反弹shell 就先开启kali1的nc监听,这就监听2233端口吧 linux:nc -l -p 2233 抓包修改为攻击数据包 ip和端口可以任意修改 反弹的shell 还可以写入文件shell 只需要把提供的poc POS…

URL解析

目录 URIURLURL语法相对URLURL中的转义 现在与未来PURL 在 URL出现之前,人们如果想访问网络中的资源,就需要使用不同的 应用程序,如共享文件需要使用 FTP程序,想要发送邮件必须使用 邮件程序,想要看新闻那只能使用…

Agent 智能体食用指南

Agent 智能体食用指南 三年前都在 ALL in AI,一年前都在 ALL in LLM,现在都在 ALL in AgentAutoGEN分析MetaGPT 分析RAG 分析MOE 多专家分析 三年前都在 ALL in AI,一年前都在 ALL in LLM,现在都在 ALL in Agent 科技圈焦点&…