/** * 学生端功能管理 */ class StudentManager { constructor() { this.apiBase = '/api/student'; this.init(); } init() { this.initDashboard(); this.initCourses(); this.updateCurrentTime(); setInterval(() => this.updateCurrentTime(), 1000); // 绑定刷新按钮 const refreshBtn = document.getElementById('refreshCourses'); if (refreshBtn) { refreshBtn.addEventListener('click', () => this.initCourses()); } } updateCurrentTime() { const timeElement = document.getElementById('currentTime'); if (timeElement) { const now = new Date(); const options = { year: 'numeric', month: 'long', day: 'numeric', hour: '2-digit', minute: '2-digit', second: '2-digit' }; timeElement.textContent = now.toLocaleString('zh-CN', options); } } async initDashboard() { // 检查是否在仪表板页面 if (!document.getElementById('gradesTableBody')) return; try { const response = await fetch(`${this.apiBase}/grades`); const result = await response.json(); if (result.success) { this.renderDashboard(result.data); } else { if (window.authManager) { window.authManager.showNotification(result.message || '获取数据失败', 'error'); } } } catch (error) { console.error('Fetch dashboard data failed:', error); } } async initCourses() { // 检查是否在仪表板页面 if (!document.getElementById('coursesTableBody')) return; try { const response = await fetch(`${this.apiBase}/courses`); const result = await response.json(); if (result.success) { this.renderCourses(result.data); } else { if (window.authManager) { window.authManager.showNotification(result.message || '获取课程失败', 'error'); } } } catch (error) { console.error('Fetch courses failed:', error); } } renderCourses(courses) { const tbody = document.getElementById('coursesTableBody'); if (tbody) { if (!courses || courses.length === 0) { tbody.innerHTML = '暂无课程安排'; return; } tbody.innerHTML = courses.map(course => ` ${course.course_code} ${course.course_name} ${course.credit} ${course.teacher_name} ${course.semester || '2023-2024 下学期'} `).join(''); } } renderDashboard(data) { const { grades, statistics } = data; // 渲染统计数据 if (statistics) { this.updateElement('gpaValue', statistics.gpa); this.updateElement('courseCount', statistics.totalCourses); this.updateElement('creditTotal', statistics.totalCredits); // 班级排名如果后端没提供,可以显示为 '-' 或固定值 this.updateElement('classRank', statistics.classRank || '-'); } // 渲染成绩表格 const tbody = document.getElementById('gradesTableBody'); if (tbody) { if (!grades || grades.length === 0) { tbody.innerHTML = '暂无成绩记录'; return; } tbody.innerHTML = grades.map(grade => ` ${grade.course_name} ${grade.course_code || '-'} ${grade.credit} ${grade.score} ${grade.grade_level || '-'} ${grade.grade_point || '-'} ${this.getScoreText(grade.score)} `).join(''); } } viewCourseDetails(id) { console.log('View details for course:', id); // 可以弹出一个模态框显示更多信息 } updateElement(id, value) { const el = document.getElementById(id); if (el) el.textContent = value; } getScoreBadgeClass(score) { const s = parseFloat(score); if (s >= 90) return 'bg-success'; if (s >= 80) return 'bg-info'; if (s >= 60) return 'bg-warning'; return 'bg-danger'; } getScoreText(score) { const s = parseFloat(score); if (s >= 60) return '及格'; return '不及格'; } viewDetails(id) { // 实现查看详情逻辑,或者跳转到详情页 console.log('View details for score:', id); } } // 初始化 document.addEventListener('DOMContentLoaded', () => { window.studentManager = new StudentManager(); // 从 Session 获取用户信息并更新 UI fetch('/api/auth/me') .then(res => res.json()) .then(result => { if (result.success && result.data.user) { const user = result.data.user; const nameEl = document.getElementById('userName'); const studentNameEl = document.getElementById('studentName'); const studentClassEl = document.getElementById('studentClass'); if (nameEl) nameEl.textContent = user.name; if (studentNameEl) studentNameEl.textContent = user.name; if (studentClassEl) studentClassEl.textContent = user.class || '未分配'; } }); });