技术栈: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
93 lines
2.7 KiB
Go
93 lines
2.7 KiB
Go
// ===========================================
|
||
// 多班级版班级管理系统 - Go 后端
|
||
//
|
||
// 开发者: Canglan
|
||
// 联系方式: admin@sea-studio.top
|
||
// 版权归属: Sea Network Technology Studio
|
||
// 许可证: Apache License 2.0
|
||
//
|
||
// 版权所有 © Sea Network Technology Studio
|
||
// ===========================================
|
||
|
||
package service
|
||
|
||
import (
|
||
"fmt"
|
||
|
||
"hz-gitea.sea-studio.top/canglan/SharedClassManager/internal/model"
|
||
"hz-gitea.sea-studio.top/canglan/SharedClassManager/internal/repository"
|
||
"hz-gitea.sea-studio.top/canglan/SharedClassManager/pkg/logger"
|
||
)
|
||
|
||
// SubjectService 科目服务
|
||
type SubjectService struct {
|
||
subjectRepo *repository.SubjectRepo
|
||
}
|
||
|
||
// NewSubjectService 创建科目服务
|
||
func NewSubjectService(subjectRepo *repository.SubjectRepo) *SubjectService {
|
||
return &SubjectService{subjectRepo: subjectRepo}
|
||
}
|
||
|
||
// GetSubjects 获取科目列表
|
||
func (s *SubjectService) GetSubjects(isActive *bool) (map[string]interface{}, error) {
|
||
subjects, err := s.subjectRepo.GetAll(isActive)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
return map[string]interface{}{
|
||
"subjects": subjects,
|
||
"total": len(subjects),
|
||
}, nil
|
||
}
|
||
|
||
// CreateSubject 创建科目
|
||
func (s *SubjectService) CreateSubject(subjectName string, subjectCode *string, sortOrder int) (map[string]interface{}, error) {
|
||
existing, _ := s.subjectRepo.GetByName(subjectName)
|
||
if existing != nil {
|
||
return map[string]interface{}{"success": false, "message": "科目名称已存在"}, nil
|
||
}
|
||
|
||
subject := &model.Subject{
|
||
SubjectName: subjectName,
|
||
SubjectCode: subjectCode,
|
||
SortOrder: sortOrder,
|
||
IsActive: 1,
|
||
}
|
||
|
||
subjectID, err := s.subjectRepo.Create(subject)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
logger.Sugared.Infof("创建科目: %s", subjectName)
|
||
return map[string]interface{}{
|
||
"success": true,
|
||
"subject_id": subjectID,
|
||
}, nil
|
||
}
|
||
|
||
// UpdateSubject 更新科目
|
||
func (s *SubjectService) UpdateSubject(subjectID int, updates map[string]interface{}) error {
|
||
return s.subjectRepo.Update(subjectID, updates)
|
||
}
|
||
|
||
// DisableSubject 禁用科目(将 is_active 设为 0,保留数据)
|
||
func (s *SubjectService) DisableSubject(subjectID int) error {
|
||
return s.subjectRepo.Update(subjectID, map[string]interface{}{"is_active": 0})
|
||
}
|
||
|
||
// EnableSubject 启用科目(将 is_active 设为 1)
|
||
func (s *SubjectService) EnableSubject(subjectID int) error {
|
||
return s.subjectRepo.Update(subjectID, map[string]interface{}{"is_active": 1})
|
||
}
|
||
|
||
// DeleteSubject 物理删除科目(需先检查关联数据)
|
||
func (s *SubjectService) DeleteSubject(subjectID int) error {
|
||
hasData, _ := s.subjectRepo.HasRelatedData(subjectID)
|
||
if hasData {
|
||
return fmt.Errorf("该科目下已有作业数据,无法删除")
|
||
}
|
||
return s.subjectRepo.Delete(subjectID)
|
||
}
|