import React, { useState, useEffect } from 'react'; import { Table, Button, Modal, Form, Input, Select, DatePicker, Space, Card, message, Popconfirm, Tag, Row, Col, Upload } from 'antd'; import { PlusOutlined, EditOutlined, DeleteOutlined, EyeOutlined, UserOutlined, UploadOutlined } from '@ant-design/icons'; import { useNavigate } from 'react-router-dom'; import { activityAPI } from '../../services/api'; import dayjs from 'dayjs'; const { Option } = Select; const { RangePicker } = DatePicker; const ActivityList = () => { const [form] = Form.useForm(); const [modalVisible, setModalVisible] = useState(false); const [editingRecord, setEditingRecord] = useState(null); const [loading, setLoading] = useState(false); const [searchForm] = Form.useForm(); const [viewModalVisible, setViewModalVisible] = useState(false); const [viewingRecord, setViewingRecord] = useState(null); const [activities, setActivities] = useState([]); const [pagination, setPagination] = useState({ current: 1, pageSize: 10, total: 0, }); const [filters, setFilters] = useState({}); const navigate = useNavigate(); // 获取活动列表 const fetchActivities = async (params = {}) => { try { setLoading(true); const queryParams = { page: pagination.current, size: pagination.pageSize, ...filters, ...params, }; const response = await activityAPI.getActivityList(queryParams); if (response.code === 0) { setActivities(response.data.content || []); setPagination(prev => ({ ...prev, total: response.data.totalElements || 0, })); } } catch (error) { console.error('获取活动列表失败:', error); message.error('获取活动列表失败'); } finally { setLoading(false); } }; // 页面初始化加载数据 useEffect(() => { fetchActivities(); }, [pagination.current, pagination.pageSize]); // 处理分页变化 const handleTableChange = (paginationInfo) => { setPagination(prev => ({ ...prev, current: paginationInfo.current, pageSize: paginationInfo.pageSize, })); }; const columns = [ { title: '活动名称', dataIndex: 'title', key: 'title', width: 200, }, { title: '活动分类', dataIndex: 'categoryDesc', key: 'categoryDesc', width: 120, render: (categoryDesc) => { const colorMap = { '党的建设': 'red', '经济发展': 'blue', '平安法治': 'green', '民生服务': 'orange', '失信违法': 'purple', }; return {categoryDesc}; }, }, { title: '活动时间', key: 'time', width: 200, render: (_, record) => (
开始:{dayjs(record.startTime).format('MM-DD HH:mm')}
结束:{dayjs(record.endTime).format('MM-DD HH:mm')}
), }, { title: '活动地点', dataIndex: 'location', key: 'location', width: 150, }, { title: '最大志愿者人数', dataIndex: 'maxParticipants', key: 'maxParticipants', width: 120, render: (maxParticipants) => ( {maxParticipants} ), }, { title: '报名截止时间', dataIndex: 'deadline', key: 'deadline', width: 150, render: (deadline) => dayjs(deadline).format('YYYY-MM-DD HH:mm'), }, { title: '活动积分', dataIndex: 'points', key: 'points', width: 80, render: (points) => +{points}, }, { title: '状态', dataIndex: 'status', key: 'status', width: 100, render: (status) => { const statusMap = { 1: { text: '未开始', color: 'default' }, 2: { text: '进行中', color: 'processing' }, 3: { text: '已结束', color: 'success' } }; const statusInfo = statusMap[status] || { text: '未知', color: 'default' }; return {statusInfo.text}; }, }, { title: '创建时间', dataIndex: 'createTime', key: 'createTime', width: 150, render: (time) => dayjs(time).format('YYYY-MM-DD HH:mm'), }, { title: '操作', key: 'action', width: 200, render: (_, record) => ( {record.status !== '已结束' && ( <> handleDelete(record.id)} okText="确定" cancelText="取消" > )} ), }, ]; const handleAdd = () => { navigate('/activities/create'); }; const handleView = (record) => { setViewingRecord(record); setViewModalVisible(true); }; const handleEdit = (record) => { navigate(`/activities/edit/${record.id}`); }; const handleDelete = async (id) => { try { const response = await activityAPI.deleteActivities(id.toString()); if (response.code === 0) { message.success('删除成功'); fetchActivities(); } } catch (error) { console.error('删除活动失败:', error); message.error('删除活动失败'); } }; const handleModalCancel = () => { setViewModalVisible(false); }; const handleSearch = (values) => { const searchParams = { ...values }; if (values.timeRange && values.timeRange.length === 2) { searchParams.createStart = values.timeRange[0].format('YYYY-MM-DD'); searchParams.createEnd = values.timeRange[1].format('YYYY-MM-DD'); delete searchParams.timeRange; } setFilters(searchParams); setPagination(prev => ({ ...prev, current: 1 })); fetchActivities({ ...searchParams, page: 1 }); }; const handleReset = () => { searchForm.resetFields(); setFilters({}); setPagination(prev => ({ ...prev, current: 1 })); fetchActivities({ page: 1 }); }; return (

活动列表

管理所有志愿者活动,查看活动状态和报名情况

{/* 搜索表单 */}
`第 ${range[0]}-${range[1]} 条/共 ${total} 条`, }} onChange={handleTableChange} /> {/* 查看活动弹窗 */} 关闭 ]} width={800} > {viewingRecord && (
活动名称:{viewingRecord.title}
活动分类:{viewingRecord.categoryDesc}
活动开始时间:{dayjs(viewingRecord.startTime).format('YYYY-MM-DD HH:mm')}
活动结束时间:{dayjs(viewingRecord.endTime).format('YYYY-MM-DD HH:mm')}
活动地点:{viewingRecord.location}
报名截止时间:{dayjs(viewingRecord.deadline).format('YYYY-MM-DD HH:mm')}
最大志愿者人数:{viewingRecord.maxParticipants}
活动积分:{viewingRecord.points}
状态:{ (() => { const statusMap = { 1: '未开始', 2: '进行中', 3: '已结束' }; return statusMap[viewingRecord.status] || '未知'; })() }
创建时间:{dayjs(viewingRecord.createTime).format('YYYY-MM-DD HH:mm')}
活动内容:
{viewingRecord.content}
{viewingRecord.cover && (
活动封面:
活动封面
)} )} ); }; export default ActivityList;