import React, { useEffect, useState } from 'react'; import { Button, Card, Space, Table, Tag, Typography, message, Modal, Form, Input, InputNumber, Upload, } from 'antd'; import { HistoryOutlined, ReloadOutlined, PlusOutlined, UploadOutlined, EyeOutlined, EditOutlined, DeleteOutlined, } from '@ant-design/icons'; import { getOpenTypeList, getOpenType, createOpenType, updateOpenType, deleteOpenType, uploadImage } from '../api'; import { formatDate } from '../utils/formatDate'; interface OpenType { id: string; open_type: number; type_name: string; description: string; thumb?: string; createdAt: string; updatedAt: string; } const normalizeUploadError = (e: unknown): Error => { if (e instanceof Error) { return e; } if (typeof e === 'string') { return new Error(e); } return new Error('上传失败'); }; const assertUploadFile = (file: unknown): File => { if (file instanceof File) { return file; } throw new Error('请选择有效图片文件'); }; const AdminPlatform: React.FC = () => { const [openTypes, setOpenTypes] = useState([]); const [total, setTotal] = useState(0); const [loading, setLoading] = useState(false); const [page, setPage] = useState(1); const [pageSize, setPageSize] = useState(20); const [createModalVisible, setCreateModalVisible] = useState(false); const [detailModalVisible, setDetailModalVisible] = useState(false); const [updateModalVisible, setUpdateModalVisible] = useState(false); const [currentOpenType, setCurrentOpenType] = useState(null); const [createForm] = Form.useForm(); const [updateForm] = Form.useForm(); const load = async (p?: number, ps?: number) => { setLoading(true); try { const res = await getOpenTypeList({ page: p || page, page_size: ps || pageSize, }); setOpenTypes(res.items || []); setTotal(res.total || 0); } catch { message.error('加载开户方式列表失败'); } finally { setLoading(false); } }; useEffect(() => { load(); }, []); const handleCreate = async () => { try { const values = await createForm.validateFields(); console.log(values); await createOpenType({ open_type: values.open_type, type_name: values.type_name, description: values.description, thumb: values.thumb, }); message.success('创建成功'); setCreateModalVisible(false); createForm.resetFields(); load(); } catch (e: any) { message.error(e?.message || '创建失败'); } }; const handleDetail = async (id: string) => { try { const openType = await getOpenType(id); setCurrentOpenType(openType); setDetailModalVisible(true); } catch (e: any) { message.error(e?.message || '获取详情失败'); } }; const handleUpdate = async (id: string) => { try { const openType = await getOpenType(id); setCurrentOpenType(openType); updateForm.setFieldsValue({ open_type: openType.open_type, type_name: openType.type_name, description: openType.description, thumb: openType.thumb, }); setUpdateModalVisible(true); } catch (e: any) { message.error(e?.message || '获取详情失败'); } }; const handleSaveUpdate = async () => { if (!currentOpenType) return; try { const values = await updateForm.validateFields(); await updateOpenType(currentOpenType.id, { open_type: values.open_type, type_name: values.type_name, description: values.description, thumb: values.thumb, }); message.success('更新成功'); setUpdateModalVisible(false); updateForm.resetFields(); setCurrentOpenType(null); load(); } catch (e: any) { message.error(e?.message || '更新失败'); } }; const handleDelete = (id: string) => { Modal.confirm({ title: '确认删除', content: '确定要删除这个开户方式吗?', okText: '删除', okType: 'danger', cancelText: '取消', onOk: async () => { try { await deleteOpenType(id); message.success('删除成功'); load(); } catch (e: any) { message.error(e?.message || '删除失败'); } }, }); }; const columns = [ { title: 'ID', dataIndex: 'id', width: 100, render: (v: string) => {v}, }, { title: '开户类型', dataIndex: 'open_type', width: 100, render: (v: number) => {v}, }, { title: '类型名称', dataIndex: 'type_name', width: 150, render: (v: string) => {v}, }, { title: '描述', dataIndex: 'description', width: 250, ellipsis: true, render: (v: string) => ( {v} ), }, { title: '缩略图', dataIndex: 'thumb', width: 120, render: (v: string) => ( v ? thumb : '-' ), }, { title: '创建时间', dataIndex: 'createdAt', width: 160, render: (v: string) => ( {formatDate(v)} ), }, { title: '更新时间', dataIndex: 'updatedAt', width: 160, render: (v: string) => ( {formatDate(v)} ), }, { title: '操作', width: 200, render: (_: any, record: OpenType) => ( ), }, ]; return (
平台开户方式管理
`共 ${t} 条记录`, onChange: (p, ps) => { setPage(p); setPageSize(ps); load(p, ps); }, }} scroll={{ x: 1000 }} /> { setCreateModalVisible(false); createForm.resetFields(); }} okText="创建" cancelText="取消" width={600} >
{ try { const uploadFile = assertUploadFile(file); const res = await uploadImage(uploadFile); console.log(res); createForm.setFieldsValue({ thumb: res.url }); onSuccess?.({ url: res.url }); } catch (e) { onError?.(normalizeUploadError(e)); } }} >
上传图片
{ setDetailModalVisible(false); setCurrentOpenType(null); }} okText="关闭" cancelText="取消" width={600} > {currentOpenType && (

ID: {currentOpenType.id}

开户类型: {currentOpenType.open_type}

类型名称: {currentOpenType.type_name}

描述: {currentOpenType.description}

缩略图:{' '} {currentOpenType.thumb ? ( thumb ) : '-'}

创建时间: {formatDate(currentOpenType.createdAt)}

更新时间: {formatDate(currentOpenType.updatedAt)}

)}
{ setUpdateModalVisible(false); updateForm.resetFields(); setCurrentOpenType(null); }} okText="更新" cancelText="取消" width={600} >
{ try { const uploadFile = assertUploadFile(file); const res = await uploadImage(uploadFile); updateForm.setFieldsValue({ thumb: res.url }); onSuccess?.({ url: res.url }); } catch (e) { onError?.(normalizeUploadError(e)); } }} > {!updateForm.getFieldValue('thumb') && (
上传图片
)}
); }; export default AdminPlatform;