// =========================================== // 多班级版班级管理系统 - Go 后端 // // 开发者: Canglan // 联系方式: admin@sea-studio.top // 版权归属: Sea Network Technology Studio // 许可证: Apache License 2.0 // // 版权所有 © Sea Network Technology Studio // =========================================== package repository import ( "gorm.io/gorm" "hz-gitea.sea-studio.top/canglan/SharedClassManager/internal/model" ) // LogRepo 日志数据访问层 type LogRepo struct { db *gorm.DB } // NewLogRepo 创建日志 Repository func NewLogRepo(db *gorm.DB) *LogRepo { return &LogRepo{db: db} } // ========== 操作日志 ========== // CreateOperationLog 写入操作日志 func (r *LogRepo) CreateOperationLog(log *model.OperationLog) (int64, error) { if err := r.db.Create(log).Error; err != nil { return 0, err } return log.LogID, nil } // GetOperationLogs 查询操作日志(支持按操作者和班级过滤) func (r *LogRepo) GetOperationLogs(operatorID int, classID int, operationType string, page, pageSize int) ([]model.OperationLog, int64, error) { var logs []model.OperationLog var total int64 query := r.db.Model(&model.OperationLog{}).Where("1 = 1") if operatorID > 0 { query = query.Where("operator_id = ?", operatorID) } if classID > 0 { query = query.Where("class_id = ?", classID) } if operationType != "" { query = query.Where("operation_type = ?", operationType) } if err := query.Count(&total).Error; err != nil { return nil, 0, err } offset := (page - 1) * pageSize if err := query.Order("created_at DESC"). Limit(pageSize). Offset(offset). Find(&logs).Error; err != nil { return nil, 0, err } return logs, total, nil } // ========== 登录日志 ========== // CreateLoginLog 写入登录日志 func (r *LogRepo) CreateLoginLog(log *model.LoginLog) (int64, error) { if err := r.db.Create(log).Error; err != nil { return 0, err } return log.LogID, nil } // GetRecentLoginFailCount 获取最近 5 分钟内的登录失败次数 func (r *LogRepo) GetRecentLoginFailCount(username string) (int64, error) { var count int64 if err := r.db.Model(&model.LoginLog{}). Where("username = ? AND login_result = 0 AND created_at > DATE_SUB(NOW(), INTERVAL 5 MINUTE)", username). Count(&count).Error; err != nil { return 0, err } return count, nil }