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