Skip to content

安装

bash
pnpm add vue-router -S

路由插件

useRouterPlugin为框架提供默认路由插件源码

javascript
import {createRouter, createWebHistory} from "vue-router"
import {defaultBuiltRouter} from "@/packages/router/routes.js";

export class RouterPlugin {
    constructor() {
        this.name = 'RouterPlugin'
    }

    install({ctx}, options = {}) {
        const {router, ...args} = options;
        ctx.router = router || createRouter({  // 如果有router,则使用router,否则使用默认的router
            history: createWebHistory(options.base || '/'), // 默认使用History模式
            routes: ctx.helpers.deepMergeArrays(defaultBuiltRouter, options.routes || []), // 合并默认路由与用户配置路由
            ...args // 其他参数可以覆盖默认配置
        });
        ctx.app.use(ctx.router)
    }
}

export const useRouterPlugin = new RouterPlugin()

使用Hash模式

用法根正常使用Vue-Router一致

javascript
import {createRouter, createWebHashHistory} from "vue-router"
import install from "vue-bag-admin"
const {app, framework, plugins} = install()

const files = import.meta.glob(`@/app/views/*/*.vue`, {eager: true})
framework.use(plugins.useRouterPlugin, {
    files,
    history: createWebHashHistory(),
    routes: [] // 自定义路由
})
app.mount('#app')

传递Router对象

javascript
import install from "vue-bag-admin"
const {app, framework, plugins} = install()
import {createRouter, createWebHashHistory} from "vue-router"

const routes = [
    {
        path: '/',
        component: () => import('@/layouts/index.vue'),
        children: [
            {
                path: '/home',
                name: 'home',
                component: () => import('@/app/views/home/index.vue'),

            }, {
                path: '/about',
                name: 'about',
                component: () => import('@/app/views/about/index.vue'),
            }]
    },
    {
        path: '/test',
        name: 'test',
        component: () => import('@/app/views/home/index.vue'),

    },
]
const router = createRouter({
    history: createWebHashHistory(),
    routes,
})
const files = import.meta.glob(`@/app/views/*/*.vue`, {eager: true})
framework.use(plugins.useRouterPlugin, {
    files,
    router
})
app.mount('#app')

File对象

通过传递files对象,框架就能寻找到外部文件,根据文件规则生成相对应的路由,一般作用于配合菜单使用

javascript
import install from "vue-bag-admin"
const {app, framework, plugins} = install()

const files = import.meta.glob(`@/app/views/*/*.vue`, {eager: true})
framework.use(plugins.useRouterPlugin, {
    files,
})
app.mount('#app')

handleMenus

获取菜单数据,可以通过接口获取菜单数据,也可以通过传递一个数组来获取菜单数据

该函数类型可以是一个函数返回一个Promise,也可以是一个数组

javascript
import install from "vue-bag-admin"
const {app, framework, plugins} = install()

framework.use(plugins.useRouterPlugin, {
    files,
    handleMenus: ({ctx}) => {
        // 使用了API插件获取数据
        return ctx.apis.Menus.httpGet({'pagination[limit]': '-1'}) // 从接口获取菜单数据
    }
})

framework.use(plugins.useRouterPlugin, {
    files,
    handleMenus: [
        {
            id: 1,
            title: '首页',
            localesKey: 'home',
            file: '/src/app/views/home/index.vue',
            path: '/home',
            name: 'home',
            icon: 'BookOutline',
            hasClose: false,
            sort: 100,
            hasMenu: false,
            hasRouter: false,
            overlayRouting: false,
            children: []
        },
        {
            id: 2,
            title: '用户管理',
            localesKey: 'userManagement',
            file: '/src/app/views/user/index.vue',
            path: '/user',
            name: 'user',
            icon: 'BookOutline',
            hasClose: true,
            hasMenu: false,
            hasRouter: false,
            overlayRouting: false,
            children: []
        },
    ],
})
app.mount('#app')

handleGroups

框架应用分类获取菜单数据,可以通过接口获取菜单数据,也可以通过传递一个数组来获取菜单数据

javascript
framework.use(plugins.useRouterPlugin, {
    files,
    handleGroups: ({ctx}) => {
        // 使用方式同上
    }
})

插件参数说明

属性类型说明
filesObject通过import.meta.glob获取
errorRouteObject错误路由的面
handleMenusArray/Promise返回菜单数组,或者一个Promise(适用于网络接口)
handleGroupsArray/Promise返回菜单分组,或者返回一个Promise(适用于网络接口)
baseStringvue-router参数保持一致
......更多属性跟vue-router参数保持一致

菜单属性说明

属性类型说明
idnumber菜单id
titlestring菜单名称
localesKeystring菜单名称的国际化key
filestring菜单对应的文件路径
pathstring菜单对应的路径
namestring菜单对应的路由名称
iconstring菜单对应的图标
hasCloseboolean是否有关闭按钮
sortnumber菜单排序
hasMenuboolean是否有菜单
hasRouterboolean是否有路由
hasTabboolean是否有tab
rootstring路由布局,默认layout
keepAliveboolean是否缓存路由
overlayRoutingboolean是否覆盖路由
childrenarray子菜单数据
extrastirng角标