// Filename: internal/service/log_service.go package service import ( "gemini-balancer/internal/models" "strconv" "github.com/gin-gonic/gin" "gorm.io/gorm" ) type LogService struct { db *gorm.DB } func NewLogService(db *gorm.DB) *LogService { return &LogService{db: db} } func (s *LogService) Record(log *models.RequestLog) error { return s.db.Create(log).Error } func (s *LogService) GetLogs(c *gin.Context) ([]models.RequestLog, int64, error) { var logs []models.RequestLog var total int64 query := s.db.Model(&models.RequestLog{}).Scopes(s.filtersScope(c)) // 先计算总数 if err := query.Count(&total).Error; err != nil { return nil, 0, err } if total == 0 { return []models.RequestLog{}, 0, nil } // 再执行分页查询 page, _ := strconv.Atoi(c.DefaultQuery("page", "1")) pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "20")) offset := (page - 1) * pageSize err := query.Order("request_time desc").Limit(pageSize).Offset(offset).Find(&logs).Error if err != nil { return nil, 0, err } return logs, total, nil } func (s *LogService) filtersScope(c *gin.Context) func(db *gorm.DB) *gorm.DB { return func(db *gorm.DB) *gorm.DB { if modelName := c.Query("model_name"); modelName != "" { db = db.Where("model_name = ?", modelName) } if isSuccessStr := c.Query("is_success"); isSuccessStr != "" { if isSuccess, err := strconv.ParseBool(isSuccessStr); err == nil { db = db.Where("is_success = ?", isSuccess) } } if statusCodeStr := c.Query("status_code"); statusCodeStr != "" { if statusCode, err := strconv.Atoi(statusCodeStr); err == nil { db = db.Where("status_code = ?", statusCode) } } if keyIDStr := c.Query("key_id"); keyIDStr != "" { if keyID, err := strconv.ParseUint(keyIDStr, 10, 64); err == nil { db = db.Where("key_id = ?", keyID) } } if groupIDStr := c.Query("group_id"); groupIDStr != "" { if groupID, err := strconv.ParseUint(groupIDStr, 10, 64); err == nil { db = db.Where("group_id = ?", groupID) } } return db } }