import { useState } from 'react' import { Table, Button, Tag, Space, Typography, Tabs, message } from 'antd' import { CloudUploadOutlined, DeleteOutlined } from '@ant-design/icons' import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query' import { backupAPI } from '@/api' import { backupStatusLabels } from '@/constants/labels' const { Title } = Typography const statusColors: Record = { RUNNING: 'blue', COMPLETED: 'green', FAILED: 'red' } export default function BackupAdmin() { const [tab, setTab] = useState('backups') const qc = useQueryClient() const { data: backups, isLoading: bLoading } = useQuery({ queryKey: ['admin', 'backup-jobs'], queryFn: () => backupAPI.jobs(), enabled: tab === 'backups', }) const { data: cleanups, isLoading: cLoading } = useQuery({ queryKey: ['admin', 'cleanup-jobs'], queryFn: () => backupAPI.cleanups(), enabled: tab === 'cleanup', }) const triggerBackup = useMutation({ mutationFn: (type: string) => backupAPI.triggerBackup(type), onSuccess: () => { message.success('备份任务已触发'); qc.invalidateQueries({ queryKey: ['admin', 'backup-jobs'] }) }, }) const triggerCleanup = useMutation({ mutationFn: (type: string) => backupAPI.triggerCleanup(type), onSuccess: () => { message.success('清理任务已触发'); qc.invalidateQueries({ queryKey: ['admin', 'cleanup-jobs'] }) }, }) const backupColumns = [ { title: 'ID', dataIndex: 'id', width: 100, ellipsis: true }, { title: '类型', dataIndex: 'type', width: 80 }, { title: '状态', dataIndex: 'status', width: 80, render: (s: string) => {backupStatusLabels[s] || s} }, { title: '本地路径', dataIndex: 'localPath', width: 200, ellipsis: true, render: (p: string | null) => p || '-' }, { title: 'COS Key', dataIndex: 'cosObjectKey', width: 180, ellipsis: true, render: (k: string | null) => k || '-' }, { title: '大小', dataIndex: 'fileSizeBytes', width: 80, render: (s: number) => s ? `${(Number(s) / 1048576).toFixed(1)} MB` : '-' }, { title: '开始时间', dataIndex: 'startedAt', width: 120, render: (d: string) => new Date(d).toLocaleString() }, { title: '完成时间', dataIndex: 'completedAt', width: 120, render: (d: string | null) => d ? new Date(d).toLocaleString() : '-' }, ] const cleanupColumns = [ { title: 'ID', dataIndex: 'id', width: 100, ellipsis: true }, { title: '类型', dataIndex: 'type', width: 100 }, { title: '状态', dataIndex: 'status', width: 80, render: (s: string) => {backupStatusLabels[s] || s} }, { title: '目标', dataIndex: 'target', width: 120, ellipsis: true, render: (t: string | null) => t || '-' }, { title: '影响行数', dataIndex: 'rowsAffected', width: 80 }, { title: '开始时间', dataIndex: 'startedAt', width: 120, render: (d: string) => new Date(d).toLocaleString() }, { title: '完成时间', dataIndex: 'completedAt', width: 120, render: (d: string | null) => d ? new Date(d).toLocaleString() : '-' }, ] return (
备份与清理 ), }, { key: 'cleanup', label: '清理任务', children: (
), }, ]} /> ) }