feat: 实现教师资料更新、操作日志和系统设置功能
新增教师资料更新功能,包括个人信息修改和密码更新 添加操作日志记录系统,记录用户关键操作 实现系统设置模块,支持动态配置系统参数 重构数据库模型,新增教师表和系统设置表 优化成绩录入逻辑,支持平时分、期中和期末成绩计算 添加数据导出功能,支持学生、教师和成绩数据导出 完善管理员后台,增加统计图表和操作日志查看
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user