Guanghu Domestic Migration d1e47f4565
Some checks are pending
自动更新代码和重启 / update-and-restart (push) Waiting to run
CI检查 + 自动部署 / check (push) Waiting to run
CI检查 + 自动部署 / deploy (push) Blocked by required conditions
重启聊天服务 / restart (push) Waiting to run
chore: import sanitized domestic snapshot for REPO-002
Source snapshot: ca48d3ddf926d79aa138306164169baf764bb829
2026-07-17 15:54:41 +08:00

190 lines
5.9 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// HoloLake 数据统计面板 · 交互脚本 v2含导出 + 环形图)
window.addEventListener('load', function() {
// 条形图动画
setTimeout(function() {
var bars = document.querySelectorAll('.bar-fill');
bars.forEach(function(bar) {
var percent = bar.getAttribute('data-percent');
bar.style.width = percent + '%';
});
}, 300);
// 柱状图动画
setTimeout(function() {
var trendBars = document.querySelectorAll('.trend-bar');
trendBars.forEach(function(bar) {
var height = bar.getAttribute('data-height');
var fill = bar.querySelector('.trend-fill');
fill.style.height = height + '%';
});
}, 600);
// 环形图绘制函数
function drawDonut(percentages) {
var segments = document.querySelectorAll('.donut-segment');
var total = 377; // 2 * Math.PI * 60 ≈ 377
var cumulative = 0;
segments.forEach(function(seg, i) {
var value = percentages[i] || 0;
var dashArray = (value / 100 * total) + ' ' + total;
seg.setAttribute('stroke-dasharray', dashArray);
seg.setAttribute('stroke-dashoffset', 0);
});
}
// 当前选中的时间范围
var currentRange = 'today';
// 模拟数据
var mockData = {
today: {
users: '128', chats: '1,024', personas: '6', api: '3,892',
bars: [72,15,8,3,2],
trends: [45,62,38,78,55,90,85],
donut: [72,15,8,3,2],
apiTotal: '3,892'
},
week: {
users: '128', chats: '6,847', personas: '6', api: '24,103',
bars: [68,18,9,3,2],
trends: [320,415,380,450,290,520,480],
donut: [68,18,9,3,2],
apiTotal: '24,103'
},
month: {
users: '128', chats: '28,392', personas: '6', api: '98,741',
bars: [65,20,10,3,2],
trends: [1200,1450,1100,1680,1320,1890,1750],
donut: [65,20,10,3,2],
apiTotal: '98,741'
}
};
// 更新所有图表和数字
function updateStats(range) {
currentRange = range;
var data = mockData[range];
// 更新统计卡片
var values = document.querySelectorAll('.stat-value');
values[0].textContent = data.users;
values[1].textContent = data.chats;
values[2].textContent = data.personas;
values[3].textContent = data.api;
// 更新条形图
var bars = document.querySelectorAll('.bar-fill');
bars.forEach(function(bar, i) {
bar.style.width = '0%';
setTimeout(function() {
bar.style.width = data.bars[i] + '%';
}, 100);
});
// 更新百分比文字
var barValues = document.querySelectorAll('.bar-value');
data.bars.forEach(function(v, i) {
barValues[i].textContent = v + '%';
});
// 更新柱状图
var maxTrend = Math.max.apply(null, data.trends);
var trendBars = document.querySelectorAll('.trend-bar');
trendBars.forEach(function(bar, i) {
var fill = bar.querySelector('.trend-fill');
fill.style.height = '0%';
setTimeout(function() {
fill.style.height = Math.round(data.trends[i] / maxTrend * 90) + '%';
}, 100);
});
// 更新环形图
drawDonut(data.donut);
document.querySelector('.donut-center-value').textContent = data.apiTotal;
// 更新图例百分比
var legendPercents = document.querySelectorAll('.legend-percent');
data.donut.forEach(function(v, i) {
legendPercents[i].textContent = v + '%';
});
}
// 时间选择器切换
var timeButtons = document.querySelectorAll('.time-btn');
timeButtons.forEach(function(btn) {
btn.addEventListener('click', function() {
timeButtons.forEach(function(b) { b.classList.remove('active'); });
btn.classList.add('active');
var range = btn.getAttribute('data-range');
updateStats(range);
});
});
// 初始化环形图(今日数据)
drawDonut(mockData.today.donut);
// 卡片点击高亮
var cards = document.querySelectorAll('.stat-card');
cards.forEach(function(card) {
card.addEventListener('click', function() {
cards.forEach(function(c) { c.style.borderColor = 'rgba(255,255,255,0.06)'; });
card.style.borderColor = 'rgba(79, 195, 247, 0.5)';
});
});
// CSV 导出功能
var exportBtn = document.getElementById('exportBtn');
var toast = document.getElementById('exportToast');
exportBtn.addEventListener('click', function() {
var data = mockData[currentRange];
var models = ['DeepSeek', '通义千问', 'Kimi', '豆包', 'GPT/Claude'];
var days = ['周一', '周二', '周三', '周四', '周五', '周六', '周日'];
var csv = '\uFEFF'; // BOM for Chinese support
csv += 'HoloLake 数据统计报表\n';
csv += '时间范围,' + currentRange + '\n';
csv += '导出时间,' + new Date().toLocaleString('zh-CN') + '\n\n';
csv += '【统计概览】\n';
csv += '指标,数值,变化\n';
csv += '总用户,' + data.users + ',↑12%\n';
csv += '今日对话,' + data.chats + ',↑8%\n';
csv += '活跃人格体,' + data.personas + ',—\n';
csv += 'API调用,' + data.api + ',↓3%\n\n';
csv += '【模型调用分布】\n';
csv += '模型,占比\n';
models.forEach(function(m, i) {
csv += m + ',' + data.donut[i] + '%\n';
});
csv += '\n';
csv += '【每日对话趋势】\n';
csv += '日期,对话次数\n';
days.forEach(function(d, i) {
csv += d + ',' + data.trends[i] + '\n';
});
// 创建下载链接
var blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });
var link = document.createElement('a');
var url = URL.createObjectURL(blob);
link.href = url;
link.setAttribute('download', 'hololake_stats_' + currentRange + '.csv');
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
URL.revokeObjectURL(url);
// 显示提示
toast.classList.add('show');
setTimeout(function() {
toast.classList.remove('show');
}, 2000);
});
console.log('HoloLake Analytics v2 · 交互已加载');
});