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
+223
View File
@@ -0,0 +1,223 @@
package vipctrl
import (
"91porn-server/app/service/integral_config_ser"
"91porn-server/common/daichong"
"sync"
"time"
"91porn-server/app/proto"
"91porn-server/app/service/productser"
"91porn-server/app/service/rechargeser"
"91porn-server/app/service/vipcardexperimentser"
"91porn-server/common"
"91porn-server/common/log"
"91porn-server/common/stderr"
"91porn-server/models/commod"
"91porn-server/models/v/annoumod"
"91porn-server/models/v/prdcthsomod"
"91porn-server/models/v/usermod"
"91porn-server/models/v/vipconfigmod"
"github.com/gin-gonic/gin"
)
// PurchaseHistory doc
// @Summary vip购买历史
// @Description vip购买历史
// @Tags vipzz
// @Accept mpfd,json
// @Produce json,html
// @Param pageNumber formData int true "页码"
// @Param pageSize formData int true "条数"
// @Success 200 {string} json "{"msg": "操作成功"}"
// @Failure 400 {string} json "{"msg": "操作失败"}"
// @Router /api/app/vip/history [get]
func PurchaseHistory(ctx *gin.Context) {
uid, err := common.GetUID(ctx)
if err != nil {
common.ServeJSON(ctx, stderr.ErrNoToken, err)
return
}
var arg struct {
commod.Page
}
if err = ctx.ShouldBind(&arg); err != nil {
common.ServeJSON(ctx, stderr.ErrNoToken, err)
return
}
total, data, hasNext, err := prdcthsomod.FindProductHistorysByUID(uid, arg.PageNumber, arg.PageSize)
if err != nil {
common.ServeJSON(ctx, stderr.ErrDbQueryError, "")
return
}
common.ServeJSON(ctx, stderr.Success, map[string]interface{}{
"total": total,
"history": data,
"list": data,
"hasNext": hasNext,
})
}
// Product doc
// @Summary vip种类 新
// @Description 可购买的vip种类
// @Tags vip
// @Accept mpfd,json
// @Produce json,html
// @Success 200 {object} proto.ProductRes "{"msg": "操作成功"}"
// @Failure 400 {string} json "{"msg": "操作失败"}"
// @Router /app/vip/product [get]
func Product(ctx *gin.Context) {
uid, _ := common.GetUID(ctx)
ua, _ := common.GetUA(ctx)
var (
data = proto.ProductRes{
IsNewUser: false,
}
goldResError error
)
var arg struct {
IsNewUser bool `json:"isNewUser" form:"isNewUser"` // 是否新手
}
if err := ctx.ShouldBind(&arg); err != nil {
common.ServeJSON(ctx, stderr.ErrParamError, nil)
return
}
wg := sync.WaitGroup{}
wg.Add(3)
common.Go(func() {
defer wg.Done()
countdownSec, _ := productser.CountdownTiroCard(uid)
if countdownSec > 0 {
data.IsNewUser = true
}
if arg.IsNewUser == true {
data.IsNewUser = arg.IsNewUser
}
data.List, goldResError = rechargeser.New_ProductList(uid, ua.SysType, data.IsNewUser, 0)
})
common.Go(func() {
defer wg.Done()
//d, _ := daichongser.NewTakeChat(ctx, uid, 0)
d := daichong.ChatResp{}
data.Daichong = d.Data
})
common.Go(func() {
defer wg.Done()
data.IntegralList = integral_config_ser.GetAllConfig()
})
wg.Wait()
if goldResError != nil {
common.ServeJSON(ctx, stderr.PayBusy, goldResError.Error())
return
}
if err := vipcardexperimentser.ApplyToProductResponse(uid, &data, time.Now()); err != nil {
// 实验是增强能力,查询异常时降级到原套餐列表,不能阻断购买主链路。
log.Warn("vip card experiment fallback to legacy product response", log.Any("uid", uid), log.E(err))
}
common.ServeJSON(ctx, stderr.Success, data)
}
// 获取新手卡倒计时
func CountdownTiroCard(ctx *gin.Context) {
uid, err := common.GetUID(ctx)
if err != nil {
common.ServeJSON(ctx, stderr.ErrNoToken, err)
return
}
countdownSec, err := productser.CountdownTiroCard(uid)
if err != nil {
common.ServeJSON(ctx, stderr.ErrDbQueryError, err)
return
}
common.ServeJSON(ctx, stderr.Success, gin.H{"countdownSec": countdownSec})
}
// 获取新手卡倒计时
func VIPUpAnnouns(ctx *gin.Context) {
uid, err := common.GetUID(ctx)
if err != nil {
common.ServeJSON(ctx, stderr.ErrNoToken, err)
return
}
u, err := usermod.FindUserByUID(uid)
if err != nil || u == nil {
common.ServeJSON(ctx, stderr.ErrDbQueryError, err)
return
}
var announs []annoumod.AnnounInfo
if u.IsPaidVIP() && u.VipExpireDate.Before(time.Now().AddDate(20, 0, 0)) {
announs, _ = annoumod.GetAnnouForDomain(annoumod.VIPUP)
if err != nil {
common.ServeJSON(ctx, stderr.ErrDbQueryError, err)
return
}
}
common.ServeJSON(ctx, stderr.Success, gin.H{"list": announs})
}
func VIPUpInfo(ctx *gin.Context) {
uid, err := common.GetUID(ctx)
if err != nil {
common.ServeJSON(ctx, stderr.ErrNoToken, err)
return
}
u, err := usermod.FindUserByUID(uid)
if err != nil || u == nil {
common.ServeJSON(ctx, stderr.ErrDbQueryError, err)
return
}
var cfg vipconfigmod.VIPConfig
cfg, _ = vipconfigmod.FindOne()
if err != nil {
common.ServeJSON(ctx, stderr.ErrDbQueryError, err)
return
}
var vipUpCheapPrice int64
var vipUpPrice int64
now := time.Now()
if u.VipExpireDate.After(now) && u.VipExpireDate.Before(now.AddDate(20, 0, 0)) {
switch u.VipLevel {
case 1:
vipUpPrice = cfg.VipUpPrice
vipUpCheapPrice = cfg.VipUpCheapPrice
case 2:
vipUpPrice = cfg.SVipUpPrice
vipUpCheapPrice = cfg.SVipUpCheapPrice
default:
}
}
common.ServeJSON(ctx, stderr.Success, gin.H{
"vipUpPrice": vipUpPrice,
"vipUpCheapPrice": vipUpCheapPrice,
})
}
func VIPUp(ctx *gin.Context) {
uid, err := common.GetUID(ctx)
if err != nil {
common.ServeJSON(ctx, stderr.ErrNoToken, err)
return
}
code := productser.VIPUp(uid)
common.ServeJSON(ctx, code, gin.H{})
}
//// VipRecommend doc
//// @Summary vip推荐展示
//// @Description vip推荐展示
//// @Tags vip
//// @Accept mpfd,json
//// @Produce json,html
//// @Success 200 {object} productmod.Product
//// @Failure 400 {string} json "{"msg": "操作失败"}"
//// @Router /api/app/vip/recommend [get]
//func VipRecommend(ctx *gin.Context) {
// resp, err := productser.GetRecommendVip()
// if err != nil {
// common.ServeJSON(ctx, stderr.ErrDbQueryError, err)
// return
// }
// common.ServeJSON(ctx, stderr.Success, resp)
//}