feat: 实现教师资料更新、操作日志和系统设置功能

新增教师资料更新功能,包括个人信息修改和密码更新
添加操作日志记录系统,记录用户关键操作
实现系统设置模块,支持动态配置系统参数
重构数据库模型,新增教师表和系统设置表
优化成绩录入逻辑,支持平时分、期中和期末成绩计算
添加数据导出功能,支持学生、教师和成绩数据导出
完善管理员后台,增加统计图表和操作日志查看
This commit is contained in:
祀梦
2025-12-22 23:30:01 +08:00
parent 16802c85e5
commit b1da021185
43 changed files with 7860 additions and 2835 deletions

View File

@@ -41,7 +41,7 @@ class Score {
const sql = `
INSERT INTO grades (student_id, course_id, teacher_id, final_score, total_score,
grade_point, grade_level, created_at, remark)
VALUES (?, ?, ?, ?, ?, ?, ?, NOW(), ?)
VALUES (?, ?, ?, ?, ?, ?, ?, datetime('now', 'localtime'), ?)
`;
const result = await db.pool.execute(sql, [
studentId, courseId, teacherId, score, score, gradePoint, gradeLevel, remark
@@ -56,6 +56,78 @@ class Score {
);
return rows[0];
}
static async findByTeacher(teacherId, filters) {
let sql = `
SELECT g.*, s.name as student_name, c.course_name
FROM grades g
JOIN students s ON g.student_id = s.id
JOIN courses c ON g.course_id = c.id
WHERE c.teacher_id = ?
`;
const params = [teacherId];
if (filters.courseId) {
sql += ' AND g.course_id = ?';
params.push(filters.courseId);
}
if (filters.studentName) {
sql += ' AND (s.name LIKE ? OR s.id LIKE ?)';
params.push(`%${filters.studentName}%`, `%${filters.studentName}%`);
}
return await db.query(sql, params);
}
static async findCourseStudentsWithGrades(courseId, teacherId) {
const sql = `
SELECT s.id as student_id, s.name as student_name,
g.usual_score, g.midterm_score, g.final_score, g.total_score, g.grade_point, g.grade_level,
c.id as course_id, c.course_name
FROM students s
JOIN classes cl ON s.class = cl.class_name
JOIN courses c ON c.class_id = cl.id
LEFT JOIN grades g ON s.id = g.student_id AND g.course_id = c.id
WHERE c.id = ? AND c.teacher_id = ?
`;
return await db.query(sql, [courseId, teacherId]);
}
static async upsert(scoreData) {
const {
studentId, courseId, teacherId,
usual_score, midterm_score, final_score, score,
gradePoint, gradeLevel, remark
} = scoreData;
const existing = await this.findByStudentAndCourse(studentId, courseId);
// 处理参数:如果是 undefined 或空字符串,则设为 null
const sanitize = (val) => (val === undefined || val === '' || val === null) ? null : val;
const params = [
sanitize(usual_score),
sanitize(midterm_score),
sanitize(final_score),
sanitize(score),
sanitize(gradePoint),
sanitize(gradeLevel),
sanitize(remark)
];
if (existing) {
const sql = `UPDATE grades SET usual_score=?, midterm_score=?, final_score=?, total_score=?, grade_point=?, grade_level=?, remark=? WHERE id=?`;
await db.query(sql, [...params, existing.id]);
return existing.id;
} else {
const sql = `INSERT INTO grades (student_id, course_id, teacher_id, usual_score, midterm_score, final_score, total_score, grade_point, grade_level, created_at, remark) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, datetime('now', 'localtime'), ?)`;
const insertParams = [
studentId, courseId, teacherId,
...params
];
const result = await db.query(sql, insertParams);
return result.insertId;
}
}
}
module.exports = Score;