This repository has been archived on 2026-06-21. You can view files and clone it, but cannot push or open issues or pull requests.
Files
MetaLab/internal/service/trends_service.go
Victor_Jay fcff28ab60 feat: Studio 概览/分析补上阅读量 + 详情页 meta 行改版
- StudioOverview 新增 TotalViews 字段,GetOverviewByUserID 查询含 SUM(views_count)
- 新增 ViewTrendStore 接口和 AggregateViewsByAuthor,UNION ALL 合并已登录+访客阅读日志按日期聚合
- 数据分析页面新增阅读量趋势折线图(绿色,Chart.js)
- 概览和数据分析页面新增总阅读量统计卡片
- 详情页 meta 行改为标签格式:作者/阅读/点赞/收藏/评论/发布时间
- 移除详情页公开状态徽章,已锁定+理由仅作者可见
2026-06-02 23:26:48 +08:00

94 lines
2.2 KiB
Go

package service
import (
"fmt"
"golang.org/x/sync/errgroup"
)
// TrendResult 趋势返回结构
type TrendResult struct {
Energy []TrendPoint `json:"energy"`
Comments []TrendPoint `json:"comments"`
Likes []TrendPoint `json:"likes"`
Favorites []TrendPoint `json:"favorites"`
Views []TrendPoint `json:"views"`
}
// TrendsService Studio 趋势分析服务
type TrendsService struct {
energyRepo EnergyTrendStore
commentRepo CommentTrendStore
likeRepo LikeTrendStore
favoriteRepo FavoriteTrendStore
viewRepo ViewTrendStore
}
// NewTrendsService 构造函数
func NewTrendsService(energyRepo EnergyTrendStore, commentRepo CommentTrendStore, likeRepo LikeTrendStore, favoriteRepo FavoriteTrendStore, viewRepo ViewTrendStore) *TrendsService {
return &TrendsService{
energyRepo: energyRepo,
commentRepo: commentRepo,
likeRepo: likeRepo,
favoriteRepo: favoriteRepo,
viewRepo: viewRepo,
}
}
// GetTrends 获取指定时间范围的趋势数据(并行查询四项趋势)
func (s *TrendsService) GetTrends(userID uint, since string) (*TrendResult, error) {
result := &TrendResult{}
g := new(errgroup.Group)
g.Go(func() error {
var err error
result.Energy, err = s.energyRepo.AggregateEnergyByAuthor(userID, since)
if err != nil {
return fmt.Errorf("查询赋能趋势: %w", err)
}
return nil
})
g.Go(func() error {
var err error
result.Comments, err = s.commentRepo.AggregateCommentsByAuthor(userID, since)
if err != nil {
return fmt.Errorf("查询评论趋势: %w", err)
}
return nil
})
g.Go(func() error {
var err error
result.Likes, err = s.likeRepo.AggregateLikesByAuthor(userID, since)
if err != nil {
return fmt.Errorf("查询点赞趋势: %w", err)
}
return nil
})
g.Go(func() error {
var err error
result.Favorites, err = s.favoriteRepo.AggregateFavoritesByAuthor(userID, since)
if err != nil {
return fmt.Errorf("查询收藏趋势: %w", err)
}
return nil
})
g.Go(func() error {
var err error
result.Views, err = s.viewRepo.AggregateViewsByAuthor(userID, since)
if err != nil {
return fmt.Errorf("查询阅读趋势: %w", err)
}
return nil
})
if err := g.Wait(); err != nil {
return nil, err
}
return result, nil
}