diff --git a/backend/controllers/studentController.js b/backend/controllers/studentController.js index ed1975a..8f72a60 100644 --- a/backend/controllers/studentController.js +++ b/backend/controllers/studentController.js @@ -30,6 +30,20 @@ class StudentController { error(res, '服务器错误'); } } + + static async getCourses(req, res) { + try { + const userId = req.session.user.id; + const data = await StudentService.getStudentCourses(userId); + success(res, data); + } catch (err) { + if (err.message === '学生信息不存在') { + return error(res, err.message, 404); + } + console.error('Get Courses Error:', err); + error(res, '服务器错误'); + } + } } module.exports = StudentController; \ No newline at end of file diff --git a/backend/models/Course.js b/backend/models/Course.js index bff2e83..3d4b9af 100644 --- a/backend/models/Course.js +++ b/backend/models/Course.js @@ -12,6 +12,19 @@ class Course { const rows = await db.query('SELECT * FROM courses WHERE id = ?', [id]); return rows[0]; } + + static async findByStudentId(studentId) { + const sql = ` + SELECT c.*, u.name as teacher_name + FROM courses c + JOIN classes cl ON c.class_id = cl.id + JOIN students s ON cl.class_name = s.class + JOIN users u ON c.teacher_id = u.id + WHERE s.id = ? + ORDER BY c.course_code + `; + return await db.query(sql, [studentId]); + } } module.exports = Course; \ No newline at end of file diff --git a/backend/routes/student.js b/backend/routes/student.js index 478fa0e..4b559b8 100644 --- a/backend/routes/student.js +++ b/backend/routes/student.js @@ -5,5 +5,6 @@ const { requireAuth, requireRole } = require('../middleware/auth'); router.get('/grades', requireAuth, requireRole(['student']), StudentController.getGrades); router.get('/grades/:id', requireAuth, requireRole(['student']), StudentController.getGradeDetails); +router.get('/courses', requireAuth, requireRole(['student']), StudentController.getCourses); module.exports = router; \ No newline at end of file diff --git a/backend/services/studentService.js b/backend/services/studentService.js index 1e8796b..c0af4eb 100644 --- a/backend/services/studentService.js +++ b/backend/services/studentService.js @@ -1,12 +1,9 @@ const Score = require('../models/Score'); const Student = require('../models/Student'); +const Course = require('../models/Course'); class StudentService { static async getStudentGrades(userId) { - // 先通过 userId 获取 studentId - // 假设 users.id = students.id,或者通过 user_id 关联 - // 根据之前的 authService,我们假设 users.id 就是 students.id - // 确认学生是否存在 const student = await Student.findById(userId); if (!student) { @@ -50,6 +47,14 @@ class StudentService { } return grade; } + + static async getStudentCourses(userId) { + const student = await Student.findById(userId); + if (!student) { + throw new Error('学生信息不存在'); + } + return await Course.findByStudentId(userId); + } } -module.exports = StudentService; \ No newline at end of file +module.exports = StudentService; diff --git a/frontend/public/js/student.js b/frontend/public/js/student.js index cfd19d8..4b9bb04 100644 --- a/frontend/public/js/student.js +++ b/frontend/public/js/student.js @@ -9,8 +9,15 @@ class StudentManager { init() { this.initDashboard(); + this.initCourses(); this.updateCurrentTime(); setInterval(() => this.updateCurrentTime(), 1000); + + // 绑定刷新按钮 + const refreshBtn = document.getElementById('refreshCourses'); + if (refreshBtn) { + refreshBtn.addEventListener('click', () => this.initCourses()); + } } updateCurrentTime() { @@ -44,6 +51,51 @@ class StudentManager { 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 = '
${course.course_code}| 课程代码 | +课程名称 | +学分 | +授课教师 | +学期 | +操作 | +
|---|---|---|---|---|---|
| + + 数据加载中... + | +|||||