合作页面的内容
This commit is contained in:
91
server/repositories/log_repository.go
Normal file
91
server/repositories/log_repository.go
Normal file
@@ -0,0 +1,91 @@
|
||||
package repositories
|
||||
|
||||
import (
|
||||
"github.com/niangaodev/art-code/config"
|
||||
"github.com/niangaodev/art-code/models"
|
||||
)
|
||||
|
||||
// CreateAccessLog 创建访问日志
|
||||
func CreateAccessLog(log *models.AccessLog) error {
|
||||
query := `INSERT INTO access_logs (ip, user_agent, path, method, status_code, response_time, region) VALUES (?, ?, ?, ?, ?, ?, ?)`
|
||||
_, err := config.DB.Exec(query, log.IP, log.UserAgent, log.Path, log.Method, log.StatusCode, log.ResponseTime, log.Region)
|
||||
return err
|
||||
}
|
||||
|
||||
// GetDailyUV 获取最近7天UV
|
||||
func GetDailyUV() ([]struct {
|
||||
Date string
|
||||
Count int
|
||||
}, error) {
|
||||
query := `
|
||||
SELECT DATE_FORMAT(created_at, '%Y-%m-%d') as date, COUNT(DISTINCT ip) as count
|
||||
FROM access_logs
|
||||
WHERE created_at >= DATE_SUB(CURDATE(), INTERVAL 6 DAY)
|
||||
GROUP BY date
|
||||
ORDER BY date ASC
|
||||
`
|
||||
rows, err := config.DB.Query(query)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
|
||||
var results []struct {
|
||||
Date string
|
||||
Count int
|
||||
}
|
||||
for rows.Next() {
|
||||
var r struct {
|
||||
Date string
|
||||
Count int
|
||||
}
|
||||
if err := rows.Scan(&r.Date, &r.Count); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
results = append(results, r)
|
||||
}
|
||||
return results, nil
|
||||
}
|
||||
|
||||
// GetUserRegions 获取用户地域分布
|
||||
func GetUserRegions() ([]struct {
|
||||
Region string
|
||||
Count int
|
||||
}, error) {
|
||||
// 简单的截取省份逻辑,实际可能需要更复杂的解析,这里假设region格式为 国家|区域|省份|城市|ISP
|
||||
// 我们可以取省份 (第3部分)
|
||||
query := `
|
||||
SELECT
|
||||
SUBSTRING_INDEX(SUBSTRING_INDEX(region, '|', 3), '|', -1) as province,
|
||||
COUNT(DISTINCT ip) as count
|
||||
FROM access_logs
|
||||
WHERE region != 'Internal' AND region != 'Unknown' AND region IS NOT NULL
|
||||
GROUP BY province
|
||||
ORDER BY count DESC
|
||||
LIMIT 20
|
||||
`
|
||||
rows, err := config.DB.Query(query)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
|
||||
var results []struct {
|
||||
Region string
|
||||
Count int
|
||||
}
|
||||
for rows.Next() {
|
||||
var r struct {
|
||||
Region string
|
||||
Count int
|
||||
}
|
||||
if err := rows.Scan(&r.Region, &r.Count); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
// 过滤掉无效数据
|
||||
if r.Region != "" && r.Region != "0" {
|
||||
results = append(results, r)
|
||||
}
|
||||
}
|
||||
return results, nil
|
||||
}
|
||||
@@ -375,3 +375,75 @@ func BuildPostHistoryResponses(history []models.PostHistory) []models.PostHistor
|
||||
}
|
||||
return responses
|
||||
}
|
||||
|
||||
// GetNewPostsTrend 获取最近7天新增文章趋势
|
||||
func GetNewPostsTrend() ([]struct {
|
||||
Date string
|
||||
Count int
|
||||
}, error) {
|
||||
query := `
|
||||
SELECT DATE_FORMAT(created_at, '%Y-%m-%d') as date, COUNT(*) as count
|
||||
FROM posts
|
||||
WHERE created_at >= DATE_SUB(CURDATE(), INTERVAL 6 DAY)
|
||||
GROUP BY date
|
||||
ORDER BY date ASC
|
||||
`
|
||||
rows, err := config.DB.Query(query)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
|
||||
var results []struct {
|
||||
Date string
|
||||
Count int
|
||||
}
|
||||
for rows.Next() {
|
||||
var r struct {
|
||||
Date string
|
||||
Count int
|
||||
}
|
||||
if err := rows.Scan(&r.Date, &r.Count); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
results = append(results, r)
|
||||
}
|
||||
return results, nil
|
||||
}
|
||||
|
||||
// GetTopPosts 获取热门文章 (按阅读量)
|
||||
func GetTopPosts(limit int) ([]models.Post, error) {
|
||||
query := `
|
||||
SELECT id, title, category, date, excerpt, content, read_count, is_published, created_at, updated_at
|
||||
FROM posts
|
||||
WHERE is_published = 1
|
||||
ORDER BY read_count DESC
|
||||
LIMIT ?
|
||||
`
|
||||
rows, err := config.DB.Query(query, limit)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
|
||||
var posts []models.Post
|
||||
for rows.Next() {
|
||||
var post models.Post
|
||||
if err := rows.Scan(
|
||||
&post.ID,
|
||||
&post.Title,
|
||||
&post.Category,
|
||||
&post.Date,
|
||||
&post.Excerpt,
|
||||
&post.Content,
|
||||
&post.ReadCount,
|
||||
&post.IsPublished,
|
||||
&post.CreatedAt,
|
||||
&post.UpdatedAt,
|
||||
); err != nil {
|
||||
continue
|
||||
}
|
||||
posts = append(posts, post)
|
||||
}
|
||||
return posts, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user