yearning
11 小时以前 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
import { useState } from "react";
import { Button, Card, Form, Input, message } from "antd";
import { useNavigate } from "react-router-dom";
import { api, setToken } from "../api";
import type { UserMe } from "../App";
import "./LoginPage.css";
import SystemBrand from "../components/SystemBrand";
 
export default function LoginPage({ onLogin }: { onLogin: (u: UserMe) => void }) {
  const nav = useNavigate();
  const [loading, setLoading] = useState(false);
  return (
    <div className="login-page">
      <div className="login-page__brand login-glass">
        <SystemBrand size="lg" />
      </div>
      <Card title="登录" className="login-page__card">
        <Form
          layout="vertical"
          onFinish={async (v) => {
            setLoading(true);
            try {
              const { data } = await api.post<{ access_token: string }>("/api/auth/login", v);
              setToken(data.access_token);
              const me = await api.get<UserMe>("/api/auth/me");
              onLogin(me.data);
              nav("/scores");
            } catch {
              message.error("登录失败");
            } finally {
              setLoading(false);
            }
          }}
        >
          <Form.Item name="username" label="账号" rules={[{ required: true }]}>
            <Input />
          </Form.Item>
          <Form.Item name="password" label="密码" rules={[{ required: true }]}>
            <Input.Password />
          </Form.Item>
          <Button type="primary" htmlType="submit" block loading={loading}>
            登录
          </Button>
        </Form>
      </Card>
    </div>
  );
}