diff --git a/src/components/Auth/Login.jsx b/src/components/Auth/Login.jsx
index 2f43619..d635223 100644
--- a/src/components/Auth/Login.jsx
+++ b/src/components/Auth/Login.jsx
@@ -1,95 +1,213 @@
-import React, { useState } from 'react';
-import '../../pages/AuthPage/AuthPage.css';
-import image from './logo.svg'; // 引入图片
-const Login = ({ onRegisterClick }) => {
-  const [formData, setFormData] = useState({
-    username: '',
-    password: ''
-  });
+// import React, { useState } from 'react';
+// import '../../pages/AuthPage/AuthPage.css';
+// import image from './logo.svg'; // 引入图片
+// const Login = ({ onRegisterClick }) => {
+//   const [formData, setFormData] = useState({
+//     username: '',
+//     password: ''
+//   });
 
-  const handleChange = (e) => {
-    const { name, value } = e.target;
-    setFormData(prev => ({ ...prev, [name]: value }));
-  };
+//   const handleChange = (e) => {
+//     const { name, value } = e.target;
+//     setFormData(prev => ({ ...prev, [name]: value }));
+//   };
 
-  const handleSubmit = async (e) => {
-    e.preventDefault();
-    try {
-      const response = await fetch('http://localhost:8080/user/login', {
-        method: 'POST',
-        headers: {
-          'Content-Type': 'application/json',
-        },
-        body: JSON.stringify(formData),
-      });
+//   const handleSubmit = async (e) => {
+//     e.preventDefault();
+//     try {
+//       const response = await fetch('http://localhost:8080/user/login', {
+//         method: 'POST',
+//         headers: {
+//           'Content-Type': 'application/json',
+//         },
+//         body: JSON.stringify(formData),
+//       });
   
-      const result = await response.json();
-      if (response.ok && result.code === "0") {
-        console.log('登录成功:', result);
-        // 处理成功逻辑
-      } else {
-        console.error('登录失败:', result);
-        // 处理失败逻辑
-      }
-    } catch (error) {
-      console.error('请求错误:', error);
-      // 处理请求错误
-    }
-  };
+//       const result = await response.json();
+//       if (response.ok && result.code === "0") {
+//         console.log('登录成功:', result);
+//         // 处理成功逻辑
+//       } else {
+//         console.error('登录失败:', result);
+//         // 处理失败逻辑
+//       }
+//     } catch (error) {
+//       console.error('请求错误:', error);
+//       // 处理请求错误
+//     }
+//   };
 
-  return (
-    <div className="auth-container">
-      <img 
-        src={image} 
-        alt="描述" 
-        style={{ width: '30%', height: 'auto'}} 
-      />
-      <div className="auth-form-section">
-        {/* <h3>欢迎来到EchoTorent !</h3> */}
-        <h3>用户登录</h3>
-        <form onSubmit={handleSubmit}>
-          <div className="form-group">
-            <label>用户名</label>
-            <input
-              type="text"
-              name="username"
-              placeholder="请输入用户名"
-              value={formData.username}
-              onChange={handleChange}
-              className="form-input"
-            />
-          </div>
-          <div className="form-group">
-            <label>密码</label>
-            <input
-              type="password"
-              name="password"
-              placeholder="请输入密码"
-              value={formData.password}
-              onChange={handleChange}
-              className="form-input"
-            />
-            <button 
-              type="button" 
-              className="link-button forgot-password" 
-              onClick={() => console.log('跳转到忘记密码页面')}
-            >
-              忘记密码？
-            </button>
-          </div>
-          <button type="submit" className="auth-button">
-            登录
-          </button>
-          <p className="register-link">
-            没有账号? 
-            <button onClick={onRegisterClick} className="link-button">
-               点击注册
-            </button>
-          </p>
-        </form>
-      </div>
-    </div>
-  );
-};
+//   return (
+//     <div className="auth-container">
+//       <img 
+//         src={image} 
+//         alt="描述" 
+//         style={{ width: '30%', height: 'auto'}} 
+//       />
+//       <div className="auth-form-section">
+//         {/* <h3>欢迎来到EchoTorent !</h3> */}
+//         <h3>用户登录</h3>
+//         <form onSubmit={handleSubmit}>
+//           <div className="form-group">
+//             <label>用户名</label>
+//             <input
+//               type="text"
+//               name="username"
+//               placeholder="请输入用户名"
+//               value={formData.username}
+//               onChange={handleChange}
+//               className="form-input"
+//             />
+//           </div>
+//           <div className="form-group">
+//             <label>密码</label>
+//             <input
+//               type="password"
+//               name="password"
+//               placeholder="请输入密码"
+//               value={formData.password}
+//               onChange={handleChange}
+//               className="form-input"
+//             />
+//             <button 
+//               type="button" 
+//               className="link-button forgot-password" 
+//               onClick={() => console.log('跳转到忘记密码页面')}
+//             >
+//               忘记密码？
+//             </button>
+//           </div>
+//           <button type="submit" className="auth-button">
+//             登录
+//           </button>
+//           <p className="register-link">
+//             没有账号? 
+//             <button onClick={onRegisterClick} className="link-button">
+//                点击注册
+//             </button>
+//           </p>
+//         </form>
+//       </div>
+//     </div>
+//   );
+// };
 
-export default Login;
\ No newline at end of file
+// export default Login;
+
+
+// import React, { useState } from 'react';
+// import '../../pages/AuthPage/AuthPage.css';
+// import image from './logo.svg';
+
+// const API_BASE = process.env.REACT_APP_API_BASE;
+
+// const Login = ({ onRegisterClick }) => {
+//   const [formData, setFormData] = useState({
+//     username: '',
+//     password: ''
+//   });
+//   const [error, setError] = useState('');
+//   const [isSubmitting, setIsSubmitting] = useState(false);
+
+//   const handleSubmit = async (e) => {
+//     e.preventDefault();
+//     setIsSubmitting(true);
+//     setError('');
+
+//     try {
+//       const response = await fetch(`${API_BASE}/user/login`, {
+//         method: 'POST',
+//         headers: {
+//           'Content-Type': 'application/json',
+//         },
+//         body: JSON.stringify(formData),
+//       });
+
+//       const result = await response.json();
+      
+//       if (!response.ok) {
+//         throw new Error(result.message || '登录失败');
+//       }
+
+//       console.log('登录成功:', result);
+//       // 这里可以添加登录成功后的跳转逻辑
+//       alert('登录成功！');
+//     } catch (error) {
+//       console.error('登录错误:', error);
+//       setError(error.message || '登录过程中出现错误');
+//     } finally {
+//       setIsSubmitting(false);
+//     }
+//   };
+
+//   const handleChange = (e) => {
+//     const { name, value } = e.target;
+//     setFormData(prev => ({ ...prev, [name]: value }));
+//   };
+
+//   return (
+//     <div className="auth-container">
+//       <img
+//         src={image}
+//         alt="网站Logo"
+//         style={{ width: '30%', height: 'auto' }}
+//       />
+//       <div className="auth-form-section">
+//         <h3>用户登录</h3>
+//         {error && <div className="error-message">{error}</div>}
+//         <form onSubmit={handleSubmit}>
+//           <div className="form-group">
+//             <label>用户名</label>
+//             <input
+//               type="text"
+//               name="username"
+//               placeholder="请输入用户名"
+//               value={formData.username}
+//               onChange={handleChange}
+//               className="form-input"
+//               required
+//             />
+//           </div>
+//           <div className="form-group">
+//             <label>密码</label>
+//             <input
+//               type="password"
+//               name="password"
+//               placeholder="请输入密码"
+//               value={formData.password}
+//               onChange={handleChange}
+//               className="form-input"
+//               required
+//             />
+//             <button
+//               type="button"
+//               className="link-button forgot-password"
+//               onClick={() => console.log('跳转到忘记密码页面')}
+//             >
+//               忘记密码？
+//             </button>
+//           </div>
+//           <button 
+//             type="submit" 
+//             className="auth-button"
+//             disabled={isSubmitting}
+//           >
+//             {isSubmitting ? '登录中...' : '登录'}
+//           </button>
+//           <p className="register-link">
+//             没有账号?{' '}
+//             <button 
+//               type="button"
+//               onClick={onRegisterClick} 
+//               className="link-button"
+//             >
+//               点击注册
+//             </button>
+//           </p>
+//         </form>
+//       </div>
+//     </div>
+//   );
+// };
+
+// export default Login;
\ No newline at end of file
diff --git a/src/components/Auth/Login.test.jsx b/src/components/Auth/Login.test.jsx
deleted file mode 100644
index 6da7659..0000000
--- a/src/components/Auth/Login.test.jsx
+++ /dev/null
@@ -1,28 +0,0 @@
-import React from 'react';
-import { render, screen, fireEvent } from '@testing-library/react';
-import Login from './Login';
-
-describe('Login component', () => {
-  test('renders login form', () => {
-    const onRegisterClick = jest.fn();
-    render(<Login onRegisterClick={onRegisterClick} />);
-
-    const usernameInput = screen.getByPlaceholderText('请输入用户名');
-    const passwordInput = screen.getByPlaceholderText('请输入密码');
-    const loginButton = screen.getByText('登录');
-
-    expect(usernameInput).toBeInTheDocument();
-    expect(passwordInput).toBeInTheDocument();
-    expect(loginButton).toBeInTheDocument();
-  });
-
-  test('calls onRegisterClick when "点击注册" is clicked', () => {
-    const onRegisterClick = jest.fn();
-    render(<Login onRegisterClick={onRegisterClick} />);
-
-    const registerButton = screen.getByText('点击注册');
-    fireEvent.click(registerButton);
-
-    expect(onRegisterClick).toHaveBeenCalled();
-  });
-});
\ No newline at end of file
diff --git a/src/components/Auth/Login.test.jsx.txt b/src/components/Auth/Login.test.jsx.txt
new file mode 100644
index 0000000..4631a5f
--- /dev/null
+++ b/src/components/Auth/Login.test.jsx.txt
@@ -0,0 +1,28 @@
+// import React from 'react';
+// import { render, screen, fireEvent } from '@testing-library/react';
+// import Login from './Login';
+
+// describe('Login component', () => {
+//   test('renders login form', () => {
+//     const onRegisterClick = jest.fn();
+//     render(<Login onRegisterClick={onRegisterClick} />);
+
+//     const usernameInput = screen.getByPlaceholderText('请输入用户名');
+//     const passwordInput = screen.getByPlaceholderText('请输入密码');
+//     const loginButton = screen.getByText('登录');
+
+//     expect(usernameInput).toBeInTheDocument();
+//     expect(passwordInput).toBeInTheDocument();
+//     expect(loginButton).toBeInTheDocument();
+//   });
+
+//   test('calls onRegisterClick when "点击注册" is clicked', () => {
+//     const onRegisterClick = jest.fn();
+//     render(<Login onRegisterClick={onRegisterClick} />);
+
+//     const registerButton = screen.getByText('点击注册');
+//     fireEvent.click(registerButton);
+
+//     expect(onRegisterClick).toHaveBeenCalled();
+//   });
+// });
\ No newline at end of file
diff --git a/src/components/Auth/Register.jsx b/src/components/Auth/Register.jsx
index de32cc2..16b2313 100644
--- a/src/components/Auth/Register.jsx
+++ b/src/components/Auth/Register.jsx
@@ -1,121 +1,261 @@
-import React, { useState } from 'react';
-import '../../pages/AuthPage/AuthPage.css';
-import image from './logo.svg'; // 引入图片
+// import React, { useState } from 'react';
+// import '../../pages/AuthPage/AuthPage.css';
+// import image from './logo.svg'; // 引入图片
 
-const Register = ({ onLoginClick }) => {
-  const [formData, setFormData] = useState({
-    username: '',
-    password: '',
-    email: ''
-  });
-  const [verificationCode, setVerificationCode] = useState('');
+// const Register = ({ onLoginClick }) => {
+//   const [formData, setFormData] = useState({
+//     username: '',
+//     password: '',
+//     email: ''
+//   });
+//   const [verificationCode, setVerificationCode] = useState('');
 
-  const handleSubmit = async (e) => {
-    e.preventDefault();
-    // 注册逻辑
-  };
+//   const handleSubmit = async (e) => {
+//     e.preventDefault();
+//     // 注册逻辑
+//   };
 
-  const verifyEmailCode = async () => {
-    try {
-      const response = await fetch('http://localhost:8080/user/verify-code', {
-        method: 'POST',
-        headers: {
-          'Content-Type': 'application/json',
-        },
-        body: JSON.stringify({
-          email: formData.email,
-          code: verificationCode,
-        }),
-      });
+//   const verifyEmailCode = async () => {
+//     try {
+//       const response = await fetch('http://localhost:8080/user/verify-code', {
+//         method: 'POST',
+//         headers: {
+//           'Content-Type': 'application/json',
+//         },
+//         body: JSON.stringify({
+//           email: formData.email,
+//           code: verificationCode,
+//         }),
+//       });
 
-      const result = await response.json();
-      if (response.ok && result.code === "0") {
-        console.log('邮箱验证成功:', result.msg);
-        // 处理成功逻辑
-      } else {
-        console.error('邮箱验证失败:', result.msg);
-        // 处理失败逻辑
-      }
-    } catch (error) {
-      console.error('请求错误:', error);
-      // 处理请求错误
-    }
-  };
+//       const result = await response.json();
+//       if (response.ok && result.code === "0") {
+//         console.log('邮箱验证成功:', result.msg);
+//         // 处理成功逻辑
+//       } else {
+//         console.error('邮箱验证失败:', result.msg);
+//         // 处理失败逻辑
+//       }
+//     } catch (error) {
+//       console.error('请求错误:', error);
+//       // 处理请求错误
+//     }
+//   };
 
 
-  return (
-    <div className="auth-container">
-      <img 
-        src={image} 
-        alt="描述" 
-        style={{ width: '30%', height: 'auto'}} 
-      />
-      <div className="auth-form-section">
-        <h3>用户注册</h3>
-        <form onSubmit={handleSubmit}>
-          <div className="form-group">
-            <label>用户名</label>
-            <input
-              type="text"
-              className="form-input"
-              placeholder="请输入用户名"
-              value={formData.username}
-              onChange={(e) => setFormData({ ...formData, username: e.target.value })}
-              required
-            />
-          </div>
-          <div className="form-group">
-            <label>密码</label>
-            <input
-              type="password"
-              className="form-input"
-              placeholder="请输入密码"
-              value={formData.password}
-              onChange={(e) => setFormData({ ...formData, password: e.target.value })}
-              required
-            />
-          </div>
-          <div className="form-group">
-            <label>邮箱</label>
-            <div style={{ display: 'flex', alignItems: 'center' }}>
-              <input
-                type="email"
-                className="form-input"
-                placeholder="请输入邮箱"
-                value={formData.email}
-                onChange={(e) => setFormData({ ...formData, email: e.target.value })}
-                required
-                style={{ flex: 1, marginRight: '10px' }}
-              />
-              <button type="button" onClick={verifyEmailCode} className="verify-button">
-                验证邮箱
-              </button>
-            </div>
-          </div>
-          <div className="form-group">
-            <label>验证码</label>
-            <input
-              type="text"
-              className="form-input"
-              placeholder="请输入邮箱验证码"
-              value={verificationCode}
-              onChange={(e) => setVerificationCode(e.target.value)}
-              required
-            />
-          </div>
-          <button type="submit" className="auth-button">
-            注册
-          </button>
-          <p className="login-link">
-            已有账号? 
-            <button onClick={onLoginClick} className="link-button">
-              点击登录
-            </button>
-          </p>
-        </form>
-      </div>
-    </div>
-  );
-};
+//   return (
+//     <div className="auth-container">
+//       <img 
+//         src={image} 
+//         alt="描述" 
+//         style={{ width: '30%', height: 'auto'}} 
+//       />
+//       <div className="auth-form-section">
+//         <h3>用户注册</h3>
+//         <form onSubmit={handleSubmit}>
+//           <div className="form-group">
+//             <label>用户名</label>
+//             <input
+//               type="text"
+//               className="form-input"
+//               placeholder="请输入用户名"
+//               value={formData.username}
+//               onChange={(e) => setFormData({ ...formData, username: e.target.value })}
+//               required
+//             />
+//           </div>
+//           <div className="form-group">
+//             <label>密码</label>
+//             <input
+//               type="password"
+//               className="form-input"
+//               placeholder="请输入密码"
+//               value={formData.password}
+//               onChange={(e) => setFormData({ ...formData, password: e.target.value })}
+//               required
+//             />
+//           </div>
+//           <div className="form-group">
+//             <label>邮箱</label>
+//             <div style={{ display: 'flex', alignItems: 'center' }}>
+//               <input
+//                 type="email"
+//                 className="form-input"
+//                 placeholder="请输入邮箱"
+//                 value={formData.email}
+//                 onChange={(e) => setFormData({ ...formData, email: e.target.value })}
+//                 required
+//                 style={{ flex: 1, marginRight: '10px' }}
+//               />
+//               <button type="button" onClick={verifyEmailCode} className="verify-button">
+//                 验证邮箱
+//               </button>
+//             </div>
+//           </div>
+//           <div className="form-group">
+//             <label>验证码</label>
+//             <input
+//               type="text"
+//               className="form-input"
+//               placeholder="请输入邮箱验证码"
+//               value={verificationCode}
+//               onChange={(e) => setVerificationCode(e.target.value)}
+//               required
+//             />
+//           </div>
+//           <button type="submit" className="auth-button">
+//             注册
+//           </button>
+//           <p className="login-link">
+//             已有账号? 
+//             <button onClick={onLoginClick} className="link-button">
+//               点击登录
+//             </button>
+//           </p>
+//         </form>
+//       </div>
+//     </div>
+//   );
+// };
 
-export default Register;
\ No newline at end of file
+// export default Register;
+
+// import React, { useState } from 'react';
+// import '../../pages/AuthPage/AuthPage.css';
+// import image from './logo.svg';
+
+// const API_BASE = process.env.REACT_APP_API_BASE || '/echo';
+
+// const Register = ({ onLoginClick }) => {
+//   const [formData, setFormData] = useState({
+//     username: '',
+//     email: '',
+//     password: '',
+//     role: 'user',
+//     inviteCode: ''
+//   });
+//   const [error, setError] = useState('');
+//   const [isSubmitting, setIsSubmitting] = useState(false);
+
+//   const handleSubmit = async (e) => {
+//     e.preventDefault();
+//     setIsSubmitting(true);
+//     setError('');
+
+//     try {
+//       const response = await fetch(`${API_BASE}/user/register`, {
+//         method: 'POST',
+//         headers: {
+//           'Content-Type': 'application/json',
+//         },
+//         body: JSON.stringify(formData),
+//       });
+
+//       const result = await response.json();
+      
+//       if (!response.ok) {
+//         throw new Error(result.message || '注册失败');
+//       }
+
+//       console.log('注册成功:', result);
+//       // 这里可以添加注册成功后的跳转逻辑
+//       alert('注册成功！');
+//     } catch (error) {
+//       console.error('注册错误:', error);
+//       setError(error.message || '注册过程中出现错误');
+//     } finally {
+//       setIsSubmitting(false);
+//     }
+//   };
+
+//   const handleChange = (e) => {
+//     const { name, value } = e.target;
+//     setFormData(prev => ({ ...prev, [name]: value }));
+//   };
+
+//   return (
+//     <div className="auth-container">
+//       <img
+//         src={image}
+//         alt="网站Logo"
+//         style={{ width: '30%', height: 'auto' }}
+//       />
+//       <div className="auth-form-section">
+//         <h3>用户注册</h3>
+//         {error && <div className="error-message">{error}</div>}
+//         <form onSubmit={handleSubmit}>
+//           <div className="form-group">
+//             <label>用户名</label>
+//             <input
+//               type="text"
+//               name="username"
+//               className="form-input"
+//               placeholder="请输入用户名"
+//               value={formData.username}
+//               onChange={handleChange}
+//               required
+//               minLength="3"
+//               maxLength="20"
+//             />
+//           </div>
+//           <div className="form-group">
+//             <label>邮箱</label>
+//             <input
+//               type="email"
+//               name="email"
+//               className="form-input"
+//               placeholder="请输入邮箱"
+//               value={formData.email}
+//               onChange={handleChange}
+//               required
+//             />
+//           </div>
+//           <div className="form-group">
+//             <label>密码</label>
+//             <input
+//               type="password"
+//               name="password"
+//               className="form-input"
+//               placeholder="请输入密码"
+//               value={formData.password}
+//               onChange={handleChange}
+//               required
+//               minLength="6"
+//             />
+//           </div>
+//           <div className="form-group">
+//             <label>邀请码</label>
+//             <input
+//               type="text"
+//               name="inviteCode"
+//               className="form-input"
+//               placeholder="请输入邀请码"
+//               value={formData.inviteCode}
+//               onChange={handleChange}
+//               required
+//             />
+//           </div>
+//           <button 
+//             type="submit" 
+//             className="auth-button"
+//             disabled={isSubmitting}
+//           >
+//             {isSubmitting ? '注册中...' : '注册'}
+//           </button>
+//           <p className="login-link">
+//             已有账号?{' '}
+//             <button 
+//               type="button"
+//               onClick={onLoginClick} 
+//               className="link-button"
+//             >
+//               点击登录
+//             </button>
+//           </p>
+//         </form>
+//       </div>
+//     </div>
+//   );
+// };
+
+// export default Register;
\ No newline at end of file
diff --git a/src/components/Auth/Register.test.jsx b/src/components/Auth/Register.test.jsx
deleted file mode 100644
index 969e464..0000000
--- a/src/components/Auth/Register.test.jsx
+++ /dev/null
@@ -1,32 +0,0 @@
-import React from 'react';
-import { render, screen, fireEvent } from '@testing-library/react';
-import Register from './Register';
-
-describe('Register component', () => {
-  test('renders register form', () => {
-    const onLoginClick = jest.fn();
-    render(<Register onLoginClick={onLoginClick} />);
-
-    const usernameInput = screen.getByPlaceholderText('请输入用户名');
-    const passwordInput = screen.getByPlaceholderText('请输入密码');
-    const emailInput = screen.getByPlaceholderText('请输入邮箱');
-    const verifyButton = screen.getByText('验证邮箱');
-    const registerButton = screen.getByText('注册');
-
-    expect(usernameInput).toBeInTheDocument();
-    expect(passwordInput).toBeInTheDocument();
-    expect(emailInput).toBeInTheDocument();
-    expect(verifyButton).toBeInTheDocument();
-    expect(registerButton).toBeInTheDocument();
-  });
-
-  test('calls onLoginClick when "点击登录" is clicked', () => {
-    const onLoginClick = jest.fn();
-    render(<Register onLoginClick={onLoginClick} />);
-
-    const loginButton = screen.getByText('点击登录');
-    fireEvent.click(loginButton);
-
-    expect(onLoginClick).toHaveBeenCalled();
-  });
-});
\ No newline at end of file
diff --git a/src/components/Auth/Register.test.jsx.txt b/src/components/Auth/Register.test.jsx.txt
new file mode 100644
index 0000000..356fadd
--- /dev/null
+++ b/src/components/Auth/Register.test.jsx.txt
@@ -0,0 +1,32 @@
+// import React from 'react';
+// import { render, screen, fireEvent } from '@testing-library/react';
+// import Register from './Register';
+
+// describe('Register component', () => {
+//   test('renders register form', () => {
+//     const onLoginClick = jest.fn();
+//     render(<Register onLoginClick={onLoginClick} />);
+
+//     const usernameInput = screen.getByPlaceholderText('请输入用户名');
+//     const passwordInput = screen.getByPlaceholderText('请输入密码');
+//     const emailInput = screen.getByPlaceholderText('请输入邮箱');
+//     const verifyButton = screen.getByText('验证邮箱');
+//     const registerButton = screen.getByText('注册');
+
+//     expect(usernameInput).toBeInTheDocument();
+//     expect(passwordInput).toBeInTheDocument();
+//     expect(emailInput).toBeInTheDocument();
+//     expect(verifyButton).toBeInTheDocument();
+//     expect(registerButton).toBeInTheDocument();
+//   });
+
+//   test('calls onLoginClick when "点击登录" is clicked', () => {
+//     const onLoginClick = jest.fn();
+//     render(<Register onLoginClick={onLoginClick} />);
+
+//     const loginButton = screen.getByText('点击登录');
+//     fireEvent.click(loginButton);
+
+//     expect(onLoginClick).toHaveBeenCalled();
+//   });
+// });
\ No newline at end of file
