52 lines
1.6 KiB
TypeScript
52 lines
1.6 KiB
TypeScript
|
|
/**
|
||
|
|
* Router configuration
|
||
|
|
*/
|
||
|
|
import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom';
|
||
|
|
import { Login } from './pages/Login';
|
||
|
|
import { AdminLayout } from './pages/admin/AdminLayout';
|
||
|
|
import { Dashboard } from './pages/admin/Dashboard';
|
||
|
|
import { CelestialBodies } from './pages/admin/CelestialBodies';
|
||
|
|
import { auth } from './utils/auth';
|
||
|
|
import App from './App';
|
||
|
|
|
||
|
|
// Protected Route wrapper
|
||
|
|
function ProtectedRoute({ children }: { children: React.ReactNode }) {
|
||
|
|
if (!auth.isLoggedIn()) {
|
||
|
|
return <Navigate to="/login" replace />;
|
||
|
|
}
|
||
|
|
return <>{children}</>;
|
||
|
|
}
|
||
|
|
|
||
|
|
export function Router() {
|
||
|
|
return (
|
||
|
|
<BrowserRouter>
|
||
|
|
<Routes>
|
||
|
|
{/* Public routes */}
|
||
|
|
<Route path="/login" element={<Login />} />
|
||
|
|
|
||
|
|
{/* Main app (3D visualization) */}
|
||
|
|
<Route path="/" element={<App />} />
|
||
|
|
|
||
|
|
{/* Admin routes (protected) */}
|
||
|
|
<Route
|
||
|
|
path="/admin"
|
||
|
|
element={
|
||
|
|
<ProtectedRoute>
|
||
|
|
<AdminLayout />
|
||
|
|
</ProtectedRoute>
|
||
|
|
}
|
||
|
|
>
|
||
|
|
<Route index element={<Navigate to="/admin/dashboard" replace />} />
|
||
|
|
<Route path="dashboard" element={<Dashboard />} />
|
||
|
|
<Route path="celestial-bodies" element={<CelestialBodies />} />
|
||
|
|
<Route path="static-data" element={<div><h1>静态数据列表</h1><p>开发中...</p></div>} />
|
||
|
|
<Route path="nasa-data" element={<div><h1>NASA数据下载管理</h1><p>开发中...</p></div>} />
|
||
|
|
</Route>
|
||
|
|
|
||
|
|
{/* Fallback */}
|
||
|
|
<Route path="*" element={<Navigate to="/" replace />} />
|
||
|
|
</Routes>
|
||
|
|
</BrowserRouter>
|
||
|
|
);
|
||
|
|
}
|