import { useEffect, useState } from 'react'; import { Button, Card, Space, Typography, message, Spin, Form, Input, Tabs } from 'antd'; import { UserOutlined, LockOutlined } from '@ant-design/icons'; import { authApi } from '../services/api'; import { useNavigate, useSearchParams } from 'react-router-dom'; import AnnouncementModal from '../components/AnnouncementModal'; const { Title, Paragraph } = Typography; export default function Login() { const navigate = useNavigate(); const [searchParams] = useSearchParams(); const [loading, setLoading] = useState(false); const [checking, setChecking] = useState(true); const [localAuthEnabled, setLocalAuthEnabled] = useState(false); const [linuxdoEnabled, setLinuxdoEnabled] = useState(false); const [form] = Form.useForm(); const [showAnnouncement, setShowAnnouncement] = useState(false); // 检查是否已登录和获取认证配置 useEffect(() => { const checkAuth = async () => { try { await authApi.getCurrentUser(); // 已登录,重定向到首页 const redirect = searchParams.get('redirect') || '/'; navigate(redirect); } catch { // 未登录,获取认证配置 try { const config = await authApi.getAuthConfig(); setLocalAuthEnabled(config.local_auth_enabled); setLinuxdoEnabled(config.linuxdo_enabled); } catch (error) { console.error('获取认证配置失败:', error); // 默认显示LinuxDO登录 setLinuxdoEnabled(true); } setChecking(false); } }; checkAuth(); }, [navigate, searchParams]); const handleLocalLogin = async (values: { username: string; password: string }) => { try { setLoading(true); const response = await authApi.localLogin(values.username, values.password); if (response.success) { message.success('登录成功!'); // 检查今天是否已经显示过公告 const doNotShowUntil = localStorage.getItem('announcement_do_not_show_until'); const now = new Date().getTime(); if (!doNotShowUntil || now > parseInt(doNotShowUntil)) { setShowAnnouncement(true); } else { const redirect = searchParams.get('redirect') || '/'; navigate(redirect); } } } catch (error) { console.error('本地登录失败:', error); setLoading(false); } }; const handleLinuxDOLogin = async () => { try { setLoading(true); const response = await authApi.getLinuxDOAuthUrl(); // 保存重定向地址到 sessionStorage const redirect = searchParams.get('redirect'); if (redirect) { sessionStorage.setItem('login_redirect', redirect); } // 跳转到 LinuxDO 授权页面 window.location.href = response.auth_url; } catch (error) { console.error('获取授权地址失败:', error); message.error('获取授权地址失败,请稍后重试'); setLoading(false); } }; if (checking) { return (
); } // 渲染本地登录表单 const renderLocalLogin = () => (
} placeholder="用户名" autoComplete="username" /> } placeholder="密码" autoComplete="current-password" />
); // 渲染LinuxDO登录 const renderLinuxDOLogin = () => (
); const handleAnnouncementClose = () => { setShowAnnouncement(false); const redirect = searchParams.get('redirect') || '/'; navigate(redirect); }; const handleDoNotShowToday = () => { // 设置到今天23:59:59不再显示 const tomorrow = new Date(); tomorrow.setHours(23, 59, 59, 999); localStorage.setItem('announcement_do_not_show_until', tomorrow.getTime().toString()); }; return ( <>
{/* 装饰性背景元素 */}
{/* Logo区域 */}
Logo
AI小说创作助手 {localAuthEnabled && linuxdoEnabled ? '选择登录方式' : localAuthEnabled ? '使用账户密码登录' : '使用 LinuxDO 账号登录'}
{/* 登录方式 */} {localAuthEnabled && linuxdoEnabled ? ( ) : localAuthEnabled ? ( renderLocalLogin() ) : ( renderLinuxDOLogin() )} {/* 提示信息 */}
🎉 首次登录将自动创建账号
🔒 每个用户拥有独立的数据空间
); }