blob: 0bcce3a4d45b47fbc2e12a9b9be28a59815a8c5a [file] [log] [blame]
LaoeGaoci85307e62025-05-30 23:28:42 +08001'use client';
lfmylbhf96fd7e22025-06-09 23:39:05 +08002import React, {useEffect, useRef, useState} from 'react';
lfmylbhf839e5a12025-06-09 18:22:25 +08003import { Button } from "primereact/button";
4// 输入框
5import { InputText } from "primereact/inputtext";
6// 消息提醒
7import { Toast } from 'primereact/toast';
8// 接口传输
9import axios from "axios";
10// 页面跳转
11import { useRouter } from "next/navigation";
12// 密码
13import { Password } from 'primereact/password';
14// 样式
15import './login.scss';
LaoeGaoci85307e62025-05-30 23:28:42 +080016
lfmylbhf96fd7e22025-06-09 23:39:05 +080017interface UserInfo {
18 userId: number;
19 username: string;
20 avatar: string;
21 signature: string;
22}
23
lfmylbhf839e5a12025-06-09 18:22:25 +080024export default function LoginPage() {
25 // 路由
26 const router = useRouter();
27 // 消息提醒
28 const toast = useRef<Toast>(null);
29
lfmylbhf96fd7e22025-06-09 23:39:05 +080030 const [userId, setUserId] = useState<number>(0);
lfmylbhf839e5a12025-06-09 18:22:25 +080031 const [loginFormData, setLoginFormData] = useState({
32 username: '',
33 password: '',
34 })
35
lfmylbhf96fd7e22025-06-09 23:39:05 +080036 useEffect(() => {
37 storeUserInfo();
38 }, [userId]);
39
40 // 使用localStorage存储用户数据
41 const storeUserInfo = async () => {
42 try {
43 const response = await axios.get<UserInfo>(process.env.PUBLIC_URL + `/user/info`, {
44 params: { userId: userId }
45 });
46
47 localStorage.setItem("user", JSON.stringify({
48 Id: response.data.userId,
49 name: response.data.username,
50 avatar: response.data.avatar,
51 signature: response.data.signature,
52 }));
53
54 } catch (error) {
55 console.error('获取用户信息失败:', error);
56 toast.current?.show({ severity: 'error', summary: 'Error', detail: '获取用户信息失败' });
57 }
58 }
59
lfmylbhf839e5a12025-06-09 18:22:25 +080060 // 获取userId
61 const fetchUserId = async () => {
62 try {
63 const response = await axios.get(process.env.PUBLIC_URL + `/user/getId`, {
64 params: { username: loginFormData.username , password: loginFormData.password }
65 });
lfmylbhf96fd7e22025-06-09 23:39:05 +080066 setUserId(response.data)
lfmylbhf839e5a12025-06-09 18:22:25 +080067 } catch (error) {
68 console.error('获取用户id失败:', error);
69 toast.current?.show({ severity: 'error', summary: 'Error', detail: '获取用户id失败' });
70 }
71 }
72
73 // 处理用户登录
74 const handleLogin = async () => {
75 try {
76 const postData = {
77 username: loginFormData.username,
78 password: loginFormData.password,
79 }
80 const response = await axios.post(process.env.PUBLIC_URL + `/user/login`, postData, {
81 // eslint-disable-next-line @typescript-eslint/no-unused-vars
82 validateStatus: (status) => true // 接受所有状态码
83 });
84
85 if (response.status === 200) {
86 console.log('用户登录成功');
87 toast.current?.show({ severity: 'success', summary: 'Success', detail: '登录成功' });
88 // 设置userId
89 fetchUserId()
90 router.push('/');
91 } else if (response.status === 406) {
92 console.log('用户名不存在');
93 toast.current?.show({ severity: 'error', summary: 'Error', detail: '用户名不存在' });
94 } else if (response.status === 408) {
95 console.error('密码错误');
96 toast.current?.show({ severity: 'error', summary: 'Error', detail: '密码错误' });
97 }
98
99 } catch (error) {
100 console.error('登录失败:', error);
101 toast.current?.show({ severity: 'error', summary: 'Error', detail: '登录失败' });
102 }
103 }
104
105 return (
106 <div className='login-container'>
107 <Toast ref={toast}></Toast>
108 <h1 className="form-header">登录</h1>
109 <div className="form-field">
110 <div className="form-field-header">
111 <label htmlFor="username">用户名</label>
112 </div>
113 <InputText
114 id="username"
115 value={loginFormData.username}
116 onChange={(e) => setLoginFormData(prev => ({
117 ...prev, // 复制顶层所有属性
118 username: e.target.value
119 }))}
120 className="w-full"
121 />
122 </div>
123 <div className="form-field">
124 <div className="form-field-header">
125 <label htmlFor="password">密码</label>
126 </div>
127 <Password
128 id="password"
129 value={loginFormData.password}
130 onChange={(e) => setLoginFormData(prev => ({
131 ...prev,
132 password: e.target.value
133 }))}
134 className="w-full"
135 toggleMask
136 />
137 </div>
138 <div className="form-operation">
139 <Button label="确定" onClick={handleLogin} className='form-operation-button'/>
140 <Button label="注册" onClick={() => router.push("/user/register")} className='form-operation-button'/>
141 </div>
142 </div>
143 )
LaoeGaoci85307e62025-05-30 23:28:42 +0800144};