/** * 班级操行分管理系统 - 操行分管理页JS * * 开发者: Canglan * 版权归属: Sea Network Technology Studio * * 版权所有 © Sea Network Technology Studio */ (function() { 'use strict'; async function loadStudents() { const res = await apiGet('/api/admin/students', {page_size: 1000}); if (res && res.success) { let html = ''; res.data.students.forEach(student => { html += ` ${escapeHtml(student.student_no)} ${escapeHtml(student.name)} ${student.total_points} `; }); if (res.data.students.length === 0) { html = '暂无学生数据'; } document.getElementById('studentList').innerHTML = html; } } function showSinglePointsModal(studentId, studentName) { window.selectedStudentIds = [studentId]; document.getElementById('selectedStudentsCount').innerHTML = `${studentName} (1人)`; document.getElementById('pointsChange').value = ''; document.getElementById('pointsReason').value = ''; document.getElementById('batchPointsModal').style.display = 'flex'; } async function exportMoralityRecords() { showToast('正在导出德育分记录...', 'info'); try { const studentsRes = await apiGet('/api/admin/students', { page_size: 1000 }); if (!studentsRes || !studentsRes.success) { showToast('获取学生列表失败', 'error'); return; } const students = studentsRes.data.students; if (students.length === 0) { showToast('没有找到学生', 'warning'); return; } const historyRes = await apiGet('/api/admin/conduct/history', { page: 1, page_size: 1000 }); if (!historyRes || !historyRes.success) { showToast('获取历史记录失败', 'error'); return; } const allRecords = historyRes.data.records || []; const recordsByStudent = {}; allRecords.forEach(record => { const sid = record.student_id; if (!recordsByStudent[sid]) { recordsByStudent[sid] = []; } recordsByStudent[sid].push(record); }); const studentRecords = []; for (const student of students) { const studentRecords_list = recordsByStudent[student.student_id] || []; const positiveRecords = studentRecords_list.filter(r => r.points_change > 0).map(r => `${r.reason}(+${r.points_change})`); const negativeRecords = studentRecords_list.filter(r => r.points_change < 0).map(r => `${r.reason}(${r.points_change})`); studentRecords.push({ student_no: student.student_no, name: student.name, total_points: student.total_points || 0, positive_history: positiveRecords.join('; '), negative_history: negativeRecords.join('; ') }); } function escapeCsvField(field) { if (field === null || field === undefined) return ''; let str = String(field).replace(/[\r\n]+/g, ' '); str = str.replace(/"/g, '""'); if (/[\,\;\"\s]/.test(str)) { str = '"' + str + '"'; } return str; } let csv = '\uFEFF'; csv += '学号,姓名,分数,加分历史,减分记录\n'; studentRecords.forEach(s => { csv += `${escapeCsvField(s.student_no)},${escapeCsvField(s.name)},${escapeCsvField(s.total_points)},${escapeCsvField(s.positive_history)},${escapeCsvField(s.negative_history)}\n`; }); const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' }); const url = URL.createObjectURL(blob); const link = document.createElement('a'); link.href = url; link.download = `德育分记录_${new Date().toISOString().slice(0,10)}.csv`; document.body.appendChild(link); link.click(); document.body.removeChild(link); URL.revokeObjectURL(url); showToast(`导出成功,共${studentRecords.length}名学生`); } catch (err) { showToast('导出失败:' + err.message, 'error'); console.error('导出失败:', err); } } loadStudents(); window.loadStudents = loadStudents; window.showSinglePointsModal = showSinglePointsModal; window.exportMoralityRecords = exportMoralityRecords; })();