Files
MemoryBear/web/src/routes/index.tsx

134 lines
5.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { lazy, type LazyExoticComponent, type ComponentType, type ReactNode } from 'react';
import { createHashRouter, createRoutesFromElements, Route } from 'react-router-dom';
// 导入路由配置JSON
import routesConfig from './routes.json';
// 递归函数,用于生成路由元素
// 递归收集所有路由中的element
function collectElements(routes: RouteConfig[]): Set<string> {
const elements = new Set<string>();
function traverse(routeList: RouteConfig[]) {
routeList.forEach(route => {
// 添加当前路由的element
elements.add(route.element);
// 递归处理子路由
if (route.children && route.children.length > 0) {
traverse(route.children);
}
});
}
traverse(routes);
return elements;
}
// 直接定义组件映射表,避免动态路径解析问题
const componentMap: Record<string, LazyExoticComponent<ComponentType<object>>> = {
// 布局组件
AuthLayout: lazy(() => import('@/components/Layout/AuthLayout')),
AuthSpaceLayout: lazy(() => import('@/components/Layout/AuthSpaceLayout')),
BasicLayout: lazy(() => import('@/components/Layout/BasicLayout')),
LoginLayout: lazy(() => import('@/components/Layout/LoginLayout')),
// 视图组件
Index: lazy(() => import('@/views/Index')),
Home: lazy(() => import('@/views/Home')),
UserMemory: lazy(() => import('@/views/UserMemory')),
UserMemoryDetail: lazy(() => import('@/views/UserMemoryDetail')),
Neo4jUserMemoryDetail: lazy(() => import('@/views/UserMemoryDetail/Neo4j')),
MemberManagement: lazy(() => import('@/views/MemberManagement')),
MemoryManagement: lazy(() => import('@/views/MemoryManagement')),
ForgettingEngine: lazy(() => import('@/views/ForgettingEngine')),
MemoryExtractionEngine: lazy(() => import('@/views/MemoryExtractionEngine')),
ApplicationManagement: lazy(() => import('@/views/ApplicationManagement')),
ApplicationConfig: lazy(() => import('@/views/ApplicationConfig')),
MemoryConversation: lazy(() => import('@/views/MemoryConversation')),
Conversation: lazy(() => import('@/views/Conversation')),
KnowledgeBase: lazy(() => import('@/views/KnowledgeBase')),
Private: lazy(() => import('@/views/KnowledgeBase/[knowledgeBaseId]/Private')),
Share: lazy(() => import('@/views/KnowledgeBase/[knowledgeBaseId]/Share')),
CreateDataset: lazy(() => import('@/views/KnowledgeBase/[knowledgeBaseId]/CreateDataset')),
DocumentDetails: lazy(() => import('@/views/KnowledgeBase/[knowledgeBaseId]/DocumentDetails')),
UserManagement: lazy(() => import('@/views/UserManagement')),
ModelManagement: lazy(() => import('@/views/ModelManagement')),
SpaceManagement: lazy(() => import('@/views/SpaceManagement')),
ApiKeyManagement: lazy(() => import('@/views/ApiKeyManagement')),
EmotionEngine: lazy(() => import('@/views/EmotionEngine')),
StatementDetail: lazy(() => import('@/views/UserMemoryDetail/pages/StatementDetail')),
ForgetDetail: lazy(() => import('@/views/UserMemoryDetail/pages/ForgetDetail')),
MemoryNodeDetail: lazy(() => import('@/views/UserMemoryDetail/pages/index')),
SelfReflectionEngine: lazy(() => import('@/views/SelfReflectionEngine')),
OrderPayment: lazy(() => import('@/views/OrderPayment')),
OrderHistory: lazy(() => import('@/views/OrderHistory')),
Pricing: lazy(() => import('@/views/Pricing')),
ToolManagement: lazy(() => import('@/views/ToolManagement')),
SpaceConfig: lazy(() => import('@/views/SpaceConfig')),
Login: lazy(() => import('@/views/Login')),
InviteRegister: lazy(() => import('@/views/InviteRegister')),
NoPermission: lazy(() => import('@/views/NoPermission')),
NotFound: lazy(() => import('@/views/NotFound'))
};
// 检查并报告缺失的组件
const allElements = collectElements(routesConfig);
allElements.forEach(elementName => {
if (!componentMap[elementName]) {
console.warn(`Warning: Component ${elementName} is referenced in routes but not defined in componentMap`);
}
});
// 确保NotFound组件总是存在作为兜底
if (!componentMap['NotFound']) {
componentMap['NotFound'] = lazy(() => import('@/views/NotFound/index.tsx'));
}
// 路由配置类型定义
interface RouteConfig {
path?: string;
element: string;
componentPath?: string;
children?: RouteConfig[];
}
// 递归函数,用于生成路由元素
const generateRoutes = (routes: RouteConfig[]): ReactNode => {
return routes.map((route, index) => {
// 获取组件
const componentKey = route.element as keyof typeof componentMap;
const Component = componentMap[componentKey];
if (!Component) {
console.error(`Component ${route.element} not found in componentMap`);
return null;
}
// 如果有子路由
if (route.children) {
return (
<Route key={index} element={<Component />}>
{generateRoutes(route.children)}
</Route>
);
}
// 如果有path属性则为普通路由
if (route.path) {
return <Route key={index} path={route.path} element={<Component />} />;
}
return null;
});
};
// 创建路由
const router = createHashRouter(
createRoutesFromElements(
generateRoutes(routesConfig)
)
);
export default router;