// app/static/js/user_activity.js
document.addEventListener('DOMContentLoaded', function() {
let activityChart = null;
// 初始加载
loadUserActivity();
function loadUserActivity() {
// 显示加载状态
document.getElementById('user-table-body').innerHTML = `
| 加载中... |
`;
// 调用API获取数据
fetch('/statistics/api/user-activity')
.then(response => {
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return response.json();
})
.then(data => {
updateUserTable(data);
updateUserChart(data);
})
.catch(error => {
console.error('加载用户活跃度数据失败:', error);
document.getElementById('user-table-body').innerHTML = `
| 加载数据失败,请稍后重试 |
`;
// 也可以考虑清除或提示图表加载失败
if (activityChart) {
activityChart.destroy();
activityChart = null;
}
const canvas = document.getElementById('user-activity-chart');
const ctx = canvas.getContext('2d');
ctx.clearRect(0, 0, canvas.width, canvas.height); // 清除画布
// 可以在画布上显示错误信息,但这比较复杂,通常表格的错误提示已足够
});
}
function updateUserTable(data) {
const tableBody = document.getElementById('user-table-body');
if (!data || data.length === 0) { // 增加了对 data 本身的检查
tableBody.innerHTML = `
| 暂无数据 |
`;
return;
}
let tableHtml = '';
data.forEach((user, index) => {
tableHtml += `
| ${index + 1} |
${user.username || 'N/A'} |
${user.nickname || 'N/A'} |
${user.borrow_count} |
`;
});
tableBody.innerHTML = tableHtml;
}
function updateUserChart(data) {
// 销毁旧图表
if (activityChart) {
activityChart.destroy();
activityChart = null; // 确保旧实例被完全清除
}
const canvas = document.getElementById('user-activity-chart');
const ctx = canvas.getContext('2d');
if (!data || data.length === 0) {
// 如果没有数据,清除画布,避免显示旧图表或空白图表框架
ctx.clearRect(0, 0, canvas.width, canvas.height);
// 也可以在这里显示 "暂无数据" 的文本到 canvas 上,如果需要
// 例如:
// ctx.textAlign = 'center';
// ctx.fillText('暂无图表数据', canvas.width / 2, canvas.height / 2);
return;
}
// 准备图表数据
const labels = data.map(user => user.nickname || user.username || '未知用户');
const borrowCounts = data.map(user => user.borrow_count);
// 创建图表
activityChart = new Chart(ctx, {
type: 'bar',
data: {
labels: labels,
datasets: [{
label: '借阅次数',
data: borrowCounts,
backgroundColor: 'rgba(153, 102, 255, 0.6)',
borderColor: 'rgba(153, 102, 255, 1)',
borderWidth: 1
}]
},
options: {
responsive: true,
maintainAspectRatio: false,
scales: {
y: {
beginAtZero: true,
title: {
display: true,
text: '借阅次数'
}
},
x: {
title: {
display: true,
text: '用户' // 这个标题现在应该有空间显示了
}
}
},
plugins: {
legend: {
display: false // 保持不显示图例
},
title: {
display: true, // 如果HTML中已有h3标题,这里可以设为 false
text: '最活跃用户排行' // 这个是图表内部的标题
}
},
layout: { // <--- 这是添加的部分
padding: {
bottom: 30 // 为X轴标题和标签留出足够的底部空间,可以根据实际显示效果调整此数值
}
}
}
});
}
});