feat: 实现成绩管理系统核心功能
添加响应工具、错误处理中间件和数据库模型 创建用户、学生、课程和成绩相关服务 实现管理员、教师和学生控制器的基本功能 重构路由处理并优化数据库查询
This commit is contained in:
17
backend/models/Course.js
Normal file
17
backend/models/Course.js
Normal file
@@ -0,0 +1,17 @@
|
||||
const db = require('../config/database');
|
||||
|
||||
class Course {
|
||||
static async findByTeacherId(teacherId) {
|
||||
return await db.query(
|
||||
'SELECT * FROM courses WHERE teacher_id = ? ORDER BY course_code',
|
||||
[teacherId]
|
||||
);
|
||||
}
|
||||
|
||||
static async findById(id) {
|
||||
const rows = await db.query('SELECT * FROM courses WHERE id = ?', [id]);
|
||||
return rows[0];
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = Course;
|
||||
55
backend/models/Score.js
Normal file
55
backend/models/Score.js
Normal file
@@ -0,0 +1,55 @@
|
||||
const db = require('../config/database');
|
||||
|
||||
class Score {
|
||||
static async findByStudentId(studentId) {
|
||||
const sql = `
|
||||
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.created_at DESC
|
||||
`;
|
||||
return await db.query(sql, [studentId]);
|
||||
}
|
||||
|
||||
static async findDetailsById(scoreId, studentId) {
|
||||
const sql = `
|
||||
SELECT s.*, c.course_code, c.course_name, c.credit, c.semester,
|
||||
u.name as teacher_name, u.email as teacher_email,
|
||||
st.id as student_number, st.class as class_name
|
||||
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.id = ?
|
||||
`;
|
||||
const rows = await db.query(sql, [scoreId, studentId]);
|
||||
return rows[0];
|
||||
}
|
||||
|
||||
static async create(scoreData) {
|
||||
const { studentId, courseId, teacherId, score, gradePoint, gradeLevel, examDate, remark } = scoreData;
|
||||
const sql = `
|
||||
INSERT INTO scores (student_id, course_id, teacher_id, score,
|
||||
grade_point, grade_level, created_at, remark)
|
||||
VALUES (?, ?, ?, ?, ?, ?, NOW(), ?)
|
||||
`;
|
||||
// 注意:这里用 created_at 替代了 examDate,如果数据库有 examDate 列可以改回去
|
||||
const result = await db.pool.execute(sql, [
|
||||
studentId, courseId, teacherId, score, gradePoint, gradeLevel, remark
|
||||
]);
|
||||
return result[0].insertId;
|
||||
}
|
||||
|
||||
static async findByStudentAndCourse(studentId, courseId) {
|
||||
const rows = await db.query(
|
||||
'SELECT * FROM scores WHERE student_id = ? AND course_id = ?',
|
||||
[studentId, courseId]
|
||||
);
|
||||
return rows[0];
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = Score;
|
||||
23
backend/models/Student.js
Normal file
23
backend/models/Student.js
Normal file
@@ -0,0 +1,23 @@
|
||||
const db = require('../config/database');
|
||||
|
||||
class Student {
|
||||
static async findByUserId(userId) {
|
||||
const students = await db.query('SELECT * FROM students WHERE user_id = ?', [userId]);
|
||||
return students[0];
|
||||
}
|
||||
|
||||
static async findById(studentId) {
|
||||
const students = await db.query('SELECT * FROM students WHERE student_id = ?', [studentId]);
|
||||
return students[0];
|
||||
}
|
||||
|
||||
static async create(studentData) {
|
||||
const { id, name, className, userId } = studentData;
|
||||
await db.query(
|
||||
'INSERT INTO students (id, name, class, user_id) VALUES (?, ?, ?, ?)',
|
||||
[id, name, className, userId]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = Student;
|
||||
33
backend/models/User.js
Normal file
33
backend/models/User.js
Normal file
@@ -0,0 +1,33 @@
|
||||
const db = require('../config/database');
|
||||
const bcrypt = require('bcryptjs');
|
||||
|
||||
class User {
|
||||
static async findById(id) {
|
||||
const users = await db.query('SELECT * FROM users WHERE id = ?', [id]);
|
||||
return users[0];
|
||||
}
|
||||
|
||||
static async findByIdAndRole(id, role) {
|
||||
const users = await db.query('SELECT * FROM users WHERE id = ? AND role = ?', [id, role]);
|
||||
return users[0];
|
||||
}
|
||||
|
||||
static async create(userData) {
|
||||
const { id, name, password, role, className } = userData;
|
||||
const salt = await bcrypt.genSalt(10);
|
||||
const hashedPassword = await bcrypt.hash(password, salt);
|
||||
|
||||
await db.query(
|
||||
'INSERT INTO users (id, name, password, role, class) VALUES (?, ?, ?, ?, ?)',
|
||||
[id, name, hashedPassword, role, className || null]
|
||||
);
|
||||
|
||||
return { id, name, role, class: className };
|
||||
}
|
||||
|
||||
static async verifyPassword(plainPassword, hashedPassword) {
|
||||
return await bcrypt.compare(plainPassword, hashedPassword);
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = User;
|
||||
Reference in New Issue
Block a user