当前位置: 首页 > news >正文

Vue Router 实现动态路由的前端操作解析

一.首先需要准备两个数组:


1.基础路由配置
2.所有可能的路由配置(包括嵌套路由)
 

// 基础路由配置
const routes = [
    {
        path: '/',
        name: 'Login',
        component: Login,
        meta: { title: '登录' } // 添加页面标题元数据
    },
    {
        path: '/all',
        name: 'all',
        component: () => import('@/components/all.vue'),
        children: [] // 初始时子路由为空,后续动态添加
    }
];

// 所有可能的路由配置(包括嵌套路由)
const allPossibleRoutes = [
    {
        path: '/home',
        name: 'Home',
        component: () => import('@/views/Home.vue'),
        meta: { title: '首页', requiresAuth: true, role: ['*'] }
    },
    {
        path: '/control',
        name: 'Control',
        component: () => import('@/views/Control.vue'),
        meta: { title: '菜单管理', requiresAuth: true, role: ['2'] }
    },
    {
        path: '/role',
        name: 'Role',
        component: () => import('@/views/Role.vue'),
        meta: { title: '角色管理', requiresAuth: true, role: ['1'] }
    },
    {
        path: '/nested',
        name: 'Nested',
        component: () => import('@/views/Nested.vue'),
        meta: { title: '嵌套页面', requiresAuth: true, role: ['1', '2'] },
        children: [
            {
                path: 'subpage1',
                name: 'SubPage1',
                component: () => import('@/views/SubPage1.vue'),
                meta: { title: '子页面1', requiresAuth: true, role: ['1'] }
            },
            {
                path: 'subpage2',
                name: 'SubPage2',
                component: () => import('@/views/SubPage2.vue'),
                meta: { title: '子页面2', requiresAuth: true, role: ['2'] }
            },
            {
                path: 'subpage3',
                name: 'SubPage3',
                component: () => import('@/views/SubPage3.vue'),
                meta: { title: '子页面3', requiresAuth: true, role: ['1', '2'] },
                children: [
                    {
                        path: 'subsubpage1',
                        name: 'SubSubPage1',
                        component: () => import('@/views/SubSubPage1.vue'),
                        meta: { title: '子子页面1', requiresAuth: true, role: ['1'] }
                    }
                ]
            }
        ]
    }
];

二.创建路由实例
 

// 创建路由实例

const router = createRouter({

    history: createWebHistory(import.meta.env.BASE_URL),

    routes: routes

});

三.获取本地存储的 role(用于根据用户角色判断哪个页面显示)

// 获取本地存储的 role
const role = sessionStorage.getItem('role');
console.log('本地存储的 role:', role);

四.递归处理多维数组(嵌套路由)的权限过滤,并添加新路由

const filterNestedRoutes = (routes, role) => {
    return routes.map(route => {
        const newRoute = { ...route };
        const requiredRoles = newRoute.meta?.role || [];
        if (requiredRoles.includes('*') || requiredRoles.includes(role + '')) {
            if (newRoute.children && newRoute.children.length > 0) {
                newRoute.children = filterNestedRoutes(newRoute.children, role);
            }
            return newRoute;
        }
        return null;
    }).filter(route => route !== null);
};

// 权限过滤方法
const filterRoutes = (routes, role) => {
    console.log('全部的路由', routes);
    return filterNestedRoutes(routes, role);
};

// 过滤并添加新路由
const allowedRoutes = filterRoutes(allPossibleRoutes, role);
allowedRoutes.forEach(route => {
    if (route.children && route.children.length > 0) {
        // 如果有子路由,先添加父路由
        router.addRoute('all', route);
        route.children.forEach(childRoute => {
            router.addRoute(route.name, childRoute);
        });
    } else {
        router.addRoute('all', route);
    }
});
console.log(allowedRoutes);
sessionStorage.setItem('allowedRoutes', JSON.stringify(allowedRoutes));


五.添加路由守卫
 

router.beforeEach((to, from, next) => {
    const requiredAuth = to.meta?.requiresAuth;
    const requiredRoles = to.meta?.role || [];
    if (requiredAuth &&!role) {
        // 如果需要认证且没有角色信息,重定向到登录页面
        next('/');
    } else if (requiredAuth && role &&!requiredRoles.includes('*') &&!requiredRoles.includes(role + '')) {
        // 如果需要认证且角色不匹配,重定向到登录页面
        next('/');
    } else {
        next();
    }
});

相关文章:

  • DRM_CLIENT_CAP_UNIVERSAL_PLANES和DRM_CLIENT_CAP_ATOMIC
  • Sentinel[超详细讲解]-1
  • android常用资料
  • 1Panel MCP Server发布,开启AI对话式运维新时代!
  • 基于Hbuilder X的uni-app连接OneNET云平台及AI交互 实战指南(二)——获取数据流模型的数据
  • 算法 | 蜘蛛蜂优化算法原理,公式,应用,算法改进研究综述,matlab代码
  • MyBatis实战笔记
  • MapReduce 的工作原理
  • Electron 开发:获取当前客户端 IP
  • kotlin扩展函数的实现原理
  • 环境 tensorflow ERROR: No matching distribution found for ai-edge-litert
  • 【LeetCode基础算法】链表所有类型
  • 学透Spring Boot — 007. 加载配置
  • 【模拟CMOS集成电路笔记】轨到轨运放(Rail to Rail)基础(附带实例:基于1:3电流镜的轨到轨输入运放)
  • c++绘制爱心[特殊字符] 安装 EasyX 库
  • scala-stwitch分支结构
  • 【从0到1学Docker】Docker学习笔记
  • Java常用工具算法-1--哈希算法(MD5,SHA家族,SHA-256,BLAKE2)
  • 3万字长文详解Android AIDL 接口设计
  • 1.oracle修改配置文件
  • 做网站百度云/网上培训
  • 怎么做赌博网站吗/网络营销介绍
  • vs做动态网站/网站制作多少钱一个
  • 程序员做图网站/百度基木鱼建站
  • 返利网站怎么做的/代写
  • 家政服务公司网站源码/博客是哪个软件