新增路由管理
Change-Id: I8139fd09f135c42944f60ca473ee208e69549dc2
diff --git a/Merge/front/src/router/App.js b/Merge/front/src/router/App.js
index d91b3b7..4da6f49 100644
--- a/Merge/front/src/router/App.js
+++ b/Merge/front/src/router/App.js
@@ -1,72 +1,75 @@
-import React from 'react';
-import {
- Routes,
- Route,
- Navigate,
-} from 'react-router-dom';
-import AdminPage from '../components/Admin';
-import UserManagement from '../components/UserManagement';
-import LogsDashboard from '../components/LogsDashboard';
-import SuperAdmin from '../components/SuperAdmin';
+// src/router/index.jsx
+import React from 'react'
+import { Routes, Route, Navigate, Outlet } from 'react-router-dom'
-import CreatePost from '../components/CreatePost' // src/components/CreatePost.jsx
-import HomeFeed from '../components/HomeFeed' // src/components/HomeFeed.jsx
-import PlaceholderPage from '../components/PlaceholderPage'// src/components/PlaceholderPage.jsx
-import UploadPage from '../components/UploadPage' // src/components/UploadPage.jsx
+import LoginPage from '../pages/LoginPage/LoginPage'
+import RegisterPage from '../pages/RegisterPage/RegisterPage'
+import ForgotPasswordPage from '../pages/ForgotPasswordPage/ForgotPasswordPage'
+import TestDashboard from '../pages/TestDashboard/TestDashboard'
+import HomeFeed from '../components/HomeFeed'
+import CreatePost from '../components/CreatePost'
+import NotebookPage from '../components/NotebookPage'
+import PlaceholderPage from '../components/PlaceholderPage'
+import UserProfile from '../components/UserProfile'
-import UserProfile from '../components/UserProfile'; // src/components/UserProfileRoute.jsx
+import AdminPage from '../components/Admin'
+import SuperAdmin from '../components/SuperAdmin'
+import UserManagement from '../components/UserManagement'
+import LogsDashboard from '../components/LogsDashboard'
+import TransactionLogs from '../components/TransactionLogs'
+import PerformanceLogs from '../components/PerformanceLogs'
-import LoginPage from '../pages/LoginPage/LoginPage';
-import RegisterPage from '../pages/RegisterPage/RegisterPage';
-import ForgotPasswordPage from '../pages/ForgotPasswordPage/ForgotPasswordPage';
-import TestDashboard from '../pages/TestDashboard/TestDashboard';
-
-import TransactionLogs from '../components/TransactionLogs';
-import PerformanceLogs from '../components/PerformanceLogs';
-import NotebookPage from '../components/NotebookPage'
+import { RequireAuth, RequireRole } from './Guards'
export default function AppRoutes() {
return (
<Routes>
- <Route path="/posts/new" element={<CreatePost />} />
-
- <Route path="/home" element={<HomeFeed />} />
+ {/* ### 公开路由(不用登录就能看) */}
+ <Route path="/login" element={<LoginPage />} />
+ <Route path="/register" element={<RegisterPage />} />
+ <Route path="/forgot-password" element={<ForgotPasswordPage />} />
- <Route path="/notebooks" element={<NotebookPage />} />
- <Route path="/activity" element={<PlaceholderPage pageId="activity" />} />
- <Route path="/notes" element={<PlaceholderPage pageId="notes" />} />
- <Route path="/creator" element={<PlaceholderPage pageId="creator" />} />
- <Route path="/journal" element={<PlaceholderPage pageId="journal" />} />
- <Route path="/user/:userId" element={<UserProfile />} />
- <Route path="/dashboard/*" element={<UploadPage />} />
+ {/* ### 需要登录才能访问的区域 */}
+ <Route element={<RequireAuth />}>
+ {/* ---- 普通用户区块 ---- */}
+ <Route element={<RequireRole allowedRoles={['user']} />}>
+ <Route path="/home" element={<HomeFeed />} />
+ <Route path="/posts/new" element={<CreatePost />} />
+ <Route path="/notebooks" element={<NotebookPage />} />
+ <Route path="/user/:userId" element={<UserProfile />} />
+ <Route path="/activity" element={<PlaceholderPage pageId="activity" />} />
+ <Route path="/notes" element={<PlaceholderPage pageId="notes" />} />
+ <Route path="/creator" element={<PlaceholderPage pageId="creator" />} />
+ <Route path="/journal" element={<PlaceholderPage pageId="journal" />} />
- {/* 根路径重定向到 dashboard */}
- {/* <Route path="/" element={<Navigate to="/dashboard/overview" replace />} /> */}
+ <Route path="/dashboard/*" element={<PlaceholderPage />} />
+ <Route path="/posts/new" element={<CreatePost />} />
+ <Route path="/posts/edit/:postId" element={<CreatePost />} />
+ <Route path="/" element={<Navigate to="/dashboard/overview" replace />} />
+ </Route>
- <Route path="/" element={<LoginPage />} />
- <Route path="/login" element={<LoginPage />} />
- <Route path="/register" element={<RegisterPage />} />
- <Route path="/forgot-password" element={<ForgotPasswordPage />} />
- <Route path="/test-dashboard" element={<TestDashboard />} />
+ {/* ---- 管理员区块 ---- */}
+ <Route element={<RequireRole allowedRoles={['admin']} />}>
+ <Route path="/admin" element={<AdminPage />} />
+ <Route path="/test-dashboard" element={<TestDashboard />} />
+ </Route>
- {/* 普通管理员,无 header */}
- <Route path="admin" element={<AdminPage />} />
-
- {/* 超级管理员,只用 SuperAdminLayout */}
- <Route path="superadmin" element={<SuperAdmin />}>
- <Route index element={<Navigate to="users" replace />} />
- <Route path="users" element={<UserManagement superAdminId={3} />} />
-
- {/* dashboard as layout */}
- <Route path="dashboard" element={<LogsDashboard />}>
- <Route index element={<Navigate to="transactions" replace />} />
- <Route path="transactions" element={<TransactionLogs userId={1} />} />
- <Route path="performance" element={<PerformanceLogs userId={1} />} />
+ {/* ---- 超级管理员区块 ---- */}
+ <Route element={<RequireRole allowedRoles={['superadmin']} />}>
+ <Route path="/superadmin" element={<SuperAdmin />}>
+ <Route index element={<Navigate to="users" replace />} />
+ <Route path="users" element={<UserManagement superAdminId={3} />} />
+ <Route path="dashboard" element={<LogsDashboard />}>
+ <Route index element={<Navigate to="transactions" replace />} />
+ <Route path="transactions" element={<TransactionLogs userId={1} />} />
+ <Route path="performance" element={<PerformanceLogs userId={1} />} />
+ </Route>
+ </Route>
</Route>
</Route>
- {/* 最后一个兜底,放在最末尾 */}
- <Route path="*" element={<PlaceholderPage pageId="home" />} />
+ {/* ### 兜底:不认识的地址都重定向到 /login */}
+ <Route path="*" element={<Navigate to="/login" replace />} />
</Routes>
- );
-}
\ No newline at end of file
+ )
+}
diff --git a/Merge/front/src/router/Guards.jsx b/Merge/front/src/router/Guards.jsx
new file mode 100644
index 0000000..3fa7408
--- /dev/null
+++ b/Merge/front/src/router/Guards.jsx
@@ -0,0 +1,24 @@
+// src/router/Guards.jsx
+import React from 'react'
+import { Navigate, Outlet, useLocation } from 'react-router-dom'
+import { getAuthToken, getUserInfo } from '../utils/auth'
+
+/** 登录检查:有 token 才放行,否则跳到 /login */
+export function RequireAuth({ children }) {
+ const token = getAuthToken()
+ const loc = useLocation()
+ if (!token) {
+ return <Navigate to="/login" state={{ from: loc }} replace />
+ }
+ return children ?? <Outlet />
+}
+
+/** 角色检查:只有 allowedRoles 内的角色才能访问 */
+export function RequireRole({ allowedRoles, children }) {
+ const user = getUserInfo()
+ // user 里应该有 .role
+ if (!user || !allowedRoles.includes(user.role)) {
+ return <Navigate to="/login" replace />
+ }
+ return children ?? <Outlet />
+}