整理了会议和知识库的代码结构
parent
493e632c1f
commit
46358a623b
|
|
@ -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; }
|
||||
|
|
|
|||
|
|
@ -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
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="form-group">
|
||||
|
||||
<div className="form-group password-group">
|
||||
<label htmlFor="password">
|
||||
<Lock size={18} />
|
||||
密码
|
||||
|
|
@ -168,25 +190,31 @@ const HomePage = ({ onLogin }) => {
|
|||
placeholder="请输入密码"
|
||||
required
|
||||
/>
|
||||
<label htmlFor="rememberMe" className="remember-me-label">
|
||||
<input
|
||||
type="checkbox"
|
||||
id="rememberMe"
|
||||
checked={rememberMe}
|
||||
onChange={(e) => setRememberMe(e.target.checked)}
|
||||
/>
|
||||
<span>记住用户名</span>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
{loginError && (
|
||||
<div className="error-message">{loginError}</div>
|
||||
)}
|
||||
<div className="error-message-container">
|
||||
{loginError && (
|
||||
<div className="error-message">{loginError}</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
<button
|
||||
type="submit"
|
||||
<button
|
||||
type="submit"
|
||||
className="submit-btn"
|
||||
disabled={isLoading}
|
||||
>
|
||||
{isLoading ? '登录中...' : '登录'}
|
||||
</button>
|
||||
</form>
|
||||
|
||||
<div className="demo-info">
|
||||
<p>开通业务账号:</p>
|
||||
<p>请联系平台管理员</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
|
|
|||
Loading…
Reference in New Issue