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 }