- 后端从 Python FastAPI 重写为 Go Gin(端口 56789) - 多班级完全隔离 - 超级管理员独立登录 - 课代表作业管理、排行榜分项排行 - 角色加减分上下限可配置 - 家长改密功能(可开关) - 周度/月度重置功能 - MySQL 5.7 兼容 - 43轮代码审查+全部修复 - Apache 2.0 许可证
81 lines
2.1 KiB
Go
81 lines
2.1 KiB
Go
// ===========================================
|
|
// 多班级版班级管理系统 - Go 后端
|
|
//
|
|
// 开发者: Canglan
|
|
// 联系方式: admin@sea-studio.top
|
|
// 版权归属: Sea Network Technology Studio
|
|
// 许可证: Apache License 2.0
|
|
//
|
|
// 版权所有 © Sea Network Technology Studio
|
|
// ===========================================
|
|
|
|
package service
|
|
|
|
import (
|
|
"hz-gitea.sea-studio.top/canglan/SharedClassManager/internal/repository"
|
|
)
|
|
|
|
// RankingService 排行榜服务
|
|
type RankingService struct {
|
|
studentRepo *repository.StudentRepo
|
|
conductRepo *repository.ConductRepo
|
|
}
|
|
|
|
// NewRankingService 创建排行榜服务
|
|
func NewRankingService(
|
|
studentRepo *repository.StudentRepo,
|
|
conductRepo *repository.ConductRepo,
|
|
) *RankingService {
|
|
return &RankingService{
|
|
studentRepo: studentRepo,
|
|
conductRepo: conductRepo,
|
|
}
|
|
}
|
|
|
|
// GetRankings 获取排行榜
|
|
func (s *RankingService) GetRankings(classID int, rankType string, limit int) (map[string]interface{}, error) {
|
|
switch rankType {
|
|
case "attendance", "homework", "conduct":
|
|
return s.getTypedRanking(classID, rankType, limit)
|
|
default:
|
|
// 默认按操行分总分排行
|
|
ranking, err := s.studentRepo.GetRanking(classID, limit)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
totalStudents, _ := s.studentRepo.GetTotalCount(classID)
|
|
return map[string]interface{}{
|
|
"ranking": ranking,
|
|
"total_students": totalStudents,
|
|
"type": "all",
|
|
}, nil
|
|
}
|
|
}
|
|
|
|
// getTypedRanking 获取分项排行榜(使用 SQL 层聚合,避免全量加载)
|
|
func (s *RankingService) getTypedRanking(classID int, relatedType string, limit int) (map[string]interface{}, error) {
|
|
dbType := relatedType
|
|
if relatedType == "conduct" {
|
|
dbType = "manual"
|
|
}
|
|
results, err := s.conductRepo.GetStudentPointsByType(classID, dbType, limit)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var rankings []map[string]interface{}
|
|
for _, r := range results {
|
|
rankings = append(rankings, map[string]interface{}{
|
|
"student_id": r.StudentID,
|
|
"student_no": r.StudentNo,
|
|
"name": r.Name,
|
|
"points": r.TotalPoints,
|
|
})
|
|
}
|
|
|
|
return map[string]interface{}{
|
|
"ranking": rankings,
|
|
"type": relatedType,
|
|
}, nil
|
|
}
|