'use client'; import { useSearchParams } from 'next/navigation'; import { useState, useEffect, useCallback, Suspense } from 'react'; import OrderTable from '@/components/admin/OrderTable'; import OrderDetail from '@/components/admin/OrderDetail'; function AdminContent() { const searchParams = useSearchParams(); const token = searchParams.get('token'); const [orders, setOrders] = useState([]); const [total, setTotal] = useState(0); const [page, setPage] = useState(1); const [totalPages, setTotalPages] = useState(1); const [statusFilter, setStatusFilter] = useState(''); const [loading, setLoading] = useState(true); const [error, setError] = useState(''); // Dialogs const [detailOrder, setDetailOrder] = useState(null); const fetchOrders = useCallback(async () => { if (!token) return; setLoading(true); try { const params = new URLSearchParams({ token, page: String(page), page_size: '20' }); if (statusFilter) params.set('status', statusFilter); const res = await fetch(`/api/admin/orders?${params}`); if (!res.ok) { if (res.status === 401) { setError('管理员凭证无效'); return; } throw new Error('请求失败'); } const data = await res.json(); setOrders(data.orders); setTotal(data.total); setTotalPages(data.total_pages); } catch (e) { setError('加载订单列表失败'); } finally { setLoading(false); } }, [token, page, statusFilter]); useEffect(() => { fetchOrders(); }, [fetchOrders]); if (!token) { return (
缺少管理员凭证
); } const handleRetry = async (orderId: string) => { if (!confirm('确认重试充值?')) return; try { const res = await fetch(`/api/admin/orders/${orderId}/retry?token=${token}`, { method: 'POST', }); if (res.ok) { fetchOrders(); } else { const data = await res.json(); setError(data.error || '重试失败'); } } catch { setError('重试请求失败'); } }; const handleCancel = async (orderId: string) => { if (!confirm('确认取消该订单?')) return; try { const res = await fetch(`/api/admin/orders/${orderId}/cancel?token=${token}`, { method: 'POST', }); if (res.ok) { fetchOrders(); } else { const data = await res.json(); setError(data.error || '取消失败'); } } catch { setError('取消请求失败'); } }; const handleViewDetail = async (orderId: string) => { try { const res = await fetch(`/api/admin/orders/${orderId}?token=${token}`); if (res.ok) { const data = await res.json(); setDetailOrder(data); } } catch { setError('加载订单详情失败'); } }; const statuses = ['', 'PENDING', 'PAID', 'RECHARGING', 'COMPLETED', 'EXPIRED', 'CANCELLED', 'FAILED', 'REFUNDED']; const statusLabels: Record = { '': '全部', PENDING: '待支付', PAID: '已支付', RECHARGING: '充值中', COMPLETED: '已完成', EXPIRED: '已超时', CANCELLED: '已取消', FAILED: '充值失败', REFUNDED: '已退款', }; return (

Sub2ApiPay 订单管理

{error && (
{error}
)} {/* Filters */}
{statuses.map((s) => ( ))}
{/* Table */}
{loading ? (
加载中...
) : ( )}
{/* Pagination */} {totalPages > 1 && (
共 {total} 条记录
{page} / {totalPages}
)} {/* Order Detail */} {detailOrder && ( setDetailOrder(null)} /> )}
); } export default function AdminPage() { return (
加载中...
}>
); }