const params = new URLSearchParams(location.search); const slug = params.get('slug'); let scale = null, answers = [], current = 0, submitted = false, started = false; async function init() { if (!slug) { document.getElementById('app').innerHTML = '
缺少量表参数
'; return; } try { const r = await fetch(`../api/scales/${slug}`); scale = await r.json(); if (scale.error) throw new Error(scale.error); answers = new Array(scale.question_count).fill(null); // Restore from localStorage const cached = localStorage.getItem(`scale_${slug}`); if (cached) answers = JSON.parse(cached); renderStart(); } catch(e) { document.getElementById('app').innerHTML = `
加载失败: ${e.message}
`; } } function renderStart() { const hasCache = answers.some(a => a !== null); const answered = answers.filter(a => a !== null).length; const rawDesc = scale.description || ''; const parts = rawDesc.split('\n\n'); const mainDesc = parts[0] || ''; const metaLine = parts.slice(1).join(' · ') || ''; const timeMin = Math.ceil(scale.question_count / 6); const timeMax = Math.ceil(scale.question_count / 4); document.getElementById('app').innerHTML = `
${scale.name}
${mainDesc ? `
${mainDesc}
` : ''} ${metaLine ? `
${metaLine.split('·').filter(m=>m.trim()).map(m => `${m.trim()}` ).join('')}
` : ''}
📝 ${scale.question_count} ⏱ ${timeMin}-${timeMax} 分钟 🔒 自动保存
${hasCache ? `
📌 已有答题进度:${answered}/${scale.question_count}
` : ''} ${hasCache ? `` : ''}
`; } function startTest() { started = true; // Resume from first unanswered question const firstUnanswered = answers.findIndex(a => a === null); current = firstUnanswered >= 0 ? firstUnanswered : 0; render(); } function resetAndStart() { answers = new Array(scale.question_count).fill(null); localStorage.removeItem(`scale_${slug}`); started = true; current = 0; render(); } function saveCache() { localStorage.setItem(`scale_${slug}`, JSON.stringify(answers)); } function selectOption(idx) { if (submitted) return; answers[current] = idx; saveCache(); render(); // Auto advance after short delay if (current < scale.question_count - 1) { setTimeout(() => { current++; render(); }, 300); } } function goPrev() { if (current > 0) { current--; render(); } } function goNext() { if (current < scale.question_count - 1) { current++; render(); } } async function submit() { if (submitted) return; submitted = true; saveCache(); try { const r = await fetch('../api/scales/result', { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({ scale_slug: scale.slug, scale_name: scale.name, answers: answers, }) }); const data = await r.json(); // Clear cache localStorage.removeItem(`scale_${slug}`); renderResult(data); } catch(e) { submitted = false; alert('提交失败,请重试'); render(); } } function renderResult(data) { const s = data.scores; const allAnswered = s.answer_count; const total = scale.question_count; const scoreDisplay = s.std_score !== null ? s.std_score : s.raw_score; const isStd = s.std_score !== null; const isFactorScale = s.factors && Object.keys(s.factors).length >= 6; const hasFactors = s.factors && Object.keys(s.factors).length > 0; // Factor bars (for any factor count, not just 8+) let factorsHtml = ''; if (hasFactors) { const factorMax = s.factor_max || {}; const bars = Object.entries(s.factors).map(([k,v]) => { const max = factorMax[k] || 50; const pct = Math.min(Math.round(v / max * 100), 100); return `
${k}${v}/${max}
`; }).join(''); let insightHtml = ''; if (isFactorScale) { const sorted = Object.entries(s.factors).sort((a,b) => b[1]-a[1]); const top3 = sorted.slice(0,3).map(([k,v]) => `${k}`).join('、'); insightHtml = `
🌟 优势方向:${top3}
得分最高的领域代表天赋倾向,建议重点关注和培养。
`; } factorsHtml = `
${isFactorScale ? '各维度得分' : '因子得分'}
${bars} ${insightHtml}
`; } // Rating badge let ratingHtml = ''; if (s.rating) { ratingHtml = `
${s.rating}
`; } document.getElementById('app').innerHTML = `
${scale.name}
测评完成 · ${allAnswered}/${total} 题
${isFactorScale ? `
多元智能测评结果
` : `
${scoreDisplay} ${isStd ? `` : ''}
${isStd ? `
原始分 ${s.raw_score} × 1.25 = 标准分 ${scoreDisplay}
` : ''} ${!isStd && !isFactorScale ? `
满分 ${s.max_score} · 占比 ${(s.raw_score/s.max_score*100).toFixed(0)}%
` : ''}`} ${ratingHtml} ${factorsHtml}
返回量表库 重新测试

* 结果仅供参考,不能替代专业诊断

`; } function render() { if (!scale) return; const total = scale.question_count; const pct = ((current + 1) / total * 100).toFixed(0); const isLast = current === total - 1; const selected = answers[current]; const q = scale.questions[current]; const opts = scale.options[current]; const optHtml = opts.map((o, i) => ` `).join(''); const allAnswered = answers.every(a => a !== null); document.getElementById('app').innerHTML = `
${scale.name}
${current+1}/${total}
${current+1}.${q}
${optHtml}
${isLast ? `` : `` }
${isLast ? `
${allAnswered?'全部答完,可以提交了':'还有题目未作答'}
` : ''} `; } init();