// =========================================== // 多班级版班级管理系统 - 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/model" "hz-gitea.sea-studio.top/canglan/SharedClassManager/internal/repository" "hz-gitea.sea-studio.top/canglan/SharedClassManager/pkg/logger" ) // LogService 日志服务 type LogService struct { logRepo *repository.LogRepo } // NewLogService 创建日志服务 func NewLogService(logRepo *repository.LogRepo) *LogService { return &LogService{logRepo: logRepo} } // WriteLoginLog 写入登录日志 func (s *LogService) WriteLoginLog(username string, loginResult int8, ip, userAgent, failReason string) { log := &model.LoginLog{ Username: username, LoginResult: loginResult, IPAddress: stringPtr(ip), UserAgent: stringPtr(userAgent), FailReason: stringPtr(failReason), } if _, err := s.logRepo.CreateLoginLog(log); err != nil { logger.Sugared.Errorf("写入登录日志失败: %v", err) } } // WriteOperationLog 写入操作日志 func (s *LogService) WriteOperationLog(operatorID int, operatorName, operatorRole, operationType string, targetType *string, targetID *int, details *string, ip *string, classID *int) { log := &model.OperationLog{ OperatorID: operatorID, OperatorName: stringPtr(operatorName), OperatorRole: stringPtr(operatorRole), OperationType: operationType, TargetType: targetType, TargetID: targetID, Details: details, IPAddress: ip, ClassID: classID, } if _, err := s.logRepo.CreateOperationLog(log); err != nil { logger.Sugared.Errorf("写入操作日志失败: %v", err) } } // stringPtr 辅助函数:字符串转指针(空字符串返回 nil) func stringPtr(s string) *string { if s == "" { return nil } return &s }