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) => (
}
onClick={() => handleView(record)}
>
查看
}
onClick={() => navigate(`/activities/registrations/${record.id}`)}
>
报名管理
{record.status !== '已结束' && (
<>
}
onClick={() => handleEdit(record)}
>
编辑
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 (
活动列表
管理所有志愿者活动,查看活动状态和报名情况
{/* 搜索表单 */}
}
onClick={handleAdd}
>
发布活动
`第 ${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;