From 7c05bb1e71ffeb846e145f83892b3d6600668763 Mon Sep 17 00:00:00 2001 From: ata <17314593+asdxzaaaaa@user.noreply.gitee.com> Date: Fri, 10 Jul 2026 10:06:14 +0000 Subject: [PATCH] Add internal/repository/game.go --- internal/repository/game.go | 92 +++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 internal/repository/game.go diff --git a/internal/repository/game.go b/internal/repository/game.go new file mode 100644 index 0000000..0b5d5a6 --- /dev/null +++ b/internal/repository/game.go @@ -0,0 +1,92 @@ +package repository + +import ( + "gotest/internal/model" + + "gorm.io/gorm" +) + +// GameRepository 游戏数据访问层 +type GameRepository struct { + db *gorm.DB +} + +// NewGameRepository 创建游戏仓库实例 +func NewGameRepository(db *gorm.DB) *GameRepository { + return &GameRepository{db: db} +} + +// ListCategories 获取游戏分类列表 +func (r *GameRepository) ListCategories() ([]model.GameCategory, error) { + var categories []model.GameCategory + if err := r.db.Order("sort ASC, id ASC").Find(&categories).Error; err != nil { + return nil, err + } + return categories, nil +} + +// ListGames 获取游戏列表,支持分类过滤、关键词搜索和排序 +func (r *GameRepository) ListGames(categoryID uint, keyword string, sort string, page, pageSize int) ([]model.Game, int64, error) { + var games []model.Game + var total int64 + + query := r.db.Where("status = 1") + if categoryID > 0 { + query = query.Where("category_id = ?", categoryID) + } + if keyword != "" { + query = query.Where("name LIKE ? OR tags LIKE ? OR developer LIKE ?", "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%") + } + + if err := query.Model(&model.Game{}).Count(&total).Error; err != nil { + return nil, 0, err + } + + switch sort { + case "rating": + query = query.Order("rating DESC") + case "plays": + query = query.Order("plays DESC") + case "newest": + query = query.Order("release_date DESC") + default: + query = query.Order("sort ASC, id DESC") + } + + if page > 0 && pageSize > 0 { + offset := (page - 1) * pageSize + query = query.Offset(offset).Limit(pageSize) + } + + if err := query.Find(&games).Error; err != nil { + return nil, 0, err + } + return games, total, nil +} + +// GetGame 根据 ID 获取游戏详情 +func (r *GameRepository) GetGame(id uint) (*model.Game, error) { + var game model.Game + if err := r.db.First(&game, id).Error; err != nil { + return nil, err + } + return &game, nil +} + +// ListHotGames 获取热门游戏 +func (r *GameRepository) ListHotGames(limit int) ([]model.Game, error) { + var games []model.Game + if err := r.db.Where("status = 1 AND is_hot = true").Order("plays DESC").Limit(limit).Find(&games).Error; err != nil { + return nil, err + } + return games, nil +} + +// ListNewGames 获取新游 +func (r *GameRepository) ListNewGames(limit int) ([]model.Game, error) { + var games []model.Game + if err := r.db.Where("status = 1 AND is_new = true").Order("release_date DESC").Limit(limit).Find(&games).Error; err != nil { + return nil, err + } + return games, nil +}