Files
SharedClassManager/backend-go/internal/repository/assignment_repo.go
canglan 4a82eff3c6 feat: 多班级版班级管理系统 v2.0
技术栈:Go (Gin + GORM) + PHP + MySQL 5.7 + Redis

主要功能:
- 多班级完全隔离(class_id 贯穿全系统)
- 后端 Go Gin(端口 56789),Nginx 反代
- 超级管理员独立登录(env 配置,默认账密 admin/Admin123)
- bcrypt 密码加密(无 PASSWORD_SALT)
- 科任老师/课代表新角色
- 课代表作业管理页面
- 排行榜分项排行(操行分/考勤/作业)
- 角色加减分上下限由班主任配置
- 家长改密功能(可开关)
- 班级角色按需开关
- 宿舍号格式:南0-000
- 周度/月度重置功能
- MySQL 5.7 兼容
- 43 轮代码审查 + 全部修复

开发者: Canglan
版权归属: Sea Network Technology Studio
许可证: Apache License 2.0
2026-06-23 04:41:49 +08:00

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
}