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

@@ -7,8 +7,39 @@ class TeacherService {
return await Course.findByTeacherId(teacherId);
}
static async getClasses() {
return await Course.getClasses();
}
static async getTeacherClasses(teacherId) {
const sql = `SELECT * FROM classes WHERE teacher_id = ?`;
const db = require('../config/database');
return await db.query(sql, [teacherId]);
}
static async createCourse(teacherId, courseData) {
return await Course.create({ ...courseData, teacher_id: teacherId });
}
static async updateCourse(teacherId, courseId, courseData) {
// Verify ownership
const course = await Course.findById(courseId);
if (!course || course.teacher_id != teacherId) {
throw new Error('无权修改该课程或课程不存在');
}
return await Course.update(courseId, courseData);
}
static async getGrades(teacherId, filters) {
if (filters.courseId) {
return await Score.findCourseStudentsWithGrades(filters.courseId, teacherId);
} else {
return await Score.findByTeacher(teacherId, filters);
}
}
static async addScore(teacherId, scoreData) {
const { studentId, courseId, score } = scoreData;
let { studentId, courseId, score, usual_score, midterm_score, final_score } = scoreData;
// 验证学生
const student = await Student.findById(studentId);
@@ -16,13 +47,12 @@ class TeacherService {
throw new Error('学生不存在');
}
// 验证课程(可选:验证是否是该教师的课程)
// const course = await Course.findById(courseId);
// 检查重复
const existingScore = await Score.findByStudentAndCourse(studentId, courseId);
if (existingScore) {
throw new Error('该学生此课程成绩已存在');
// 如果没有总分但有平时/期中/期末分,尝试计算总分 (30% + 30% + 40%)
if ((score === undefined || score === '') && (usual_score || midterm_score || final_score)) {
const u = parseFloat(usual_score) || 0;
const m = parseFloat(midterm_score) || 0;
const f = parseFloat(final_score) || 0;
score = (u * 0.3 + m * 0.3 + f * 0.4).toFixed(1);
}
// 计算绩点和等级
@@ -30,19 +60,33 @@ class TeacherService {
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'; }
if (!isNaN(numericScore)) {
if (numericScore >= 90) { gradePoint = 4.0; gradeLevel = 'A'; }
else if (numericScore >= 85) { gradePoint = 3.7; gradeLevel = 'A-'; }
else if (numericScore >= 82) { gradePoint = 3.3; gradeLevel = 'B+'; }
else if (numericScore >= 78) { gradePoint = 3.0; gradeLevel = 'B'; }
else if (numericScore >= 75) { gradePoint = 2.7; gradeLevel = 'B-'; }
else if (numericScore >= 72) { gradePoint = 2.3; gradeLevel = 'C+'; }
else if (numericScore >= 68) { gradePoint = 2.0; gradeLevel = 'C'; }
else if (numericScore >= 64) { gradePoint = 1.5; gradeLevel = 'C-'; }
else if (numericScore >= 60) { gradePoint = 1.0; gradeLevel = 'D'; }
} else {
gradePoint = null;
gradeLevel = null;
}
const fullScoreData = {
...scoreData,
score, // 更新后的总分
teacherId,
gradePoint,
gradeLevel
gradeLevel,
usual_score,
midterm_score,
final_score
};
const gradeId = await Score.create(fullScoreData);
const gradeId = await Score.upsert(fullScoreData);
return gradeId;
}
}