Initial commit

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-15 13:57:10 +08:00
co-authored by Claude Opus 5
commit 8679200f41
1897 changed files with 257900 additions and 0 deletions
+163
View File
@@ -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 与 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
}