import React, { useEffect, useState } from 'react'; import apiClient from './api/client'; import clusterDeliveryUrl from './assets/login/cluster-delivery-art.webp'; import processingArchitectureUrl from './assets/login/processing-architecture-art.webp'; import systemOverviewUrl from './assets/login/system-overview-art.webp'; const loginSlides = [ { title: '统一管理雷达数据生产流程', description: '覆盖源数据入库、精密轨道匹配、生产编排、成果目录和地图分析,形成可审计的工程闭环。', image: systemOverviewUrl, }, { title: '面向 D-InSAR / SBAS 的处理链路', description: '扫描与解析先行,生产任务进入队列,运行结果和失败归因统一登记,便于复查和补跑。', image: processingArchitectureUrl, }, { title: '支持集群生产与成果交付', description: '主服务器负责资产、权限和审计,生产节点承担受控处理服务,结果回传后进入交付申请与下载流程。', image: clusterDeliveryUrl, }, ]; const LoginPage = ({ onLoginSuccess }) => { const [username, setUsername] = useState(''); const [password, setPassword] = useState(''); const [loading, setLoading] = useState(false); const [message, setMessage] = useState(''); const [activeSlide, setActiveSlide] = useState(0); useEffect(() => { const timer = window.setInterval(() => { setActiveSlide((current) => (current + 1) % loginSlides.length); }, 5200); return () => window.clearInterval(timer); }, []); const handleSubmit = async (event) => { event.preventDefault(); setLoading(true); setMessage(''); try { const response = await apiClient.post('/auth/login', { username: username.trim(), password, }); if (onLoginSuccess) { await onLoginSuccess(response.data?.user || null); } } catch (error) { const status = error.response?.status; if (status === 401) { setMessage('用户名或密码不正确。'); } else if (status === 429) { setMessage(error.response?.data?.detail || '登录尝试过于频繁,请稍后再试。'); } else { setMessage(error.response?.data?.detail || '登录请求失败,请稍后重试。'); } } finally { setLoading(false); } }; return (
内网受控访问,请使用管理员分配的账号登录。
{loginSlides[activeSlide].description}