龙虾成长简报
把材料交给星光 → 工具读取 → 一键打印评语条
选择你的角色
不同角色的提示词和评语维度会自动适配
👩‍🏫
班主任
全班学生 · 全科成绩 · 综合评语
📖
科任老师
自己学科 · 学科评语
1
2
3
评语需求
选择评语的字数、风格和评价维度
📝 评语字数
约20字
约50字
约100字
约150字
🎨 语言风格
温暖鼓励
客观严谨
简洁明了
📊 评价维度
学业表现
行为习惯
品德素养
团队协作
特长发展
进步空间
打印预览
工资条样式,虚线分隔,可撕下发
🦞 龙虾老师 · aiedge.top
`; const blob = new Blob([html], { type: 'text/html;charset=utf-8' }); const a = document.createElement('a'); a.href = URL.createObjectURL(blob); a.download = `成长简报_${s.name}_${new Date().toISOString().slice(0,10)}.html`; a.click(); toast(`✅ ${s.name} 的HTML已导出`); } // ── 批量导出全部HTML ── function exportAllHTML() { students.forEach((s, i) => { if (s.comment) setTimeout(() => exportStudentHTML(i), i * 200); }); toast('✅ 正在逐个导出HTML…'); } // ── 多学期对比 ── function toggleCompare(i) { const panel = document.getElementById(`compare-${i}`); if (panel.style.display === 'block') { panel.style.display = 'none'; return; } const history = getHistory(); if (!history.length) { toast('暂无历史存档'); return; } const latest = history[history.length - 1]; const prev = latest.students.find(s => s.name === students[i].name); if (!prev) { panel.innerHTML = '

上学期无此学生记录

'; panel.style.display = 'block'; return; } // 计算总分变化 const curTotal = Object.values(students[i].scores || {}).reduce((a,b) => a+b, 0); const prevTotal = Object.values(prev.scores || {}).reduce((a,b) => a+b, 0); const diff = curTotal - prevTotal; panel.innerHTML = `
对比:${latest.semester}(${latest.date})
上学期评语
${prev.comment || '无'}
本学期评语
${students[i].comment || '无'}
${prevTotal ? `
总分变化:${curTotal} vs ${prevTotal} ${diff >= 0 ? '↑' : '↓'}${Math.abs(diff)}分
` : ''} `; panel.style.display = 'block'; } // ── 打印 ── function switchPrintVersion(el) { el.parentElement.querySelectorAll('.version-btn').forEach(b => b.classList.remove('active')); el.classList.add('active'); printVersion = el.dataset.pver; renderPrint(); } function renderPrint() { const container = document.getElementById('print-strips'); const empty = document.getElementById('print-empty'); const withC = students.filter(s => printVersion === 'parent' ? (s.parentComment || s.comment) : s.comment); if (!withC.length) { container.innerHTML = ''; empty.style.display = 'block'; return; } empty.style.display = 'none'; if (printVersion === 'parent') { container.innerHTML = withC.map(s => ` `).join(''); } else { container.innerHTML = withC.map(s => ` `).join(''); } } // ── 导出 ── function exportCSV() { const withC = students.filter(s => s.comment); if (!withC.length) { toast('暂无评语'); return; } let csv = '\uFEFF姓名,学生版评语,家长版评语,教师版评语\n'; withC.forEach(s => { csv += `"${s.name}","${(s.comment||'').replace(/"/g,'""')}","${(s.parentComment||'').replace(/"/g,'""')}","${(s.teacherComment||'').replace(/"/g,'""')}"\n`; }); const blob = new Blob([csv], { type: 'text/csv;charset=utf-8' }); const a = document.createElement('a'); a.href = URL.createObjectURL(blob); a.download = `成长简报_${new Date().toISOString().slice(0,10)}.csv`; a.click(); toast('✅ CSV已下载'); } // ── 演示 ── function loadDemo() { if (!role) { role = 'homeroom'; selectRoleByValue('homeroom'); showHomeAfterRole(); } isDemoMode = true; students = [ { name:'张明辉', strengths:'担任班长,责任心强,各科成绩均衡', weaknesses:'偶尔过于追求完美', comment:'该生品学兼优,担任班长期间表现出色,学习勤奋刻苦,是老师的得力助手。建议在追求卓越的同时学会适当放松,保持身心健康。', parentComment:'该生本学期在学业和品行方面均有良好表现。学业上,各科均衡发展,尤其理科思维突出。行为习惯方面,作为班长展现了较强的责任心和团队领导力。建议家长在关注学业的同时,引导孩子学会适当放松,避免过度追求完美带来的心理压力。建议每日保证30分钟体育锻炼时间。', teacherComment:'班长工作出色,各科均衡,理科突出。偶尔追求完美需关注心理状态。', scores:{语文:85,数学:92,英语:78,物理:88}, avgScores:{语文:80,数学:85,英语:82,物理:82}, lastScores:{语文:80,数学:88,英语:75,物理:85} }, { name:'李思琪', strengths:'学习态度端正,笔记工整,期中进步明显', weaknesses:'课堂发言不够积极', comment:'该生学习态度认真踏实,本学期成绩进步显著,笔记工整规范值得全班学习。希望今后能更积极地参与课堂讨论,勇敢表达自己的想法。', parentComment:'该生本学期学习态度端正,成绩稳步提升,笔记工整规范。建议家长鼓励孩子多参与课堂互动,培养自信心。可以每天安排10分钟的朗读练习,锻炼口头表达能力。下学期目标:课堂发言次数明显增加。', teacherComment:'态度端正,笔记工整,期中进步明显。课堂发言少,需多鼓励。', scores:{语文:88,数学:72,英语:90,物理:68}, avgScores:{语文:80,数学:85,英语:82,物理:82}, lastScores:{语文:82,数学:70,英语:85,物理:65} }, { name:'王浩然', strengths:'体育表现突出,运动会上为班级争光', weaknesses:'上课偶尔走神,需加强自律', comment:'该生在体育方面表现突出,运动会上为班级争光。性格开朗,乐于助人。建议将运动场上的拼搏精神带到学习中,提高课堂专注力。', parentComment:'该生体育特长突出,在校运动会上表现优异。但课堂专注力有待提升,偶尔出现走神现象。建议家长帮助孩子制定作息时间表,保证充足睡眠。可以将运动作为完成学习任务后的奖励,培养自律习惯。下学期目标:课堂纪律评分提升至良好以上。', teacherComment:'体育特长突出,运动会贡献大。课堂走神需加强自律,建议用运动激励学习。', scores:{语文:65,数学:70,英语:58,物理:72}, avgScores:{语文:80,数学:85,英语:82,物理:82}, lastScores:{语文:62,数学:68,英语:55,物理:70} } ]; saveLocal(); updateOverview(); // 显示演示模式标识 document.getElementById('demo-banner').style.display = 'block'; toast('✅ 演示模式:已加载3名学生'); } function clearAll() { if (!confirm('确认清空?')) return; isDemoMode = false; students = []; saveLocal(); updateOverview(); document.getElementById('demo-banner').style.display = 'none'; toast('已清空'); } function toast(msg) { const el = document.getElementById('toast'); el.textContent = msg; el.classList.add('show'); setTimeout(() => el.classList.remove('show'), 2500); } /* ═══ Logo注入 ═══ */ const LOGO_SVG_200 = ` `; function initEyeTracking(svgEl, opts = {}) { const { leftPupilSel = '.pupil-l', rightPupilSel = '.pupil-r', maxOffset = 3.5 } = opts; const lp = svgEl.querySelector(leftPupilSel); const rp = svgEl.querySelector(rightPupilSel); if (!lp || !rp) return; const lcx = +lp.getAttribute('cx'), lcy = +lp.getAttribute('cy'); const rcx = +rp.getAttribute('cx'), rcy = +rp.getAttribute('cy'); const handler = e => { const rect = svgEl.getBoundingClientRect(); const vb = svgEl.viewBox.baseVal; const scaleX = vb.width / rect.width; const scaleY = vb.height / rect.height; const dx = (e.clientX - rect.left - rect.width/2) * scaleX; const dy = (e.clientY - rect.top - rect.height/2) * scaleY; const dist = Math.sqrt(dx*dx + dy*dy); const factor = Math.min(dist / 200, 1) * maxOffset; const angle = Math.atan2(dy, dx); const cx = Math.cos(angle) * factor; const cy = Math.sin(angle) * factor; lp.setAttribute('cx', lcx + cx); lp.setAttribute('cy', lcy + cy); rp.setAttribute('cx', rcx + cx); rp.setAttribute('cy', rcy + cy); }; document.addEventListener('mousemove', handler); } function injectLogo(container, size) { if (!container) return; const div = document.createElement('div'); div.innerHTML = LOGO_SVG_200; const svg = div.querySelector('svg'); if (size) { svg.style.width = size + 'px'; svg.style.height = size + 'px'; } svg.style.color = 'currentColor'; container.appendChild(svg); initEyeTracking(svg, { maxOffset: 3.5 }); } // 导航栏小Logo injectLogo(document.getElementById('nav-logo-icon'), 24); // 在Hero区域下方添加大Logo水印 const hero = document.querySelector('.hero'); if (hero) { const wm = document.createElement('div'); wm.style.cssText = 'position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);opacity:0.04;pointer-events:none;z-index:0'; wm.innerHTML = `
${LOGO_SVG_200}
`; hero.style.position = 'relative'; hero.appendChild(wm); } // 在main区域添加装饰性Logo const main = document.querySelector('.main'); if (main) { const deco = document.createElement('div'); deco.style.cssText = 'position:fixed;bottom:-60px;right:-60px;opacity:0.03;pointer-events:none;z-index:0;width:280px;height:240px;color:var(--text)'; deco.innerHTML = LOGO_SVG_200; document.body.appendChild(deco); }
🦞 已有 - 人使用过此工具 · 今日 - 次访问
🦞 龙虾老师 · aiedge.top