import { useState } from 'react'; import { Rocket, Loader2, KeyRound, User } from 'lucide-react'; import { toast } from 'sonner'; import { apiClient, auth } from '@/lib/api'; const REMEMBER_KEY = 'flowstack-remember'; // 记住密码:明文存 localStorage 仅适合内网工具场景;不勾选则彻底不落盘 function readRemember(): { username: string; password: string } | null { try { const raw = localStorage.getItem(REMEMBER_KEY); if (!raw) return null; const parsed = JSON.parse(raw); if (parsed?.username && parsed?.password) return parsed; } catch { // 脏数据忽略 } return null; } export default function Login({ onSuccess }: { onSuccess: () => void }) { const remembered = readRemember(); const [username, setUsername] = useState(remembered?.username ?? ''); const [password, setPassword] = useState(remembered?.password ?? ''); const [remember, setRemember] = useState(!!remembered); const [loading, setLoading] = useState(false); const submit = async (e?: React.FormEvent) => { e?.preventDefault(); if (!username.trim() || !password) { toast.error('请输入用户名和密码'); return; } setLoading(true); try { const res = await apiClient.login(username.trim(), password); auth.setToken(res.token); if (remember) { localStorage.setItem(REMEMBER_KEY, JSON.stringify({ username: username.trim(), password })); } else { localStorage.removeItem(REMEMBER_KEY); } toast.success(`欢迎,${res.nickname || res.username}`); onSuccess(); } catch (err) { toast.error('登录失败', { description: (err as Error).message }); } finally { setLoading(false); } }; const inputStyle = { background: 'var(--panel-bg-secondary)', borderColor: 'var(--border-color-light)', color: 'var(--text-primary)' }; return (
发布系统 · 请登录
支持本地账号与 LDAP 账号(启用后自动识别)