yearning
12 小时以前 3f96c9c6502243b06efd4bb34a189e72e3a5557c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import { BrowserRouter, Navigate, Route, Routes } from "react-router-dom";
import { useEffect, useState } from "react";
import { Spin } from "antd";
import { api, getToken } from "./api";
import LoginPage from "./pages/LoginPage";
import MainLayout from "./layout/MainLayout";
import ScoreQueryPage from "./pages/ScoreQueryPage";
import AttemptReviewPage from "./pages/AttemptReviewPage";
import AdminImportPage from "./pages/AdminImportPage";
import AdminGradersPage from "./pages/AdminGradersPage";
import AdminSystemSettingsPage from "./pages/AdminSystemSettingsPage";
import AdminRoute from "./AdminRoute";
 
export type UserMe = { id: number; username: string; display_name: string; role: string };
 
function App() {
  const [user, setUser] = useState<UserMe | null>(null);
  const [loading, setLoading] = useState(true);
 
  useEffect(() => {
    if (!getToken()) {
      setLoading(false);
      return;
    }
    api
      .get<UserMe>("/api/auth/me")
      .then((r) => setUser(r.data))
      .catch(() => setUser(null))
      .finally(() => setLoading(false));
  }, []);
 
  if (loading) {
    return (
      <div style={{ display: "flex", height: "100vh", alignItems: "center", justifyContent: "center" }}>
        <Spin size="large" />
      </div>
    );
  }
 
  return (
    <BrowserRouter>
      <Routes>
        <Route path="/login" element={<LoginPage onLogin={setUser} />} />
        <Route
          path="/"
          element={user ? <MainLayout user={user} onLogout={() => setUser(null)} /> : <Navigate to="/login" />}
        >
          <Route index element={<Navigate to="/scores" replace />} />
          <Route path="scores" element={<ScoreQueryPage />} />
          <Route path="attempts/:attemptId" element={<AttemptReviewPage />} />
          <Route
            path="admin/import"
            element={<AdminRoute user={user}><AdminImportPage /></AdminRoute>}
          />
          <Route
            path="admin/graders"
            element={<AdminRoute user={user}><AdminGradersPage /></AdminRoute>}
          />
          <Route
            path="admin/settings"
            element={<AdminRoute user={user}><AdminSystemSettingsPage /></AdminRoute>}
          />
        </Route>
      </Routes>
    </BrowserRouter>
  );
}
 
export default App;