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
+111
View File
@@ -0,0 +1,111 @@
package adser
import (
"time"
"91porn-server/common"
"91porn-server/models/v/adsmod"
"go.mongodb.org/mongo-driver/bson/primitive"
)
type AdRecord struct {
ID primitive.ObjectID `json:"id"` //广告id
AdsType adsmod.AdsType `json:"adsType"` //广告类型
Cover string `json:"cover"` //广告封面图
Size int `json:"size"` //尺寸 B
Height int `json:"height"` //高
Width int `json:"width"` //宽
Title string `json:"title"` //广告标题
HrefType adsmod.URLJumpType `json:"hrefType"` //广告链接类型
Href string `json:"href"` //广告跳转地址
Position adsmod.AdPosition `json:"position"` //广告位置
SortCode int `json:"sortCode"` //排序号
Active bool `json:"active"` //激活状态 true:激活
Click int `json:"click"` //点击次数
Remark string `json:"remark"` //备注
ReviewID primitive.ObjectID `json:"reviewID,omitempty"` //审核id
DistrictCode string `json:"districtCode"` //商区码
CreatedAt time.Time `json:"createdAt"` //创建时间
Start time.Time `json:"start"` //开始时间
End time.Time `json:"end"` //结束时间
}
type AdPage struct {
List []AdRecord `json:"list"`
Total int64 `json:"total"`
}
// AdPages 获取广告列表
func AdPages(skip, limit int64, idMatch adsmod.IDMatch, adsType adsmod.AdsTypeMatch, adsPositionMatch adsmod.AdPositionMatch, districtCodeMatch adsmod.DistrictCodeMatch) (AdPage, error) {
mats := []adsmod.Matcher{
idMatch.New(),
adsType.New(),
adsPositionMatch.New(),
districtCodeMatch.New(),
}
list, _ := adsmod.List(adsmod.Sort_createdAt_N1, &skip, &limit, mats...)
recordList := make([]AdRecord, len(list))
for i, v := range list {
recordList[i] = AdRecord{
ID: v.ID,
AdsType: v.AdsType,
Cover: v.Cover,
Size: v.Size,
Height: v.Height,
Width: v.Width,
Title: v.Title,
HrefType: v.HrefType,
Href: v.Href,
Position: v.Position,
SortCode: v.SortCode,
Active: v.Active,
Click: v.Click,
Remark: v.Remark,
ReviewID: v.ReviewID,
DistrictCode: v.DistrictCode,
CreatedAt: v.CreatedAt,
Start: v.Start,
End: v.End,
}
}
count, _ := adsmod.Count(mats...)
return AdPage{
recordList,
count,
}, nil
}
func IsValidAdPicture(pos adsmod.AdPosition, pictureProp common.PictureProp) error {
switch pos {
case adsmod.StartupPage: //启动页广告
if pictureProp.Height > 1560 || pictureProp.Width > 720 {
return ErrImgScale{}
}
case adsmod.HomeRecoSmall: //首页-推荐小广告
if pictureProp.Height > 620 || pictureProp.Width > 560 {
return ErrImgScale{}
}
case adsmod.HomePopupAnnou: //首页-弹窗公告
if pictureProp.Height > 1300 || pictureProp.Width > 656 {
return ErrImgScale{}
}
case adsmod.NotifyPage: //消息-界面广告
if pictureProp.Height > 260 || pictureProp.Width > 720 {
return ErrImgScale{}
}
case adsmod.LiaoCarousel: //撩吧-轮播广告
if pictureProp.Height > 500 || pictureProp.Width > 720 {
return ErrImgScale{}
}
case adsmod.WalletPage: //钱包-轮播广告
if pictureProp.Height > 120 || pictureProp.Width > 720 {
return ErrImgScale{}
}
case adsmod.SearchPage: //搜索-轮播广告
if pictureProp.Height > 360 || pictureProp.Width > 720 {
return ErrImgScale{}
}
}
return nil
}
+29
View File
@@ -0,0 +1,29 @@
package adser
type ErrImgURLInvalid struct {
}
func (ErrImgURLInvalid) Error() string {
return "picture url is invalid!"
}
type ErrImgTooBig struct {
}
func (ErrImgTooBig) Error() string {
return "picture is too big!"
}
type ErrImgScale struct {
}
func (ErrImgScale) Error() string {
return "picture cale is invalid!"
}
type ErrImgContent struct {
}
func (ErrImgContent) Error() string {
return "picture is invalid!"
}
+166
View File
@@ -0,0 +1,166 @@
package adser
import (
"time"
"91porn-server/common/db"
"91porn-server/models/v/adreviewmod"
"91porn-server/models/v/adsmod"
"91porn-server/web/webg"
"go.mongodb.org/mongo-driver/bson/primitive"
)
type ReviewRecord struct {
ID primitive.ObjectID `json:"id"` //id
DistrictCode string `json:"districtCode"` //商区码
OptType adreviewmod.OptType `json:"optType"` //操作类型
ApplyAt time.Time `json:"applyAt"` //申请时间
PassAt time.Time `json:"passAt"` //通过时间
RefussAt time.Time `json:"refussAt"` //拒绝时间
Reviewer string `json:"reviewer"` //审核人
ReviewStatus adreviewmod.ReviewStatus `json:"reviewStatus"` //审核状态
Remark string `json:"remark"` //备注
ReceiptInfo string `json:"receiptInfo"` //回执信息
ADID primitive.ObjectID `json:"adID"` //广告id
Title string `json:"title"` //广告标题
Cover string `json:"cover"` //广告封面图
Size int `json:"size"` //尺寸 单位:B
Height int `json:"height"`
Width int `json:"width"`
HrefType adsmod.URLJumpType `json:"hrefType"` //广告链接类型
Href string `json:"href"` //广告跳转地址
Position adsmod.AdPosition `json:"position"` //广告位置
SortCode int `json:"sortCode"` //排序号
}
type ReviewPage struct {
List []ReviewRecord `json:"list"`
Total int64 `json:"total"`
}
// ReviewPages 获取广告列表
func ReviewPages(skip, limit int64, idMatch adreviewmod.IDMatch, reviewStatusMatch adreviewmod.ReviewStatusMatch, districtCodeMatch adreviewmod.DistrictCodeMatch) (ReviewPage, error) {
mats := []adreviewmod.Matcher{
idMatch.New(),
reviewStatusMatch.New(),
districtCodeMatch.New(),
}
list, err := adreviewmod.List(adreviewmod.Sort_createdAt_N1, &skip, &limit, mats...)
if err != nil {
return ReviewPage{}, nil
}
recordList := make([]ReviewRecord, len(list))
for i, v := range list {
recordList[i] = ReviewRecord{
ID: v.ID,
DistrictCode: v.DistrictCode,
OptType: v.OptType,
PassAt: v.PassAt,
RefussAt: v.RefussAt,
Reviewer: v.Reviewer,
ReviewStatus: v.ReviewStatus,
ADID: v.ADID,
Cover: v.Cover,
Size: v.Size,
Height: v.Height,
Width: v.Width,
Title: v.Title,
HrefType: v.HrefType,
Href: v.Href,
Position: adsmod.AdPosition(v.Position),
SortCode: v.SortCode,
Remark: v.Remark,
ReceiptInfo: v.ReceiptInfo,
ApplyAt: v.ApplyAt,
}
}
count, err := adreviewmod.Count(mats...)
if err != nil {
return ReviewPage{}, nil
}
return ReviewPage{
recordList,
count,
}, nil
}
func CheckRefuse(id primitive.ObjectID, reviewer string, receiptInfo string) error {
return adreviewmod.UpdateReviewByID(id, adreviewmod.Processong, adreviewmod.Refuse, nil, reviewer, receiptInfo, time.Now())
}
func CheckPass(id primitive.ObjectID, adsType adsmod.AdsType, reviewer string, receiptInfo string, startTime, endTime time.Time) error {
adR, err := adreviewmod.FindOneByID(id)
if err != nil {
return err
}
now := time.Now()
position := adsmod.AdPosition(adR.Position)
reviewInfo := adsmod.ReviewInfo{
ReviewID: adR.ID,
ReviewAt: &now,
Reviewer: &reviewer,
}
insDoc := adsmod.InsertDoc{
AdsType: adsType,
Cover: adR.Cover,
Title: adR.Title,
HrefType: adR.HrefType,
Href: adR.Href,
Position: position,
SortCode: adR.SortCode,
Active: true,
Remark: receiptInfo,
DistrictCode: adR.DistrictCode,
ReviewInfo: reviewInfo,
CreatedAt: now,
CoverProp: adR.CoverProp,
Start: startTime,
End: endTime,
}
t := true
upDoc := adsmod.UpdateDoc{
Title: &adR.Title,
Cover: &adR.Cover,
HrefType: &adR.HrefType,
Href: &adR.Href,
Position: &position,
SortCode: &adR.SortCode,
Active: &t,
Remark: &receiptInfo,
ReviewInfo: reviewInfo,
UpdatedAt: now,
CoverProp: adR.CoverProp,
Start: &startTime,
End: &endTime,
}
return webg.VideoDB.Trans(func(t *db.MongoTool) error {
if adR.ADID.IsZero() {
adID, err := adsmod.InsertOne(t, insDoc)
if err != nil {
return err
}
return adreviewmod.UpdateReviewByID(id, adreviewmod.Processong, adreviewmod.Pass, &adID, reviewer, receiptInfo, now)
}
if err := adsmod.UpdateOneByID(t, adR.ADID, upDoc); err != nil {
return err
}
return adreviewmod.UpdateReviewByID(id, adreviewmod.Processong, adreviewmod.Pass, nil, reviewer, receiptInfo, now)
})
}
func DeleteAd(adID, arID *primitive.ObjectID) error {
return webg.VideoDB.Trans(func(t *db.MongoTool) error {
if adID != nil {
if err := adsmod.DeleteOne(t, *adID); err != nil {
return err
}
}
if arID != nil {
if err := adreviewmod.DeleteOne(t, *arID); err != nil {
return err
}
}
return nil
})
}