feat: 添加多维度评分统计面板

This commit is contained in:
maoshen
2026-04-14 12:28:01 +00:00
parent 0285ed25b1
commit c923243493

View File

@@ -22,6 +22,51 @@
gap: 20px;
margin-bottom: 30px;
}
.rating-stats {
background: white;
border-radius: 10px;
padding: 15px;
margin-bottom: 30px;
box-shadow: 0 4px 6px rgba(0,0,0,0.1);
}
.rating-stats h3 {
color: #333;
font-size: 1.1em;
margin-bottom: 15px;
display: flex;
align-items: center;
gap: 8px;
}
.rating-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 15px;
}
.rating-item {
background: linear-gradient(135deg, #fafaff, #f0f0ff);
padding: 12px;
border-radius: 8px;
border-left: 4px solid #667eea;
}
.rating-item .label {
font-size: 0.85em;
color: #666;
margin-bottom: 5px;
}
.rating-item .value {
font-size: 1.5em;
font-weight: bold;
color: #667eea;
}
.rating-item .value.quality { color: #10b981; }
.rating-item .value.efficiency { color: #3b82f6; }
.rating-item .value.creativity { color: #8b5cf6; }
.rating-item .value.learning { color: #f59e0b; }
.rating-item .count {
font-size: 0.8em;
color: #999;
margin-top: 5px;
}
.stat-card {
background: white;
padding: 15px;
@@ -276,6 +321,7 @@
allEntries: [],
allExperiences: [],
taskStats: {},
ratingStats: {},
showCommentForm: null,
commentContent: '',
scores: { quality: '', efficiency: '', creativity: '', learning: '' }
@@ -318,6 +364,9 @@
exp.comments = await loadComments('experience', exp.id);
}
// 计算评分统计
calculateRatingStats();
render();
} catch (error) {
document.getElementById('app').innerHTML = `<div class="error">加载失败:${error.message}</div>`;
@@ -563,10 +612,73 @@
<div class="stat-card"><h3>${state.taskStats.completion_rate || 0}%</h3><p>完成率</p></div>
<div class="stat-card"><h3>${state.expStats.total_experiences || 0}</h3><p>经验</p></div>
</div>
${renderRatingStats()}
${content}
`;
}
function calculateRatingStats() {
const allComments = [
...state.allEntries.flatMap(e => e.comments || []),
...state.allTasks.flatMap(t => t.comments || []),
...state.allExperiences.flatMap(e => e.comments || [])
];
const stats = {
quality: { sum: 0, count: 0 },
efficiency: { sum: 0, count: 0 },
creativity: { sum: 0, count: 0 },
learning: { sum: 0, count: 0 }
};
allComments.forEach(c => {
if (c.quality) { stats.quality.sum += c.quality; stats.quality.count++; }
if (c.efficiency) { stats.efficiency.sum += c.efficiency; stats.efficiency.count++; }
if (c.creativity) { stats.creativity.sum += c.creativity; stats.creativity.count++; }
if (c.learning) { stats.learning.sum += c.learning; stats.learning.count++; }
});
state.ratingStats = {
quality: stats.quality.count > 0 ? (stats.quality.sum / stats.quality.count).toFixed(1) : '-',
efficiency: stats.efficiency.count > 0 ? (stats.efficiency.sum / stats.efficiency.count).toFixed(1) : '-',
creativity: stats.creativity.count > 0 ? (stats.creativity.sum / stats.creativity.count).toFixed(1) : '-',
learning: stats.learning.count > 0 ? (stats.learning.sum / stats.learning.count).toFixed(1) : '-',
totalComments: allComments.length
};
}
function renderRatingStats() {
if (state.ratingStats.totalComments === 0) return '';
return `
<div class="rating-stats">
<h3>📊 多维度评分统计</h3>
<div class="rating-grid">
<div class="rating-item">
<div class="label">📐 完成质量</div>
<div class="value quality">${state.ratingStats.quality}</div>
<div class="count">${state.ratingStats.totalComments} 条评价</div>
</div>
<div class="rating-item">
<div class="label">⚡ 效率</div>
<div class="value efficiency">${state.ratingStats.efficiency}</div>
<div class="count">${state.ratingStats.totalComments} 条评价</div>
</div>
<div class="rating-item">
<div class="label">💡 创新性</div>
<div class="value creativity">${state.ratingStats.creativity}</div>
<div class="count">${state.ratingStats.totalComments} 条评价</div>
</div>
<div class="rating-item">
<div class="label">📚 学习价值</div>
<div class="value learning">${state.ratingStats.learning}</div>
<div class="count">${state.ratingStats.totalComments} 条评价</div>
</div>
</div>
</div>
`;
}
function switchTab(tab) { state.currentTab = tab; state.selectedTask = null; render(); }
function selectTask(taskId) { state.selectedTask = state.allTasks.find(t => t.id === taskId); render(); }