315 lines
8.2 KiB
Go
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
|
|
}
|