zhou zhou
35 分钟以前 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
import { ComponentLoader } from './ComponentLoader'
import { RouteValidator } from './RouteValidator'
import { RouteTransformer } from './RouteTransformer'
class RouteRegistry {
  constructor(router) {
    this.router = router
    this.componentLoader = new ComponentLoader()
    this.validator = new RouteValidator()
    this.transformer = new RouteTransformer(this.componentLoader)
    this.removeRouteFns = []
    this.registered = false
  }
  /**
   * 注册动态路由
   */
  register(menuList) {
    if (this.registered) {
      console.warn('[RouteRegistry] 路由已注册,跳过重复注册')
      return
    }
    const validationResult = this.validator.validate(menuList)
    if (!validationResult.valid) {
      throw new Error(`路由配置验证失败: ${validationResult.errors.join(', ')}`)
    }
    const removeRouteFns = []
    menuList.forEach((route) => {
      if (route.name && !this.router.hasRoute(route.name)) {
        const routeConfig = this.transformer.transform(route)
        const removeRouteFn = this.router.addRoute(routeConfig)
        removeRouteFns.push(removeRouteFn)
      }
    })
    this.removeRouteFns = removeRouteFns
    this.registered = true
  }
  /**
   * 移除所有动态路由
   */
  unregister() {
    this.removeRouteFns.forEach((fn) => fn())
    this.removeRouteFns = []
    this.registered = false
  }
  /**
   * 检查是否已注册
   */
  isRegistered() {
    return this.registered
  }
  /**
   * 获取移除函数列表(用于 store 管理)
   */
  getRemoveRouteFns() {
    return this.removeRouteFns
  }
  /**
   * 标记为已注册(用于错误处理场景,避免重复请求)
   */
  markAsRegistered() {
    this.registered = true
  }
}
export { RouteRegistry }