feat: 多班级版班级管理系统 v2.0
技术栈:Go (Gin + GORM) + PHP + MySQL 5.7 + Redis 主要功能: - 多班级完全隔离(class_id 贯穿全系统) - 后端从 Python FastAPI 重写为 Go Gin(端口 56789) - 超级管理员独立登录(env 配置路径,默认账密 admin/Admin123) - 科任老师/课代表新角色 - 课代表作业管理页面 - 排行榜分项排行(操行分/考勤/作业) - 角色加减分上下限由班主任配置 - 家长改密功能(可开关) - 班级角色按需开关 - 宿舍号格式:南0-000 - 周度/月度重置功能 - MySQL 5.7 兼容 - Nginx 反向代理部署 开发者: Canglan 版权归属: Sea Network Technology Studio 许可证: Apache License 2.0
This commit is contained in:
168
backend-go/internal/repository/assignment_repo.go
Normal file
168
backend-go/internal/repository/assignment_repo.go
Normal file
@@ -0,0 +1,168 @@
|
||||
// ===========================================
|
||||
// 多班级版班级管理系统 - 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
|
||||
}
|
||||
Reference in New Issue
Block a user