Files
gva/web/src/pinia/modules/router.js

122 lines
3.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { asyncRouterHandle } from '@/utils/asyncRouter'
import { emitter } from '@/utils/bus.js'
import { asyncMenu } from '@/api/menu'
import { defineStore } from 'pinia'
import { ref } from 'vue'
const routerListArr = []
const notLayoutRouterArr = []
const keepAliveRoutersArr = []
const nameMap = {}
const formatRouter = (routes, routeMap) => {
routes && routes.forEach(item => {
if ((!item.children || item.children.every(ch => ch.hidden)) && item.name !== '404' && !item.hidden) {
routerListArr.push({ label: item.meta.title, value: item.name })
}
item.meta.btns = item.btns
item.meta.hidden = item.hidden
if (item.meta.defaultMenu === true) {
notLayoutRouterArr.push({
...item,
path: `/${item.path}`,
})
} else {
routeMap[item.name] = item
if (item.children && item.children.length > 0) {
formatRouter(item.children, routeMap)
}
}
})
}
const KeepAliveFilter = (routes) => {
routes && routes.forEach(item => {
// 子菜单中有 keep-alive 的,父菜单也必须 keep-alive否则无效。这里将子菜单中有 keep-alive 的父菜单也加入。
if ((item.children && item.children.some(ch => ch.meta.keepAlive) || item.meta.keepAlive)) {
item.component && item.component().then(val => {
keepAliveRoutersArr.push(val.default.name)
nameMap[item.name] = val.default.name
})
}
if (item.children && item.children.length > 0) {
KeepAliveFilter(item.children)
}
})
}
export const useRouterStore = defineStore('router', () => {
const keepAliveRouters = ref([])
const setKeepAliveRouters = (history) => {
const keepArrTemp = []
history.forEach(item => {
if (nameMap[item.name]) {
keepArrTemp.push(nameMap[item.name])
}
})
keepAliveRouters.value = Array.from(new Set(keepArrTemp))
}
emitter.on('setKeepAlive', setKeepAliveRouters)
const asyncRouters = ref([])
const routerList = ref(routerListArr)
const routeMap = ({})
// 从后台获取动态路由
const SetAsyncRouter = async() => {
const baseRouter = [{
path: '/layout',
name: 'layout',
component: 'view/layout/index.vue',
meta: {
title: '底层layout'
},
children: []
}]
const asyncRouterRes = await asyncMenu()
const asyncRouter = asyncRouterRes.data.menus
asyncRouter && asyncRouter.push({
path: '404',
name: '404',
hidden: true,
meta: {
title: '迷路了*。*',
closeTab: true,
},
component: 'view/error/index.vue'
}, {
path: 'reload',
name: 'Reload',
hidden: true,
meta: {
title: '',
closeTab: true,
},
component: 'view/error/reload.vue'
})
formatRouter(asyncRouter, routeMap)
baseRouter[0].children = asyncRouter
if (notLayoutRouterArr.length !== 0) {
baseRouter.push(...notLayoutRouterArr)
}
baseRouter.push({
path: '/:catchAll(.*)',
redirect: '/layout/404'
})
asyncRouterHandle(baseRouter)
KeepAliveFilter(asyncRouter)
asyncRouters.value = baseRouter
routerList.value = routerListArr
return true
}
return {
asyncRouters,
routerList,
keepAliveRouters,
SetAsyncRouter,
routeMap
}
})