143 lines
4.4 KiB
JavaScript
143 lines
4.4 KiB
JavaScript
const express = require('express');
|
|
const router = express.Router();
|
|
const db = require('../config/database');
|
|
const { requireAuth, requireRole } = require('../middleware/auth');
|
|
|
|
// 获取学生成绩
|
|
router.get('/grades', requireAuth, requireRole(['student']), async (req, res) => {
|
|
try {
|
|
const userId = req.session.user.id;
|
|
|
|
// 获取学生信息
|
|
const students = await db.pool.execute(
|
|
'SELECT id FROM students WHERE user_id = ?',
|
|
[userId]
|
|
);
|
|
|
|
if (students[0].length === 0) {
|
|
return res.status(404).json({
|
|
success: false,
|
|
message: '学生信息不存在'
|
|
});
|
|
}
|
|
|
|
const studentId = students[0][0].id;
|
|
|
|
// 获取成绩信息
|
|
const grades = await db.pool.execute(`
|
|
SELECT s.*, c.course_code, c.course_name, c.credit,
|
|
u.name as teacher_name
|
|
FROM scores s
|
|
JOIN courses c ON s.course_id = c.id
|
|
JOIN users u ON s.teacher_id = u.id
|
|
WHERE s.student_id = ?
|
|
ORDER BY s.exam_date DESC
|
|
`, [studentId]);
|
|
|
|
// 计算统计信息
|
|
let totalCredits = 0;
|
|
let totalGradePoints = 0;
|
|
let totalCourses = grades.length;
|
|
|
|
grades.forEach(grade => {
|
|
totalCredits += parseFloat(grade.credit);
|
|
if (grade.grade_point) {
|
|
totalGradePoints += parseFloat(grade.grade_point) * parseFloat(grade.credit);
|
|
}
|
|
});
|
|
|
|
const gpa = totalCredits > 0 ? (totalGradePoints / totalCredits).toFixed(2) : 0;
|
|
|
|
res.json({
|
|
success: true,
|
|
grades,
|
|
statistics: {
|
|
totalCourses,
|
|
totalCredits,
|
|
gpa,
|
|
averageScore: totalCourses > 0 ?
|
|
(grades.reduce((sum, g) => sum + parseFloat(g.score || 0), 0) / totalCourses).toFixed(1) : 0
|
|
}
|
|
});
|
|
|
|
} catch (error) {
|
|
console.error('获取成绩错误:', error);
|
|
res.status(500).json({
|
|
success: false,
|
|
message: '服务器错误'
|
|
});
|
|
}
|
|
});
|
|
|
|
// 获取成绩详情
|
|
router.get('/grades/:id', requireAuth, requireRole(['student']), async (req, res) => {
|
|
try {
|
|
const gradeId = req.params.id;
|
|
const userId = req.session.user.id;
|
|
|
|
const grades = await db.pool.execute(`
|
|
SELECT s.*, c.course_code, c.course_name, c.credit, c.semester,
|
|
u.full_name as teacher_name, u.email as teacher_email,
|
|
st.student_id as student_number, st.class_name, st.major
|
|
FROM scores s
|
|
JOIN courses c ON s.course_id = c.id
|
|
JOIN users u ON s.teacher_id = u.id
|
|
JOIN students st ON s.student_id = st.id
|
|
WHERE s.id = ? AND st.user_id = ?
|
|
`, [gradeId, userId]);
|
|
|
|
if (grades[0].length === 0) {
|
|
return res.status(404).json({
|
|
success: false,
|
|
message: '成绩不存在'
|
|
});
|
|
}
|
|
|
|
res.json({
|
|
success: true,
|
|
grade: grades[0]
|
|
});
|
|
|
|
} catch (error) {
|
|
console.error('获取成绩详情错误:', error);
|
|
res.status(500).json({
|
|
success: false,
|
|
message: '服务器错误'
|
|
});
|
|
}
|
|
});
|
|
|
|
// 获取学生个人信息
|
|
router.get('/profile', requireAuth, requireRole(['student']), async (req, res) => {
|
|
try {
|
|
const userId = req.session.user.id;
|
|
|
|
const students = await db.pool.execute(`
|
|
SELECT s.*, u.username, u.email, u.created_at as account_created
|
|
FROM students s
|
|
JOIN users u ON s.user_id = u.id
|
|
WHERE u.id = ?
|
|
`, [userId]);
|
|
|
|
if (students[0].length === 0) {
|
|
return res.status(404).json({
|
|
success: false,
|
|
message: '学生信息不存在'
|
|
});
|
|
}
|
|
|
|
res.json({
|
|
success: true,
|
|
profile: students[0]
|
|
});
|
|
|
|
} catch (error) {
|
|
console.error('获取个人信息错误:', error);
|
|
res.status(500).json({
|
|
success: false,
|
|
message: '服务器错误'
|
|
});
|
|
}
|
|
});
|
|
|
|
module.exports = router; |