diff --git a/src/routes/index.js b/src/routes/index.js
new file mode 100644
index 00000000..f6688c75
--- /dev/null
+++ b/src/routes/index.js
@@ -0,0 +1,101 @@
+// src/routes/index.js
+// 路由渲染器 - 根据配置自动生成 Routes
+
+import React from 'react';
+import { Routes, Route, Navigate } from 'react-router-dom';
+import { Box, useColorMode } from '@chakra-ui/react';
+
+// 路由配置
+import { routeConfig, PROTECTION_MODES, getMainLayoutRoutes, getStandaloneRoutes } from './routeConfig';
+
+// 布局组件 (非懒加载)
+import Auth from '../layouts/Auth';
+import HomeLayout from '../layouts/Home';
+import MainLayout from '../layouts/MainLayout';
+
+// 保护路由组件
+import ProtectedRoute from '../components/ProtectedRoute';
+import ProtectedRouteRedirect from '../components/ProtectedRouteRedirect';
+
+/**
+ * 根据保护模式包装组件
+ */
+function wrapWithProtection(Component, protection) {
+ if (protection === PROTECTION_MODES.MODAL) {
+ return (
+
+
+
+ );
+ }
+
+ if (protection === PROTECTION_MODES.REDIRECT) {
+ return (
+
+
+
+ );
+ }
+
+ // PUBLIC - 无保护
+ return ;
+}
+
+/**
+ * 渲染单个路由
+ */
+function renderRoute(routeItem, index) {
+ const { path, component, protection } = routeItem;
+
+ // 处理特殊组件(非懒加载)
+ let Component;
+ if (component === 'Auth') {
+ Component = Auth;
+ } else if (component === 'HomeLayout') {
+ Component = HomeLayout;
+ } else {
+ Component = component;
+ }
+
+ return (
+
+ );
+}
+
+/**
+ * AppRoutes - 应用路由组件
+ * 替代 App.js 中的 Routes 部分
+ */
+export function AppRoutes() {
+ const { colorMode } = useColorMode();
+
+ // 分离路由
+ const mainLayoutRoutes = getMainLayoutRoutes();
+ const standaloneRoutes = getStandaloneRoutes();
+
+ return (
+
+
+ {/* 带导航栏的主布局 - 所有需要导航栏的页面都在这里 */}
+ }>
+ {mainLayoutRoutes.map((route, index) => renderRoute(route, index))}
+
+
+ {/* 不使用布局的路由 */}
+ {standaloneRoutes.map((route, index) => renderRoute(route, index))}
+
+ {/* 默认重定向到首页 */}
+ } />
+
+ {/* 404 页面 */}
+ } />
+
+
+ );
+}
+
+export default AppRoutes;
diff --git a/src/routes/lazy-components.js b/src/routes/lazy-components.js
new file mode 100644
index 00000000..dc1e668a
--- /dev/null
+++ b/src/routes/lazy-components.js
@@ -0,0 +1,44 @@
+// src/routes/lazy-components.js
+// 集中管理所有懒加载组件
+
+import React from 'react';
+
+/**
+ * 懒加载组件配置
+ * 使用 React.lazy() 实现路由懒加载,大幅减少初始 JS 包大小
+ */
+export const lazyComponents = {
+ // 社区/内容模块
+ Community: React.lazy(() => import('../views/Community')),
+ ConceptCenter: React.lazy(() => import('../views/Concept')),
+ StockOverview: React.lazy(() => import('../views/StockOverview')),
+ LimitAnalyse: React.lazy(() => import('../views/LimitAnalyse')),
+
+ // 交易模块
+ TradingSimulation: React.lazy(() => import('../views/TradingSimulation')),
+
+ // 事件模块
+ EventDetail: React.lazy(() => import('../views/EventDetail')),
+
+ // 公司相关模块
+ CompanyIndex: React.lazy(() => import('../views/Company')),
+ ForecastReport: React.lazy(() => import('../views/Company/ForecastReport')),
+ FinancialPanorama: React.lazy(() => import('../views/Company/FinancialPanorama')),
+ MarketDataView: React.lazy(() => import('../views/Company/MarketDataView')),
+};
+
+/**
+ * 按需导出单个组件(可选)
+ */
+export const {
+ Community,
+ ConceptCenter,
+ StockOverview,
+ LimitAnalyse,
+ TradingSimulation,
+ EventDetail,
+ CompanyIndex,
+ ForecastReport,
+ FinancialPanorama,
+ MarketDataView,
+} = lazyComponents;
diff --git a/src/routes/routeConfig.js b/src/routes/routeConfig.js
new file mode 100644
index 00000000..aa668b3d
--- /dev/null
+++ b/src/routes/routeConfig.js
@@ -0,0 +1,190 @@
+// src/routes/routeConfig.js
+// 声明式路由配置
+
+import { lazyComponents } from './lazy-components';
+
+/**
+ * 路由保护模式
+ * - 'modal': 使用 ProtectedRoute (弹窗模式登录)
+ * - 'redirect': 使用 ProtectedRouteRedirect (跳转模式登录)
+ * - 'public': 公开访问,无需登录
+ */
+export const PROTECTION_MODES = {
+ MODAL: 'modal',
+ REDIRECT: 'redirect',
+ PUBLIC: 'public',
+};
+
+/**
+ * 路由配置
+ * 每个路由对象包含:
+ * - path: 路由路径
+ * - component: 组件(从 lazyComponents 引用)
+ * - protection: 保护模式 (modal/redirect/public)
+ * - layout: 布局类型 (main/auth/none)
+ * - meta: 路由元数据(可选,用于面包屑、标题等)
+ */
+export const routeConfig = [
+ // ==================== 首页 ====================
+ {
+ path: 'home/*',
+ component: 'HomeLayout', // 非懒加载,直接在 App.js 导入
+ protection: PROTECTION_MODES.PUBLIC,
+ layout: 'main',
+ meta: {
+ title: '首页',
+ description: '价值前沿首页'
+ }
+ },
+
+ // ==================== 社区/内容模块 ====================
+ {
+ path: 'community',
+ component: lazyComponents.Community,
+ protection: PROTECTION_MODES.MODAL,
+ layout: 'main',
+ meta: {
+ title: '社区',
+ description: '投资社区交流'
+ }
+ },
+ {
+ path: 'concepts',
+ component: lazyComponents.ConceptCenter,
+ protection: PROTECTION_MODES.MODAL,
+ layout: 'main',
+ meta: {
+ title: '概念中心',
+ description: '热门概念追踪'
+ }
+ },
+ {
+ path: 'stocks',
+ component: lazyComponents.StockOverview,
+ protection: PROTECTION_MODES.MODAL,
+ layout: 'main',
+ meta: {
+ title: '股票概览',
+ description: '全市场股票概览'
+ }
+ },
+ {
+ path: 'limit-analyse',
+ component: lazyComponents.LimitAnalyse,
+ protection: PROTECTION_MODES.MODAL,
+ layout: 'main',
+ meta: {
+ title: '涨停分析',
+ description: '涨停板数据分析'
+ }
+ },
+
+ // ==================== 交易模块 ====================
+ {
+ path: 'trading-simulation',
+ component: lazyComponents.TradingSimulation,
+ protection: PROTECTION_MODES.MODAL,
+ layout: 'main',
+ meta: {
+ title: '模拟交易',
+ description: '模拟盘交易系统'
+ }
+ },
+
+ // ==================== 事件模块 ====================
+ {
+ path: 'event-detail/:eventId',
+ component: lazyComponents.EventDetail,
+ protection: PROTECTION_MODES.REDIRECT,
+ layout: 'main',
+ meta: {
+ title: '事件详情',
+ description: '事件详细信息'
+ }
+ },
+
+ // ==================== 公司相关模块 ====================
+ {
+ path: 'forecast-report',
+ component: lazyComponents.ForecastReport,
+ protection: PROTECTION_MODES.REDIRECT,
+ layout: 'main',
+ meta: {
+ title: '财报预测',
+ description: '上市公司财报预测'
+ }
+ },
+ {
+ path: 'Financial',
+ component: lazyComponents.FinancialPanorama,
+ protection: PROTECTION_MODES.MODAL,
+ layout: 'main',
+ meta: {
+ title: '财务全景',
+ description: '公司财务全景分析'
+ }
+ },
+ {
+ path: 'company',
+ component: lazyComponents.CompanyIndex,
+ protection: PROTECTION_MODES.MODAL,
+ layout: 'main',
+ meta: {
+ title: '公司',
+ description: '上市公司信息'
+ }
+ },
+ {
+ path: 'company/:code',
+ component: lazyComponents.CompanyIndex,
+ protection: PROTECTION_MODES.REDIRECT,
+ layout: 'main',
+ meta: {
+ title: '公司详情',
+ description: '公司详细信息'
+ }
+ },
+ {
+ path: 'market-data',
+ component: lazyComponents.MarketDataView,
+ protection: PROTECTION_MODES.MODAL,
+ layout: 'main',
+ meta: {
+ title: '市场数据',
+ description: '实时市场数据'
+ }
+ },
+
+ // ==================== 认证模块 ====================
+ {
+ path: 'auth/*',
+ component: 'Auth', // 非懒加载,直接在 App.js 导入
+ protection: PROTECTION_MODES.PUBLIC,
+ layout: 'none',
+ meta: {
+ title: '登录/注册',
+ description: '用户认证'
+ }
+ },
+];
+
+/**
+ * 获取所有需要 MainLayout 的路由
+ */
+export function getMainLayoutRoutes() {
+ return routeConfig.filter(route => route.layout === 'main');
+}
+
+/**
+ * 获取不需要布局的路由
+ */
+export function getStandaloneRoutes() {
+ return routeConfig.filter(route => route.layout === 'none');
+}
+
+/**
+ * 根据路径查找路由配置
+ */
+export function findRouteByPath(path) {
+ return routeConfig.find(route => route.path === path);
+}