diff --git a/.DS_Store b/.DS_Store index b1b4307..72e91dd 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/dist.zip b/dist.zip index d1efc61..26e9148 100644 Binary files a/dist.zip and b/dist.zip differ diff --git a/src/pages/HomePage.css b/src/pages/HomePage.css index d44c458..bc778c3 100644 --- a/src/pages/HomePage.css +++ b/src/pages/HomePage.css @@ -296,12 +296,19 @@ .modal-header h2 { margin: 0; font-size: 1.75rem; font-weight: 600; } .close-btn { background: none; border: none; cursor: pointer; color: #888; padding: 0.5rem; border-radius: 50%; transition: all 0.3s ease; } .close-btn:hover { background: #f1f3f5; color: #333; } -.login-form { display: flex; flex-direction: column; gap: 1.5rem; } +.login-form { display: flex; flex-direction: column; gap: 1rem; } .form-group { display: flex; flex-direction: column; gap: 0.5rem; } .form-group label { display: flex; align-items: center; gap: 0.5rem; font-weight: 500; color: #555; } -.form-group input { padding: 0.85rem 1rem; border: 1px solid #ced4da; border-radius: 10px; font-size: 1rem; transition: all 0.3s ease; } -.form-group input:focus { outline: none; border-color: #8a63d2; box-shadow: 0 0 0 4px rgba(111, 66, 193, 0.1); } -.error-message { background: #fff5f5; color: #c53030; padding: 0.85rem; border-radius: 8px; border: 1px solid #fed7d7; font-size: 0.9rem; } +.form-group input[type="text"], +.form-group input[type="password"] { padding: 0.85rem 1rem; border: 1px solid #ced4da; border-radius: 10px; font-size: 1rem; transition: all 0.3s ease; } +.form-group input[type="text"]:focus, +.form-group input[type="password"]:focus { outline: none; border-color: #8a63d2; box-shadow: 0 0 0 4px rgba(111, 66, 193, 0.1); } +.form-group.password-group { position: relative; margin-bottom: 0.5rem; } +.remember-me-label { display: flex; align-items: center; gap: 0.5rem; cursor: pointer; font-weight: 400; color: #555; font-size: 0.9rem; margin-top: 0.5rem; align-self: flex-end; } +.remember-me-label input[type="checkbox"] { width: 16px; height: 16px; cursor: pointer; accent-color: var(--accent-color); } +.remember-me-label span { user-select: none; } +.error-message-container { min-height: 52px; display: flex; align-items: center; } +.error-message { background: #fff5f5; color: #c53030; padding: 0.85rem; border-radius: 8px; border: 1px solid #fed7d7; font-size: 0.9rem; width: 100%; } .submit-btn { background: var(--accent-color); color: white; border: none; padding: 0.85rem; border-radius: 10px; font-size: 1rem; font-weight: 600; cursor: pointer; transition: all 0.3s ease; } .submit-btn:hover:not(:disabled) { background-color: var(--accent-color-dark); transform: translateY(-2px); box-shadow: 0 4px 15px rgba(111, 66, 193, 0.2); } .submit-btn:disabled { opacity: 0.6; cursor: not-allowed; } diff --git a/src/pages/HomePage.jsx b/src/pages/HomePage.jsx index 1782f29..a5367f8 100644 --- a/src/pages/HomePage.jsx +++ b/src/pages/HomePage.jsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import React, { useState, useEffect } from 'react'; import { Brain, Users, Calendar, TrendingUp, X, User, Lock, Library, Download, LogIn } from 'lucide-react'; import { Link } from 'react-router-dom'; import apiClient from '../utils/apiClient'; @@ -10,6 +10,18 @@ const HomePage = ({ onLogin }) => { const [loginForm, setLoginForm] = useState({ username: '', password: '' }); const [loginError, setLoginError] = useState(''); const [isLoading, setIsLoading] = useState(false); + const [rememberMe, setRememberMe] = useState(false); + + // 组件挂载时,从localStorage读取保存的用户名 + useEffect(() => { + const savedUsername = localStorage.getItem('rememberedUsername'); + const isRemembered = localStorage.getItem('rememberMe') === 'true'; + + if (savedUsername && isRemembered) { + setLoginForm(prev => ({ ...prev, username: savedUsername })); + setRememberMe(true); + } + }, []); const handleLogin = async (e) => { e.preventDefault(); @@ -18,10 +30,20 @@ const HomePage = ({ onLogin }) => { try { const loginResponse = await apiClient.post(buildApiUrl(API_ENDPOINTS.AUTH.LOGIN), loginForm); + + // 处理记住用户名 + if (rememberMe) { + localStorage.setItem('rememberedUsername', loginForm.username); + localStorage.setItem('rememberMe', 'true'); + } else { + localStorage.removeItem('rememberedUsername'); + localStorage.removeItem('rememberMe'); + } + onLogin(loginResponse.data); setShowLoginModal(false); } catch (error) { - setLoginError(error.response?.data?.message || '登录失败,请重试'); + setLoginError(error.response?.data?.message || '登录失败,请重试'); } finally { setIsLoading(false); } @@ -153,8 +175,8 @@ const HomePage = ({ onLogin }) => { required /> - -
+ +
- {loginError && ( -
{loginError}
- )} +
+ {loginError && ( +
{loginError}
+ )} +
- - -
-

开通业务账号:

-

请联系平台管理员

-
)}