package storage import ( "goalfymax-admin/internal/models" "gorm.io/gorm" "time" ) // AuditLogStorage 审计日志存储接口 type AuditLogStorage interface { Create(log *models.AuditLog) error GetByID(id uint) (*models.AuditLog, error) List(req *models.AuditLogListRequest) ([]models.AuditLog, int64, error) } type auditLogStorage struct { db *gorm.DB } // NewAuditLogStorage 创建审计日志存储实例 func NewAuditLogStorage() AuditLogStorage { return &auditLogStorage{db: DB} } // Create 创建审计日志 func (s *auditLogStorage) Create(log *models.AuditLog) error { // 如果操作时间为空,设置为当前时间 if log.OperationTime.IsZero() { log.OperationTime = time.Now() } return s.db.Create(log).Error } // GetByID 根据ID获取审计日志 func (s *auditLogStorage) GetByID(id uint) (*models.AuditLog, error) { var log models.AuditLog err := s.db.First(&log, id).Error if err != nil { return nil, err } return &log, nil } // List 查询审计日志列表 func (s *auditLogStorage) List(req *models.AuditLogListRequest) ([]models.AuditLog, int64, error) { var logs []models.AuditLog var total int64 query := s.db.Model(&models.AuditLog{}) // 操作类型筛选 if req.OperationType != "" { query = query.Where("operation_type = ?", req.OperationType) } // 操作人筛选 if req.OperatorEmail != "" { query = query.Where("operator_email = ?", req.OperatorEmail) } // 操作对象搜索(模糊匹配) if req.TargetEmail != "" { query = query.Where("target_email LIKE ?", "%"+req.TargetEmail+"%") } // 时间范围筛选 if req.StartTime != "" { startTime, err := time.Parse("2006-01-02 15:04:05", req.StartTime) if err == nil { query = query.Where("operation_time >= ?", startTime) } } if req.EndTime != "" { endTime, err := time.Parse("2006-01-02 15:04:05", req.EndTime) if err == nil { query = query.Where("operation_time <= ?", endTime) } } // 统计总数 if err := query.Count(&total).Error; err != nil { return nil, 0, err } // 排序 sortBy := req.SortBy if sortBy == "" { sortBy = "operation_time" } sortOrder := req.SortOrder if sortOrder == "" { sortOrder = "desc" } query = query.Order(sortBy + " " + sortOrder) // 分页 page := req.Page if page < 1 { page = 1 } size := req.Size if size < 1 { size = 20 } offset := (page - 1) * size query = query.Offset(offset).Limit(size) // 查询 if err := query.Find(&logs).Error; err != nil { return nil, 0, err } return logs, total, nil }