Initial commit

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-15 13:57:10 +08:00
co-authored by Claude Opus 5
commit 8679200f41
1897 changed files with 257900 additions and 0 deletions
+262
View File
@@ -0,0 +1,262 @@
package vidmod
import (
"strconv"
"91porn-server/common/timeutil/timerange"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
"go.mongodb.org/mongo-driver/mongo/options"
)
func (receiver *AppListReq) LatestFilter() (primitive.M, error) {
// 时间对齐5分钟
recentMinute := timerange.RecentMinute(receiver.Time, 5)
// 视频帖子并且已通过审核
filter := bson.M{
"newsType": "SP",
"status": 1,
"reviewAt": bson.M{"$lte": recentMinute},
}
if receiver.Tag != "" {
tagID, err := primitive.ObjectIDFromHex(receiver.Tag)
if err != nil {
return nil, err
}
filter["tags"] = bson.M{"$elemMatch": bson.M{"$eq": tagID}}
}
if receiver.PaymentType == PaymentVIP {
filter["coins"] = 0
} else if receiver.PaymentType == PaymentGold {
filter["coins"] = bson.M{"$gt": 0}
}
if receiver.Type == LongVideo {
filter["playTime"] = bson.M{"$gte": 600}
} else if receiver.Type == ShortVideo {
filter["playTime"] = bson.M{"$lt": 600}
}
return filter, nil
}
// MostLikedFilter 点赞最多搜索条件
func (receiver AppListReq) MostLikedFilter() (primitive.M, error) {
// 视频帖子并且已通过审核
filter := bson.M{
"newsType": "SP",
"status": 1,
}
if receiver.Tag != "" {
tagID, err := primitive.ObjectIDFromHex(receiver.Tag)
if err != nil {
return nil, err
}
filter["tags"] = bson.M{"$elemMatch": bson.M{"$eq": tagID}}
}
if receiver.PaymentType == PaymentVIP {
filter["coins"] = 0
} else if receiver.PaymentType == PaymentGold {
filter["coins"] = bson.M{"$gt": 0}
}
if receiver.Type == LongVideo {
filter["playTime"] = bson.M{"$gte": 600}
} else if receiver.Type == ShortVideo {
filter["playTime"] = bson.M{"$lt": 600}
}
return filter, nil
}
// MostPlayFilter 播放最多搜索条件
func (receiver *AppListReq) MostPlayFilter() (primitive.M, error) {
// 视频帖子并且已通过审核
filter := bson.M{
"newsType": "SP",
"status": 1,
}
if receiver.Tag != "" {
tagID, err := primitive.ObjectIDFromHex(receiver.Tag)
if err != nil {
return nil, err
}
filter["tags"] = bson.M{"$elemMatch": bson.M{"$eq": tagID}}
}
if receiver.PaymentType == PaymentVIP {
filter["coins"] = 0
} else if receiver.PaymentType == PaymentGold {
filter["coins"] = bson.M{"$gt": 0}
}
if receiver.Type == LongVideo {
filter["playTime"] = bson.M{"$gte": 600}
} else if receiver.Type == ShortVideo {
filter["playTime"] = bson.M{"$lt": 600}
}
return filter, nil
}
func (receiver *AppListReq) HappinessPlazaFilter() (primitive.M, error) {
// 时间对齐5分钟
recentMinute := timerange.RecentMinute(receiver.Time, 5)
// 视频帖子并且已通过审核
filter := bson.M{
"newsType": "COVER",
"status": 1,
"reviewAt": bson.M{"$lte": recentMinute},
}
return filter, nil
}
func (receiver *AppListReq) Filter(uid uint64) (primitive.M, error) {
// 视频帖子并且已通过审核
filter := bson.M{
"newsType": SP,
"status": 1,
}
if receiver.Tag != "" {
tagID, err := primitive.ObjectIDFromHex(receiver.Tag)
if err != nil {
return nil, err
}
filter["tags"] = tagID // bson.M{"$elemMatch": bson.M{"$eq": tagID}}
}
if receiver.PaymentType == PaymentVIP {
filter["coins"] = 0
} else if receiver.PaymentType == PaymentGold {
filter["coins"] = bson.M{"$gt": 0}
}
switch receiver.Type {
case LongVideo:
filter["playTime"] = bson.M{"$gte": 600}
case ShortVideo:
filter["playTime"] = bson.M{"$lt": 600}
case Image:
filter["newsType"] = COVER
}
// 时间对齐5分钟
recentMinute := timerange.RecentMinute(receiver.Time, 5)
switch receiver.Model {
case LatestZone:
filter["reviewAt"] = bson.M{"$lte": recentMinute}
case HappinessPlaza:
filter["reviewAt"] = bson.M{"$lte": recentMinute}
case MyImage:
if receiver.UID != 0 {
filter["publisherID"] = receiver.UID
} else {
filter["publisherID"] = uid
delete(filter, "status")
}
}
return filter, nil
}
// Options 分页及排序处理
func (receiver *AppListReq) Options() *options.FindOptions {
opts := options.Find() //如果是幸福广场,不进行分页
if receiver.Model != HappinessPlaza { //否则进行分页
opts.SetSkip(int64((receiver.PageNumber - 1) * receiver.PageSize)).SetLimit(int64(receiver.PageSize + 1))
}
var sort bson.D
if receiver.FilterType == 1 {
sort = bson.D{{Key: "recoWeigh", Value: -1}}
opts.SetSort(sort)
} else if receiver.FilterType == 2 {
sort = bson.D{{Key: "createdAt", Value: -1}}
opts.SetSort(sort)
}
switch receiver.Model {
case LatestZone:
opts.SetSort(mergeSort(sort, bson.D{{Key: "reviewAt", Value: -1}}))
case HottestZone:
opts.SetSort(mergeSort(sort, bson.D{{Key: "hot", Value: -1}, {Key: "reviewAt", Value: -1}}))
case MostLiked:
opts.SetSort(mergeSort(sort, bson.D{{Key: "likeCount", Value: -1}, {Key: "reviewAt", Value: -1}}))
case MostPlay:
opts.SetSort(mergeSort(sort, bson.D{{Key: "playCount", Value: -1}, {Key: "reviewAt", Value: -1}}))
case MyImage:
opts.SetSort(mergeSort(sort, bson.D{{Key: "createdAt", Value: -1}}))
case HappinessPlaza:
//opts.SetSort(bson.D{{"happinessPlazaTop", -1}, {"reviewAt", -1}})
opts.SetSort(mergeSort(sort, bson.D{{Key: "reviewAt", Value: -1}})) //统一默认按照审核时间排序
}
return opts
}
func mergeSort(m bson.D, mm bson.D) bson.D {
if len(m) == 0 {
return mm
}
if len(mm) == 0 {
return m
}
for _, vv := range mm {
for _, v := range m {
if v.Key == vv.Key {
continue
}
}
m = append(m, vv)
}
return m
}
// RedisKey 获取redis缓存key
func (receiver *AppListReq) RedisKey(uid uint64) string {
redisKey := "appListReqCache:status:1"
if receiver.Type == Image {
redisKey += ":newsType:" + COVER
} else {
redisKey += ":newsType:" + SP
}
if receiver.Tag != "" {
tagID, err := primitive.ObjectIDFromHex(receiver.Tag)
if err != nil {
return ""
}
redisKey += ":tags:" + tagID.Hex()
}
if receiver.PaymentType == PaymentVIP {
redisKey += ":coins:0"
} else if receiver.PaymentType == PaymentGold {
redisKey += ":coins:gt0"
}
if receiver.Type == LongVideo {
redisKey += ":playTime:gte600"
}
if receiver.Type == ShortVideo {
redisKey += ":playTime:lt600"
}
// 时间对齐5分钟
recentMinute := timerange.RecentMinute(receiver.Time, 5)
switch receiver.Model {
case LatestZone:
redisKey += ":reviewAt:lte" + recentMinute.Format("200601021504")
case HappinessPlaza:
redisKey += ":reviewAt:lte" + recentMinute.Format("200601021504")
case MyImage:
if receiver.UID != 0 {
redisKey += ":publisherID:" + strconv.FormatUint(receiver.UID, 10)
} else {
redisKey += ":publisherID:" + strconv.FormatUint(receiver.UID, 10)
redisKey += ":status:delete"
}
}
if receiver.Model != HappinessPlaza { //分页信息
redisKey += ":skip:" + strconv.FormatUint((receiver.PageNumber-1)*receiver.PageSize, 10) + ":limit:" + strconv.FormatUint((receiver.PageSize+1), 10)
}
switch receiver.Model {
case LatestZone:
redisKey += ":reviewAt:-1"
case HottestZone:
redisKey += ":hot:-1:reviewAt:-1"
case MostLiked:
redisKey += ":likeCount:-1:reviewAt:-1"
case MostPlay:
redisKey += ":playCount:-1:reviewAt:-1"
case MyImage:
redisKey += ":createdAt:-1"
case HappinessPlaza:
redisKey += ":reviewAt:-1"
}
redisKey += ":filterType:" + strconv.FormatInt(int64(receiver.FilterType), 10)
return redisKey
}