Skip to content

Commit 6765bd9

Browse files
author
liuhang
committed
增加网站统计信息
1 parent 0aeed7b commit 6765bd9

File tree

4 files changed

+53
-4
lines changed

4 files changed

+53
-4
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
mysql_data/

cmd/server/internal/handler/article_handler.go

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,19 @@ import (
44
"blog_platform/cmd/server/internal/repository"
55
"net/http"
66
"github.com/gin-gonic/gin"
7+
"time"
78
)
89

910
type ArticleHandler struct {
1011
Repo repository.ArticleRepository
12+
StartTime time.Time
1113
}
1214

13-
func NewArticleHandler(repo repository.ArticleRepository) *ArticleHandler {
14-
return &ArticleHandler{Repo: repo}
15+
func NewArticleHandler(repo repository.ArticleRepository, startTime time.Time) *ArticleHandler {
16+
return &ArticleHandler{
17+
Repo: repo,
18+
StartTime: startTime,
19+
}
1520
}
1621

1722
// RecordArticleVisit 处理 POST /api/article/visit
@@ -39,4 +44,24 @@ func (h *ArticleHandler) RecordArticleVisit(c *gin.Context) {
3944
"path": req.Path,
4045
"views": count,
4146
})
47+
}
48+
49+
// GetSiteInfo 处理 GET /api/site/info
50+
func (h *ArticleHandler) GetSiteInfo(c *gin.Context) {
51+
// 从数据库查统计
52+
totalViews, totalArticles, err := h.Repo.GetSiteStats()
53+
if err != nil {
54+
c.JSON(http.StatusInternalServerError, gin.H{"error": "数据库查询失败"})
55+
return
56+
}
57+
58+
// 计算运行时间 (当前时间 - 启动时间)
59+
uptime := time.Since(h.StartTime)
60+
61+
c.JSON(http.StatusOK, gin.H{
62+
"total_views": totalViews,
63+
"total_articles": totalArticles,
64+
"uptime_seconds": int64(uptime.Seconds()), // 返回秒数,前端处理成 "xx天xx小时" 更灵活
65+
"start_time": h.StartTime.Format(time.RFC3339),
66+
})
4267
}

cmd/server/internal/repository/article_repo.go

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ import (
66
"gorm.io/gorm/clause"
77
)
88

9-
// 定义接口,方便未来做单元测试或更换数据库
109
type ArticleRepository interface {
1110
IncreaseViewCount(path string) (int64, error)
11+
GetSiteStats() (int64, int64, error)
1212
}
1313

1414
type articleRepo struct {
@@ -38,4 +38,24 @@ func (r *articleRepo) IncreaseViewCount(path string) (int64, error) {
3838
var stat model.ArticleStat
3939
err = r.db.Select("view_count").Where("path = ?", path).First(&stat).Error
4040
return stat.ViewCount, err
41+
}
42+
43+
func (r *articleRepo) GetSiteStats() (int64, int64, error) {
44+
var totalViews int64
45+
var totalArticles int64
46+
47+
// 计算总阅读量 (SUM view_count)
48+
// COALESCE 防止没有数据时返回 NULL 导致报错
49+
err := r.db.Model(&model.ArticleStat{}).Select("COALESCE(SUM(view_count), 0)").Scan(&totalViews).Error
50+
if err != nil {
51+
return 0, 0, err
52+
}
53+
54+
// 计算文章总数 (COUNT)
55+
err = r.db.Model(&model.ArticleStat{}).Count(&totalArticles).Error
56+
if err != nil {
57+
return 0, 0, err
58+
}
59+
60+
return totalViews, totalArticles, nil
4161
}

cmd/server/main.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"blog_platform/cmd/server/internal/repository"
77
"log"
88
"os"
9+
"time"
910

1011
"github.com/gin-contrib/cors"
1112
"github.com/gin-gonic/gin"
@@ -23,11 +24,12 @@ func main() {
2324
if err != nil {
2425
log.Fatal("无法连接数据库: ", err)
2526
}
27+
siteFoundingDate := time.Date(2025, 12, 10, 0, 0, 0, 0, time.Local)
2628

2729
db.AutoMigrate(&model.ArticleStat{})
2830

2931
articleRepo := repository.NewArticleRepo(db)
30-
articleHandler := handler.NewArticleHandler(articleRepo)
32+
articleHandler := handler.NewArticleHandler(articleRepo, siteFoundingDate)
3133

3234
r := gin.Default()
3335

@@ -42,6 +44,7 @@ func main() {
4244
api := r.Group("/api")
4345
{
4446
api.POST("/article/visit", articleHandler.RecordArticleVisit)
47+
api.GET("/site/info", articleHandler.GetSiteInfo)
4548
}
4649

4750
log.Println("服务启动在 :8080")

0 commit comments

Comments
 (0)