import React, { useState, useEffect } from 'react'; import axios from '../../services/axios' import { toast } from 'react-toastify'; import { Link } from 'react-router-dom'; import { Bar } from 'react-chartjs-2'; import { Chart, registerables } from 'chart.js'; // 注册Chart.js组件 Chart.register(...registerables); const Dashboard = () => { const [stats, setStats] = useState({ totalUsers: 0, activeUsers: 0, totalFiles: 0, takenFiles: 0, availableFiles: 0, recentUploads: {}, recentDownloads: {} }); const [loading, setLoading] = useState(true); useEffect(() => { const fetchDashboardData = async () => { try { const [userRes, fileRes] = await Promise.all([ axios.get('/api/admin/analytics/users'), axios.get('/api/admin/analytics/files') ]); setStats({ totalUsers: userRes.data.total_users || 0, activeUsers: userRes.data.active_users || 0, totalFiles: fileRes.data.total_files || 0, takenFiles: fileRes.data.taken_files || 0, availableFiles: fileRes.data.available_files || 0, recentUploads: fileRes.data.upload_stats || {}, recentDownloads: fileRes.data.take_stats || {} }); } catch (err) { console.error('获取统计数据失败:', err); toast.error('获取统计数据失败'); } finally { setLoading(false); } }; fetchDashboardData(); }, []); // 准备图表数据 const getChartData = () => { // 确保数据存在且为对象 const recentUploads = stats.recentUploads || {}; const recentDownloads = stats.recentDownloads || {}; // 确保日期顺序正确 const uploadDates = Object.keys(recentUploads); const downloadDates = Object.keys(recentDownloads); const allDates = [...new Set([...uploadDates, ...downloadDates])].sort(); return { labels: allDates.map(date => new Date(date).toLocaleDateString()), datasets: [ { label: '文件上传', data: allDates.map(date => recentUploads[date] || 0), backgroundColor: 'rgba(54, 162, 235, 0.5)', borderColor: 'rgba(54, 162, 235, 1)', borderWidth: 1 }, { label: '文件领取', data: allDates.map(date => recentDownloads[date] || 0), backgroundColor: 'rgba(75, 192, 192, 0.5)', borderColor: 'rgba(75, 192, 192, 1)', borderWidth: 1 } ] }; }; if (loading) { return (