-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathprogress.html
More file actions
243 lines (222 loc) · 9.46 KB
/
progress.html
File metadata and controls
243 lines (222 loc) · 9.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>学习进度 - AI Agent 学习工坊</title>
<meta name="description" content="查看 AI Agent 学习进度,了解各分类掌握情况,获取个性化学习建议。">
<link rel="manifest" href="manifest.json">
<link rel="icon" href="icons/icon-192.png" type="image/png">
<link rel="stylesheet" href="css/minimal.css">
<style>
.recommendation-card {
padding: 20px 24px;
border: 1px solid #E2E8F0;
border-radius: 12px;
margin-bottom: 12px;
display: flex;
align-items: flex-start;
gap: 16px;
transition: 200ms;
}
.recommendation-card:hover { border-color: #FBBF24; }
.rec-icon { font-size: 1.5rem; flex-shrink: 0; }
.rec-title { font-weight: 600; margin-bottom: 4px; }
.rec-desc { font-size: 0.9375rem; color: #64748B; }
.mastered-list { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 16px; }
.mastered-chip {
padding: 4px 12px;
background: #ECFDF5;
border: 1px solid #10B981;
border-radius: 100px;
font-size: 0.8125rem;
color: #065F46;
cursor: pointer;
transition: 200ms;
}
.mastered-chip:hover { background: #D1FAE5; }
.danger-zone { margin-top: 48px; padding: 24px; border: 1px solid #FEE2E2; border-radius: 12px; background: #FFF5F5; }
.danger-title { font-weight: 600; color: #991B1B; margin-bottom: 8px; }
.danger-desc { font-size: 0.9375rem; color: #64748B; margin-bottom: 16px; }
</style>
</head>
<body>
<!-- 导航 -->
<nav class="nav">
<div class="nav-container">
<a href="index.html" class="nav-brand">🤖 AI Agent 学习工坊</a>
<div class="nav-links">
<a href="learn.html" class="nav-link">学习</a>
<a href="flashcard.html" class="nav-link">闪卡</a>
<a href="roots.html" class="nav-link">索引</a>
<a href="progress.html" class="nav-link active">进度</a>
</div>
<div class="nav-progress" id="navProgress">0/45</div>
</div>
</nav>
<!-- 主内容 -->
<main style="padding: 48px 0 96px;">
<div class="container">
<!-- 页面标题 -->
<div class="page-header">
<h1 class="page-title">学习进度</h1>
<p class="page-subtitle">追踪你的 AI Agent 学习旅程</p>
</div>
<!-- 总体进度 -->
<div class="progress-overview">
<div class="progress-stat">
<div class="progress-stat-value" id="masteredCount" style="color: #10B981;">0</div>
<div class="progress-stat-label">已掌握概念</div>
</div>
<div class="progress-stat">
<div class="progress-stat-value" id="visitedCount" style="color: #FBBF24;">0</div>
<div class="progress-stat-label">已学习概念</div>
</div>
<div class="progress-stat">
<div class="progress-stat-value" id="quizAccuracy" style="color: #6366F1;">-</div>
<div class="progress-stat-label">测验正确率</div>
</div>
<div class="progress-stat">
<div class="progress-stat-value" id="totalItems">45</div>
<div class="progress-stat-label">总概念数</div>
</div>
</div>
<!-- 总体进度条 -->
<div style="margin-bottom: 48px;">
<div style="display: flex; justify-content: space-between; margin-bottom: 8px;">
<span style="font-weight: 600;">总体掌握进度</span>
<span id="overallPercent" style="color: #64748B;">0%</span>
</div>
<div class="progress-bar" style="height: 12px;">
<div class="progress-fill success" id="overallFill" style="width: 0%;"></div>
</div>
</div>
<!-- 分类进度 -->
<div style="margin-bottom: 48px;">
<h2 style="font-size: 1.25rem; font-weight: 700; margin-bottom: 24px;">各分类掌握情况</h2>
<div id="categoryProgress"></div>
</div>
<!-- 学习建议 -->
<div style="margin-bottom: 48px;">
<h2 style="font-size: 1.25rem; font-weight: 700; margin-bottom: 24px;">📋 学习建议</h2>
<div id="recommendations"></div>
</div>
<!-- 已掌握概念列表 -->
<div style="margin-bottom: 48px;" id="masteredSection">
<h2 style="font-size: 1.25rem; font-weight: 700; margin-bottom: 8px;">✓ 已掌握的概念</h2>
<p style="color: #64748B; font-size: 0.9375rem; margin-bottom: 16px;">点击可取消掌握标记</p>
<div class="mastered-list" id="masteredList"></div>
</div>
<!-- 快捷操作 -->
<div style="display: flex; gap: 12px; flex-wrap: wrap; margin-bottom: 48px;">
<a href="learn.html" class="btn btn-primary">继续学习</a>
<a href="flashcard.html" class="btn btn-secondary">闪卡复习</a>
<button class="btn btn-secondary" onclick="exportProgress()">📤 导出进度</button>
</div>
<!-- 危险区域 -->
<div class="danger-zone">
<div class="danger-title">⚠️ 重置进度</div>
<div class="danger-desc">清除所有学习记录,包括已掌握标记、测验结果等。此操作不可撤销。</div>
<button class="btn" style="border: 1px solid #EF4444; color: #EF4444;" onclick="confirmReset()">重置所有进度</button>
</div>
</div>
</main>
<!-- Toast -->
<div class="toast" id="toast"></div>
<script src="js/wordData.js"></script>
<script src="js/siteConfig.js"></script>
<script src="js/storage.js"></script>
<script>
function renderProgress() {
const stats = getOverallStats();
const mastered = loadMasteredItems();
// 更新统计数字
document.getElementById('masteredCount').textContent = stats.mastered;
document.getElementById('visitedCount').textContent = stats.visited;
document.getElementById('quizAccuracy').textContent = stats.totalQuizAttempts > 0 ? `${Math.round(stats.quizAccuracy)}%` : '-';
document.getElementById('navProgress').textContent = `${stats.mastered}/45 已掌握`;
// 总体进度条
const percent = Math.round(stats.masteredPercentage);
document.getElementById('overallPercent').textContent = `${percent}%`;
document.getElementById('overallFill').style.width = `${percent}%`;
// 分类进度
const categories = {};
WordRoots.forEach(item => {
if (!categories[item.origin]) categories[item.origin] = { total: 0, mastered: 0 };
categories[item.origin].total++;
if (mastered.includes(item.id)) categories[item.origin].mastered++;
});
const catContainer = document.getElementById('categoryProgress');
catContainer.innerHTML = Object.entries(categories).map(([name, data]) => {
const pct = Math.round((data.mastered / data.total) * 100);
return `
<div class="category-progress">
<div class="category-name">
<span>${name}</span>
<span style="color: #64748B;">${data.mastered}/${data.total} (${pct}%)</span>
</div>
<div class="progress-bar">
<div class="progress-fill ${pct === 100 ? 'success' : ''}" style="width: ${pct}%;"></div>
</div>
</div>
`;
}).join('');
// 学习建议
const recommendations = getStudyRecommendations();
const recIcons = { learning: '📖', review: '🔄', practice: '✏️', advanced: '🚀', continue: '💪' };
document.getElementById('recommendations').innerHTML = recommendations.map(rec => `
<div class="recommendation-card">
<div class="rec-icon">${recIcons[rec.type] || '💡'}</div>
<div>
<div class="rec-title">${rec.title}</div>
<div class="rec-desc">${rec.description}</div>
</div>
</div>
`).join('');
// 已掌握列表
const masteredSection = document.getElementById('masteredSection');
const masteredList = document.getElementById('masteredList');
if (mastered.length === 0) {
masteredSection.style.display = 'none';
} else {
masteredSection.style.display = 'block';
masteredList.innerHTML = mastered.map(id => {
const item = WordRoots.find(w => w.id === id);
if (!item) return '';
return `<span class="mastered-chip" onclick="unmarkItem(${id})" title="点击取消掌握">${item.root}</span>`;
}).join('');
}
}
function unmarkItem(id) {
if (confirm(`确定取消"${WordRoots.find(w => w.id === id)?.root}"的掌握标记吗?`)) {
saveMastered(id, false);
renderProgress();
showToast('已取消掌握标记');
}
}
function exportProgress() {
const data = exportData();
const blob = new Blob([data], { type: 'application/json' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = `ai-agent-progress-${new Date().toISOString().split('T')[0]}.json`;
a.click();
URL.revokeObjectURL(url);
showToast('进度已导出');
}
function confirmReset() {
if (confirm('确定要重置所有学习进度吗?此操作不可撤销!')) {
clearAllData();
}
}
function showToast(message, type = '') {
const toast = document.getElementById('toast');
toast.textContent = message;
toast.className = `toast show ${type}`;
setTimeout(() => toast.className = 'toast', 2500);
}
renderProgress();
</script>
</body>
</html>