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 hideForever = localStorage.getItem('announcement_hide_forever'); const hideToday = localStorage.getItem('announcement_hide_today'); const today = new Date().toDateString(); // 如果永久隐藏或今日已隐藏,则不显示公告 if (hideForever === 'true' || hideToday === today) { const redirect = searchParams.get('redirect') || '/'; navigate(redirect); } else { setShowAnnouncement(true); } } } 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 = () => { // 设置今日不再显示 const today = new Date().toDateString(); localStorage.setItem('announcement_hide_today', today); }; const handleNeverShow = () => { // 设置永久不再显示 localStorage.setItem('announcement_hide_forever', 'true'); }; return ( <>
{/* 装饰性背景元素 */}
{/* Logo区域 */}
Logo
AI小说创作助手 {localAuthEnabled && linuxdoEnabled ? '选择登录方式' : localAuthEnabled ? '使用账户密码登录' : '使用 LinuxDO 账号登录'}
{/* 登录方式 */} {localAuthEnabled && linuxdoEnabled ? ( ) : localAuthEnabled ? ( renderLocalLogin() ) : ( renderLinuxDOLogin() )} {/* 提示信息 */}
🎉 首次登录将自动创建账号
🔒 每个用户拥有独立的数据空间
); }