imetting_frontend/src/pages/HomePage.jsx

181 lines
5.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import React, { useState } from 'react';
import { Brain, Users, Calendar, TrendingUp, X, User, Lock } from 'lucide-react';
import apiClient from '../utils/apiClient';
import { buildApiUrl, API_ENDPOINTS } from '../config/api';
import './HomePage.css';
const HomePage = ({ onLogin }) => {
const [showLoginModal, setShowLoginModal] = useState(false);
const [loginForm, setLoginForm] = useState({ username: '', password: '' });
const [loginError, setLoginError] = useState('');
const [isLoading, setIsLoading] = useState(false);
const handleLogin = async (e) => {
e.preventDefault();
setIsLoading(true);
setLoginError('');
try {
const response = await apiClient.post(buildApiUrl(API_ENDPOINTS.AUTH.LOGIN), loginForm);
onLogin(response.data);
setShowLoginModal(false);
} catch (error) {
setLoginError(error.response?.data?.detail || '登录失败,请重试');
} finally {
setIsLoading(false);
}
};
const handleInputChange = (e) => {
setLoginForm({
...loginForm,
[e.target.name]: e.target.value
});
};
const closeModal = () => {
setShowLoginModal(false);
setLoginForm({ username: '', password: '' });
setLoginError('');
};
return (
<div className="homepage">
{/* Header */}
<header className="homepage-header">
<div className="header-content">
<div className="logo">
<Brain className="logo-icon" />
<span className="logo-text-white">iMeeting</span>
</div>
<button
className="login-btn"
onClick={() => setShowLoginModal(true)}
>
登录
</button>
</div>
</header>
{/* Hero Section */}
<section className="hero">
<div className="hero-content">
<h1 className="hero-title">智慧会议让会议更高效</h1>
<p className="hero-subtitle">
通过AI技术将会议音视频转化为结构化信息提升团队协作效率
</p>
<button
className="cta-button"
onClick={() => setShowLoginModal(true)}
>
开始使用
</button>
</div>
</section>
{/* Features Section */}
<section className="features">
<div className="features-container">
<h2 className="features-title">核心功能</h2>
<div className="features-grid">
<div className="feature-card">
<Brain className="feature-icon" />
<h3>AI智能转录</h3>
<p>自动将会议音频转为文字并识别不同发言人</p>
</div>
<div className="feature-card">
<Users className="feature-icon" />
<h3>参会人管理</h3>
<p>轻松管理会议参与者追踪会议参与情况</p>
</div>
<div className="feature-card">
<Calendar className="feature-icon" />
<h3>时间轴视图</h3>
<p>按时间顺序展示所有会议快速回顾历史记录</p>
</div>
<div className="feature-card">
<TrendingUp className="feature-icon" />
<h3>智能摘要</h3>
<p>AI自动生成会议摘要提取关键信息和决策</p>
</div>
</div>
</div>
</section>
{/* Footer */}
<footer className="homepage-footer">
<p>© 2025 紫光汇智信息技术有限公司. All rights reserved.</p>
<p>备案号渝ICP备2023007695号-11</p>
</footer>
{/* Login Modal */}
{showLoginModal && (
<div className="modal-overlay" onClick={closeModal}>
<div className="login-modal" onClick={e => e.stopPropagation()}>
<div className="modal-header">
<h2>登录到iMeeting</h2>
<button className="close-btn" onClick={closeModal}>
<X size={20} />
</button>
</div>
<form className="login-form" onSubmit={handleLogin}>
<div className="form-group">
<label htmlFor="username">
<User size={18} />
用户名
</label>
<input
type="text"
id="username"
name="username"
value={loginForm.username}
onChange={handleInputChange}
placeholder="请输入用户名"
required
/>
</div>
<div className="form-group">
<label htmlFor="password">
<Lock size={18} />
密码
</label>
<input
type="password"
id="password"
name="password"
value={loginForm.password}
onChange={handleInputChange}
placeholder="请输入密码"
required
/>
</div>
{loginError && (
<div className="error-message">{loginError}</div>
)}
<button
type="submit"
className="submit-btn"
disabled={isLoading}
>
{isLoading ? '登录中...' : '登录'}
</button>
</form>
<div className="demo-info">
<p>开通业务账号</p>
<p>请联系平台管理员</p>
</div>
</div>
</div>
)}
</div>
);
};
export default HomePage;