FPF   付鹏篚的笔记
  • 主页
  • 归档
  • 分类
  • 标签
  • 关于

付鹏篚

  • 主页
  • 归档
  • 分类
  • 标签
  • 关于
Quiet主题
  • 配置
  • addRoutes
  • Router

Vue 动态路由配置与权限控制

付鹏篚
Vue

2023-01-02 20:00:00

文章目录
  1. Vue 动态路由配置与权限控制
    1. 一、基础概念
      1. 1. 静态路由与动态路由
      2. 2. 动态路由的场景
    2. 二、路由配置
      1. 1. 静态路由配置
      2. 2. 动态路由配置
    3. 三、动态路由实现
      1. 1. 根据用户权限动态添加路由
        1. 用户权限加载并动态添加路由
        2. treeToList 函数(将树状结构转换为扁平化列表)
      2. 2. 在 router.js 中动态添加路由
      3. 3. 路由守卫(Router Guards)
    4. 四、总结

Vue 动态路由配置与权限控制

在单页应用(SPA)中,动态路由允许根据用户权限、角色等动态地生成和管理路由。动态路由配置使得不同权限的用户能够访问不同的页面,同时也确保了未授权用户无法访问敏感页面。

一、基础概念

1. 静态路由与动态路由

  • 静态路由:这些路由是在应用启动时预先定义的,无论用户的权限如何,都会加载这些路由。
  • 动态路由:这些路由根据用户权限动态生成。通常,只有用户具备某种权限时,才会在路由表中添加相应的路由。

2. 动态路由的场景

  • 用户权限控制:根据用户角色动态生成路由,确保不同角色的用户只能访问自己有权限的页面。
  • 菜单权限控制:通过动态路由控制菜单显示,防止用户通过修改 URL 访问没有权限的页面。

二、路由配置

1. 静态路由配置

静态路由是始终存在的路由,不会根据用户权限变化而变化。比如登录、404 页面等。

// router.js

// 静态路由
export const constantRouterMap = [
  {
    path: '/',
    redirect: '/dashboard'
  },
  {
    path: '/login',
    name: 'Login',
    component: () => import('@/views/Login')
  },
  {
    path: '/404',
    name: '404',
    component: () => import('@/views/404')
  }
]

2. 动态路由配置

动态路由是在用户登录后,根据用户的角色或权限动态生成的。通常动态路由会在用户登录后通过 API 获取。

// router.js

// 动态路由
export const asyncRouterMap = [
  {
    path: '/dashboard',
    name: 'Dashboard',
    component: () => import('@/views/Dashboard'),
    meta: { title: '工作台' }
  },
  {
    path: '/user',
    name: 'User',
    component: () => import('@/views/User'),
    meta: { title: '用户管理' }
  },
  {
    path: '/settings',
    name: 'Settings',
    component: () => import('@/views/Settings'),
    meta: { title: '系统设置' }
  }
]

三、动态路由实现

1. 根据用户权限动态添加路由

通过获取用户的权限信息,我们可以根据权限动态地添加路由。在 Vue 中,使用 router.addRoutes() 方法可以动态添加新的路由。

用户权限加载并动态添加路由

假设我们已经从服务器获取了用户的菜单权限数据,接下来将动态生成路由并添加到 Vue Router。

// store.js

// 动态加载用户菜单
addUserMenus({ commit }, menus) {
  commit('setMenuList', menus);

  // 扁平化菜单数据
  const menuList = treeToList(menus);
  const addRoutes = [];

  asyncRouterMap.forEach(route => {
    const tempList = route.children.filter(child => 
      menuList.some(menu => menu.url === child.path)
    );

    if (tempList.length > 0) {
      addRoutes.push({ ...route, children: tempList });
    }
  });

  // 动态添加路由
  router.addRoutes(addRoutes);
}

treeToList 函数(将树状结构转换为扁平化列表)

// utils.js

/**
 * 将树形结构转换为列表
 * @param {Array} tree 树形结构的数据
 * @param {String} childKey 子节点的键名
 * @returns {Array} 扁平化的列表
 */
export function treeToList(tree, childKey = 'children') {
  let stack = [...tree];
  const result = [];

  while (stack.length) {
    const node = stack.shift();
    result.push(node);

    if (node[childKey]) {
      stack.push(...node[childKey]);
    }
  }

  return result;
}

2. 在 router.js 中动态添加路由

在 Vue 中,我们可以通过 router.addRoutes() 方法将动态生成的路由添加到现有的路由表中。

// router.js

import Vue from 'vue'
import Router from 'vue-router'
import { constantRouterMap } from './staticRoutes'

Vue.use(Router)

const router = new Router({
  routes: constantRouterMap
})

export default router

3. 路由守卫(Router Guards)

为了防止用户直接访问没有权限的页面,可以使用路由守卫来检查用户是否有权限访问该路由。如果没有权限,跳转到 404 或者其他页面。

// router.js

router.beforeEach((to, from, next) => {
  const user = store.state.user;

  // 判断用户是否已登录
  if (!user) {
    if (to.path !== '/login') {
      return next({ path: '/login' });
    }
  } else {
    // 判断用户是否有权限访问该页面
    if (to.meta && to.meta.permission && !user.permissions.includes(to.meta.permission)) {
      return next({ path: '/404' });
    }
  }

  next();
});

四、总结

  • 静态路由:在应用启动时就已经定义,始终有效。
  • 动态路由:根据用户的权限动态生成,通常在用户登录后根据角色或权限来加载相应的路由。
  • 路由守卫:用于控制路由的访问权限,确保用户只能访问有权限的页面。

通过结合静态路由、动态路由和路由守卫,我们可以高效地管理 Vue 应用中的路由和用户权限,确保应用的安全性和灵活性。

上一篇

tampermonkey油猴

下一篇

内网穿透配置与使用指南

©2025 By 付鹏篚. 主题:Quiet
Quiet主题