import type { VxeGridProps } from '@vben/plugins/vxe-table'; export interface BackupInfo { id: number; name: string; type: 'database' | 'file' | 'full'; size: string; path: string; status: 'success' | 'failed' | 'running'; start_time: string; end_time?: string; create_time: string; } export interface BackupForm { id?: number; name: string; type: string; tables?: string[]; exclude_tables?: string[]; compress: 0 | 1; } export const typeOptions = [ { label: '数据库备份', value: 'database' }, { label: '文件备份', value: 'file' }, { label: '完整备份', value: 'full' }, ]; export const statusOptions = [ { label: '成功', value: 'success' }, { label: '失败', value: 'failed' }, { label: '进行中', value: 'running' }, ]; export const statusColorMap = { success: 'success', failed: 'error', running: 'processing', }; export const gridOptions: VxeGridProps = { columns: [ { type: 'checkbox', width: 50 }, { field: 'name', title: '备份名称', minWidth: 150 }, { field: 'type', title: '备份类型', width: 120, formatter: ({ cellValue }) => { const option = typeOptions.find(item => item.value === cellValue); return option?.label || cellValue; }}, { field: 'size', title: '文件大小', width: 100 }, { field: 'status', title: '状态', width: 100, formatter: ({ cellValue }) => { const colorMap = { success: 'success', failed: 'error', running: 'processing', }; const color = colorMap[cellValue] || 'default'; const option = statusOptions.find(item => item.value === cellValue); return `${option?.label || cellValue}`; } }, { field: 'start_time', title: '开始时间', width: 180 }, { field: 'end_time', title: '结束时间', width: 180 }, { field: 'create_time', title: '创建时间', width: 180 }, { field: 'action', fixed: 'right', title: '操作', width: 200, cellRender: { name: 'CellOperation', attrs: { onClick: (code: string, row: BackupInfo) => { // This will be handled in the component }, options: [ { code: 'download', text: '下载', icon: 'ant-design:download-outlined' }, { code: 'restore', text: '还原', icon: 'ant-design:reload-outlined' }, { code: 'delete', text: '删除', icon: 'ant-design:delete-outlined', danger: true }, ], }, }, }, ], height: 'auto', keepSource: true, pagerConfig: { enabled: true, pageSize: 20, pageSizes: [10, 20, 50, 100], }, toolbarConfig: { custom: true, export: true, // import: true, print: true, refresh: true, zoom: true, }, };