const express = require('express'); const router = express.Router(); const db = require('../config/database'); const { requireAuth, requireRole } = require('../middleware/auth'); // 获取教师教授的课程 router.get('/courses', requireAuth, requireRole(['teacher']), async (req, res) => { try { const teacherId = req.session.user.id; const courses = await db.pool.execute( 'SELECT * FROM courses WHERE teacher_id = ? ORDER BY course_code', [teacherId] ); res.json({ success: true, courses }); } catch (error) { console.error('获取课程错误:', error); res.status(500).json({ success: false, message: '服务器错误' }); } }); // 录入成绩 router.post('/grades', requireAuth, requireRole(['teacher']), async (req, res) => { try { const teacherId = req.session.user.id; const { studentId, courseId, score, examDate, remark } = req.body; // 验证输入 if (!studentId || !courseId || score === undefined) { return res.status(400).json({ success: false, message: '请填写必填字段' }); } // 检查学生和课程是否存在 const students = await db.pool.execute( 'SELECT id FROM students WHERE student_id = ?', [studentId] ); if (students[0].length === 0) { return res.status(404).json({ success: false, message: '学生不存在' }); } // 计算绩点和等级 const numericScore = parseFloat(score); let gradePoint = 0; let gradeLevel = 'F'; if (numericScore >= 90) { gradePoint = 4.0; gradeLevel = 'A'; } else if (numericScore >= 80) { gradePoint = 3.0; gradeLevel = 'B'; } else if (numericScore >= 70) { gradePoint = 2.0; gradeLevel = 'C'; } else if (numericScore >= 60) { gradePoint = 1.0; gradeLevel = 'D'; } // 插入成绩 const result = await db.pool.execute( `INSERT INTO scores (student_id, course_id, teacher_id, score, grade_point, grade_level, exam_date, remark) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, [students[0][0].id, courseId, teacherId, numericScore, gradePoint, gradeLevel, examDate, remark] ); res.json({ success: true, message: '成绩录入成功', gradeId: result.insertId }); } catch (error) { console.error('录入成绩错误:', error); // 处理唯一约束错误 if (error.code === 'ER_DUP_ENTRY') { return res.status(400).json({ success: false, message: '该学生此课程成绩已存在' }); } res.status(500).json({ success: false, message: '服务器错误' }); } }); // 查询成绩(按班级、课程) router.get('/grades', requireAuth, requireRole(['teacher']), async (req, res) => { try { const { class_name, course_id } = req.query; const teacherId = req.session.user.id; let query = ` SELECT sc.*, st.student_id, st.full_name, st.class_name, c.course_code, c.course_name, c.credit FROM scores sc JOIN students st ON sc.student_id = st.id JOIN courses c ON sc.course_id = c.id WHERE sc.teacher_id = ? `; const params = [teacherId]; if (class_name) { query += ' AND st.class_name = ?'; params.push(class_name); } if (course_id) { query += ' AND sc.course_id = ?'; params.push(course_id); } query += ' ORDER BY st.class_name, st.student_id, sc.exam_date DESC'; const grades = await db.pool.execute(query, params); res.json({ success: true, grades }); } catch (error) { console.error('查询成绩错误:', error); res.status(500).json({ success: false, message: '服务器错误' }); } }); // 更新成绩 router.put('/grades/:id', requireAuth, requireRole(['teacher']), async (req, res) => { try { const gradeId = req.params.id; const teacherId = req.session.user.id; const { score, examDate, remark } = req.body; // 验证成绩是否存在且属于该教师 const existingGrades = await db.pool.execute( 'SELECT id FROM scores WHERE id = ? AND teacher_id = ?', [gradeId, teacherId] ); if (existingGrades[0].length === 0) { return res.status(404).json({ success: false, message: '成绩不存在或无权修改' }); } // 计算新的绩点和等级 const numericScore = parseFloat(score); let gradePoint = 0; let gradeLevel = 'F'; if (numericScore >= 90) { gradePoint = 4.0; gradeLevel = 'A'; } else if (numericScore >= 80) { gradePoint = 3.0; gradeLevel = 'B'; } else if (numericScore >= 70) { gradePoint = 2.0; gradeLevel = 'C'; } else if (numericScore >= 60) { gradePoint = 1.0; gradeLevel = 'D'; } // 更新成绩 await db.pool.execute( `UPDATE scores SET score = ?, grade_point = ?, grade_level = ?, exam_date = ?, remark = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?`, [numericScore, gradePoint, gradeLevel, examDate, remark, gradeId] ); res.json({ success: true, message: '成绩更新成功' }); } catch (error) { console.error('更新成绩错误:', error); res.status(500).json({ success: false, message: '服务器错误' }); } }); // 删除成绩 router.delete('/grades/:id', requireAuth, requireRole(['teacher']), async (req, res) => { try { const gradeId = req.params.id; const teacherId = req.session.user.id; // 验证成绩是否存在且属于该教师 const existingGrades = await db.pool.execute( 'SELECT id FROM scores WHERE id = ? AND teacher_id = ?', [gradeId, teacherId] ); if (existingGrades[0].length === 0) { return res.status(404).json({ success: false, message: '成绩不存在或无权删除' }); } // 删除成绩 await db.pool.execute('DELETE FROM scores WHERE id = ?', [gradeId]); res.json({ success: true, message: '成绩删除成功' }); } catch (error) { console.error('删除成绩错误:', error); res.status(500).json({ success: false, message: '服务器错误' }); } }); module.exports = router;