Files
rootandClaude Opus 5 8679200f41 Initial commit
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 13:57:10 +08:00

279 lines
10 KiB
Go

package usermod
import (
"time"
"91porn-server/common/log"
"91porn-server/models/l/payvidlgmod"
"91porn-server/models/v/prdcthsomod"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo/options"
)
type UserListSelector struct {
UID *uint64 `form:"uid,omitempty" json:"uid,omitempty" bson:"uid,omitempty"` //用户id
DevID *string `form:"devID,omitempty" json:"devID,omitempty" bson:"devID,omitempty"` //设备id
DevType *string `form:"devType,omitempty" json:"devType,omitempty" bson:"devType,omitempty"` //设备类型
DevToken *string `form:"devToken,omitempty" json:"devToken,omitempty" bson:"devToken,omitempty"` //设备toke`n ios 推送用
RegisterIP *string `form:"registerIP,omitempty" json:"registerIP,omitempty" bson:"registerIP,omitempty"` //注册IP
Mobile *string `form:"mobile,omitempty" json:"mobile,omitempty" bson:"mobile,omitempty"` //手机号
Gender *string `form:"gender,omitempty" json:"gender,omitempty" bson:"gender,omitempty"` //性别
Channel *string `form:"channel,omitempty" json:"channel,omitempty" bson:"channel,omitempty"`
Name *string `form:"name,omitempty" json:"name,omitempty" bson:"name,omitempty"`
PromotionCode *string `form:"promotionCode,omitempty" json:"promotionCode,omitempty" bson:"promotionCode,omitempty"` //推广码
Portrait *string `form:"portrait,omitempty" json:"portrait,omitempty" bson:"portrait,omitempty"` //头像
Summary *string `form:"summary,omitempty" json:"summary,omitempty" bson:"summary,omitempty"` //简介
Region *string `form:"region,omitempty" json:"region,omitempty" bson:"region,omitempty"` //地区
Birthday *string `form:"birthday,omitempty" json:"birthday,omitempty" bson:"birthday,omitempty"` //生日
VipLevel *int `form:"vipLevel,omitempty" json:"vipLevel,omitempty" bson:"vipLevel,omitempty"` //vip等级
HasLocked *bool `form:"hasLocked,omitempty" json:"hasLocked,omitempty" bson:"hasLocked,omitempty"` //已禁止登陆
HasBanned *bool `form:"hasBanned,omitempty" json:"hasBanned,omitempty" bson:"hasBanned,omitempty"` //已禁言
Token *string `form:"token,omitempty" json:"token,omitempty" bson:"token,omitempty"` //用户令牌
WatchCount *uint64 `from:"watchCount,omitempty" json:"watchCount,omitempty" bson:"watchCount,omitempty"` //观看次数
BankActName *string `json:"bankActName,omitempty" bson:"bankActName,omitempty"` //银行卡绑定名字
UpTag *string `form:"upTag" json:"upTag,omitempty" bson:"upTag,omitempty"` // 博主认证
}
// ExportUser 导出的用户信息
type ExportUser struct {
UID uint64 `xlsx:"用户id"`
//DevID string `xlsx:"设备id"`
DevType string `xlsx:"设备类型"`
RegisterIP string `xlsx:"注册IP"`
Mobile string `xlsx:"手机号"`
//Gender string `xlsx:"性别"`
Channel string `xlsx:"渠道号"`
//Name string `xlsx:"用户名"`
PromotionCode string `xlsx:"推广码"`
//Summary string `xlsx:"简介"`
//Region string `xlsx:"地区"`
//Birthday string `xlsx:"生日"`
//VipLevel int `xlsx:"vip等级"`
VipExpireDate time.Time `xlsx:"vip过期时间"`
CreatedAt time.Time `xlsx:"用户创建时间"`
LastVisitAt time.Time `xlsx:"最后活跃时间"`
//MobileBindAt *time.Time `xlsx:"手机绑定时间"`
//HasLocked bool `xlsx:"已禁止登陆"`
//HasBanned bool `xlsx:"已禁言"`
WatchCount int `xlsx:"七日观看次数"` //七日观看次数,和数据库存的不同
//VisitCount int `xlsx:"24小时内访问数"`
//TotalVideoCnt int `xlsx:"视频总数"`
//UndealVideoCnt int `xlsx:"未审核视频数"`
}
// 用户VIP返回数据
type UserVipInfoRes struct {
VideoDiscount int `json:"videoDiscount"` //视频折扣率
VideoDiscountExpiration time.Time `json:"videoDiscountExpiration"` // 视频折扣卡到期时间
VipExpireDate time.Time `json:"vipExpireDate"` //vip过期时间
GoldVideoFreeExpire time.Time `json:"goldVideoFreeExpire"` //金币视频免费日期
PayVidDiscount int `json:"payVidDiscount"` //支付视频折扣
VideoFreeExpiration *time.Time `json:"videoFreeExpiration"` //视频免费过期时间
GoldVideoCoupon []UserGoldVideoCoupon `json:"goldVideoCoupon"`
}
func FindAgentByAccount(acc string) (user *User, err error) {
if acc == "" {
return
}
err = coll(nil).FindOne(&user, bson.M{"agentAccount": acc})
return
}
func FindAllPayableAgents() ([]string, error) {
var p []struct {
AgentAcc string `bson:"agentAccount"`
}
if err := coll(nil).Find(&p, bson.M{
"agentAccount": bson.M{"$gt": ""},
"deposit": bson.M{"$gt": 0},
"payable": true,
"userType": UserLoufengAgent,
}, options.Find().SetProjection(bson.M{"agentAccount": 1})); err != nil {
return []string{}, err
}
agents := make([]string, len(p))
for i, agent := range p {
agents[i] = agent.AgentAcc
}
return agents, nil
}
// FindMany 查询所有
func FindMany(filter bson.M, _ *options.FindOptions, skip int64, size int64) ([]*User, error) {
sort := bson.D{{Key: "createdAt", Value: -1}}
opts := options.FindOptions{}
opts.SetSort(sort).SetSkip(skip).SetLimit(size)
data := make([]*User, 0)
if err := coll(nil).Find(&data, filter, &opts); err != nil {
log.ZapLog.Warn("proxy FindMany Find fail", log.E(err))
return data, err
}
return data, nil
}
// ExportFindMany 导出的时候查询所有
func ExportFindMany(filter bson.M, skip int64, size int64) ([]*User, error) {
sort := bson.D{{Key: "createdAt", Value: 1}}
filter["userType"] = bson.M{"$in": []UserType{UserUnkown, UserLoufengAgent}}
opts := options.FindOptions{}
opts.SetSort(sort).SetSkip(skip).SetLimit(size)
data := make([]*User, 0)
if err := coll(nil).Find(&data, filter, &opts); err != nil {
log.ZapLog.Warn(" ExportFindMany Find fail", log.E(err))
return data, err
}
return data, nil
}
// GetTotalCnt 查询数量
func GetTotalCnt(filter bson.M, _ *options.FindOptions) (total int64, err error) {
total, err = coll(nil).Count(filter)
if err != nil {
log.ZapLog.Warn("GetTotalCnt fail", log.E(err))
}
return
}
// PayUIDCountByCreatedTime 消费包括 购买VIP、付费视屏
func PayUIDCountByCreatedTime(start time.Time, end time.Time) ([]uint64, error) {
//购买VIP /分
vUIDList, err := prdcthsomod.PayVipUIDSByCreatedTime(start, end)
if err != nil {
return nil, err
}
//付费视屏 /金币
pUIDList, err := payvidlgmod.GetUIDListByPayTime(start, end)
if err != nil {
return nil, err
}
payUIDMap := make(map[uint64]byte, len(vUIDList)+len(pUIDList))
//转载payUIDMap
for _, uid := range vUIDList {
payUIDMap[uid] = 1
}
for _, uid := range pUIDList {
payUIDMap[uid] = 1
}
//取出payUID
payUIDList := make([]uint64, len(payUIDMap))
i := 0
for k := range payUIDMap {
payUIDList[i] = k
i++
}
return payUIDList, nil
}
// NewAndPayUIDListByCreatedTime 消费包括 购买VIP、付费视屏
func NewAndPayUIDListByCreatedTime(start time.Time, end time.Time) ([]uint64, error) {
uidList, err := FindUIDByCreateTime(start, end)
if err != nil {
return nil, err
}
vUIDList, err := prdcthsomod.PayVipUIDSByCreatedTime(start, end)
if err != nil {
return nil, err
}
pUIDList, err := payvidlgmod.GetUIDListByPayTime(start, end)
if err != nil {
return nil, err
}
payUIDMap := make(map[uint64]bool, len(uidList))
//转载payUIDMap
for _, uid := range pUIDList {
payUIDMap[uid] = false
}
//标记消费的的UID
for _, uid := range vUIDList {
if _, ok := payUIDMap[uid]; ok {
payUIDMap[uid] = true
}
}
for _, uid := range pUIDList {
if _, ok := payUIDMap[uid]; ok {
payUIDMap[uid] = true
}
}
//取出payUID
payUIDList := make([]uint64, 0, len(payUIDMap))
for k, v := range payUIDMap {
if v {
payUIDList = append(payUIDList, k)
}
}
return payUIDList, nil
}
type UpdateFreeTimesCond struct {
UID uint64 `json:"uid" bson:"uid" binding:"required"` // 用户ID
FreeTimes *int64 `json:"freeTimes" bson:"freeTimes"` // 免费次数
Mark *string `json:"mark" bson:"mark"` // 备注
}
func (receiver *UpdateFreeTimesCond) Filter() bson.M {
return bson.M{"uid": receiver.UID, "aiUndressFreeTimes": bson.M{"$gte": receiver.FreeTimes}}
}
func (receiver *UpdateFreeTimesCond) Update() bson.M {
var update = bson.M{}
if receiver.FreeTimes != nil {
update["aiUndressFreeTimes"] = receiver.FreeTimes
}
return bson.M{"$inc": update}
}
type UpdateDownloadCond struct {
UID uint64 `json:"uid" bson:"uid" binding:"required"` // 用户ID
Download *int64 `json:"download" bson:"download"` // 下载次数
Mark *string `json:"mark" bson:"mark"` // 备注
}
func (receiver *UpdateDownloadCond) Filter() bson.M {
return bson.M{"uid": receiver.UID}
}
func (receiver *UpdateDownloadCond) Update() bson.M {
var update = bson.M{}
if receiver.Download != nil {
update["downloadCount"] = receiver.Download
}
return bson.M{"$inc": update}
}
type SetAdvertiseCond struct {
UId []uint64 `form:"uid" json:"uid" binding:"required"` // 用户uid
Enable *bool `form:"enable" json:"enable" binding:"required"` // 是否开启
}
type UpdateLotteryTimesCond struct {
UID uint64 `json:"uid" bson:"uid" binding:"required"` // 用户ID
LotteryTimes *int64 `json:"lotteryTimes" bson:"lotteryTimes"` // 抽空次数
Mark *string `json:"mark" bson:"mark"` // 备注
}
func (receiver *UpdateLotteryTimesCond) Filter() bson.M {
return bson.M{"uid": receiver.UID}
}
func (receiver *UpdateLotteryTimesCond) Update() bson.M {
var update = bson.M{}
if receiver.LotteryTimes != nil {
update["lotteryTimes"] = receiver.LotteryTimes
}
return bson.M{"$inc": update}
}
type DeleteCommentCond struct {
UID uint64 `json:"uid" bson:"uid" binding:"required"` // 用户ID
}
type QueryGameCodeCond struct {
UID uint64 `form:"uid" json:"uid" bson:"uid,omitempty"` //用户ID
}
func (receiver *DeleteCommentCond) Filter() bson.M {
return bson.M{"uid": receiver.UID}
}