import { useState, useEffect } from 'react' import { LayoutDashboard, Key, Upload, Cloud, LogOut, Menu, X, Server, Users } from 'lucide-react' import clsx from 'clsx' import AccountManager from './components/AccountManager' import ApiTester from './components/ApiTester' import BatchImport from './components/BatchImport' import VercelSync from './components/VercelSync' import Login from './components/Login' const NAV_ITEMS = [ { id: 'accounts', label: '账号管理', icon: Users, description: '管理 DeepSeek 账号池' }, { id: 'test', label: 'API 测试', icon: Server, description: '测试 API 连接与响应' }, { id: 'import', label: '批量导入', icon: Upload, description: '批量导入账号配置' }, { id: 'vercel', label: 'Vercel 同步', icon: Cloud, description: '同步配置到 Vercel' }, ] export default function App() { const [activeTab, setActiveTab] = useState('accounts') const [config, setConfig] = useState({ keys: [], accounts: [] }) const [loading, setLoading] = useState(true) const [message, setMessage] = useState(null) const [token, setToken] = useState(null) const [authChecking, setAuthChecking] = useState(true) const [sidebarOpen, setSidebarOpen] = useState(false) // 检查已存储的 Token useEffect(() => { const checkAuth = async () => { const storedToken = localStorage.getItem('ds2api_token') || sessionStorage.getItem('ds2api_token') const expiresAt = parseInt(localStorage.getItem('ds2api_token_expires') || sessionStorage.getItem('ds2api_token_expires') || '0') if (storedToken && expiresAt > Date.now()) { try { const res = await fetch('/admin/verify', { headers: { 'Authorization': `Bearer ${storedToken}` } }) if (res.ok) { setToken(storedToken) } else { handleLogout() } } catch { setToken(storedToken) } } setAuthChecking(false) } checkAuth() }, []) const authFetch = async (url, options = {}) => { const headers = { ...options.headers, 'Authorization': `Bearer ${token}` } const res = await fetch(url, { ...options, headers }) if (res.status === 401) { handleLogout() throw new Error('认证已过期,请重新登录') } return res } const fetchConfig = async () => { if (!token) return try { setLoading(true) const res = await authFetch('/admin/config') if (res.ok) { const data = await res.json() setConfig(data) } } catch (e) { console.error('获取配置失败:', e) showMessage('error', e.message) } finally { setLoading(false) } } useEffect(() => { if (token) { fetchConfig() } }, [token]) const showMessage = (type, text) => { setMessage({ type, text }) setTimeout(() => setMessage(null), 5000) } const handleLogin = (newToken) => { setToken(newToken) } const handleLogout = () => { setToken(null) localStorage.removeItem('ds2api_token') localStorage.removeItem('ds2api_token_expires') sessionStorage.removeItem('ds2api_token') sessionStorage.removeItem('ds2api_token_expires') } const renderTab = () => { switch (activeTab) { case 'accounts': return case 'test': return case 'import': return case 'vercel': return default: return null } } if (authChecking) { return (

检查登录状态...

) } if (!token) { return (
{/* Background decorative elements */}
{message && (
{message.text}
)}
) } return (
{/* Mobile Sidebar Overlay */} {sidebarOpen && (
setSidebarOpen(false)} /> )} {/* Sidebar */} {/* Main Content */}
{/* Mobile Header */}
DS2API
{/* Content Area */}

{NAV_ITEMS.find(n => n.id === activeTab)?.label}

{NAV_ITEMS.find(n => n.id === activeTab)?.description}

{message && (
{message.type === 'error' ? :
} {message.text}
)}
{loading ? (

正在加载数据,请稍候...

) : ( renderTab() )}
) }