路由配置

Zap Admin Vue3使用Vue Router处理路由管理,支持动态路由、路由守卫和权限控制。

基础路由配置

路由配置文件位于 src/router/ 目录下,采用模块化管理方式。

// src/router/index.js
import { createRouter, createWebHistory } from 'vue-router'
import baseRoutes from './routes/base'
import adminRoutes from './routes/admin'

const router = createRouter({
  history: createWebHistory(),
  routes: [
    ...baseRoutes,
    ...adminRoutes
  ]
})

export default router

路由模块示例

// src/router/routes/admin.js
export default [
  {
    path: '/admin',
    component: () => import('@/layouts/AdminLayout.vue'),
    meta: {
      requiresAuth: true,
      title: '管理后台'
    },
    children: [
      {
        path: 'dashboard',
        name: 'Dashboard',
        component: () => import('@/views/admin/Dashboard.vue'),
        meta: {
          title: '仪表盘',
          icon: 'dashboard'
        }
      },
      // 其他子路由...
    ]
  }
]

路由守卫

使用路由守卫实现登录验证、权限控制等功能。

// src/router/guards.js
import { useUserStore } from '@/stores/user'
import { usePermissionStore } from '@/stores/permission'

export function setupRouterGuards(router) {
  router.beforeEach(async (to, from, next) => {
    const userStore = useUserStore()
    const permissionStore = usePermissionStore()

    // 检查是否需要登录
    if (to.meta.requiresAuth && !userStore.isLoggedIn) {
      next({ name: 'Login', query: { redirect: to.fullPath } })
      return
    }

    // 检查权限
    if (to.meta.permission) {
      if (!permissionStore.hasPermission(to.meta.permission)) {
        next({ name: '403' })
        return
      }
    }

    // 设置页面标题
    if (to.meta.title) {
      document.title = `${to.meta.title} - Zap Admin`
    }

    next()
  })
}

动态路由

根据用户角色和权限动态生成路由配置。

// src/stores/permission.js
import { defineStore } from 'pinia'
import { asyncRoutes } from '@/router/routes/async'

export const usePermissionStore = defineStore('permission', {
  state: () => ({
    routes: []
  }),
  actions: {
    async generateRoutes(roles) {
      // 过滤异步路由表
      const accessedRoutes = filterAsyncRoutes(asyncRoutes, roles)
      this.routes = accessedRoutes
      return accessedRoutes
    }
  }
})

// 根据角色过滤路由
function filterAsyncRoutes(routes, roles) {
  const res = []
  routes.forEach(route => {
    const tmp = { ...route }
    if (hasPermission(roles, tmp)) {
      if (tmp.children) {
        tmp.children = filterAsyncRoutes(tmp.children, roles)
      }
      res.push(tmp)
    }
  })
  return res
}

路由元信息

通过路由的meta字段配置额外信息:

  • requiresAuth: 是否需要登录
  • permission: 所需权限
  • title: 页面标题
  • icon: 菜单图标
  • keepAlive: 是否缓存页面

路由工具函数

提供了一些常用的路由工具函数:

// src/utils/route.js
export function flattenRoutes(routes) {
  let flatRoutes = []
  routes.forEach(route => {
    if (route.children) {
      flatRoutes = flatRoutes.concat(flattenRoutes(route.children))
    } else {
      flatRoutes.push(route)
    }
  })
  return flatRoutes
}

export function findRouteByName(name, routes) {
  const flatRoutes = flattenRoutes(routes)
  return flatRoutes.find(route => route.name === name)
}