Files
certd/packages/ui/certd-client/src/router/resolve.ts
T
GitHub Actions Bot 6ec697b010 🔱: [client] sync upgrade with 12 commits [trident-sync]
refactor: 1.11.0
refactor: 1.11.0
refactor: 1.11.0
refactor: 1.11.0
refactor: ts化
refactor: ts化
feat: 全面TS化
perf: 全面ts化
refactor: 继续优化ts
perf: ts定义优化
fix: 修复wangeditor无法上传视频的bug
2023-03-16 19:24:01 +00:00

155 lines
3.9 KiB
TypeScript

import LayoutPass from "/src/layout/layout-pass.vue";
import _ from "lodash-es";
import { outsideResource } from "./source/outside";
import { headerResource } from "./source/header";
import { frameworkResource } from "./source/framework";
const modules = import.meta.glob("/src/views/**/*.vue");
let index = 0;
function transformOneResource(resource: any) {
let menu: any = null;
if (resource.meta == null) {
resource.meta = {};
}
const meta = resource.meta;
meta.title = meta.title ?? resource.title ?? "未命名";
if (resource.title == null) {
resource.title = meta.title;
}
if (meta.isMenu === false) {
menu = null;
} else {
menu = _.cloneDeep(resource);
delete menu.component;
}
let route;
if (resource.type !== "menu") {
if (resource.path == null || resource.path.startsWith("https://") || resource.path.startsWith("http://")) {
//没有route
route = null;
} else {
route = _.cloneDeep(resource);
if (route.component && typeof route.component === "string") {
const path = "/src/views" + route.component;
route.component = modules[path];
}
if (route.component == null) {
route.component = LayoutPass;
}
}
}
return {
menu,
route
};
}
export const buildMenusAndRouters = (resources: any) => {
const routes: Array<any> = [];
const menus: Array<any> = [];
for (const item of resources) {
const { menu, route } = transformOneResource(item);
let menuChildren;
let routeChildren;
if (item.children) {
if (item.children.length > 0) {
const ret = buildMenusAndRouters(item.children);
menuChildren = ret.menus;
routeChildren = ret.routes;
}
}
if (menu) {
menus.push(menu);
menu.children = menuChildren;
}
if (route) {
if (route?.meta?.cache !== false) {
if (route.meta == null) {
route.meta = {};
}
route.meta.cache = true;
}
routes.push(route);
route.children = routeChildren;
}
}
setIndex(menus);
return {
routes,
menus
};
};
function setIndex(menus: any) {
for (const menu of menus) {
menu.index = "index_" + index;
index++;
if (menu.children && menu.children.length > 0) {
setIndex(menu.children);
}
}
}
function findMenus(menus: any, condition: any) {
const list: any = [];
for (const menu of menus) {
if (condition(menu)) {
list.push(menu);
}
if (menu.children && menu.children.length > 0) {
const subList = findMenus(menu.children, condition);
for (const item of subList) {
list.push(item);
}
}
}
return list;
}
function filterMenus(menus: any, condition: any) {
const list = menus.filter((item: any) => {
return condition(item);
});
for (const item of list) {
if (item.children && item.children.length > 0) {
item.children = filterMenus(item.children, condition);
}
}
return list;
}
function flatChildren(list: any, children: any) {
for (const child of children) {
list.push(child);
if (child.children && child.children.length > 0) {
flatChildren(list, child.children);
}
child.children = null;
}
}
function flatSubRouters(routers: any) {
for (const router of routers) {
const children: Array<any> = [];
if (router.children && router.children.length > 0) {
flatChildren(children, router.children);
}
router.children = children;
}
return routers;
}
const frameworkRet = buildMenusAndRouters(frameworkResource);
const outsideRet = buildMenusAndRouters(outsideResource);
const headerRet = buildMenusAndRouters(headerResource);
const outsideRoutes = outsideRet.routes;
const frameworkRoutes = flatSubRouters(frameworkRet.routes);
const routes = [...outsideRoutes, ...frameworkRoutes];
const frameworkMenus = frameworkRet.menus;
const headerMenus = headerRet.menus;
export { routes, outsideRoutes, frameworkRoutes, frameworkMenus, headerMenus, findMenus, filterMenus };