🧠 心算测试

多人云端版 · 数据统一存储
请选择套题 -- -- ⏱️ 00:00 ☁️ 云端
📚 选择套题
第一套
第二套
第三套
第四套
第五套
第六套
📋 受试者信息
⚠️ 做题中途不可退出
📊 多人统计 0
☁️ 数据存储在云端,多设备共享
-
总人数
-
平均正确率
-
平均总用时
#姓名年龄性别套题 总正确率总用时 P1率P1时P2率P2时 P3率P3时P4率P4时提交时间
加载中...
导出CSV建议使用系统浏览器
'; var blob = new Blob([html], { type: 'application/vnd.ms-excel;charset=utf-8' }); var link = document.createElement('a'); link.href = URL.createObjectURL(blob); link.download = '心算测试_全部数据_' + new Date().toLocaleDateString() + '.xls'; document.body.appendChild(link); link.click(); document.body.removeChild(link); }); } // ============================================================ // 测试逻辑 // ============================================================ var selectedSet = -1, setIndex = 0, partIndex = 0, qIndex = 0; var currentQuestions = [], correct = 0, wrong = 0, timerInterval = null, seconds = 0; var isAnswered = false, isTestStarted = false, isPartDone = false, partStats = [], partStartTime = 0; var setLabel = document.getElementById('setLabel'); var partLabel = document.getElementById('partLabel'); var qCounter = document.getElementById('qCounter'); var timerDisplay = document.getElementById('timerDisplay'); var questionText = document.getElementById('questionText'); var answerInput = document.getElementById('answerInput'); var submitBtn = document.getElementById('submitBtn'); var feedback = document.getElementById('feedback'); var progressFill = document.getElementById('progressFill'); var progressPercent = document.getElementById('progressPercent'); var selectArea = document.getElementById('selectArea'); var testArea = document.getElementById('testArea'); var resultArea = document.getElementById('resultArea'); var resultContent = document.getElementById('resultContent'); var startBtn = document.getElementById('startBtn'); var resetBtn = document.getElementById('resetBtn'); var submitResultBtn = document.getElementById('submitResultBtn'); var submitMsg = document.getElementById('submitMsg'); var partDoneArea = document.getElementById('partDoneArea'); var partDoneTitle = document.getElementById('partDoneTitle'); var partDoneDetail = document.getElementById('partDoneDetail'); var partDoneTime = document.getElementById('partDoneTime'); var partDoneBtn = document.getElementById('partDoneBtn'); var userName = document.getElementById('userName'); var userAge = document.getElementById('userAge'); var userGender = document.getElementById('userGender'); var userMusicStudy = document.getElementById('userMusicStudy'); var userMusicFamiliar = document.getElementById('userMusicFamiliar'); // 选择套题 var cards = document.querySelectorAll('.set-card'); for (var i = 0; i < cards.length; i++) { cards[i].addEventListener('click', function() { if (isTestStarted) return; var all = document.querySelectorAll('.set-card'); for (var j = 0; j < all.length; j++) all[j].classList.remove('selected'); this.classList.add('selected'); selectedSet = parseInt(this.dataset.set); setLabel.textContent = ALL_SETS[selectedSet].name; }); } // 开始测试 startBtn.addEventListener('click', function() { if (selectedSet < 0) { alert('请先选择一套题!'); return; } if (!userName.value.trim()) { alert('请填写姓名'); userName.focus(); return; } if (!userAge.value.trim()) { alert('请填写年龄'); userAge.focus(); return; } isTestStarted = true; setIndex = selectedSet; partIndex = 0; correct = 0; wrong = 0; seconds = 0; partStats = []; isPartDone = false; selectArea.classList.add('hidden'); testArea.classList.remove('hidden'); resultArea.classList.add('hidden'); partDoneArea.classList.add('hidden'); if (timerInterval) clearInterval(timerInterval); timerInterval = setInterval(function() { seconds++; timerDisplay.textContent = '⏱️ ' + formatTime(seconds); }, 1000); loadPart(setIndex, 0); }); function loadPart(setIdx, pIdx) { var partData = ALL_SETS[setIdx].parts[pIdx]; currentQuestions = partData; setLabel.textContent = ALL_SETS[setIdx].name; partLabel.textContent = '第' + ['一', '二', '三', '四'][pIdx] + '部分'; qIndex = 0; correct = 0; wrong = 0; isAnswered = false; isPartDone = false; partStartTime = Date.now(); partDoneArea.classList.add('hidden'); answerInput.disabled = false; answerInput.value = ''; submitBtn.disabled = false; feedback.className = 'feedback waiting'; feedback.textContent = '请输入答案'; showQuestion(); answerInput.focus(); if (window.innerWidth < 768) { setTimeout(function() { answerInput.focus(); }, 300); } } function showQuestion() { if (qIndex >= currentQuestions.length) { showPartDone(); return; } var q = currentQuestions[qIndex]; var parts = q.split('='); questionText.textContent = parts[0] + ' = ?'; qCounter.textContent = (qIndex + 1) + ' / ' + currentQuestions.length; var total = currentQuestions.length; var done = qIndex; var pct = Math.round((done / total) * 100); progressFill.style.width = pct + '%'; progressPercent.textContent = pct + '%'; isAnswered = false; answerInput.value = ''; answerInput.disabled = false; submitBtn.disabled = false; feedback.className = 'feedback waiting'; feedback.textContent = '请输入答案'; answerInput.focus(); if (window.innerWidth < 768) { setTimeout(function() { answerInput.focus(); }, 200); } } function showPartDone() { var total = correct + wrong; var rate = total === 0 ? 0 : Math.round((correct / total) * 100); var elapsed = (Date.now() - partStartTime) / 1000; partStats.push({ correct: correct, wrong: wrong, rate: rate, time: Math.round(elapsed) }); partDoneTitle.textContent = '🎉 第' + ['一', '二', '三', '四'][partIndex] + '部分完成!'; partDoneDetail.textContent = '总题数:' + total + ' 题 · 答对:' + correct + ' 题 · 正确率:' + rate + '%'; partDoneTime.textContent = '⏱️ 用时:' + formatTime(Math.round(elapsed)); partDoneBtn.textContent = (partIndex === 3) ? '📊 查看最终结果' : '进入下一部分 ➜'; partDoneArea.classList.remove('hidden'); feedback.className = 'feedback part-done'; feedback.textContent = '✅ 第' + ['一', '二', '三', '四'][partIndex] + '部分完成!正确率 ' + rate + '%'; answerInput.disabled = true; submitBtn.disabled = true; partDoneArea.scrollIntoView({ behavior: 'smooth', block: 'center' }); } partDoneBtn.addEventListener('click', function() { if (partIndex === 3) { finishAllTests(); return; } partIndex++; loadPart(setIndex, partIndex); }); function handleSubmit() { if (isAnswered || !isTestStarted || isPartDone) return; var input = answerInput.value.trim(); if (input === '') { feedback.className = 'feedback waiting'; feedback.textContent = '⚠️ 请输入答案'; return; } var userAnswer = parseInt(input, 10); if (isNaN(userAnswer)) { feedback.className = 'feedback waiting'; feedback.textContent = '⚠️ 请输入有效数字'; return; } var q = currentQuestions[qIndex]; var parts = q.split('='); var correctAnswer = parseInt(parts[1], 10); var isCorrect = (userAnswer === correctAnswer); if (isCorrect) { correct++; feedback.className = 'feedback correct'; feedback.textContent = '✅ 正确!'; } else { wrong++; feedback.className = 'feedback wrong'; feedback.textContent = '❌ 错误'; } isAnswered = true; answerInput.disabled = true; submitBtn.disabled = true; setTimeout(function() { qIndex++; showQuestion(); }, 500); } function finishAllTests() { clearInterval(timerInterval); generateResult(); testArea.classList.add('hidden'); resultArea.classList.remove('hidden'); resultArea.scrollIntoView({ behavior: 'smooth', block: 'center' }); } function generateResult() { var totalSeconds = seconds; var totalCorrect = 0, totalWrong = 0; for (var i = 0; i < partStats.length; i++) { totalCorrect += partStats[i].correct; totalWrong += partStats[i].wrong; } var totalAll = totalCorrect + totalWrong; var totalRate = totalAll === 0 ? 0 : Math.round((totalCorrect / totalAll) * 100); var avgTime = totalAll > 0 ? Math.round(totalSeconds / totalAll) : 0; var html = ''; html += '
👤 个人信息
姓名:' + (userName.value.trim() || '') + '  |  年龄:' + (userAge.value.trim() || '') + '  |  性别:' + userGender.value + '
平时学习听音乐:' + userMusicStudy.value + '  |  今天背景音乐熟悉:' + userMusicFamiliar.value + '
'; html += '
' + '
📚 总题数' + totalAll + '
' + '
✅ 总正确' + totalCorrect + '
' + '
❌ 总错误' + totalWrong + '
' + '
📊 总正确率' + totalRate + '%
' + '
⏱️ 总用时' + formatTime( totalSeconds) + '
' + '
⏱️ 平均每题用时' + avgTime + '秒
'; html += '
📋 各部分详情
'; for (var j = 0; j < partStats.length; j++) { var p = partStats[j]; html += '
第' + ['一', '二', '三', '四'][j] + '部分 — 正确 ' + p.correct + ' / ' + (p.correct + p.wrong) + ' (' + p.rate + '%)  ⏱️ ' + formatTime(p.time) + '
'; } resultContent.innerHTML = html; submitMsg.textContent = ''; window._currentResult = { name: userName.value.trim(), age: userAge.value.trim(), gender: userGender.value, setName: ALL_SETS[setIndex].name, totalCorrect: totalCorrect, totalWrong: totalWrong, totalRate: totalRate, totalTime: totalSeconds, avgTime: avgTime, p1Rate: partStats[0] && partStats[0].rate || 0, p1Time: partStats[0] && partStats[0].time || 0, p2Rate: partStats[1] && partStats[1].rate || 0, p2Time: partStats[1] && partStats[1].time || 0, p3Rate: partStats[2] && partStats[2].rate || 0, p3Time: partStats[2] && partStats[2].time || 0, p4Rate: partStats[3] && partStats[3].rate || 0, p4Time: partStats[3] && partStats[3].time || 0 }; } submitResultBtn.addEventListener('click', function() { if (!window._currentResult) { submitMsg.textContent = '⚠️ 请先完成测试'; submitMsg.style.color = '#d9533a'; return; } var r = window._currentResult; if (partStats.length !== 4) { submitMsg.textContent = '⚠️ 请完成全部4部分再提交'; submitMsg.style.color = '#d9533a'; return; } var data = { name: r.name, age: r.age, gender: r.gender, music_study: userMusicStudy.value, music_familiar: userMusicFamiliar.value, set_name: r.setName, total_rate: r.totalRate, total_time: r.totalTime, p1_rate: r.p1Rate, p1_time: r.p1Time, p2_rate: r.p2Rate, p2_time: r.p2Time, p3_rate: r.p3Rate, p3_time: r.p3Time, p4_rate: r.p4Rate, p4_time: r.p4Time }; submitMsg.textContent = '⏳ 提交中...'; submitMsg.style.color = '#e67e22'; submitToCloud(data).then(function(result) { if (result.success) { submitMsg.textContent = '✅ 提交成功!数据已保存到云端'; submitMsg.style.color = '#1a8a6a'; submitResultBtn.disabled = true; fetchAllData(); } else { submitMsg.textContent = '❌ 提交失败:' + result.error; submitMsg.style.color = '#d9533a'; } }); }); resetBtn.addEventListener('click', function() { clearInterval(timerInterval); seconds = 0; timerDisplay.textContent = '⏱️ 00:00'; isTestStarted = false; isPartDone = false; partStats = []; correct = 0; wrong = 0; selectedSet = -1; submitResultBtn.disabled = false; submitMsg.textContent = ''; window._currentResult = null; var all = document.querySelectorAll('.set-card'); for (var i = 0; i < all.length; i++) all[i].classList.remove('selected'); setLabel.textContent = '请选择套题'; partLabel.textContent = '--'; qCounter.textContent = '--'; questionText.textContent = '3 + 7 = ?'; feedback.className = 'feedback waiting'; feedback.textContent = '请输入答案'; answerInput.value = ''; progressFill.style.width = '0%'; progressPercent.textContent = '0%'; selectArea.classList.remove('hidden'); testArea.classList.add('hidden'); resultArea.classList.add('hidden'); partDoneArea.classList.add('hidden'); window.scrollTo({ top: 0, behavior: 'smooth' }); }); answerInput.addEventListener('keydown', function(e) { if (e.key === 'Enter') { e.preventDefault(); if (!isAnswered && !isPartDone) { handleSubmit(); } } }); // ============================================================ // 初始化 // ============================================================ selectArea.classList.remove('hidden'); testArea.classList.add('hidden'); resultArea.classList.add('hidden'); partDoneArea.classList.add('hidden'); fetchAllData();