import { ERROR_CODE, IMAGES_TYPE_MAP } from '@/constants/images.constants'; import { getImagesList } from '@/services/images'; import { DeleteOutlined, EyeOutlined, SettingOutlined, } from '@ant-design/icons'; import type { TableProps } from 'antd'; import dayjs from 'dayjs'; import { Button, Checkbox, Input, message, Modal, Popconfirm, Popover, Space, Table, Tooltip, } from 'antd'; import React, { useEffect, useState } from 'react'; import { ImportModal, ModalDetailShow } from './components/modalShow/modalShow'; import './index.less'; import { ReactComponent as RefreshIcon } from '@/assets/icons/refresh.svg'; const ImageList: React.FC = () => { const [images, setImages] = useState([]); const [loading, setLoading] = useState(false); const [selectedImage, setSelectedImage] = useState( null, ); const [searchText, setSearchText] = useState(''); const [detailVisible, setDetailVisible] = useState(false); const [importModalVisible, setImportModalVisible] = useState(false); const [tableParams, setTableParams] = useState({ pagination: { current: 1, pageSize: 10, }, }); // 列显示控制状态 const [visibleColumns, setVisibleColumns] = useState>( { image_type: true, storage_path: true, bt_path: true, create_time: true, action: true, }, ); const [columnSettingsVisible, setColumnSettingsVisible] = useState(false); useEffect(() => { loadImages(); }, [ tableParams.pagination?.current, tableParams.pagination?.pageSize, tableParams?.sortOrder, tableParams?.sortField, JSON.stringify(tableParams.filters), JSON.stringify(tableParams.keywords), ]); /** * 表格参数转换 * @param params - 表格参数对象,包含分页、过滤、排序等信息 * @returns 转换后的接口参数对象 */ const getRandomuserParams = (params: IMAGES.TableParams) => { const { pagination, filters, sortField, sortOrder, keywords, ...restParams } = params; const result: Record = {}; result.page_size = pagination?.pageSize; result.page_num = pagination?.current; if (keywords) { result.keywords = keywords; } if (filters) { Object.entries(filters).forEach(([key, value]) => { if (value !== undefined && value !== null) { result[key] = value; } }); } if (sortField) { result.orderby = sortField; result.order = sortOrder === 'ascend' ? 'asc' : 'desc'; } // 处理其他参数 Object.entries(restParams).forEach(([key, value]) => { if (value !== undefined && value !== null) { result[key] = value; } }); return result; }; const params = getRandomuserParams(tableParams); const loadImages = async () => { setLoading(true); try { const imagesRes = await getImagesList(params); if (imagesRes.error_code === ERROR_CODE) { setImages(imagesRes.data.data || []); setLoading(false); // 直接使用后端返回的分页信息 setTableParams((prev) => ({ ...prev, pagination: { ...prev.pagination, current: imagesRes.data.paging.page_num || 1, total: imagesRes.data.paging.total || 0, pageSize: imagesRes.data.paging.page_size || 10, }, })); } else { message.error(imagesRes.message || '获取镜像列表失败'); setLoading(false); } } catch (err) { message.error('获取镜像列表失败'); setLoading(false); } }; // const getStatusTag = (status: string) => { // const statusMap = { // active: { color: 'green', text: '可用' }, // inactive: { color: 'red', text: '不可用' }, // building: { color: 'orange', text: '构建中' }, // }; // const config = statusMap[status as keyof typeof statusMap]; // return {config.text}; // }; const handleViewDetail = (record: IMAGES.ImageItem) => { setSelectedImage(record); setDetailVisible(true); }; const handleDelete = (record: IMAGES.ImageItem) => { Modal.confirm({ title: '确认删除', content: `确定要删除镜像 "${record.image_name}" 吗?`, onOk: () => { // TODO: 调用删除接口 setImages(images.filter((img) => img.image_id !== record.image_id)); message.success('删除成功'); }, }); }; // 列设置相关函数 const handleColumnChange = (columnKey: string, checked: boolean) => { setVisibleColumns((prev) => ({ ...prev, [columnKey]: checked, })); }; const resetColumns = () => { setVisibleColumns({ image_type: true, storage_path: true, bt_path: true, create_time: true, action: true, }); }; // 列设置内容 const columnSettingsContent = (
handleColumnChange('image_type', e.target.checked)} > 桌面类型
handleColumnChange('storage_path', e.target.checked)} > 模板存放路径
handleColumnChange('bt_path', e.target.checked)} > BT路径
handleColumnChange('create_time', e.target.checked)} > 创建时间
handleColumnChange('action', e.target.checked)} > 操作
); // 根据visibleColumns过滤显示的列 const filteredColumns = [ { title: '镜像名称', dataIndex: 'image_name', key: 'image_name', width: 200, }, { title: '桌面类型', dataIndex: 'image_type', key: 'image_type', width: 200, render: (text: number) => { const key = text as keyof typeof IMAGES_TYPE_MAP; return {IMAGES_TYPE_MAP[key] || '--'}; }, ...(visibleColumns['image_type'] ? {} : { hidden: true }), }, { title: '模板存放路径', dataIndex: 'storage_path', key: 'storage_path', width: 200, ...(visibleColumns['storage_path'] ? {} : { hidden: true }), }, { title: 'BT路径', dataIndex: 'bt_path', key: 'bt_path', width: 200, ...(visibleColumns['bt_path'] ? {} : { hidden: true }), }, { title: '创建时间', dataIndex: 'create_time', key: 'create_time', width: 180, render:(text:string)=>{dayjs(text).format('YYYY-MM-DD HH:mm:ss')}, ...(visibleColumns['create_time'] ? {} : { hidden: true }), }, { title: '操作', key: 'action', width: 200, render: (_: any, record: IMAGES.ImageItem) => (
setSearchText(e.target.value)} style={{ width: 300 }} onSearch={(value) => { setTableParams((prev) => ({ ...prev, pagination: { ...prev.pagination, current: 1, }, keywords: value, })); }} />
{detailVisible ? ( ) : null} {/* 导入弹窗 */} setImportModalVisible(false)} onImportSuccess={handleImportSuccess} /> ); }; export default ImageList;