123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- import { isUrl } from '@v-c/utils'
- import { omit } from 'lodash'
- import { basicRouteMap, getRouterModule } from './router-modules.js'
- import dynamicRoutes from '~@/router/dynamic-routes'
- import { ROOT_ROUTE_REDIRECT_PATH } from '~@/router/constant'
- import { i18n } from '~@/locales'
- let cache_key = 1
- const getCacheKey = () => `Cache_Key_${cache_key++}`
- function renderTitle(route) {
- const { title, locale } = route.meta || {}
- if (!title)
- return ''
- return locale ? i18n.global.t(locale) : title
- }
- function formatMenu(route, path) {
- return {
- id: route.meta?.id,
- parentId: route.meta?.parentId,
- title: () => renderTitle(route),
- icon: route.meta?.icon || '',
- path: path ?? route.path,
- hideInMenu: route.meta?.hideInMenu || false,
- parentKeys: route.meta?.parentKeys || [],
- hideInBreadcrumb: route.meta?.hideInBreadcrumb || false,
- hideChildrenInMenu: route.meta?.hideChildrenInMenu || false,
- locale: route.meta?.locale,
- keepAlive: route.meta?.keepAlive || false,
- name: route.name,
- url: route.meta?.url || '',
- target: route.meta?.target || '_blank',
- }
- }
- export function genRoutes(routes, parent) {
- const menuData = []
- routes.forEach((route) => {
- let path = route.path
- if (!path.startsWith('/') && !isUrl(path)) {
- if (parent)
- path = `${parent.path}/${path}`
- else
- path = `/${path}`
- }
- if (!route.name)
- route.name = getCacheKey()
- const item = formatMenu(route, path)
- item.children = []
- if (route.children && route.children.length)
- item.children = genRoutes(route.children, item)
- if (item.children?.length === 0)
- delete item.children
- menuData.push(item)
- })
- return menuData
- }
- export function generateTreeRoutes(menus) {
- const routeDataMap = /* @__PURE__ */ new Map()
- const menuDataMap = /* @__PURE__ */ new Map()
- for (const menuItem of menus) {
- if (!menuItem.id)
- continue
- const route = {
- path: menuItem.path,
- name: menuItem.name || getCacheKey(),
- component: getRouterModule(menuItem.component),
- redirect: menuItem.redirect || void 0,
- meta: {
- title: menuItem?.title,
- icon: menuItem?.icon,
- keepAlive: menuItem?.keepAlive,
- id: menuItem?.id,
- parentId: menuItem?.parentId,
- affix: menuItem?.affix,
- parentKeys: menuItem?.parentKeys,
- url: menuItem?.url,
- hideInMenu: menuItem?.hideInMenu,
- hideChildrenInMenu: menuItem?.hideChildrenInMenu,
- hideInBreadcrumb: menuItem?.hideInBreadcrumb,
- target: menuItem?.target,
- locale: menuItem?.locale,
- },
- }
- const menu = formatMenu(route)
- routeDataMap.set(menuItem.id, route)
- menuDataMap.set(menuItem.id, menu)
- }
- const routeData = []
- const menuData = []
- for (const menuItem of menus) {
- if (!menuItem.id)
- continue
- const currentRoute = routeDataMap.get(menuItem.id)
- const currentItem = menuDataMap.get(menuItem.id)
- if (!menuItem.parentId) {
- if (currentRoute && currentItem) {
- routeData.push(currentRoute)
- menuData.push(currentItem)
- }
- }
- else {
- const pRoute = routeDataMap.get(menuItem.parentId)
- const pItem = menuDataMap.get(menuItem.parentId)
- if (currentItem && currentRoute && pRoute && pItem) {
- if (pRoute.children && pItem.children) {
- pRoute.children.push(currentRoute)
- pItem.children.push(currentItem)
- }
- else {
- pItem.children = [currentItem]
- pRoute.children = [currentRoute]
- }
- }
- }
- }
- return {
- menuData,
- routeData,
- }
- }
- export async function generateRoutes() {
- const { hasAccess } = useAccess()
- function filterRoutesByAccess(routes) {
- return routes
- .filter((route) => {
- return !route.meta?.access || hasAccess(route.meta?.access)
- })
- .map((route) => {
- if (route.children?.length) {
- route.children = filterRoutesByAccess(route.children)
- }
- return route
- })
- }
- const accessRoutes = filterRoutesByAccess(dynamicRoutes)
- const menuData = genRoutes(accessRoutes)
- return {
- menuData,
- routeData: dynamicRoutes,
- }
- }
- function checkComponent(component) {
- for (const componentKey in basicRouteMap) {
- if (component === basicRouteMap[componentKey])
- return void 0
- }
- return component
- }
- function flatRoutes(routes, parentName, parentComps = []) {
- const flatRouteData = []
- for (const route of routes) {
- const parentComponents = [...parentComps]
- const currentRoute = omit(route, ['children'])
- if (!currentRoute.meta)
- currentRoute.meta = {}
- if (parentName)
- currentRoute.meta.parentName = parentName
- if (parentComponents.length > 0)
- currentRoute.meta.parentComps = parentComponents
- currentRoute.meta.originPath = currentRoute.path
- flatRouteData.push(currentRoute)
- if (route.children && route.children.length) {
- const comp = checkComponent(route.component)
- if (comp)
- parentComponents.push(comp)
- flatRouteData.push(...flatRoutes(route.children, route.name, [...parentComponents]))
- }
- }
- return flatRouteData
- }
- export function generateFlatRoutes(routes) {
- const flatRoutesList = flatRoutes(routes)
- const parentRoute = {
- path: '/',
- redirect: ROOT_ROUTE_REDIRECT_PATH,
- name: 'ROOT_EMPTY_PATH',
- // component: getRouterModule('RouteView'),
- children: flatRoutesList,
- }
- return [parentRoute]
- }
|