diff --git a/video-gen-admin/src/api/index.ts b/video-gen-admin/src/api/index.ts index c6a37c39..37b434b2 100644 --- a/video-gen-admin/src/api/index.ts +++ b/video-gen-admin/src/api/index.ts @@ -94,9 +94,12 @@ export async function getAdminStats(startDate?: string, endDate?: string): Promi return api.get(`/admin/stats${query ? `?${query}` : ''}`); } -export async function getAdminUsers(search?: string): Promise { - const q = search ? `?search=${encodeURIComponent(search)}` : ''; - return api.get(`/admin/users${q}`); +export async function getAdminUsers(page = 1, pageSize = 20, search?: string): Promise<{ items: AdminUser[]; total: number }> { + const params = new URLSearchParams(); + params.set('page', String(page)); + params.set('page_size', String(pageSize)); + if (search) params.set('search', search); + return api.get(`/admin/users?${params.toString()}`); } export async function adjustCredits(userId: string, amount: number, description: string): Promise { @@ -245,20 +248,26 @@ export async function getPaymentStats(params?: { return api.get(url); } -export async function getAdminPaymentOrders(params?: { method?: string; status?: string }): Promise<{ items: any[] }> { +export async function getAdminPaymentOrders(params?: { method?: string; status?: string; startDate?: string; endDate?: string; page?: number; pageSize?: number }): Promise<{ items: any[]; total: number }> { const qs = new URLSearchParams(); - if (params?.method) qs.set('method', params.method); + if (params?.method) qs.set('payment_method', params.method); if (params?.status) qs.set('status', params.status); - const suffix = qs.toString() ? `?${qs.toString()}` : ''; - return api.get(`/admin/payment-orders${suffix}`); + if (params?.startDate) qs.set('start_date', params.startDate); + if (params?.endDate) qs.set('end_date', params.endDate); + if (params?.page) qs.set('page', String(params.page)); + if (params?.pageSize) qs.set('page_size', String(params.pageSize)); + return api.get(`/admin/payment-orders?${qs.toString()}`); } export async function refundPaymentOrder(orderNo: string): Promise { await api.post(`/admin/payment-orders/${orderNo}/refund`); } -export async function getAdminNotifications(): Promise<{ total: number; items: any[] }> { - return api.get('/admin/notifications'); +export async function getAdminNotifications(page = 1, pageSize = 20): Promise<{ total: number; items: any[] }> { + const params = new URLSearchParams(); + params.set('page', String(page)); + params.set('page_size', String(pageSize)); + return api.get(`/admin/notifications?${params.toString()}`); } export async function createAdminNotification(data: { title: string; content: string; type: string; target_user_id?: string }): Promise { diff --git a/video-gen-admin/src/pages/AdminCreditRecords.tsx b/video-gen-admin/src/pages/AdminCreditRecords.tsx index 2abc5fc1..1023ffe9 100644 --- a/video-gen-admin/src/pages/AdminCreditRecords.tsx +++ b/video-gen-admin/src/pages/AdminCreditRecords.tsx @@ -29,6 +29,8 @@ const AdminCreditRecords: React.FC = () => { const [records, setRecords] = useState([]); const [total, setTotal] = useState(0); const [loading, setLoading] = useState(false); + const [page, setPage] = useState(1); + const [pageSize, setPageSize] = useState(10); const [typeFilter, setTypeFilter] = useState(''); const [userNameFilter, setUserNameFilter] = useState(''); const [dateRange, setDateRange] = useState<[dayjs.Dayjs | null, dayjs.Dayjs | null]>([null, null]); @@ -36,11 +38,13 @@ const AdminCreditRecords: React.FC = () => { const load = async () => { setLoading(true); try { - const filters: { type?: string; user_name?: string; start_date?: string; end_date?: string } = {}; + const filters: { type?: string; user_name?: string; start_date?: string; end_date?: string; page?: number; page_size?: number } = {}; if (typeFilter) filters.type = typeFilter; if (userNameFilter) filters.user_name = userNameFilter; if (dateRange[0]) filters.start_date = dateRange[0].format('YYYY-MM-DD'); if (dateRange[1]) filters.end_date = dateRange[1].format('YYYY-MM-DD'); + filters.page = page; + filters.page_size = pageSize; const res = await getCreditRecords(Object.keys(filters).length > 0 ? filters : undefined); setRecords(res.items || []); setTotal(res.total || 0); @@ -51,6 +55,13 @@ const AdminCreditRecords: React.FC = () => { } }; + useEffect(() => { load(); }, [page, pageSize, typeFilter, userNameFilter, dateRange]); + + const handlePageChange = (p: number, ps: number) => { + setPage(p); + setPageSize(ps); + }; + useEffect(() => { load(); }, []); const handleSearch = () => { @@ -191,7 +202,14 @@ const AdminCreditRecords: React.FC = () => { dataSource={records} rowKey="id" loading={loading} - pagination={{ pageSize: 10, showTotal: (t) => `共 ${t} 条记录` }} + pagination={{ + current: page, + pageSize: pageSize, + total: total, + onChange: handlePageChange, + showSizeChanger: true, + showTotal: (t) => `共 ${t} 条记录`, + }} scroll={{ x: 800 }} /> diff --git a/video-gen-admin/src/pages/AdminNotificationManager.tsx b/video-gen-admin/src/pages/AdminNotificationManager.tsx index 0c2a8d78..4083fe0a 100644 --- a/video-gen-admin/src/pages/AdminNotificationManager.tsx +++ b/video-gen-admin/src/pages/AdminNotificationManager.tsx @@ -38,12 +38,16 @@ const AdminNotificationManager: React.FC = () => { const [readModal, setReadModal] = useState<{ open: boolean; notifId: string; title: string }>({ open: false, notifId: '', title: '' }); const [readUsers, setReadUsers] = useState([]); const [readLoading, setReadLoading] = useState(false); + const [page, setPage] = useState(1); + const [pageSize, setPageSize] = useState(10); + const [total, setTotal] = useState(0); const load = async () => { setLoading(true); try { - const res = await getAdminNotifications(); - const userList = await getAdminUsers(); + const res = await getAdminNotifications(page, pageSize); + const userRes = await getAdminUsers(1, 1000); + const userList = userRes.items || []; const userMap: Record = {}; userList.forEach((u: any) => { userMap[u.id] = u.username; }); const items = (res.items || []).map((n: any) => ({ @@ -56,6 +60,7 @@ const AdminNotificationManager: React.FC = () => { createdAt: n.createdAt, })); setNotifications(items); + setTotal(res.total || 0); setUsers(userList.map((u: any) => ({ id: u.id, username: u.username }))); } catch { message.error('加载通知列表失败'); @@ -64,7 +69,12 @@ const AdminNotificationManager: React.FC = () => { } }; - useEffect(() => { load(); }, []); + useEffect(() => { load(); }, [page, pageSize]); + + const handlePageChange = (p: number, ps: number) => { + setPage(p); + setPageSize(ps); + }; const handleSend = async () => { try { @@ -161,7 +171,7 @@ const AdminNotificationManager: React.FC = () => { 消息推送管理 - {notifications.length} 条消息 + 共 {total} 条消息