vue3 如果切换角色后权限不同 怎么清空之前添加动态路由。

news2025/1/21 8:54:23

项目中切换角色后发现会保留前面一个角色的权限,方法一是到login页面,权限重新reload,不过这样确实会影响体验,如果不采用此方案的话,你可以看下我从发现问题到解决问题的思路:

1、首先要找到一个初始状态值,所以我打开login页面,查看当前用到的路由(作为一个初始状态值),如下图

https://img.mukewang.com/szimg/60e4175109523bef13960176.jpg

其实可以看到,这4个路由是基本的路由,其他都是我们动态添加路由,那我们需要做的其实就是在退出登录的时候,将所有的路由恢复到这个初始化状态;

2、有了第一条的思路后,就可以第二步就是应该去查阅vue-router4.0的官方文档,于是找到了下图

https://img.mukewang.com/szimg/60e418a7090ac8fe15381540.jpg

然后尝试了了用removeRoute()的方法来移出路由,发现会将所有home以及home的所有子路由都删除掉,而我们想要达到的效果是,删除除了home还有home名叫wecolme的子路由以外的所有路由,所以这个removeRoute API并不适合(当然你可以先删除再新增路由,只是显得代码有点臃肿),继续寻找方法;

3、有了以上的思路,我们继续看文档,发现了接下来文档的描述,https://img.mukewang.com/szimg/60e4198f09d5aeb715820984.jpg

这便是我的解决思路,可以添加一个同名的路由,这样可以直接覆盖掉之前同名的路由,看到这里,其实就很简单了,只需要添加一个home,和welcome路由即可,所以我们需要做的就是,在单击退出的时候,添加一步操作,如下图:

https://img.mukewang.com/szimg/60e41a5b0966354110060964.jpg

4、测试,效果,当用admin账号登录后,点击退出,在不刷新页面的情况下,登录普通的账号(比如这个账号没有角色管理权限),那么在登录成功之后,如果从url上边直接输入/system/role的话,会直接被拦截,进入熟悉的404页面。

以下是代码router里面的代码

import { createRouter, createWebHashHistory, RouteRecordRaw } from 'vue-router'
import Api from './../api'
import utils from './../utils/utils'
const routes: RouteRecordRaw[] = [
    {
        name: 'HomeAd',
        path: '/',
        redirect: '/welcome',
        component: () => import('../views/HomeAd.vue'),
        children: [
            {
                name: 'WelcomeAd',
                path: '/welcome',
                meta: { title: '欢迎页' },
                component: () => import('../views/WelcomeAd.vue')
            },
			//此处是动态路由
        ]
    },
    {
        name: 'LoginAd',
        path: '/login',
        meta: {
            title: '登录页'
        },
        component: () => import('../views/LoginAd.vue')
    },
    {
        name: '404Ad',
        path: '/404',
        meta: {
            title: '页面不存在'
        },
        component: () => import('../views/404Ad.vue')
    }
]
const router = createRouter({
    routes,
    history: createWebHashHistory()
})
console.log(router.getRoutes());

//重置路由
export function resetRouter(){
    let routers = router.getRoutes()
	console.log(routers);
    routers.map((it:any)=>{
        if(!['LoginAd','404Ad'].includes(it.name)){
            router.removeRoute(it.name)
        }
    })
	console.log(routers);
}

//权限菜单
export async function loadAsyncRoutes() {
    let userInfo = JSON.parse(window.sessionStorage.getItem('userinfo') || '{}')
    if (userInfo.token) {
        try {
            const res: any = await Api.getPermissionMenuList()
            const { menuList } = res
            let routes = utils.generatorRoutes(menuList)
            let modules = import.meta.glob('../views/*vue')
            console.log(modules);
            routes.map((route: any) => {
                let url = `../views/${route.name}.vue`
                route.component = modules[url]
                router.addRoute('HomeAd', route)
            })

        } catch (error) {
            console.log(error);

        }
    }
}

//导航守卫
router.beforeEach(async (to, from, next) => {
    let data: string = window.sessionStorage.getItem('userinfo') || '{}'
    let { token = "" } = JSON.parse(data)
    if (to.name) {
        if (router.hasRoute(to.name)) {
            document.title = to.meta.title as any
            if (!token && to.name != 'LoginAd') {
                next({ name: 'LoginAd', replace: true })
            }
            next()
        } else {
            next('/404')
        }
    } else {
        await loadAsyncRoutes()
        let curRoute = router.getRoutes().filter(v => v.path == to.path)
        if (curRoute?.length) {
            document.title = curRoute[0].meta.title as string
            next({ ...to, replace: true })
        } else {
            next('/404')
        }

    }
})
export default router

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

光耦继电器:实现电气隔离的卓越选择

光耦继电器是一种常用的电子元件,用于实现电气隔离和信号传输。在工业控制、自动化系统和电力电子等领域,光耦继电器具有独特的特点和优势。本文将从可靠性、隔离性、响应速度和适应性等方面对光耦继电器的特点进行概述。 光耦继电器是一种典型的固态继电…

24、springboot的自动配置01--类条件注解@ConditionalOnClass、bean条件注解@ConditionalOnBean

springboot的自动配置 ★ 自动配置 Spring Boot的自动配置通常可根据依赖库自动触发——当Spring Boot检测到项目中包含某些框架的JAR包时,Spring Boot就会触发自动配置。其实通过EnableAutoConfiguration注解来启动▲ 其实你用到SpringBootApplication&#xff0…

vmware添加额外网卡

为vmware虚拟机添加额外网卡 vmware 配置管理界面配置系统内配置查看系统中的网卡状态启用网卡重启网络修改IP地址 vmware 配置管理界面配置 关闭运行的的系统。 编辑虚拟机设置—》添加–》选择网络适配器 选择网络适配器的模式 系统内配置 查看系统中的网卡状态 第一…

使用element UI 的el-upload上传图片并携带参数的用法

直接看代码&#xff1a;前端实现 <div class"upload"><el-uploadclass"upload-demo"name"upload_name":data"{user_name:user_name}"action"http://localhost:8000/api/deal_pest_Image":show-file-list"fal…

Linux学习之iptables规则基本演示

cat /etc/redhat-release看到操作系统是CentOS Linux release 7.6.1810&#xff0c;uname -r看到内核版本是3.10.0-957.el7.x86_64&#xff0c;iptables --version可以看到iptables版本是v1.4.21。 iptables的filter表 iptables -t filter 命令 规则链 规则 动作是iptables的…

实现定时发送天气信息到企微群

场景描述&#xff1a; 每天定时自动发送天气信息到企业微信群。通过Aboter如何实现呢&#xff1f; 步骤&#xff1a; 在【应用市场 > IPaaS应用 】中找到企微群定时发送天气信息的模板应用&#xff0c;点击【安装】。 在【IPaaS应用】流程列表中找到刚安装好的模板应用&…

【UE】Web Browser内嵌网页的使用

零、准备 1.在Edit菜单打开插件界面 搜索Web Browser并勾选&#xff0c;按提示重启引擎。 2.在资源窗口右键创建Widget Blueprint&#xff0c;并打开 3.搜索canvas panel 并拖拽到下方 4.在实验分类中找到Web Browser拖拽到Canvs Panel下 4.选中WebBrowser在右侧细节面板中…

复习1-2天【80天学习完《深入理解计算机系统》】第六天

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

PSM-DID方法stata操作详解:命令代码、样例数据、参考文献

PSM-DID方法stata操作详解&#xff1a;命令、数据、文献 1、内容&#xff1a;PSM-DID方法的Stata数据、命令、文献&#xff1b;传统DID的Stata数据、命令代码、文献&#xff1b;倾向得分匹配的stata数据、命令代码、DID方法需要满足的五个条件检验代码 2、方法说明&#xff1…

用于量子通信和互联网的光量子芯片

近年来&#xff0c;新兴的光量子芯片在量子通信和量子互联网领域取得了重大进展。光量子芯片芯片具有可扩展、稳定和低成本等特点&#xff0c;为微型化应用开辟了新的可能性。 7月14日&#xff0c;一篇发表在《light: science & applications》的文章概述了用于量子通信的光…

Doris2.0时代的一些机遇和挑战!

300万字&#xff01;全网最全大数据学习面试社区等你来&#xff01; 上个周五的时候&#xff0c;Doris官宣了2.0版本&#xff0c;除了在性能上的大幅提升&#xff0c;还有一些特性需要大家特别关注。 根据官网的描述&#xff0c;Doris在下面领域都有了长足进步&#xff1a; 日志…

AI百度文心一言大语言模型接入使用(中国版ChatGPT)

百度文心一言接入使用&#xff08;中国版ChatGPT&#xff09; 一、百度文心一言API二、使用步骤1、接口2、请求参数3、请求参数示例4、接口 返回示例 三、 如何获取appKey和uid1、申请appKey:2、获取appKey和uid 四、重要说明 一、百度文心一言API 基于百度文心一言语言大模型…

【Java】多线程(初阶)

多线程初阶 认识线程线程的概念线程和进程的区别Java 的线程 和 操作系统线程 的关系创建线程方法1 继承Thread类方法2 实现Runnable接口其他变形匿名内部类创建Thread子类对象匿名内部类创建Runnable子类对象lambda表达式创建Runnable子类对象 Thread类及常见方法Thread的常见…

【C语言进阶(3)】高阶指针1

文章目录 字符指针指针数组指针数组的使用 数组指针数组指针的使用 数组传参和指针传参一维数组传参二维数组传参一级指针传参二级指针传参 函数指针 指针的概念 内存单元是有编号的&#xff0c;编号 地址 指针指针本质上是个用来存放地址的变量&#xff0c;地址是唯一的用来…

k-d Tree KD 树 交替建树

这个算法文字不太容易说明白&#xff0c;建议大家看视频&#xff0c;我只是抄下来做个笔记&#xff0c;方便回忆。 视频地址&#xff1a;141 k-d Tree KD 树 交替建树_哔哩哔哩_bilibili KD树的应用 kd树主要应用于多维空间关键数据的搜索&#xff1a; 最邻近搜索&#xff1…

动态规划:最大正方形

题目 在一个由 ‘0’ 和 ‘1’ 组成的二维矩阵内&#xff0c;找到只包含 ‘1’ 的最大正方形&#xff0c;并返回其面积。 示例 1&#xff1a; 输入&#xff1a;matrix [[“1”,“0”,“1”,“0”,“0”],[“1”,“0”,“1”,“1”,“1”],[“1”,“1”,“1”,“1”,“1”]…

Django实现音乐网站 ⑾

使用Python Django框架制作一个音乐网站&#xff0c; 本篇主要是前端开发前的一些必要配置和首页展示开发。 目录 配置应用路由 创建应用路由文件 应用路径加入项目路径 创建项目模板 创建项目及应用模板路径 设置模板路径 设置静态资源路径 创建静态资源路径 配置静态…

ubuntu16编译内核源码并替换

文章目录 1.找到和ubuntu内核版本相同的内核源码包2.下载下面三个文件3.相关步骤4.安装编译环境软件5.报错解决参考&#xff1a; 1.找到和ubuntu内核版本相同的内核源码包 4.15.0-112.113 : linux package : Ubuntu (launchpad.net) 2.下载下面三个文件 3.相关步骤 uname -r …

vue所有UI库通用)tree-select 下拉多选(设置 maxTagPlaceholder 隐藏 tag 时显示的内容,支持鼠标悬浮展示更多

如果可以实现记得点赞分享&#xff0c;谢谢老铁&#xff5e; 1.需求描述 引用的下拉树形结构支持多选&#xff0c;限制选中tag的个数&#xff0c;且超过制定个数&#xff0c;鼠标悬浮展示更多已选中。 2.先看下效果图 3.实现思路 首先根据API文档&#xff0c;先设置maxTagC…

机器人的运动范围

声明 该系列文章仅仅展示个人的解题思路和分析过程&#xff0c;并非一定是优质题解&#xff0c;重要的是通过分析和解决问题能让我们逐渐熟练和成长&#xff0c;从新手到大佬离不开一个磨练的过程&#xff0c;加油&#xff01; 原题链接 机器人的运动范围https://leetcode.c…