diff --git a/src/pages/AuthPage/AuthPage.jsx b/src/pages/AuthPage/AuthPage.jsx
index 4238214..bfc8e43 100644
--- a/src/pages/AuthPage/AuthPage.jsx
+++ b/src/pages/AuthPage/AuthPage.jsx
@@ -1,19 +1,342 @@
-import React, { useState } from 'react';
-import Login from '../../components/Auth/Login';
-import Register from '../../components/Auth/Register';
+// import React, { useState } from 'react';
+// import Login from '../../components/Auth/Login';
+// import Register from '../../components/Auth/Register';
 
-const AuthPage = () => {
-  const [isRegister, setIsRegister] = useState(false);
+// const AuthPage = () => {
+//   const [isRegister, setIsRegister] = useState(false);
+
+//   return (
+//     <div>
+//       {isRegister ? (
+//         <Register onLoginClick={() => setIsRegister(false)} />
+//       ) : (
+//         <Login onRegisterClick={() => setIsRegister(true)} />
+//       )}
+//     </div>
+//   );
+// };
+
+// export default AuthPage;
+
+
+
+import { useState } from "react";
+import { Link } from "wouter";
+import "./AuthPage.css";
+import CryptoJS from "crypto-js";
+
+const API_BASE = process.env.REACT_APP_API_BASE;
+function AuthPage() {
+  const [activeTab, setActiveTab] = useState("login");
+
+  // Login form state
+  const [loginData, setLoginData] = useState({
+    username: "",
+    password: "",
+    rememberMe: false,
+  });
+
+  // Register form state
+  const [registerData, setRegisterData] = useState({
+    username: "",
+    email: "",
+    password: "",
+    confirmPassword: "",
+    inviteCode: "",
+    agreeTerms: false,
+  });
+
+  // Form errors
+  const [errors, setErrors] = useState({
+    login: {},
+    register: {},
+  });
+
+  const hashPassword = (password) => {
+    return CryptoJS.SHA256(password).toString(CryptoJS.enc.Hex);
+  };
+
+  // Handle login form submission
+  const handleLogin = async (e) => {
+    e.preventDefault();
+
+    // 客户端验证
+    const newErrors = {};
+    if (!loginData.username) {
+      newErrors.username = "请输入用户名或邮箱";
+    }
+    if (!loginData.password) {
+      newErrors.password = "请输入密码";
+    }
+
+    if (Object.keys(newErrors).length > 0) {
+      setErrors((prev) => ({ ...prev, login: newErrors }));
+      return;
+    }
+
+    // 加密密码
+    const hashedPassword = hashPassword(loginData.password);
+
+    try {
+      const response = await fetch(`${API_BASE}/echo/user/login`, {
+        method: 'POST',
+        headers: {
+          'Content-Type': 'application/json',
+        },
+        body: JSON.stringify({
+          username: loginData.username,
+          password: hashedPassword,
+        }),
+      });
+
+      if (!response.ok) {
+        throw new Error('登录失败');
+      }
+
+      const data = await response.json();
+      
+      if (data.code !== 0 || !data.result) {
+        throw new Error(data.msg || '登录失败');
+      }
+
+      console.log('登录成功:', data);
+      localStorage.setItem('token', data.rows.token);
+      localStorage.setItem('userId', data.rows.userId);
+      window.location.href = '/';
+    } catch (error) {
+      console.error('登录错误:', error.message);
+      setErrors((prev) => ({
+        ...prev,
+        login: { message: error.message },
+      }));
+      throw error;
+    }
+  };
+
+  // Handle register form submission
+  const handleRegister = async (e) => {
+    e.preventDefault();
+
+    // 客户端验证
+    const newErrors = {};
+    if (!registerData.username) {
+      newErrors.username = "请输入用户名";
+    }
+    if (!registerData.email) {
+      newErrors.email = "请输入邮箱";
+    } else if (!/\S+@\S+\.\S+/.test(registerData.email)) {
+      newErrors.email = "邮箱格式不正确";
+    }
+    if (!registerData.password) {
+      newErrors.password = "请输入密码";
+    } else if (registerData.password.length < 6) {
+      newErrors.password = "密码长度至少为6位";
+    }
+    if (registerData.password !== registerData.confirmPassword) {
+      newErrors.confirmPassword = "两次输入的密码不一致";
+    }
+    if (!registerData.agreeTerms) {
+      newErrors.agreeTerms = "请同意用户协议和隐私政策";
+    }
+
+    if (Object.keys(newErrors).length > 0) {
+      setErrors({ ...errors, register: newErrors });
+      return;
+    }
+
+    // 加密密码
+    const hashedPassword = hashPassword(registerData.password);
+
+    try {
+      const response = await fetch(`${API_BASE}/echo/user/register`, {
+        method: 'POST',
+        headers: {
+          'Content-Type': 'application/json',
+        },
+        body: JSON.stringify({
+          username: registerData.username,
+          email: registerData.email,
+          password: hashedPassword, 
+          inviteCode: registerData.inviteCode,
+        }),
+      });
+
+      if (!response.ok) {
+        throw new Error('注册失败');
+      }
+
+      const data = await response.json();
+      if (data.code !== 0 || !data.result) {
+        throw new Error(data.msg || '注册失败');
+      }
+
+      console.log('注册成功:', data);
+      setActiveTab('login');
+      alert('注册成功，请登录！');
+    } catch (error) {
+      console.error('注册错误:', error.message);
+      setErrors((prev) => ({
+        ...prev,
+        register: { message: error.message },
+      }));
+    }
+  };
+
+  // Update login form data
+  const updateLoginData = (field, value) => {
+    setLoginData({
+      ...loginData,
+      [field]: value,
+    });
+  };
+
+  // Update register form data
+  const updateRegisterData = (field, value) => {
+    setRegisterData({
+      ...registerData,
+      [field]: value,
+    });
+  };
 
   return (
-    <div>
-      {isRegister ? (
-        <Register onLoginClick={() => setIsRegister(false)} />
-      ) : (
-        <Login onRegisterClick={() => setIsRegister(true)} />
-      )}
+    <div className="auth-container">
+      <div className="auth-card">
+        <div className="auth-header">
+          <div className={`auth-tab ${activeTab === "login" ? "active" : ""}`} onClick={() => setActiveTab("login")}>
+            登录
+          </div>
+          <div className={`auth-tab ${activeTab === "register" ? "active" : ""}`} onClick={() => setActiveTab("register")}>
+            注册
+          </div>
+        </div>
+
+        <div className="auth-content">
+          {activeTab === "login" ? (
+            <form className="auth-form" onSubmit={handleLogin}>
+              {errors.login.message && <div className="error-message">{errors.login.message}</div>}
+              <div className="form-group">
+                <label htmlFor="login-username">用户名/邮箱</label>
+                <input
+                  type="text"
+                  id="login-username"
+                  value={loginData.username}
+                  onChange={(e) => updateLoginData("username", e.target.value)}
+                  placeholder="请输入用户名或邮箱"
+                  required
+                />
+                {errors.login.username && <div className="error-message">{errors.login.username}</div>}
+              </div>
+
+              <div className="form-group">
+                <label htmlFor="login-password">密码</label>
+                <input
+                  type="password"
+                  id="login-password"
+                  value={loginData.password}
+                  onChange={(e) => updateLoginData("password", e.target.value)}
+                  placeholder="请输入密码"
+                  required
+                />
+                {errors.login.password && <div className="error-message">{errors.login.password}</div>}
+              </div>
+
+              <div className="form-group-inline">
+                <div className="checkbox-container">
+                  <input
+                    type="checkbox"
+                    id="remember-me"
+                    checked={loginData.rememberMe}
+                    onChange={(e) => updateLoginData("rememberMe", e.target.checked)}
+                  />
+                  <label htmlFor="remember-me">记住我</label>
+                </div>
+                <Link to="/forgot-password" className="forgot-password">
+                  忘记密码?
+                </Link>
+              </div>
+
+              <button type="submit" className="auth-button">
+                登录
+              </button>
+            </form>
+          ) : (
+            <form className="auth-form" onSubmit={handleRegister}>
+              {errors.register.message && <div className="error-message">{errors.register.message}</div>}
+              <div className="form-group">
+                <label htmlFor="register-username">用户名</label>
+                <input
+                  type="text"
+                  id="register-username"
+                  value={registerData.username}
+                  onChange={(e) => updateRegisterData("username", e.target.value)}
+                  placeholder="请输入用户名"
+                  required
+                />
+                {errors.register.username && <div className="error-message">{errors.register.username}</div>}
+              </div>
+
+              <div className="form-group">
+                <label htmlFor="register-email">邮箱</label>
+                <input
+                  type="email"
+                  id="register-email"
+                  value={registerData.email}
+                  onChange={(e) => updateRegisterData("email", e.target.value)}
+                  placeholder="请输入邮箱"
+                  required
+                />
+                {errors.register.email && <div className="error-message">{errors.register.email}</div>}
+              </div>
+
+              <div className="form-group">
+                <label htmlFor="register-password">密码</label>
+                <input
+                  type="password"
+                  id="register-password"
+                  value={registerData.password}
+                  onChange={(e) => updateRegisterData("password", e.target.value)}
+                  placeholder="请输入密码"
+                  required
+                />
+                {errors.register.password && <div className="error-message">{errors.register.password}</div>}
+              </div>
+
+              <div className="form-group">
+                <label htmlFor="register-confirm-password">确认密码</label>
+                <input
+                  type="password"
+                  id="register-confirm-password"
+                  value={registerData.confirmPassword}
+                  onChange={(e) => updateRegisterData("confirmPassword", e.target.value)}
+                  placeholder="请再次输入密码"
+                  required
+                />
+                {errors.register.confirmPassword && (
+                  <div className="error-message">{errors.register.confirmPassword}</div>
+                )}
+              </div>
+
+              <div className="form-group">
+                <label htmlFor="register-inviteCode">邀请码</label>
+                <input
+                  type="text"
+                  id="register-inviteCode"
+                  value={registerData.inviteCode}
+                  onChange={(e) => updateRegisterData("inviteCode", e.target.value)}
+                  placeholder="请输入邀请码"
+                />
+                {errors.register.inviteCode && <div className="error-message">{errors.register.inviteCode}</div>}
+              </div>
+
+              <button type="submit" className="auth-button">
+                注册
+              </button>
+            </form>
+          )}
+        </div>
+      </div>
     </div>
   );
-};
+}
 
 export default AuthPage;
\ No newline at end of file
