Files
shanxia2.0/web-admin/src/router/core/RouteRegistry.ts
T

91 lines
2.3 KiB
TypeScript

/**
* 路由注册核心类
*
* 负责动态路由的注册、验证和管理
*
* @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
}
}