feat: 实现成绩管理系统核心功能
添加响应工具、错误处理中间件和数据库模型 创建用户、学生、课程和成绩相关服务 实现管理员、教师和学生控制器的基本功能 重构路由处理并优化数据库查询
This commit is contained in:
53
backend/controllers/adminController.js
Normal file
53
backend/controllers/adminController.js
Normal file
@@ -0,0 +1,53 @@
|
||||
const AdminService = require('../services/adminService');
|
||||
const { success, error } = require('../utils/response');
|
||||
|
||||
class AdminController {
|
||||
static async getUsers(req, res) {
|
||||
try {
|
||||
const result = await AdminService.getUsers(req.query);
|
||||
success(res, result.data, '获取成功');
|
||||
// 注意:原来的响应结构是 { success, data, pagination }
|
||||
// 现在的 success 工具函数结构是 { success, message, data }
|
||||
// 我们可以稍微调整 success 调用,或者让前端适应
|
||||
// 为了兼容性,这里手动返回
|
||||
/*
|
||||
res.json({
|
||||
success: true,
|
||||
data: result.data,
|
||||
pagination: result.pagination
|
||||
});
|
||||
*/
|
||||
// 或者修改 response.js 支持 extra 字段,这里简单处理:
|
||||
res.json({
|
||||
success: true,
|
||||
data: result.data,
|
||||
pagination: result.pagination
|
||||
});
|
||||
|
||||
} catch (err) {
|
||||
console.error('Get Users Error:', err);
|
||||
error(res, '服务器错误');
|
||||
}
|
||||
}
|
||||
|
||||
static async createUser(req, res) {
|
||||
try {
|
||||
const { id, name, password, role } = req.body;
|
||||
|
||||
if (!id || !name || !password || !role) {
|
||||
return error(res, '请填写所有必填字段', 400);
|
||||
}
|
||||
|
||||
await AdminService.createUser(req.body);
|
||||
success(res, null, '创建用户成功');
|
||||
} catch (err) {
|
||||
if (err.message === '用户ID已存在') {
|
||||
return error(res, err.message, 400);
|
||||
}
|
||||
console.error('Create User Error:', err);
|
||||
error(res, '服务器错误');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = AdminController;
|
||||
70
backend/controllers/authController.js
Normal file
70
backend/controllers/authController.js
Normal file
@@ -0,0 +1,70 @@
|
||||
const AuthService = require('../services/authService');
|
||||
const { success, error } = require('../utils/response');
|
||||
|
||||
class AuthController {
|
||||
static async login(req, res) {
|
||||
try {
|
||||
const { id, password, role } = req.body;
|
||||
if (!id || !password || !role) {
|
||||
return error(res, '请输入完整的登录信息', 400);
|
||||
}
|
||||
|
||||
const user = await AuthService.login(id, password, role);
|
||||
|
||||
// 设置 Session
|
||||
req.session.user = user;
|
||||
|
||||
success(res, user, '登录成功');
|
||||
} catch (err) {
|
||||
if (err.message === '用户名或密码错误') {
|
||||
return error(res, err.message, 401);
|
||||
}
|
||||
console.error('Login Error:', err);
|
||||
error(res, '服务器错误');
|
||||
}
|
||||
}
|
||||
|
||||
static async register(req, res) {
|
||||
try {
|
||||
const { id, name, password, role, class: userClass } = req.body;
|
||||
|
||||
if (!id || !name || !password || !role) {
|
||||
return error(res, '请填写所有必填字段', 400);
|
||||
}
|
||||
|
||||
if ((role === 'student' || role === 'teacher') && !userClass) {
|
||||
return error(res, '学生和教师需要填写班级', 400);
|
||||
}
|
||||
|
||||
await AuthService.register(req.body);
|
||||
success(res, null, '注册成功');
|
||||
} catch (err) {
|
||||
if (err.message === '用户ID已存在') {
|
||||
return error(res, err.message, 400);
|
||||
}
|
||||
console.error('Register Error:', err);
|
||||
error(res, '服务器错误');
|
||||
}
|
||||
}
|
||||
|
||||
static async logout(req, res) {
|
||||
req.session.destroy((err) => {
|
||||
if (err) {
|
||||
return error(res, '注销失败');
|
||||
}
|
||||
res.clearCookie('session_cookie');
|
||||
success(res, null, '注销成功');
|
||||
});
|
||||
}
|
||||
|
||||
static async getCurrentUser(req, res) {
|
||||
if (req.session.user) {
|
||||
success(res, { user: req.session.user });
|
||||
} else {
|
||||
// 不返回 401,只返回 success: false,方便前端判断
|
||||
res.json({ success: false, message: '未登录' });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = AuthController;
|
||||
35
backend/controllers/studentController.js
Normal file
35
backend/controllers/studentController.js
Normal file
@@ -0,0 +1,35 @@
|
||||
const StudentService = require('../services/studentService');
|
||||
const { success, error } = require('../utils/response');
|
||||
|
||||
class StudentController {
|
||||
static async getGrades(req, res) {
|
||||
try {
|
||||
const userId = req.session.user.id;
|
||||
const data = await StudentService.getStudentGrades(userId);
|
||||
success(res, data);
|
||||
} catch (err) {
|
||||
if (err.message === '学生信息不存在') {
|
||||
return error(res, err.message, 404);
|
||||
}
|
||||
console.error('Get Grades Error:', err);
|
||||
error(res, '服务器错误');
|
||||
}
|
||||
}
|
||||
|
||||
static async getGradeDetails(req, res) {
|
||||
try {
|
||||
const scoreId = req.params.id;
|
||||
const userId = req.session.user.id;
|
||||
const grade = await StudentService.getGradeDetails(scoreId, userId);
|
||||
success(res, { grade });
|
||||
} catch (err) {
|
||||
if (err.message === '成绩不存在') {
|
||||
return error(res, err.message, 404);
|
||||
}
|
||||
console.error('Get Grade Details Error:', err);
|
||||
error(res, '服务器错误');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = StudentController;
|
||||
42
backend/controllers/teacherController.js
Normal file
42
backend/controllers/teacherController.js
Normal file
@@ -0,0 +1,42 @@
|
||||
const TeacherService = require('../services/teacherService');
|
||||
const { success, error } = require('../utils/response');
|
||||
|
||||
class TeacherController {
|
||||
static async getCourses(req, res) {
|
||||
try {
|
||||
const teacherId = req.session.user.id; // 注意:这里假设 user.id 就是 teacher_id,需要根据 users 表设计确认
|
||||
// 在之前的 SQL 中,courses.teacher_id 是 INT,而 users.id 是 VARCHAR。
|
||||
// 这里可能存在类型不匹配的问题。
|
||||
// 假设 users 表中 id 既是学号/工号,也是关联键。
|
||||
// 实际上,之前的 teacher.js 中是直接用 req.session.user.id 查询。
|
||||
|
||||
const courses = await TeacherService.getCourses(teacherId);
|
||||
success(res, { courses });
|
||||
} catch (err) {
|
||||
console.error('Get Courses Error:', err);
|
||||
error(res, '服务器错误');
|
||||
}
|
||||
}
|
||||
|
||||
static async addScore(req, res) {
|
||||
try {
|
||||
const teacherId = req.session.user.id;
|
||||
const { studentId, courseId, score } = req.body;
|
||||
|
||||
if (!studentId || !courseId || score === undefined) {
|
||||
return error(res, '请填写必填字段', 400);
|
||||
}
|
||||
|
||||
const gradeId = await TeacherService.addScore(teacherId, req.body);
|
||||
success(res, { gradeId }, '成绩录入成功');
|
||||
} catch (err) {
|
||||
if (err.message === '学生不存在' || err.message === '该学生此课程成绩已存在') {
|
||||
return error(res, err.message, 400);
|
||||
}
|
||||
console.error('Add Score Error:', err);
|
||||
error(res, '服务器错误');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = TeacherController;
|
||||
Reference in New Issue
Block a user