整理了会议和知识库的代码结构

main
mula.liu 2025-10-28 19:30:30 +08:00
parent 493e632c1f
commit 46358a623b
4 changed files with 53 additions and 18 deletions

BIN
.DS_Store vendored

Binary file not shown.

BIN
dist.zip

Binary file not shown.

View File

@ -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; }

View File

@ -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>
)}