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: , color: '#1890ff', onClick: () => navigate('/activities/create'), }, { title: '查看志愿者', icon: , color: '#52c41a', onClick: () => navigate('/volunteers'), }, { title: '积分查询', icon: , color: '#faad14', onClick: () => navigate('/volunteers/points'), }, { title: '数据统计', icon: , color: '#722ed1', onClick: () => navigate('/statistics/overview'), }, ]; return (

主控制台

欢迎使用志愿者服务后台管理系统

{/* 数据概览 */} } valueStyle={{ color: '#1890ff' }} /> } valueStyle={{ color: '#52c41a' }} /> } valueStyle={{ color: '#faad14' }} /> } valueStyle={{ color: '#722ed1' }} /> {/* 快捷操作 */} {quickActions.map((action, index) => ( ))} {/* 图表区域 */} {/* 最新活动和志愿者 */} navigate('/activities')}>查看全部} > ( } onClick={() => handleViewActivity(item)}> 查看 ]} > {getActivityStatusText(item.status)} )} /> navigate('/volunteers')}>查看全部} > ( } onClick={() => navigate(`/volunteers/${item.id}`)}> 查看 ]} > } />} title={item.name} description={`加入时间: ${dayjs(item.joinDate).format('YYYY-MM-DD HH:mm')} | 积分: ${item.points}`} /> {item.status} )} /> {/* 查看活动详情弹窗 */} 关闭 ]} width={800} > {viewingActivity && (
活动名称:{viewingActivity.title}
活动分类:{viewingActivity.categoryDesc || '未分类'}
活动开始时间:{dayjs(viewingActivity.startTime || viewingActivity.date).format('YYYY-MM-DD HH:mm')}
活动结束时间:{dayjs(viewingActivity.endTime).format('YYYY-MM-DD HH:mm')}
活动地点:{viewingActivity.location || '未设置'}
报名截止时间:{dayjs(viewingActivity.deadline).format('YYYY-MM-DD HH:mm')}
最大志愿者人数:{viewingActivity.maxParticipants || '未设置'}
活动积分:{viewingActivity.points || 0}
状态:{getActivityStatusText(viewingActivity.status)}
创建时间:{dayjs(viewingActivity.createTime).format('YYYY-MM-DD HH:mm')}
参与人数:{viewingActivity.participants || 0}
{viewingActivity.content && (
活动内容:
{viewingActivity.content}
)} {viewingActivity.cover && (
活动封面:
活动封面
)}
)}
); }; export default Dashboard;