Files
SharedClassManager/backend-go/internal/handler/parent_handler.go
canglan 4a82eff3c6 feat: 多班级版班级管理系统 v2.0
技术栈: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
2026-06-23 04:41:49 +08:00

116 lines
3.2 KiB
Go

// ===========================================
// 多班级版班级管理系统 - Go 后端
//
// 开发者: Canglan
// 联系方式: admin@sea-studio.top
// 版权归属: Sea Network Technology Studio
// 许可证: Apache License 2.0
//
// 版权所有 © Sea Network Technology Studio
// ===========================================
package handler
import (
"github.com/gin-gonic/gin"
"hz-gitea.sea-studio.top/canglan/SharedClassManager/internal/middleware"
"hz-gitea.sea-studio.top/canglan/SharedClassManager/internal/schema"
"hz-gitea.sea-studio.top/canglan/SharedClassManager/internal/service"
"hz-gitea.sea-studio.top/canglan/SharedClassManager/pkg/response"
)
// ParentHandler 家长端处理器
type ParentHandler struct {
parentService *service.ParentService
authService *service.AuthService
classService *service.ClassService
}
// NewParentHandler 创建家长端处理器
func NewParentHandler(
parentService *service.ParentService,
authService *service.AuthService,
classService *service.ClassService,
) *ParentHandler {
return &ParentHandler{
parentService: parentService,
authService: authService,
classService: classService,
}
}
// Dashboard 子女操行分(家长仪表盘)
func (h *ParentHandler) Dashboard(c *gin.Context) {
userID := middleware.GetUserID(c)
result, err := h.parentService.GetChildConduct(userID)
if err != nil {
response.InternalError(c, err.Error())
return
}
response.Success(c, result, "操作成功")
}
// History 子女历史记录
func (h *ParentHandler) History(c *gin.Context) {
var query schema.ParentHistoryQuery
if err := c.ShouldBindQuery(&query); err != nil {
response.BadRequest(c, "参数错误")
return
}
userID := middleware.GetUserID(c)
result, err := h.parentService.GetChildHistory(userID, query.Page, query.PageSize)
if err != nil {
response.InternalError(c, err.Error())
return
}
response.Success(c, result, "操作成功")
}
// Attendance 子女考勤
func (h *ParentHandler) Attendance(c *gin.Context) {
userID := middleware.GetUserID(c)
result, err := h.parentService.GetChildAttendance(userID)
if err != nil {
response.InternalError(c, err.Error())
return
}
response.Success(c, result, "操作成功")
}
// Ranking 子女排名
func (h *ParentHandler) Ranking(c *gin.Context) {
userID := middleware.GetUserID(c)
result, err := h.parentService.GetChildRanking(userID)
if err != nil {
response.InternalError(c, err.Error())
return
}
response.Success(c, result, "操作成功")
}
// ChangePassword 家长修改密码(受功能开关控制)
func (h *ParentHandler) ChangePassword(c *gin.Context) {
classID := middleware.GetClassID(c)
// 检查功能开关
if !h.classService.IsFeatureEnabled(classID, "parent_password_change_enabled") {
response.Forbidden(c, "该功能暂未开放")
return
}
var req schema.ChangePasswordRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.BadRequest(c, "参数错误")
return
}
userID := middleware.GetUserID(c)
if err := h.authService.ChangePassword(userID, req.OldPassword, req.NewPassword, false); err != nil {
response.BadRequest(c, err.Error())
return
}
response.SuccessWithMessage(c, "密码修改成功")
}