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
+184
View File
@@ -0,0 +1,184 @@
package freeVidmod
import (
"encoding/json"
"errors"
"fmt"
"time"
"91porn-server/app/appg"
"91porn-server/common"
"91porn-server/common/db"
"91porn-server/common/log"
"91porn-server/common/redis"
"91porn-server/models"
"91porn-server/models/commod"
"91porn-server/web/webg"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
var mdb *db.MongoDB
const table = models.FreeVidConfig
func coll(t *db.MongoTool) *db.MongoTool {
if t == nil {
return mdb.Coll(table)
}
return t.Coll(table)
}
// initIndex 索引设置
func initIndex() {
many := []mongo.IndexModel{
{
Keys: bson.D{{Key: "uid", Value: 1}},
Options: options.Index().SetUnique(true),
},
{
Keys: bson.D{{Key: "publisherID", Value: 1}},
},
{
Keys: bson.D{{Key: "createdAt", Value: -1}},
},
}
if _, err := coll(nil).CreateIndex(many); err != nil {
panic(fmt.Sprintf("%s model set index err ==>[%+v]", table, err))
}
}
func redisFreeVidKey(uid uint64) string {
return fmt.Sprintf("freeVidConfigList:%d", uid)
}
// List 条件获取金币配置表
func List(param ListParam) (data WebResp, err error) {
var freeVidConfig []FreeVidConfig
std := commod.StdQuery{
Page: &commod.PageBy{
CheckNext: false,
Num: param.PageNumber,
Size: param.PageSize,
},
Order: &[]commod.OrderBy{{Key: "updatedAt", Desc: true}},
}
opts := commod.ConvertToListQuery(std)
query, _ := common.ToBsonM(param.ListFilter)
total, err := coll(nil).Count(query)
if err != nil {
log.Error(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "List", table, "Count", err))
return
}
if err = coll(nil).Find(&freeVidConfig, query, opts); err != nil {
log.Error(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "List", table, "Find", err))
return
}
data.List = freeVidConfig
data.Total = total
return data, nil
}
// 根据uid查找用户免费观看的发布者列表
func FindFreeVidByUid(uid uint64) (*FreeVidConfig, error) {
var back *FreeVidConfig
redisKey := redisFreeVidKey(uid)
redisc := getRedis()
if redisc == nil || !redisc.Exists(redisKey) {
if err := coll(nil).FindOne(&back, bson.M{"uid": uid}); err != nil {
log.Warn("recharge FindFreeVidByUid FindOne fail", log.E(err))
return nil, err
}
if redisc == nil {
return back, nil
}
jsonBytes, err := json.Marshal(back)
if err != nil {
return back, err
}
_ = redisc.Set(redisKey, string(jsonBytes), 10*time.Minute)
return back, err
}
str, err := redisc.Get(redisKey)
if err != nil {
log.Warn(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "FindFreeVidByUid", table, "Find", err))
return nil, err
}
if str == nil {
return back, errors.New("redis key is null")
}
return back, json.Unmarshal([]byte(*str), &back)
}
func GetFreeVideoMapByUID(uid uint64) map[uint64]bool {
m := make(map[uint64]bool)
free, err := FindFreeVidByUid(uid)
if err != nil || free == nil {
return m
}
now := time.Now()
if free.StartTime.After(now) || free.EndTime.Before(now) {
return m
}
for _, v := range free.PublisherID {
m[v] = true
}
return m
}
// InsertOne 插入一条数据
func InsertOne(inc *Incr) error {
redisCachDel(redisFreeVidKey(inc.Uid))
inc.CreatedAt = time.Now()
inc.UpdatedAt = time.Now()
if _, err := coll(nil).InsertOne(inc); err != nil {
log.Warn(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "InsertOne", table, "InsertOne", err), log.Any("inc", inc))
return err
}
return nil
}
// Delete 删除数据
func Delete(uids []uint64) (int64, error) {
for _, uid := range uids {
redisCachDel(redisFreeVidKey(uid))
}
result, err := coll(nil).DeleteMany(bson.M{"uid": bson.M{"$in": uids}})
if err != nil {
log.Warn(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "Delete", table, "Delete", err))
return 0, err
}
return result.DeletedCount, err
}
// Update 免费观看配置更新
func Update(uid uint64, set EditDoc) (int64, error) {
defer redisCachDel(redisFreeVidKey(uid))
updateAt := time.Now()
set.UpdatedAt = updateAt
result, err := coll(nil).UpdateOne(bson.M{"uid": uid}, bson.M{"$set": set})
if err != nil {
log.Warn(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "Update", table, "UpdateOne", err),
log.Any("uid", uid),
log.Any("set", set),
)
return 0, err
}
return result.ModifiedCount, nil
}
func redisCachDel(m string) {
_, _ = getRedis().Del(m)
}
func getRedis() *redis.Client {
if appg.Redis != nil {
return appg.Redis
}
if webg.Redis != nil {
return webg.Redis
}
return nil
}
+45
View File
@@ -0,0 +1,45 @@
package freeVidmod
import (
"time"
"91porn-server/common/db"
"go.mongodb.org/mongo-driver/bson/primitive"
)
type Status int64
// FreeVidConfig 免费观看视频
type FreeVidConfig struct {
ID primitive.ObjectID `json:"id" bson:"_id,omitempty"`
Uid uint64 `json:"uid" bson:"uid"`
PublisherID []uint64 `json:"publisherID" bson:"publisherID"`
StartTime time.Time `json:"startTime" bson:"startTime,omitempty"`
EndTime time.Time `json:"endTime" bson:"endTime,omitempty"`
CreatedAt time.Time `json:"createdAt" bson:"createdAt"`
UpdatedAt time.Time `json:"updatedAt" bson:"updatedAt"`
}
// Incr 插入结构体
type Incr struct {
Uid uint64 `form:"uid" json:"uid" bson:"uid" binding:"required"`
PublisherID []uint64 `form:"publisherID" json:"publisherID" bson:"publisherID" binding:"required"`
StartTime time.Time `form:"startTime" json:"startTime" bson:"startTime,omitempty"`
EndTime time.Time `form:"endTime" json:"endTime" bson:"endTime,omitempty"`
CreatedAt time.Time `json:"createdAt" bson:"createdAt"`
UpdatedAt time.Time `json:"updatedAt" bson:"updatedAt"`
}
// EditDoc 编辑结构体
type EditDoc struct {
PublisherID []uint64 `json:"publisherID,omitempty" bson:"publisherID,omitempty"`
StartTime *time.Time `json:"startTime,omitempty" bson:"startTime,omitempty"`
EndTime *time.Time `json:"endTime,omitempty" bson:"endTime,omitempty"`
UpdatedAt time.Time `json:"updatedAt" bson:"updatedAt"`
}
func Init() {
mdb = db.Init(table)
initIndex()
}
+17
View File
@@ -0,0 +1,17 @@
package freeVidmod
import "91porn-server/models/commod"
type ListParam struct {
ListFilter
commod.Page
}
type ListFilter struct {
UID uint64 `form:"uid" json:"uid,omitempty" bson:"uid,omitempty"` //用户ID
}
type WebResp struct {
Total int64 `json:"total"`
List interface{} `json:"list"`
}