first commit
This commit is contained in:
243
backend/routes/teacher.js
Normal file
243
backend/routes/teacher.js
Normal file
@@ -0,0 +1,243 @@
|
||||
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;
|
||||
Reference in New Issue
Block a user