diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index f643b65..bf4fffa 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -1,260 +1,139 @@ -import React, { useState, useEffect } from 'react'; - +import React, { useState, useEffect, Suspense, lazy } from 'react'; import { Routes, Route, Navigate } from 'react-router-dom'; - import type { User } from '@/types'; - import { AuthContext, AuthContextType } from '@/contexts/AuthContext'; -import { authAPI } from '@/api'; - - - -// Layouts - +// Layouts - eagerly loaded (needed immediately) import FrontLayout from '@/components/layout/FrontLayout'; - import AdminLayout from '@/components/layout/AdminLayout'; +// Front Pages - lazy loaded +const LandingPage = lazy(() => import('@/pages/front/LandingPage')); +const LoginPage = lazy(() => import('@/pages/front/LoginPage')); +const ChatPage = lazy(() => import('@/pages/front/ChatPage')); +const ChannelPage = lazy(() => import('@/pages/front/ChannelPage')); +const KnowledgePage = lazy(() => import('@/pages/front/KnowledgePage')); +const MarketPage = lazy(() => import('@/pages/front/MarketPage')); +const TokenDashboardPage = lazy(() => import('@/pages/front/TokenDashboardPage')); +const PricingPage = lazy(() => import('@/pages/front/PricingPage')); +const ProfilePage = lazy(() => import('@/pages/front/ProfilePage')); +const NotificationPage = lazy(() => import('@/pages/front/NotificationPage')); +const AssetsPage = lazy(() => import('@/pages/front/AssetsPage')); +const NovelPreviewPage = lazy(() => import('@/pages/front/NovelPreviewPage')); +const EvolutionDashboard = lazy(() => import('@/pages/front/EvolutionDashboard')); +// Admin Pages - lazy loaded +const AdminDashboard = lazy(() => import('@/pages/admin/Dashboard')); +const AdminUsers = lazy(() => import('@/pages/admin/Users')); +const AdminModels = lazy(() => import('@/pages/admin/Models')); +const AdminSiteSettings = lazy(() => import('@/pages/admin/SiteSettings')); +const AdminPayment = lazy(() => import('@/pages/admin/Payment')); +const AdminServices = lazy(() => import('@/pages/admin/Services')); +const AdminMembership = lazy(() => import('@/pages/admin/Membership')); +const AdminAds = lazy(() => import('@/pages/admin/Ads')); +const AdminMarket = lazy(() => import('@/pages/admin/Market')); +const AdminLogs = lazy(() => import('@/pages/admin/Logs')); +const AdminSkills = lazy(() => import('@/pages/admin/Skills')); +const AdminAgents = lazy(() => import('@/pages/admin/Agents')); +const AdminKnowledge = lazy(() => import('@/pages/admin/Knowledge')); +// Phase C2: New orphan page routes +const AdminApps = lazy(() => import('@/pages/admin/Apps')); +const AdminAutomation = lazy(() => import('@/pages/admin/Automation')); +const AdminDeveloper = lazy(() => import('@/pages/admin/Developer')); +const AdminMcp = lazy(() => import('@/pages/admin/Mcp')); +const AdminStorage = lazy(() => import('@/pages/admin/Storage')); -// Front Pages - -import LandingPage from '@/pages/front/LandingPage'; - -import LoginPage from '@/pages/front/LoginPage'; - -import ChatPage from '@/pages/front/ChatPage'; - -import ChannelPage from '@/pages/front/ChannelPage'; - -import KnowledgePage from '@/pages/front/KnowledgePage'; - -import MarketPage from '@/pages/front/MarketPage'; - -import TokenDashboardPage from '@/pages/front/TokenDashboardPage'; - -import PricingPage from '@/pages/front/PricingPage'; - -import ProfilePage from '@/pages/front/ProfilePage'; - -import NotificationPage from '@/pages/front/NotificationPage'; - -import AssetsPage from '@/pages/front/AssetsPage'; - -import NovelPreviewPage from '@/pages/front/NovelPreviewPage'; - -import EvolutionDashboard from '@/pages/front/EvolutionDashboard'; - - - -// Admin Pages - -import AdminDashboard from '@/pages/admin/Dashboard'; - -import AdminUsers from '@/pages/admin/Users'; - -import AdminModels from '@/pages/admin/Models'; - -import AdminSiteSettings from '@/pages/admin/SiteSettings'; - -import AdminPayment from '@/pages/admin/Payment'; - -import AdminServices from '@/pages/admin/Services'; - -import AdminMembership from '@/pages/admin/Membership'; - -import AdminAds from '@/pages/admin/Ads'; - -import AdminMarket from '@/pages/admin/Market'; - -import AdminLogs from '@/pages/admin/Logs'; - -import AdminSkills from '@/pages/admin/Skills' -import AdminAgents from '@/pages/admin/Agents' -import AdminKnowledge from '@/pages/admin/Knowledge'; -import AdminStorage from '@/pages/admin/Storage'; -import AdminMcp from '@/pages/admin/Mcp'; -import AdminAutomation from '@/pages/admin/Automation'; -import AdminDeveloper from '@/pages/admin/Developer'; -import AdminApps from '@/pages/admin/Apps';; - - +// Loading fallback +const PageLoading: React.FC = () => ( +
| 模型 | +模型名称 | +显示名称 | 能力 | 状态 | 价格 | @@ -404,7 +438,13 @@ const Models: React.FC = () => {
|---|---|---|---|---|---|
|
{model.name}
- {model.isDefault && ⭐ 默认模型}
+ {model.id?.slice(0, 8)}...
+ |
+ + + {(model as any).display_name || (model as any).displayName || '-'} + + {model.isDefault && ⭐ 默认} |
@@ -421,34 +461,28 @@ const Models: React.FC = () => {
|
- - ¥{model.pricePerMillionTokens?.toFixed(4) || '0.0000'}/M + + ¥{(model.pricePerMillionTokens || 0).toFixed(4)}/M |
-
+
{formatNumber(model.totalCalls || 0)}
-
+
+
+ {formatNumber(model.totalTokens || 0)} tokens
+
|
- {/* Test Connection Button */}
-
- {testResult.success ? '✓ 成功' : '✗ 失败'}
- {testResult.latency_ms && ` (${testResult.latency_ms}ms)`}
-
-
+ {testResult && testingModelId === null && (
+
+ {testResult.success ? `✓ ${testResult.latency_ms || 0}ms` : '✗ 失败'}
+
)}
{!model.isDefault && model.isEnabled && (
- {testResult.message}
-
-
+
@@ -478,8 +512,8 @@ const Models: React.FC = () => {
{/* Provider Modal */}
{showAddProvider && (
- 🤖
- 暂无模型供应商,点击上方按钮添加 +暂无模型供应商,点击上方按钮添加
-
+ { setShowAddProvider(false); setEditingProvider(null); }}>
+ e.stopPropagation()}>
{editingProvider ? '编辑供应商' : '添加供应商'} |