Files
nl-video-api/internal/dao/movie.go
2025-08-03 00:11:15 +08:00

260 lines
7.1 KiB
Go

package dao
import (
"context"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gtime"
"nl-video-api/internal/model/entity"
)
// MovieDao 影片数据访问对象
type MovieDao struct{}
// movieDao 影片DAO实例
var movieDao = &MovieDao{}
// NewMovieDao 创建影片DAO实例
func NewMovieDao() *MovieDao {
return movieDao
}
// GetList 获取影片列表
func (d *MovieDao) GetList(ctx context.Context, req *MovieListReq) ([]*entity.Movie, int, error) {
db := g.DB()
model := db.Model("nl_movie").Where("deleted_at = 0")
// 条件筛选
if req.CategoryId > 0 {
model = model.Where("category_id = ?", req.CategoryId)
}
if req.Type > 0 {
model = model.Where("type = ?", req.Type)
}
if req.Year > 0 {
model = model.Where("year = ?", req.Year)
}
if req.Area != "" {
model = model.Where("area = ?", req.Area)
}
if req.Language != "" {
model = model.Where("language = ?", req.Language)
}
if req.IsVip >= 0 {
model = model.Where("is_vip = ?", req.IsVip)
}
if req.IsRecommend >= 0 {
model = model.Where("is_recommend = ?", req.IsRecommend)
}
if req.IsHot >= 0 {
model = model.Where("is_hot = ?", req.IsHot)
}
if req.IsNew >= 0 {
model = model.Where("is_new = ?", req.IsNew)
}
if req.Status >= 0 {
model = model.Where("status = ?", req.Status)
}
if req.Keyword != "" {
model = model.Where("title LIKE ? OR original_title LIKE ? OR director LIKE ? OR actor LIKE ?",
"%"+req.Keyword+"%", "%"+req.Keyword+"%", "%"+req.Keyword+"%", "%"+req.Keyword+"%")
}
// 获取总数
total, err := model.Count()
if err != nil {
return nil, 0, err
}
// 排序
orderBy := "created_at DESC"
if req.OrderBy != "" {
orderBy = req.OrderBy
}
model = model.Order(orderBy)
// 分页
if req.Page > 0 && req.PageSize > 0 {
offset := (req.Page - 1) * req.PageSize
model = model.Limit(req.PageSize).Offset(offset)
}
var movies []*entity.Movie
err = model.Scan(&movies)
if err != nil {
return nil, 0, err
}
return movies, total, nil
}
// GetById 根据ID获取影片
func (d *MovieDao) GetById(ctx context.Context, id int) (*entity.Movie, error) {
var movie *entity.Movie
err := g.DB().Model("nl_movie").Where("id = ? AND deleted_at = 0", id).Scan(&movie)
if err != nil {
return nil, err
}
return movie, nil
}
// Create 创建影片
func (d *MovieDao) Create(ctx context.Context, movie *entity.Movie) (int64, error) {
result, err := g.DB().Model("nl_movie").Data(movie).Insert()
if err != nil {
return 0, err
}
id, err := result.LastInsertId()
if err != nil {
return 0, err
}
return id, nil
}
// Update 更新影片
func (d *MovieDao) Update(ctx context.Context, id int, data g.Map) error {
data["updated_at"] = gtime.Now().Unix()
_, err := g.DB().Model("nl_movie").Where("id = ?", id).Data(data).Update()
return err
}
// Delete 删除影片(软删除)
func (d *MovieDao) Delete(ctx context.Context, id int) error {
_, err := g.DB().Model("nl_movie").Where("id = ?", id).Data(g.Map{
"deleted_at": gtime.Now().Unix(),
"updated_at": gtime.Now().Unix(),
}).Update()
return err
}
// UpdateViewCount 更新观看次数
func (d *MovieDao) UpdateViewCount(ctx context.Context, id int) error {
_, err := g.DB().Model("nl_movie").Where("id = ?", id).Increment("view_count", 1)
return err
}
// UpdateLikeCount 更新点赞数
func (d *MovieDao) UpdateLikeCount(ctx context.Context, id int, increment int) error {
_, err := g.DB().Model("nl_movie").Where("id = ?", id).Increment("like_count", increment)
return err
}
// UpdateCollectCount 更新收藏数
func (d *MovieDao) UpdateCollectCount(ctx context.Context, id int, increment int) error {
_, err := g.DB().Model("nl_movie").Where("id = ?", id).Increment("collect_count", increment)
return err
}
// UpdateCommentCount 更新评论数
func (d *MovieDao) UpdateCommentCount(ctx context.Context, id int, increment int) error {
_, err := g.DB().Model("nl_movie").Where("id = ?", id).Increment("comment_count", increment)
return err
}
// GetHotMovies 获取热门影片
func (d *MovieDao) GetHotMovies(ctx context.Context, limit int) ([]*entity.Movie, error) {
var movies []*entity.Movie
err := g.DB().Model("nl_movie").
Where("status = 1 AND deleted_at = 0").
Order("view_count DESC, rating DESC").
Limit(limit).
Scan(&movies)
return movies, err
}
// GetRecommendMovies 获取推荐影片
func (d *MovieDao) GetRecommendMovies(ctx context.Context, limit int) ([]*entity.Movie, error) {
var movies []*entity.Movie
err := g.DB().Model("nl_movie").
Where("is_recommend = 1 AND status = 1 AND deleted_at = 0").
Order("sort ASC, created_at DESC").
Limit(limit).
Scan(&movies)
return movies, err
}
// GetNewMovies 获取最新影片
func (d *MovieDao) GetNewMovies(ctx context.Context, limit int) ([]*entity.Movie, error) {
var movies []*entity.Movie
err := g.DB().Model("nl_movie").
Where("status = 1 AND deleted_at = 0").
Order("created_at DESC").
Limit(limit).
Scan(&movies)
return movies, err
}
// SearchMovies 搜索影片
func (d *MovieDao) SearchMovies(ctx context.Context, keyword string, page, pageSize int) ([]*entity.Movie, int, error) {
db := g.DB()
model := db.Model("nl_movie").
Where("deleted_at = 0 AND status = 1").
Where("title LIKE ? OR original_title LIKE ? OR director LIKE ? OR actor LIKE ? OR description LIKE ?",
"%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%")
// 获取总数
total, err := model.Count()
if err != nil {
return nil, 0, err
}
// 分页
if page > 0 && pageSize > 0 {
offset := (page - 1) * pageSize
model = model.Limit(pageSize).Offset(offset)
}
var movies []*entity.Movie
err = model.Order("rating DESC, view_count DESC").Scan(&movies)
if err != nil {
return nil, 0, err
}
return movies, total, nil
}
// GetMoviesByCategory 根据分类获取影片
func (d *MovieDao) GetMoviesByCategory(ctx context.Context, categoryId, page, pageSize int) ([]*entity.Movie, int, error) {
db := g.DB()
model := db.Model("nl_movie").
Where("category_id = ? AND status = 1 AND deleted_at = 0", categoryId)
// 获取总数
total, err := model.Count()
if err != nil {
return nil, 0, err
}
// 分页
if page > 0 && pageSize > 0 {
offset := (page - 1) * pageSize
model = model.Limit(pageSize).Offset(offset)
}
var movies []*entity.Movie
err = model.Order("sort ASC, created_at DESC").Scan(&movies)
if err != nil {
return nil, 0, err
}
return movies, total, nil
}
// MovieListReq 影片列表请求参数
type MovieListReq struct {
Page int `json:"page"` // 页码
PageSize int `json:"page_size"` // 每页数量
CategoryId int `json:"category_id"` // 分类ID
Type int `json:"type"` // 类型
Year int `json:"year"` // 年份
Area string `json:"area"` // 地区
Language string `json:"language"` // 语言
IsVip int `json:"is_vip"` // 是否VIP专享
IsRecommend int `json:"is_recommend"` // 是否推荐
IsHot int `json:"is_hot"` // 是否热门
IsNew int `json:"is_new"` // 是否最新
Status int `json:"status"` // 状态
Keyword string `json:"keyword"` // 关键词
OrderBy string `json:"order_by"` // 排序
}