Spaces:
Sleeping
Sleeping
| import { BrowserRouter as Router, Routes, Route, Navigate, Outlet } from "react-router-dom"; | |
| import { useTranslation } from 'react-i18next'; | |
| import { useStore } from "@/store/useStore"; | |
| import Home from "@/pages/Home"; | |
| import LandingPage from "@/pages/Landing"; | |
| import AuthPage from "@/pages/Auth"; | |
| import NotFoundPage from "@/pages/NotFound"; | |
| import DashboardLayout from "@/pages/dashboard/Layout"; | |
| import OverviewPage from "@/pages/dashboard/Overview"; | |
| import ChatPage from "@/pages/dashboard/Chat"; | |
| import WorkflowPage from "@/pages/dashboard/Workflow"; | |
| import KnowledgePage from "@/pages/dashboard/Knowledge"; | |
| import StressTestPage from "@/pages/dashboard/StressTest"; | |
| import BillingPage from "@/pages/dashboard/Billing"; | |
| import AdminPage from "@/pages/dashboard/Admin"; | |
| import SettingsPage from "@/pages/dashboard/Settings"; | |
| import DeveloperHub from "@/pages/dashboard/DeveloperHub"; | |
| import PaymentCallback from "@/pages/PaymentCallback"; | |
| import PaymentModal from "@/components/PaymentModal"; | |
| import { FileWatcher } from "@/components/FileWatcher"; | |
| import { useEffect } from "react"; | |
| // 路由守卫 | |
| const ProtectedRoute = () => { | |
| const { token } = useStore(); | |
| if (!token) return <Navigate to="/auth" replace />; | |
| return <Outlet />; | |
| }; | |
| // 管理员守卫 | |
| const AdminRoute = () => { | |
| const { user } = useStore(); | |
| if (user?.role !== 'admin') return <Navigate to="/dashboard" replace />; | |
| return <Outlet />; | |
| }; | |
| export default function App() { | |
| const { openPaymentModal, initDatabase } = useStore(); | |
| useEffect(() => { | |
| initDatabase(); | |
| }, [initDatabase]); | |
| useEffect(() => { | |
| const params = new URLSearchParams(window.location.search); | |
| const planId = params.get('openPaymentModal'); | |
| if (planId) { | |
| openPaymentModal(planId === 'true' ? undefined : planId); | |
| // 清除 URL 参数,避免刷新后再次弹出 | |
| const url = new URL(window.location.href); | |
| url.searchParams.delete('openPaymentModal'); | |
| window.history.replaceState({}, '', url.toString()); | |
| } | |
| }, [openPaymentModal]); | |
| return ( | |
| <Router> | |
| <PaymentModal /> | |
| <FileWatcher /> | |
| <Routes> | |
| <Route path="/" element={<LandingPage />} /> | |
| <Route path="/auth" element={<AuthPage />} /> | |
| <Route path="/payment/callback" element={<PaymentCallback />} /> | |
| <Route element={<ProtectedRoute />}> | |
| <Route path="/dashboard" element={<DashboardLayout />}> | |
| <Route index element={<OverviewPage />} /> | |
| <Route path="chat" element={<ChatPage />} /> | |
| <Route path="workflow" element={<WorkflowPage />} /> | |
| <Route path="stresstest" element={<StressTestPage />} /> | |
| <Route path="knowledge" element={<KnowledgePage />} /> | |
| <Route path="billing" element={<BillingPage />} /> | |
| <Route path="settings" element={<SettingsPage />} /> | |
| <Route path="developer" element={<DeveloperHub />} /> | |
| {/* 管理员专属 */} | |
| <Route element={<AdminRoute />}> | |
| <Route path="admin" element={<AdminPage />} /> | |
| </Route> | |
| </Route> | |
| </Route> | |
| {/* 404 */} | |
| <Route path="*" element={<NotFoundPage />} /> | |
| </Routes> | |
| </Router> | |
| ); | |
| } | |