diff --git a/src/app/user/login/page.tsx b/src/app/user/login/page.tsx
index c48b626..a22cee0 100644
--- a/src/app/user/login/page.tsx
+++ b/src/app/user/login/page.tsx
@@ -1,12 +1,113 @@
 'use client';
-import React from 'react';
+import React, { useRef, useState } from 'react';
+import { Button } from "primereact/button";
+// 输入框
+import { InputText } from "primereact/inputtext";
+// 消息提醒
+import { Toast } from 'primereact/toast';
+// 接口传输
+import axios from "axios";
+// 页面跳转
+import { useRouter } from "next/navigation";
+// 密码
+import { Password } from 'primereact/password';
+// 样式
+import './login.scss';
 
-const EmptyPage: React.FC = () => {
-  return (
-    <div className="p-d-flex p-jc-center p-ai-center" style={{ height: '100vh' }}>
-      {"一个空页面"}
-    </div>
-  );
+export default function LoginPage() {
+    // 路由
+    const router = useRouter();
+    // 消息提醒
+    const toast = useRef<Toast>(null);
+
+    const [loginFormData, setLoginFormData] = useState({
+        username: '',
+        password: '',
+    })
+
+    // 获取userId
+    const fetchUserId = async () => {
+        try {
+            const response = await axios.get(process.env.PUBLIC_URL + `/user/getId`, {
+                params: { username: loginFormData.username , password: loginFormData.password }
+            });
+            console.log('用户id：', response.data)
+            localStorage.setItem("user", JSON.stringify({ Id: response.data }));
+        } catch (error) {
+            console.error('获取用户id失败:', error);
+            toast.current?.show({ severity: 'error', summary: 'Error', detail: '获取用户id失败' });
+        }
+    }
+
+    // 处理用户登录
+    const handleLogin = async () => {
+        try {
+            const postData = {
+                username: loginFormData.username,
+                password: loginFormData.password,
+            }
+            const response = await axios.post(process.env.PUBLIC_URL + `/user/login`, postData, {
+                // eslint-disable-next-line @typescript-eslint/no-unused-vars
+                validateStatus: (status) => true // 接受所有状态码
+            });
+
+            if (response.status === 200) {
+                console.log('用户登录成功');
+                toast.current?.show({ severity: 'success', summary: 'Success', detail: '登录成功' });
+                // 设置userId
+                fetchUserId()
+                router.push('/');
+            } else if (response.status === 406) {
+                console.log('用户名不存在');
+                toast.current?.show({ severity: 'error', summary: 'Error', detail: '用户名不存在' });
+            } else if (response.status === 408) {
+                console.error('密码错误');
+                toast.current?.show({ severity: 'error', summary: 'Error', detail: '密码错误' });
+            }
+
+        } catch (error) {
+            console.error('登录失败:', error);
+            toast.current?.show({ severity: 'error', summary: 'Error', detail: '登录失败' });
+        }
+    }
+
+    return (
+        <div className='login-container'>
+            <Toast ref={toast}></Toast>
+            <h1 className="form-header">登录</h1>
+            <div className="form-field">
+                <div className="form-field-header">
+                    <label htmlFor="username">用户名</label>
+                </div>
+                <InputText
+                    id="username"
+                    value={loginFormData.username}
+                    onChange={(e) => setLoginFormData(prev => ({
+                        ...prev, // 复制顶层所有属性
+                        username: e.target.value
+                    }))}
+                    className="w-full"
+                />
+            </div>
+            <div className="form-field">
+                <div className="form-field-header">
+                    <label htmlFor="password">密码</label>
+                </div>
+                <Password
+                    id="password"
+                    value={loginFormData.password}
+                    onChange={(e) => setLoginFormData(prev => ({
+                        ...prev,
+                        password: e.target.value
+                    }))}
+                    className="w-full"
+                    toggleMask
+                />
+            </div>
+            <div className="form-operation">
+                <Button label="确定" onClick={handleLogin} className='form-operation-button'/>
+                <Button label="注册" onClick={() => router.push("/user/register")} className='form-operation-button'/>
+            </div>
+        </div>
+    )
 };
-
-export default EmptyPage;
