import { siteapicontrollerCreatemedia } from '@/servers/api/siteApi'; import { DeleteOutlined, EditOutlined, PlusOutlined } from '@ant-design/icons'; import { ModalForm, PageContainer, ProColumns, ProFormText, ProFormUploadButton, ProTable, } from '@ant-design/pro-components'; import { request, useParams } from '@umijs/max'; import { App, Button, Image, Popconfirm, Space } from 'antd'; import React, { useState } from 'react'; const MediaPage: React.FC = () => { const { message } = App.useApp(); const { siteId } = useParams<{ siteId: string }>(); const [editing, setEditing] = useState(null); const [selectedRowKeys, setSelectedRowKeys] = useState([]); const actionRef = React.useRef(null); React.useEffect(() => { actionRef.current?.reload(); }, [siteId]); const handleDelete = async (id: number) => { if (!siteId) return; try { const res = await request(`/site-api/${siteId}/media/${id}`, { method: 'DELETE', }); if (res.success) { message.success('删除成功'); actionRef.current?.reload(); } else { message.error(res.message || '删除失败'); } } catch (error: any) { message.error(error.message || '删除失败'); } }; const handleUpdate = async (id: number, data: any) => { if (!siteId) return false; try { const res = await request(`/site-api/${siteId}/media/${id}`, { method: 'PUT', data, }); if (res.success) { message.success('更新成功'); actionRef.current?.reload(); return true; } else { message.error(res.message || '更新失败'); return false; } } catch (error: any) { message.error(error.message || '更新失败'); return false; } }; const columns: ProColumns[] = [ { title: 'ID', dataIndex: 'id', hideInSearch: true, width: 120, copyable: true, render: (_, record) => { return record?.id ?? '-'; }, }, { title: '展示', dataIndex: 'source_url', hideInSearch: true, render: (_, record) => ( ), }, { title: '名称', dataIndex: 'title', copyable: true, ellipsis: true, width: 200, }, { title: '地址', dataIndex: 'source_url', copyable: true, ellipsis: true, hideInSearch: true, }, { title: '媒体类型', dataIndex: 'media_type', width: 120, }, { title: 'MIME类型', dataIndex: 'mime_type', width: 120, }, { // 文件大小列 title: '文件大小', dataIndex: 'file_size', hideInSearch: true, width: 120, render: (_: any, record: any) => { // 获取文件大小 const fileSize = record.file_size; // 如果文件大小不存在,则直接返回- if (!fileSize) { return '-'; } // 如果文件大小小于1024,则单位为B if (fileSize < 1024) { return `${fileSize} B`; // 如果文件大小小于1024*1024,则单位为KB } else if (fileSize < 1024 * 1024) { return `${(fileSize / 1024).toFixed(2)} KB`; // 否则单位为MB } else { return `${(fileSize / (1024 * 1024)).toFixed(2)} MB`; } }, }, { title: '创建时间', dataIndex: 'date_created', valueType: 'dateTime', hideInSearch: true, }, { title: '操作', valueType: 'option', width: 160, fixed: 'right', render: (_, record) => ( handleDelete(record.id)} okText="确定" cancelText="取消" > ), }, ]; return ( { if (!siteId) return { data: [], total: 0 }; const { current, pageSize } = params || {}; let orderObj: Record | undefined = undefined; if (sort && typeof sort === 'object') { const [field, dir] = Object.entries(sort)[0] || []; if (field && dir) { orderObj = { [field]: dir === 'descend' ? 'desc' : 'asc' }; } } const response = await request(`/site-api/${siteId}/media`, { params: { page: current, page_size: pageSize, ...(orderObj ? { order: orderObj } : {}), }, }); if (!response.success) { message.error(response.message || '获取媒体列表失败'); return { data: [], total: 0, success: false, }; } // 从API响应中正确获取数据,API响应结构为 { success, message, data, code } const data = response.data; return { total: data?.total || 0, data: data?.items || [], success: true, }; }} search={false} options={{ reload: true }} toolBarRender={() => [ }> 上传媒体 } width={500} onFinish={async (values) => { if (!siteId) return false; try { const formData = new FormData(); formData.append('siteId', siteId); if (values.file && values.file.length > 0) { values.file.forEach((f: any) => { formData.append('file', f.originFileObj); }); } else { message.warning('请选择文件'); return false; } const res = await siteapicontrollerCreatemedia({ body: formData, }); if (res.success) { message.success('上传成功'); actionRef.current?.reload(); return true; } else { message.error(res.message || '上传失败'); return false; } } catch (error: any) { message.error(error.message || '上传失败'); return false; } }} > , , { // 条件判断 如果站点編號不存在則直接返回 if (!siteId) return; // 发起批量删除请求 const response = await request( `/site-api/${siteId}/media/batch`, { method: 'POST', data: { delete: selectedRowKeys } }, ); // 条件判断 根据接口返回结果进行提示 if (response.success) { message.success('批量删除成功'); } else { message.warning(response.message || '部分删除失败'); } // 清空已选择的行鍵值 setSelectedRowKeys([]); // 刷新列表数据 actionRef.current?.reload(); }} > , , ]} /> { if (!visible) setEditing(null); }} initialValues={{ title: editing?.title, }} modalProps={{ destroyOnClose: true, }} onFinish={async (values) => { if (!editing) return false; const success = await handleUpdate(editing.id, values); if (success) { setEditing(null); } return success; }} > ); }; export default MediaPage;