This commit is contained in:
2026-09-03 17:55:42 +08:00
parent 7c38e84e30
commit c80a3d4a2d
35 changed files with 6795 additions and 597 deletions
+35 -12
View File
@@ -226,20 +226,28 @@ func (s *AdminService) DetailedStats() (*DetailedStats, error) {
{Name: "被打回", Count: core.RejectedClasses},
}
// 学校类型分布
type schoolTypeRow struct {
SchoolType string `gorm:"column:school_type"`
Cnt int64 `gorm:"column:cnt"`
// 学校类型分布(一所学校可涵盖多个学段,按学段分别计数)
typeMap := map[model.SchoolType]string{
model.SchoolUniversity: "大学",
model.SchoolVocational: "职业学校",
model.SchoolSeniorHigh: "高中",
model.SchoolJuniorHigh: "初中",
model.SchoolPrimary: "小学",
model.SchoolKindergarten: "幼儿园",
model.SchoolOther: "其他",
}
var stRows []schoolTypeRow
s.db.Model(&model.School{}).Select("school_type, COUNT(*) as cnt").Group("school_type").Scan(&stRows)
typeMap := map[string]string{"university": "大学", "vocational": "职业学校", "senior_high": "高中", "junior_high": "初中", "primary": "小学", "kindergarten": "幼儿园", "other": "其他"}
for _, r := range stRows {
name := typeMap[r.SchoolType]
if name == "" {
name = r.SchoolType
orderedTypes := []model.SchoolType{
model.SchoolUniversity, model.SchoolVocational, model.SchoolSeniorHigh,
model.SchoolJuniorHigh, model.SchoolPrimary, model.SchoolKindergarten, model.SchoolOther,
}
for _, t := range orderedTypes {
var cnt int64
s.db.Model(&model.School{}).
Where("FIND_IN_SET(?, school_types) > 0 OR ((school_types IS NULL OR school_types = '') AND school_type = ?)", t, t).
Count(&cnt)
if cnt > 0 {
ds.SchoolTypes = append(ds.SchoolTypes, NameCountItem{Name: typeMap[t], Count: cnt})
}
ds.SchoolTypes = append(ds.SchoolTypes, NameCountItem{Name: name, Count: r.Cnt})
}
// 地区TOP10(按省级行政区统计班级数)
@@ -347,6 +355,21 @@ func (s *AdminService) UnbanUser(userID uint) error {
return s.db.Save(&user).Error
}
// ListUsers 获取用户列表(支持状态与关键词检索)
func (s *AdminService) ListUsers(status, keyword string) ([]model.User, error) {
var list []model.User
query := s.db.Model(&model.User{})
if status != "" && status != "all" {
query = query.Where("status = ?", status)
}
if keyword != "" {
k := "%" + keyword + "%"
query = query.Where("username LIKE ? OR real_name LIKE ? OR nickname LIKE ? OR email LIKE ? OR phone LIKE ?", k, k, k, k, k)
}
err := query.Order("id desc").Find(&list).Error
return list, err
}
// ListBannedUsers 获取封禁用户列表
func (s *AdminService) ListBannedUsers() ([]model.User, error) {
var list []model.User