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();
    }
});

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值