/** * 路由注册核心类 * * 负责动态路由的注册、验证和管理 * * @module router/core/RouteRegistry * @author Art Design Pro Team */ import type { Router, RouteRecordRaw } from 'vue-router' import type { AppRouteRecord } from '@/types/router' import { ComponentLoader } from './ComponentLoader' import { RouteValidator } from './RouteValidator' import { RouteTransformer } from './RouteTransformer' export class RouteRegistry { private router: Router private componentLoader: ComponentLoader private validator: RouteValidator private transformer: RouteTransformer private removeRouteFns: (() => void)[] = [] private registered = false constructor(router: Router) { this.router = router this.componentLoader = new ComponentLoader() this.validator = new RouteValidator() this.transformer = new RouteTransformer(this.componentLoader) } /** * 注册动态路由 */ register(menuList: AppRouteRecord[]): void { if (this.registered) { console.warn('[RouteRegistry] 路由已注册,跳过重复注册') return } // 验证路由配置 const validationResult = this.validator.validate(menuList) if (!validationResult.valid) { throw new Error(`路由配置验证失败: ${validationResult.errors.join(', ')}`) } // 转换并注册路由 const removeRouteFns: (() => void)[] = [] menuList.forEach((route) => { if (route.name && !this.router.hasRoute(route.name)) { const routeConfig = this.transformer.transform(route) const removeRouteFn = this.router.addRoute(routeConfig as RouteRecordRaw) removeRouteFns.push(removeRouteFn) } }) this.removeRouteFns = removeRouteFns this.registered = true } /** * 移除所有动态路由 */ unregister(): void { this.removeRouteFns.forEach((fn) => fn()) this.removeRouteFns = [] this.registered = false } /** * 检查是否已注册 */ isRegistered(): boolean { return this.registered } /** * 获取移除函数列表(用于 store 管理) */ getRemoveRouteFns(): (() => void)[] { return this.removeRouteFns } /** * 标记为已注册(用于错误处理场景,避免重复请求) */ markAsRegistered(): void { this.registered = true } }