Files
huangguo_server/app/service/officialWebsiteser/news.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

164 lines
4.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 与 seoSlug24 位 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
}