feat: 多班级版 v2.0 - Go后端重写 + 43轮代码审查
- 后端从 Python FastAPI 重写为 Go Gin(端口 56789) - 多班级完全隔离 - 超级管理员独立登录 - 课代表作业管理、排行榜分项排行 - 角色加减分上下限可配置 - 家长改密功能(可开关) - 周度/月度重置功能 - MySQL 5.7 兼容 - 43轮代码审查+全部修复 - Apache 2.0 许可证
This commit is contained in:
80
backend-go/internal/service/ranking_service.go
Normal file
80
backend-go/internal/service/ranking_service.go
Normal file
@@ -0,0 +1,80 @@
|
||||
// ===========================================
|
||||
// 多班级版班级管理系统 - 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
|
||||
}
|
||||
Reference in New Issue
Block a user