import React, { useEffect, useState } from 'react'; import { Row, Col, Typography, Button, Form, Input, Space, Tabs, App } from 'antd'; import { UserOutlined, LockOutlined, ArrowRightOutlined, } from '@ant-design/icons'; import apiClient from '../utils/apiClient'; import { buildApiUrl, API_ENDPOINTS } from '../config/api'; import menuService from '../services/menuService'; import BrandLogo from '../components/BrandLogo'; import configService, { DEFAULT_BRANDING_CONFIG } from '../utils/configService'; const { Title, Paragraph, Text } = Typography; const HomePage = ({ onLogin }) => { const [loading, setLoading] = useState(false); const [branding, setBranding] = useState(DEFAULT_BRANDING_CONFIG); const { message } = App.useApp(); useEffect(() => { configService.getBrandingConfig().then(setBranding).catch(() => {}); }, []); const handleLogin = async (values) => { setLoading(true); try { const response = await apiClient.post(buildApiUrl(API_ENDPOINTS.AUTH.LOGIN), { username: values.username, password: values.password }); if (response.code === '200') { message.success('登录成功'); // 关键修复:保存整个 data 对象,因为它包含了 token 和 user 两个部分 const authData = response.data; localStorage.setItem('iMeetingUser', JSON.stringify(authData)); menuService.clearCache(); // 通知 App 组件更新状态 onLogin(authData); // 入口页会根据当前用户的首个菜单做动态跳转 window.location.href = '/'; } else { message.error(response.message || '登录失败'); } } catch (error) { console.error('Login error:', error); message.error(error.response?.data?.message || '账号或密码错误'); } finally { setLoading(false); } }; return (
{/* 左侧:品牌展示区 */}
<span style={{ color: '#1677ff' }}>{branding.home_headline}</span> {branding.home_tagline}
{/* 右侧:登录交互区 */}
{branding.login_welcome}
用户名} name="username" rules={[{ required: true, message: '请输入用户名' }]} > } placeholder="请输入用户名" style={{ borderRadius: 8, height: 50 }} /> 密码} name="password" rules={[{ required: true, message: '请输入密码' }]} > } placeholder="请输入密码" style={{ borderRadius: 8, height: 50 }} />
{branding.footer_text}
); }; export default HomePage;