新增教师资料更新功能,包括个人信息修改和密码更新 添加操作日志记录系统,记录用户关键操作 实现系统设置模块,支持动态配置系统参数 重构数据库模型,新增教师表和系统设置表 优化成绩录入逻辑,支持平时分、期中和期末成绩计算 添加数据导出功能,支持学生、教师和成绩数据导出 完善管理员后台,增加统计图表和操作日志查看
94 lines
3.4 KiB
JavaScript
94 lines
3.4 KiB
JavaScript
const Course = require('../models/Course');
|
|
const Score = require('../models/Score');
|
|
const Student = require('../models/Student');
|
|
|
|
class TeacherService {
|
|
static async getCourses(teacherId) {
|
|
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) {
|
|
let { studentId, courseId, score, usual_score, midterm_score, final_score } = scoreData;
|
|
|
|
// 验证学生
|
|
const student = await Student.findById(studentId);
|
|
if (!student) {
|
|
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);
|
|
}
|
|
|
|
// 计算绩点和等级
|
|
const numericScore = parseFloat(score);
|
|
let gradePoint = 0;
|
|
let gradeLevel = 'F';
|
|
|
|
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,
|
|
usual_score,
|
|
midterm_score,
|
|
final_score
|
|
};
|
|
|
|
const gradeId = await Score.upsert(fullScoreData);
|
|
return gradeId;
|
|
}
|
|
}
|
|
|
|
module.exports = TeacherService; |