import React, { useEffect, useState } from 'react';
import { Row, Col, Card, Statistic, Button, Table, List, Avatar, Tag, message, Modal } from 'antd';
import { useNavigate } from 'react-router-dom';
import {
UserOutlined,
GiftOutlined,
CalendarOutlined,
TeamOutlined,
PlusOutlined,
EyeOutlined,
EditOutlined,
} from '@ant-design/icons';
import ReactECharts from 'echarts-for-react';
import { statisticsAPI, dashboardAPI } from '../services/api';
import dayjs from 'dayjs';
const Dashboard = () => {
const navigate = useNavigate();
const [loading, setLoading] = useState(false);
const [overviewData, setOverviewData] = useState({
totalVolunteers: 0,
totalPoints: 0,
totalActivities: 0,
totalRegistrations: 0,
});
const [recentActivities, setRecentActivities] = useState([]);
const [recentVolunteers, setRecentVolunteers] = useState([]);
const [pointsTrendData, setPointsTrendData] = useState({
categories: [],
totalPoints: [],
});
const [activityParticipationData, setActivityParticipationData] = useState([]);
const [viewModalVisible, setViewModalVisible] = useState(false);
const [viewingActivity, setViewingActivity] = useState(null);
// 获取数据概览
const fetchOverviewData = async () => {
try {
const response = await statisticsAPI.getOverview();
if (response.code === 0) {
setOverviewData(response.data);
}
} catch (error) {
console.error('获取概览数据失败:', error);
message.error('获取概览数据失败');
}
};
// 获取最新活动列表
const fetchRecentActivities = async () => {
try {
const response = await dashboardAPI.getRecentActivities(5);
if (response.code === 0) {
setRecentActivities(response.data);
}
} catch (error) {
console.error('获取最新活动失败:', error);
message.error('获取最新活动失败');
}
};
// 获取最新志愿者列表
const fetchRecentVolunteers = async () => {
try {
const response = await dashboardAPI.getRecentVolunteers(5);
if (response.code === 0) {
setRecentVolunteers(response.data);
}
} catch (error) {
console.error('获取最新志愿者失败:', error);
message.error('获取最新志愿者失败');
}
};
// 获取积分趋势数据
const fetchPointsTrend = async () => {
try {
const response = await statisticsAPI.getPointsTrend('month');
if (response.code === 0) {
setPointsTrendData(response.data);
}
} catch (error) {
console.error('获取积分趋势失败:', error);
message.error('获取积分趋势失败');
}
};
// 获取活动参与度数据
const fetchActivityParticipation = async () => {
try {
const response = await statisticsAPI.getActivityParticipation();
if (response.code === 0) {
setActivityParticipationData(response.data);
}
} catch (error) {
console.error('获取活动参与度失败:', error);
message.error('获取活动参与度失败');
}
};
// 页面初始化加载数据
useEffect(() => {
const loadData = async () => {
setLoading(true);
try {
await Promise.all([
fetchOverviewData(),
fetchRecentActivities(),
fetchRecentVolunteers(),
fetchPointsTrend(),
fetchActivityParticipation(),
]);
} finally {
setLoading(false);
}
};
loadData();
}, []);
// 积分趋势图表配置
const pointsTrendOption = {
title: {
text: '积分趋势',
left: 'center',
},
tooltip: {
trigger: 'axis',
},
xAxis: {
type: 'category',
data: pointsTrendData.categories,
},
yAxis: {
type: 'value',
},
series: [
{
name: '积分总数',
type: 'line',
data: pointsTrendData.totalPoints,
smooth: true,
itemStyle: {
color: '#1890ff',
},
},
],
};
// 活动参与度图表配置
const activityParticipationOption = {
title: {
text: '活动参与度',
left: 'center',
},
tooltip: {
trigger: 'item',
},
series: [
{
name: '参与情况',
type: 'pie',
radius: '50%',
data: activityParticipationData,
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)',
},
},
},
],
};
// 查看活动详情
const handleViewActivity = (activity) => {
setViewingActivity(activity);
setViewModalVisible(true);
};
const handleModalCancel = () => {
setViewModalVisible(false);
setViewingActivity(null);
};
// 活动状态转换函数
const getActivityStatusText = (status) => {
switch (status) {
case '1':
return '未开始';
case '2':
return '进行中';
case '3':
return '已结束';
default:
return status; // 如果不是数字状态码,直接返回原值
}
};
const getStatusColor = (status) => {
switch (status) {
case '1':
case '未开始':
return 'default';
case '2':
case '进行中':
return 'processing';
case '3':
case '已结束':
return 'default';
case '报名中':
return 'warning';
case '活跃':
return 'success';
default:
return 'default';
}
};
const quickActions = [
{
title: '发布活动',
icon:
欢迎使用志愿者服务后台管理系统