260 lines
7.1 KiB
Go
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"` // 排序
|
|
}
|