admin/src/utils/route.ts

111 lines
3.1 KiB
TypeScript

import viewTagsStore from "@/store/viewTags";
import {nextTick} from 'vue'
import {RouteLocationNormalized, RouteLocationNormalizedLoaded} from "vue-router";
import tools from "@/utils/tools";
const modules: Record<string, () => Promise<any>> = import.meta.glob('@/views/**/*.vue')
const notFound = () => import('/src/layout/404.vue')
export function beforeEach(to: RouteLocationNormalized, from: RouteLocationNormalizedLoaded) {
const piMain = document.querySelector('#pi-main');
const viewTags = viewTagsStore()
if (!piMain) {
return false
}
viewTags.updateViewTags({
fullPath: from.fullPath,
scrollTop: piMain.scrollTop
})
}
export function afterEach(to: RouteLocationNormalized) {
const piMain = document.querySelector('#pi-main');
const viewTags = viewTagsStore()
if (!piMain) {
return false
}
nextTick(() => {
// @ts-ignore
const beforeRoute = viewTags.viewTags.filter(v => v.fullPath == to.fullPath)[0];
if (beforeRoute) {
piMain.scrollTop = beforeRoute.scrollTop || 0
}
})
}
//转换
export function filterAsyncRouter(routerMap) {
const accessedRouters = []
routerMap.forEach(item => {
item.meta = item.meta ? item.meta : {};
//处理外部链接特殊路由
if (item.meta.type == 'iframe') {
item.meta.url = item.path;
item.path = `/i/${item.name}`;
}
//MAP转路由对象
var route = {
path: item.path,
name: item.name,
meta: item.meta,
redirect: item.redirect,
children: item.children ? filterAsyncRouter(item.children) : null,
component: loadComponent(item.component)
}
accessedRouters.push(route)
})
return accessedRouters
}
export function loadComponent(component: string) {
// 构建可能的路径
const fullPath = `/src/views/${component}.vue`
const fullPathWithIndex = `/src/views/${component}/index.vue`
// 先尝试直接路径,再尝试添加/index的路径
const module = modules[fullPath] || modules[fullPathWithIndex]
return module || notFound
}
//路由扁平化
export function flatAsyncRoutes(routes, breadcrumb = []) {
let res = []
routes.forEach(route => {
const tmp = {...route}
if (tmp.children) {
let childrenBreadcrumb = [...breadcrumb]
childrenBreadcrumb.push(route)
let tmpRoute = {...route}
tmpRoute.meta.breadcrumb = childrenBreadcrumb
delete tmpRoute.children
res.push(tmpRoute)
let childrenRoutes = flatAsyncRoutes(tmp.children, childrenBreadcrumb)
childrenRoutes.map(item => {
res.push(item)
})
} else {
let tmpBreadcrumb = [...breadcrumb]
tmpBreadcrumb.push(tmp)
tmp.meta.breadcrumb = tmpBreadcrumb
res.push(tmp)
}
})
return res
}
//过滤树
export function treeFilter(tree, func) {
return tree.map(node => ({...node})).filter(node => {
node.children = node.children && treeFilter(node.children, func)
return func(node) || (node.children && node.children.length)
})
}
export function getMenu() {
const apiMenu = tools.data.get("MENU") || [];
let userInfo = tools.data.get("USER_INFO")
let userMenu = treeFilter([], node => {
return node.meta.role ? node.meta.role.filter(item => userInfo.role.indexOf(item) > -1).length > 0 : true
})
return [...userMenu, ...apiMenu]
}