- 后端从 Python FastAPI 重写为 Go Gin(端口 56789) - 多班级完全隔离 - 超级管理员独立登录 - 课代表作业管理、排行榜分项排行 - 角色加减分上下限可配置 - 家长改密功能(可开关) - 周度/月度重置功能 - MySQL 5.7 兼容 - 43轮代码审查+全部修复 - Apache 2.0 许可证
169 lines
5.0 KiB
Go
169 lines
5.0 KiB
Go
// ===========================================
|
|
// 多班级版班级管理系统 - Go 后端
|
|
//
|
|
// 开发者: Canglan
|
|
// 联系方式: admin@sea-studio.top
|
|
// 版权归属: Sea Network Technology Studio
|
|
// 许可证: Apache License 2.0
|
|
//
|
|
// 版权所有 © Sea Network Technology Studio
|
|
// ===========================================
|
|
|
|
package repository
|
|
|
|
import (
|
|
"time"
|
|
|
|
"gorm.io/gorm"
|
|
|
|
"hz-gitea.sea-studio.top/canglan/SharedClassManager/internal/model"
|
|
)
|
|
|
|
// AssignmentRepo 作业数据访问层
|
|
type AssignmentRepo struct {
|
|
db *gorm.DB
|
|
}
|
|
|
|
// NewAssignmentRepo 创建作业 Repository
|
|
func NewAssignmentRepo(db *gorm.DB) *AssignmentRepo {
|
|
return &AssignmentRepo{db: db}
|
|
}
|
|
|
|
// ========== Assignment 操作 ==========
|
|
|
|
// CreateAssignment 创建作业
|
|
func (r *AssignmentRepo) CreateAssignment(assignment *model.Assignment) (int, error) {
|
|
if err := r.db.Create(assignment).Error; err != nil {
|
|
return 0, err
|
|
}
|
|
return assignment.AssignmentID, nil
|
|
}
|
|
|
|
// GetAssignmentByID 根据ID获取作业
|
|
func (r *AssignmentRepo) GetAssignmentByID(assignmentID int) (*model.Assignment, error) {
|
|
var assignment model.Assignment
|
|
if err := r.db.Where("assignment_id = ?", assignmentID).First(&assignment).Error; err != nil {
|
|
return nil, err
|
|
}
|
|
return &assignment, nil
|
|
}
|
|
|
|
// GetAssignmentsByClass 获取班级作业列表
|
|
func (r *AssignmentRepo) GetAssignmentsByClass(classID int, subjectID int, page, pageSize int) ([]model.Assignment, int64, error) {
|
|
var assignments []model.Assignment
|
|
var total int64
|
|
|
|
query := r.db.Model(&model.Assignment{}).Where("class_id = ?", classID)
|
|
if subjectID > 0 {
|
|
query = query.Where("subject_id = ?", subjectID)
|
|
}
|
|
|
|
if err := query.Count(&total).Error; err != nil {
|
|
return nil, 0, err
|
|
}
|
|
|
|
offset := (page - 1) * pageSize
|
|
if err := query.Order("created_at DESC").
|
|
Limit(pageSize).
|
|
Offset(offset).
|
|
Find(&assignments).Error; err != nil {
|
|
return nil, 0, err
|
|
}
|
|
|
|
return assignments, total, nil
|
|
}
|
|
|
|
// GetAssignmentsBySubject 获取科目关联的作业列表
|
|
func (r *AssignmentRepo) GetAssignmentsBySubject(subjectID int) ([]model.Assignment, error) {
|
|
var assignments []model.Assignment
|
|
if err := r.db.Where("subject_id = ?", subjectID).
|
|
Order("created_at DESC").
|
|
Find(&assignments).Error; err != nil {
|
|
return nil, err
|
|
}
|
|
return assignments, nil
|
|
}
|
|
|
|
// DeleteAssignment 删除作业
|
|
func (r *AssignmentRepo) DeleteAssignment(assignmentID int) error {
|
|
return r.db.Where("assignment_id = ?", assignmentID).Delete(&model.Assignment{}).Error
|
|
}
|
|
|
|
// GetHomeworkStatsByDateRange 通过作业截止日期范围查询学生作业提交统计
|
|
func (r *AssignmentRepo) GetHomeworkStatsByDateRange(startDate, endDate time.Time) ([]struct {
|
|
StudentID int
|
|
Status string
|
|
Count int64
|
|
}, error) {
|
|
var stats []struct {
|
|
StudentID int
|
|
Status string
|
|
Count int64
|
|
}
|
|
err := r.db.Table("homework_submissions hs").
|
|
Select("hs.student_id, hs.status, COUNT(*) as count").
|
|
Joins("JOIN assignments a ON hs.assignment_id = a.assignment_id").
|
|
Where("a.deadline BETWEEN ? AND ?", startDate, endDate).
|
|
Group("hs.student_id, hs.status").
|
|
Find(&stats).Error
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return stats, nil
|
|
}
|
|
|
|
// ========== AssignmentSubmission 操作 ==========
|
|
|
|
// CreateSubmission 创建作业提交记录
|
|
func (r *AssignmentRepo) CreateSubmission(submission *model.AssignmentSubmission) (int, error) {
|
|
if err := r.db.Create(submission).Error; err != nil {
|
|
return 0, err
|
|
}
|
|
return submission.SubmissionID, nil
|
|
}
|
|
|
|
// GetSubmissionByAssignmentAndStudent 获取指定作业和学生的提交记录
|
|
func (r *AssignmentRepo) GetSubmissionByAssignmentAndStudent(assignmentID, studentID int) (*model.AssignmentSubmission, error) {
|
|
var submission model.AssignmentSubmission
|
|
if err := r.db.Where("assignment_id = ? AND student_id = ?", assignmentID, studentID).
|
|
First(&submission).Error; err != nil {
|
|
return nil, err
|
|
}
|
|
return &submission, nil
|
|
}
|
|
|
|
// GetSubmissionsByAssignment 获取作业的所有提交记录
|
|
func (r *AssignmentRepo) GetSubmissionsByAssignment(assignmentID int) ([]model.AssignmentSubmission, error) {
|
|
var submissions []model.AssignmentSubmission
|
|
if err := r.db.Where("assignment_id = ?", assignmentID).
|
|
Find(&submissions).Error; err != nil {
|
|
return nil, err
|
|
}
|
|
return submissions, nil
|
|
}
|
|
|
|
// GetSubmissionsByStudent 获取学生的所有提交记录
|
|
func (r *AssignmentRepo) GetSubmissionsByStudent(studentID int) ([]model.AssignmentSubmission, error) {
|
|
var submissions []model.AssignmentSubmission
|
|
if err := r.db.Where("student_id = ?", studentID).
|
|
Find(&submissions).Error; err != nil {
|
|
return nil, err
|
|
}
|
|
return submissions, nil
|
|
}
|
|
|
|
// UpdateSubmission 更新提交记录
|
|
func (r *AssignmentRepo) UpdateSubmission(submissionID int, updates map[string]interface{}) error {
|
|
return r.db.Model(&model.AssignmentSubmission{}).
|
|
Where("submission_id = ?", submissionID).
|
|
Updates(updates).Error
|
|
}
|
|
|
|
// BatchCreateSubmissions 批量创建提交记录
|
|
func (r *AssignmentRepo) BatchCreateSubmissions(submissions []model.AssignmentSubmission) error {
|
|
if len(submissions) == 0 {
|
|
return nil
|
|
}
|
|
return r.db.Create(&submissions).Error
|
|
}
|