zhou zhou
5 小时以前 46d872c1a5b77aa8799de4a64888a0a24a1422d6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import { IframeRouteManager } from './IframeRouteManager'
class RouteTransformer {
  constructor(componentLoader) {
    this.componentLoader = componentLoader
    this.iframeManager = IframeRouteManager.getInstance()
  }
  /**
   * 转换路由配置
   */
  transform(route, depth = 0) {
    const { component, children, ...routeConfig } = route
    const converted = {
      ...routeConfig,
      component: void 0
    }
    if (route.meta.isIframe) {
      this.handleIframeRoute(converted, route, depth)
    } else if (this.isFirstLevelRoute(route, depth)) {
      this.handleFirstLevelRoute(converted, route, component)
    } else {
      this.handleNormalRoute(converted, component)
    }
    if (children?.length) {
      converted.children = children.map((child) => this.transform(child, depth + 1))
    }
    return converted
  }
  /**
   * 判断是否为一级路由(需要 Layout 包裹)
   */
  isFirstLevelRoute(route, depth) {
    return depth === 0 && (!route.children || route.children.length === 0)
  }
  /**
   * 处理 iframe 类型路由
   */
  handleIframeRoute(targetRoute, sourceRoute, depth) {
    if (depth === 0) {
      targetRoute.component = this.componentLoader.loadLayout()
      targetRoute.path = this.extractFirstSegment(sourceRoute.path || '')
      targetRoute.name = ''
      targetRoute.children = [
        {
          ...sourceRoute,
          component: this.componentLoader.loadIframe()
        }
      ]
    } else {
      targetRoute.component = this.componentLoader.loadIframe()
    }
    this.iframeManager.add(sourceRoute)
  }
  /**
   * 处理一级菜单路由
   */
  handleFirstLevelRoute(converted, route, component) {
    converted.component = this.componentLoader.loadLayout()
    converted.path = this.extractFirstSegment(route.path || '')
    converted.name = ''
    route.meta.isFirstLevel = true
    converted.children = [
      {
        ...route,
        component: component ? this.componentLoader.load(component) : void 0
      }
    ]
  }
  /**
   * 处理普通路由
   */
  handleNormalRoute(converted, component) {
    if (component) {
      converted.component = this.componentLoader.load(component)
    }
  }
  /**
   * 提取路径的第一段
   */
  extractFirstSegment(path) {
    const segments = path.split('/').filter(Boolean)
    return segments.length > 0 ? `/${segments[0]}` : '/'
  }
}
export { RouteTransformer }