Files
huangguo_server/app/service/officialWebsiteser/hero.go
T
rootandClaude Opus 5 8679200f41 Initial commit
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 13:57:10 +08:00

315 lines
8.2 KiB
Go

package officialWebsiteser
import (
"91porn-server/common"
"91porn-server/models/v/officialWebsitemod"
"sync"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
"go.mongodb.org/mongo-driver/mongo/options"
)
type HeroListReq struct {
SortType int `json:"sortType" form:"sortType"` // 1: 最多粉丝,2: 最新加入,3:后管排序
PageNumber int64 `json:"pageNumber" form:"pageNumber"`
PageSize int64 `json:"pageSize" form:"pageSize"`
}
type HeroListResp struct {
HasNext bool `json:"hasNext"`
List []*HeroResp `json:"list"`
}
type HeroResp struct {
ID string `json:"id"`
Name string `json:"name"`
SeoSlug string `json:"seoSlug"`
Avatar string `json:"avatar"`
FansCount int64 `json:"fansCount"`
Cover string `json:"cover"`
}
func HeroList(req *HeroListReq) (resp HeroListResp, err error) {
var sort = bson.M{}
switch req.SortType {
case 2:
sort["createdAt"] = -1
case 3:
sort["sort"] = -1
default:
sort["fansCount"] = -1
}
// 分页查询时,查询一条多的数据来判断是否有下一页数据
var skip, limit = transPageAndPageNumber(req.PageSize, req.PageNumber)
var ops = options.Find().SetSort(sort).SetSkip(skip).SetLimit(limit + 1)
data, err := (&officialWebsitemod.Hero{}).FindMany(bson.M{"isActive": true}, ops)
if err != nil {
return
}
resp = HeroListResp{
HasNext: len(data) > int(limit),
List: make([]*HeroResp, 0),
}
for _, v := range data {
hero := &HeroResp{
ID: v.ID.Hex(),
Name: v.Name,
SeoSlug: v.SeoSlug,
Avatar: v.Avatar,
FansCount: v.FansCount,
Cover: v.Cover,
}
resp.List = append(resp.List, hero)
}
// 如果HasNext为true,说明还有下一页数,去除多查询的一条数据
if resp.HasNext {
resp.List = resp.List[:len(resp.List)-1]
}
return
}
type HeroDetailReq struct {
ID string `uri:"id" binding:"required"`
}
type HeroDetailResp struct {
ID string `json:"id"`
Name string `json:"name"`
SeoSlug string `json:"seoSlug"`
Avatar string `json:"avatar"`
Height int64 `json:"height"`
Bust int64 `json:"bust"`
Waist int64 `json:"waist"`
Hip int64 `json:"hip"`
Description string `json:"description"`
FansCount int64 `json:"fansCount"`
Cover string `json:"cover"`
Partners []HeroDetailPartner `json:"partners"`
Albums []HeroDetailAlbum `json:"albums"`
Videos []HeroDetailVideo `json:"videos"`
Photograph []Photograph `json:"photograph"`
}
type HeroDetailAlbum struct {
ID string `json:"id"`
Title string `json:"title"`
SeoSlug string `json:"seoSlug"`
Description string `json:"description"`
Cover string `json:"cover"`
Tags []HeroDetailTag `json:"tags"`
IsHot bool `json:"isHot"`
}
type HeroDetailVideo struct {
ID string `json:"id"`
Title string `json:"title"`
SeoSlug string `json:"seoSlug"`
Description string `json:"description"`
Cover string `json:"cover"`
Url string `json:"url"`
Tags []HeroDetailTag `json:"tags"`
IsHot bool `json:"isHot"`
}
type HeroDetailPartner struct {
ID string `json:"id"`
Name string `json:"name"`
Url string `json:"url"`
Logo string `json:"logo"`
}
type Photograph struct {
ID string `json:"id" bson:"_id,omitempty"`
Name string `json:"name" bson:"name"`
Description string `json:"description" bson:"description"`
Cover string `json:"cover" bson:"cover"`
Photos []string `json:"photos" bson:"photos"`
}
type HeroDetailTag struct {
ID string `json:"id"`
Name string `json:"name"`
}
func HeroDetail(req *HeroDetailReq) (resp *HeroDetailResp, err error) {
filter := bson.M{"isActive": true}
if id, e := primitive.ObjectIDFromHex(req.ID); e == nil {
filter["_id"] = id
} else {
filter["seoSlug"] = req.ID
}
hero := &officialWebsitemod.Hero{}
err = hero.FindOne(filter)
if err != nil {
return nil, err
}
resp = &HeroDetailResp{
ID: hero.ID.Hex(),
Name: hero.Name,
SeoSlug: hero.SeoSlug,
Avatar: hero.Avatar,
Height: hero.Height,
Bust: hero.Bust,
Waist: hero.Waist,
Hip: hero.Hip,
Description: hero.Description,
FansCount: hero.FansCount,
Cover: hero.Cover,
Partners: make([]HeroDetailPartner, 0),
Albums: make([]HeroDetailAlbum, 0),
Videos: make([]HeroDetailVideo, 0),
}
wg := sync.WaitGroup{}
wg.Add(4)
// 查询合作伙伴
common.Go(func() {
defer wg.Done()
resp.Partners, err = getHeroDetailPartners(hero.Partners)
if err != nil {
return
}
})
// 查询专辑
common.Go(func() {
defer wg.Done()
resp.Albums, err = getHeroDetailAlbums(hero.ID)
if err != nil {
return
}
})
// 查询视频
common.Go(func() {
defer wg.Done()
resp.Videos, err = getHeroDetailVideos(hero.ID)
if err != nil {
return
}
})
common.Go(func() {
defer wg.Done()
resp.Photograph, err = getHeroDetailPhotograph(hero.ID)
})
wg.Wait()
return
}
func getHeroDetailAlbums(heroID primitive.ObjectID) (albums []HeroDetailAlbum, err error) {
var albumMod = &officialWebsitemod.Album{}
var filters = bson.M{"heroID": heroID}
albumsData, err := albumMod.FindMany(filters, options.Find().SetSort(bson.D{{Key: "isHot", Value: -1}, {Key: "createdAt", Value: -1}}).SetLimit(10))
if err != nil {
return nil, err
}
albums = make([]HeroDetailAlbum, 0)
for _, v := range albumsData {
tags := make([]HeroDetailTag, 0)
for _, t := range v.Tags {
tags = append(tags, HeroDetailTag{
ID: t.ID.Hex(),
Name: t.Name,
})
}
albums = append(albums, HeroDetailAlbum{
ID: v.ID.Hex(),
Title: v.Title,
SeoSlug: v.SeoSlug,
Description: v.Description,
Cover: v.Cover,
IsHot: v.IsHot,
Tags: tags,
})
}
return
}
func getHeroDetailVideos(heroID primitive.ObjectID) (videos []HeroDetailVideo, err error) {
var videoMod = &officialWebsitemod.Video{}
var filters = bson.M{"heroID": heroID}
videosData, err := videoMod.FindMany(filters, options.Find().SetSort(bson.D{{Key: "isHot", Value: -1}, {Key: "createdAt", Value: -1}}).SetLimit(10))
if err != nil {
return nil, err
}
videos = make([]HeroDetailVideo, 0)
for _, v := range videosData {
tags := make([]HeroDetailTag, 0)
for _, t := range v.Tags {
tags = append(tags, HeroDetailTag{
ID: t.ID.Hex(),
Name: t.Name,
})
}
videos = append(videos, HeroDetailVideo{
ID: v.ID.Hex(),
Title: v.Title,
SeoSlug: v.SeoSlug,
Description: v.Description,
Cover: v.Cover,
Url: v.Url,
IsHot: v.IsHot,
Tags: tags,
})
}
return
}
func getHeroDetailPartners(partnerIds []primitive.ObjectID) (partners []HeroDetailPartner, err error) {
var partnerMod = &officialWebsitemod.Partner{}
var filters = bson.M{"_id": bson.M{"$in": partnerIds}, "isActive": true}
partnersData, err := partnerMod.FindMany(filters)
if err != nil {
return nil, err
}
partners = make([]HeroDetailPartner, 0)
for i := range partnerIds { // 保持合作伙伴的顺序和Hero中的一致,由后管控制
for _, v := range partnersData {
if v.ID == partnerIds[i] {
partners = append(partners, HeroDetailPartner{
ID: v.ID.Hex(),
Name: v.Name,
Url: v.Url,
Logo: v.Logo,
})
}
}
}
return
}
func getHeroDetailPhotograph(heroID primitive.ObjectID) (photograph []Photograph, err error) {
var photographMod = &officialWebsitemod.Photograph{}
var filters = bson.M{"heroId": heroID, "isActive": true}
photographData, err := photographMod.FindMany(filters, options.Find().SetSort(bson.D{{Key: "createdAt", Value: -1}}).SetLimit(10))
if err != nil {
return
}
photograph = make([]Photograph, 0)
for _, v := range photographData {
ph := Photograph{
ID: v.ID.Hex(),
Name: v.Name,
Description: v.Description,
Cover: v.Cover,
Photos: v.Photos,
}
photograph = append(photograph, ph)
}
return
}