@@ -0,0 +1,163 @@
|
||||
package officialWebsiteser
|
||||
|
||||
import (
|
||||
"91porn-server/models/v/officialWebsitemod"
|
||||
"time"
|
||||
|
||||
"go.mongodb.org/mongo-driver/bson"
|
||||
"go.mongodb.org/mongo-driver/bson/primitive"
|
||||
"go.mongodb.org/mongo-driver/mongo/options"
|
||||
)
|
||||
|
||||
type NewsListReq struct {
|
||||
PageNumber int64 `form:"PageNumber"`
|
||||
PageSize int64 `form:"pageSize"`
|
||||
}
|
||||
|
||||
type NewsListResp struct {
|
||||
HasNext bool `json:"hasNext"`
|
||||
List []*NewsResp `json:"list"`
|
||||
}
|
||||
|
||||
type NewsResp 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 []NewsTagResp `json:"tags"`
|
||||
CreatedAt time.Time `json:"createdAt,omitempty" bson:"createdAt,omitempty"`
|
||||
}
|
||||
|
||||
type NewsTagResp struct {
|
||||
ID string `json:"id,omitempty" bson:"_id,omitempty"`
|
||||
Name string `json:"name,omitempty" bson:"name,omitempty"`
|
||||
Type string `json:"type,omitempty" bson:"type,omitempty"`
|
||||
IsHot bool `json:"isHot,omitempty" bson:"isHot,omitempty"`
|
||||
}
|
||||
|
||||
func NewsList(req *NewsListReq) (resp *NewsListResp, err error) {
|
||||
var filter = bson.M{"isActive": true}
|
||||
var newsMod = &officialWebsitemod.News{}
|
||||
var skip, limit = transPageAndPageNumber(req.PageSize, req.PageNumber)
|
||||
data, err := newsMod.FindMany(filter, options.Find().SetSort(bson.D{{Key: "isHot", Value: -1}, {Key: "sort", Value: -1}, {Key: "createdAt", Value: -1}}).SetSkip(skip).SetLimit(limit+1))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
resp = &NewsListResp{
|
||||
HasNext: len(data) > int(limit),
|
||||
List: make([]*NewsResp, 0),
|
||||
}
|
||||
for _, v := range data {
|
||||
newsResp := &NewsResp{
|
||||
ID: v.ID.Hex(),
|
||||
Title: v.Title,
|
||||
SeoSlug: v.SeoSlug,
|
||||
Description: v.Description,
|
||||
Cover: v.Cover,
|
||||
Url: v.Url,
|
||||
CreatedAt: v.CreatedAt,
|
||||
}
|
||||
for _, tag := range v.Tags {
|
||||
newsResp.Tags = append(newsResp.Tags, NewsTagResp{
|
||||
ID: tag.ID.Hex(),
|
||||
Name: tag.Name,
|
||||
Type: tag.Type,
|
||||
IsHot: tag.IsHot,
|
||||
})
|
||||
}
|
||||
resp.List = append(resp.List, newsResp)
|
||||
}
|
||||
if resp.HasNext {
|
||||
resp.List = resp.List[:len(resp.List)-1]
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
type NewsDetailReq struct {
|
||||
ID string `uri:"id" binding:"required"`
|
||||
RelatedPageNumber int64 `form:"RelatedPageNumber"`
|
||||
RelatedPageSize int64 `form:"RelatedPageSize"`
|
||||
}
|
||||
|
||||
type NewsDetailResp 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 []NewsTagResp `json:"tags"`
|
||||
Detail string `json:"detail"`
|
||||
Related []*NewsResp `json:"related"`
|
||||
CreatedAt time.Time `json:"createdAt"`
|
||||
}
|
||||
|
||||
func NewsDetail(req *NewsDetailReq) (resp NewsDetailResp, err error) {
|
||||
// 兼容 id 与 seoSlug:24 位 hex 按 _id 查,否则按 seoSlug 查
|
||||
var filter = bson.M{"isActive": true}
|
||||
if id, e := primitive.ObjectIDFromHex(req.ID); e == nil {
|
||||
filter["_id"] = id
|
||||
} else {
|
||||
filter["seoSlug"] = req.ID
|
||||
}
|
||||
var newsMod = &officialWebsitemod.News{}
|
||||
err = newsMod.FindOne(filter)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
resp = NewsDetailResp{
|
||||
ID: newsMod.ID.Hex(),
|
||||
Title: newsMod.Title,
|
||||
SeoSlug: newsMod.SeoSlug,
|
||||
Description: newsMod.Description,
|
||||
Cover: newsMod.Cover,
|
||||
Url: newsMod.Url,
|
||||
Detail: newsMod.Detail,
|
||||
CreatedAt: newsMod.CreatedAt,
|
||||
}
|
||||
var tagIDs []primitive.ObjectID
|
||||
for _, tag := range newsMod.Tags {
|
||||
resp.Tags = append(resp.Tags, NewsTagResp{
|
||||
ID: tag.ID.Hex(),
|
||||
Name: tag.Name,
|
||||
Type: tag.Type,
|
||||
IsHot: tag.IsHot,
|
||||
})
|
||||
tagIDs = append(tagIDs, tag.ID)
|
||||
}
|
||||
|
||||
if len(resp.Tags) > 0 {
|
||||
// 组装 Related,根据tagIDs搜索,并按照排序
|
||||
filter = bson.M{"tags._id": bson.M{"$in": tagIDs}, "isActive": true}
|
||||
} else {
|
||||
filter = bson.M{"isActive": true}
|
||||
}
|
||||
skip, limit := transPageAndPageNumber(req.RelatedPageSize, req.RelatedPageNumber)
|
||||
data, err := newsMod.FindMany(filter, options.Find().SetSort(bson.D{{Key: "isHot", Value: -1}, {Key: "sort", Value: -1}, {Key: "createdAt", Value: -1}}).SetSkip(skip).SetLimit(limit))
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
for _, v := range data {
|
||||
newsResp := &NewsResp{
|
||||
ID: v.ID.Hex(),
|
||||
Title: v.Title,
|
||||
SeoSlug: v.SeoSlug,
|
||||
Description: v.Description,
|
||||
Cover: v.Cover,
|
||||
Url: v.Url,
|
||||
CreatedAt: v.CreatedAt,
|
||||
}
|
||||
for _, tag := range v.Tags {
|
||||
newsResp.Tags = append(newsResp.Tags, NewsTagResp{
|
||||
ID: tag.ID.Hex(),
|
||||
Name: tag.Name,
|
||||
Type: tag.Type,
|
||||
IsHot: tag.IsHot,
|
||||
})
|
||||
}
|
||||
resp.Related = append(resp.Related, newsResp)
|
||||
}
|
||||
return
|
||||
}
|
||||
Reference in New Issue
Block a user