feat: implement comprehensive reading analytics system with bot detection
Features: - Add article view tracking with automatic deduplication (per user/IP) - Implement intelligent bot detection (35+ patterns: Google, Bing, Baidu, GPTBot, etc) - Create admin analytics dashboard with statistics and filtering - Display view count and comment count on article cards - Add search-based article filter (replaced dropdown for scalability) Analytics Dashboard: - Global stats: total views, human/bot views, unique IPs/users - Top 20 articles ranking with detailed metrics - Detailed view records with time, article, user, IP, user-agent - Filters: article title search, IP search, show/hide bots - Pagination support (50 records per page) Technical Implementation: - Async view recording (non-blocking) - Dual deduplication (application + database layer) - Database indexes for performance optimization - Batch query for comment counts - Full i18n support (Chinese/English) Files Added: - models/article_view.go: View tracking model - models/bot_detector.go: Bot detection logic - handlers/admin_analytics.go: Analytics page handler - templates/admin/analytics_views.html: Analytics UI - test_analytics.sh: Testing script - Documentation: implementation guide, usage guide, changelog Files Modified: - handlers/home.go: Add view recording and comment count queries - models/db.go: Add ArticleView to auto-migration - main.go: Add analytics routes - i18n/i18n.go: Add 35+ translation keys - templates/admin/dashboard.html: Add analytics entry link - templates/pages/home.html: Display view/comment counts on cards Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,239 @@
|
||||
# 阅读统计系统实现总结
|
||||
|
||||
## 已完成功能
|
||||
|
||||
### 1. 数据库模型
|
||||
✅ **ArticleView 模型** (`models/article_view.go`)
|
||||
- 记录每次独特的阅读
|
||||
- 字段:文章ID、用户ID(可为NULL)、IP地址、User-Agent、是否为爬虫
|
||||
- 包含去重逻辑(BeforeCreate hook)
|
||||
- 建立了必要的索引
|
||||
|
||||
✅ **爬虫检测** (`models/bot_detector.go`)
|
||||
- 基于User-Agent的模式匹配
|
||||
- 支持主流搜索引擎爬虫、社交媒体爬虫、AI爬虫等
|
||||
- 包含35+种常见爬虫特征
|
||||
|
||||
### 2. 阅读记录功能
|
||||
✅ **自动记录** (`handlers/home.go`)
|
||||
- 在文章详情页自动记录阅读
|
||||
- 异步执行(goroutine)不阻塞页面响应
|
||||
- 同一用户/IP只记录一次(去重)
|
||||
- 自动识别并标记爬虫
|
||||
|
||||
### 3. 后台统计页面
|
||||
✅ **统计Dashboard** (`handlers/admin_analytics.go`)
|
||||
- 全局统计:总阅读量、真人阅读、爬虫访问、独立IP、独立用户
|
||||
- 文章排行榜:前20篇文章的详细统计
|
||||
- 详细访问记录:时间、文章、用户、IP、User-Agent、是否爬虫
|
||||
- 强大的筛选功能:按文章、IP、是否显示爬虫
|
||||
- 分页支持(每页50条)
|
||||
|
||||
✅ **精美模板** (`templates/admin/analytics_views.html`)
|
||||
- 响应式设计
|
||||
- 彩色统计卡片
|
||||
- 表格展示详细数据
|
||||
- 爬虫记录高亮显示(橙色背景)
|
||||
- 筛选表单
|
||||
- 分页加载
|
||||
|
||||
### 4. 国际化支持
|
||||
✅ **中英文翻译** (`i18n/i18n.go`)
|
||||
- 添加了35+个翻译key
|
||||
- 完整的中英文对照
|
||||
|
||||
### 5. 路由和集成
|
||||
✅ **路由配置** (`main.go`)
|
||||
- `/admin/analytics/views` - 阅读统计页面
|
||||
- 管理员权限保护
|
||||
|
||||
✅ **数据库迁移** (`models/db.go`)
|
||||
- ArticleView表已加入自动迁移
|
||||
|
||||
✅ **导航入口** (`templates/admin/dashboard.html`)
|
||||
- 后台首页添加"阅读统计"按钮
|
||||
|
||||
## 功能特性
|
||||
|
||||
### 去重机制
|
||||
1. **应用层去重**:在recordArticleView函数中查询现有记录
|
||||
2. **数据库层去重**:BeforeCreate hook二次检查
|
||||
3. **组合键**:article_id + user_id + ip(匿名用户user_id为NULL)
|
||||
|
||||
### 爬虫识别
|
||||
检测的爬虫类型:
|
||||
- 搜索引擎:Google, Bing, Baidu, Yandex等
|
||||
- 社交媒体:Facebook, Twitter, LinkedIn等
|
||||
- AI爬虫:GPTBot, ClaudeBot, Anthropic-AI
|
||||
- SEO工具:Ahrefs, SEMrush, Moz等
|
||||
- 无头浏览器:Headless, Phantom, Puppeteer
|
||||
|
||||
### 性能优化
|
||||
- ✅ 异步记录(goroutine)
|
||||
- ✅ 数据库索引优化
|
||||
- ✅ 分页加载(50条/页)
|
||||
- ✅ 最佳实践:忽略记录错误,不影响用户体验
|
||||
|
||||
### 安全性
|
||||
- ✅ 管理员权限保护
|
||||
- ✅ 使用c.ClientIP()获取真实IP(处理代理头)
|
||||
- ✅ SQL注入防护(GORM参数化查询)
|
||||
- ✅ XSS防护(模板自动转义)
|
||||
|
||||
## 使用说明
|
||||
|
||||
### 启动应用
|
||||
```bash
|
||||
./go_blog
|
||||
```
|
||||
|
||||
### 访问统计页面
|
||||
1. 以管理员身份登录
|
||||
2. 访问后台首页
|
||||
3. 点击"阅读统计"按钮
|
||||
4. 或直接访问:`http://localhost:PORT/admin/analytics/views`
|
||||
|
||||
### 查看统计数据
|
||||
**全局统计卡片**:
|
||||
- 总阅读量:所有记录数
|
||||
- 真人阅读:排除爬虫的阅读数
|
||||
- 爬虫访问:被标记为爬虫的访问数
|
||||
- 独立IP:不同IP地址数
|
||||
- 独立用户:已登录用户数
|
||||
|
||||
**文章排行榜**:
|
||||
- 显示阅读量最高的20篇文章
|
||||
- 每篇文章显示:总阅读、真人阅读、爬虫访问、独立IP
|
||||
|
||||
**详细访问记录**:
|
||||
- 时间、文章标题(可点击)、用户名、IP地址、User-Agent
|
||||
- 爬虫记录以橙色背景高亮
|
||||
- 真人显示绿色标签,爬虫显示橙色标签
|
||||
|
||||
### 使用筛选功能
|
||||
- **按文章筛选**:下拉选择特定文章
|
||||
- **按IP筛选**:输入IP地址(支持部分匹配)
|
||||
- **显示爬虫**:勾选以包含爬虫流量
|
||||
- 点击"应用筛选"查看结果
|
||||
|
||||
### 分页浏览
|
||||
- 每页显示50条记录
|
||||
- 底部显示"加载更多"按钮
|
||||
- 筛选条件在翻页时保持
|
||||
|
||||
## 技术细节
|
||||
|
||||
### 数据模型
|
||||
```go
|
||||
type ArticleView struct {
|
||||
ID uint
|
||||
CreatedAt time.Time
|
||||
ArticleID uint
|
||||
UserID *uint // NULL for anonymous
|
||||
IP string
|
||||
UserAgent string
|
||||
IsBot bool
|
||||
Article Article
|
||||
User *User
|
||||
}
|
||||
```
|
||||
|
||||
### 索引
|
||||
- `idx_article_views_article` on `article_id`
|
||||
- `idx_article_views_user` on `user_id`
|
||||
- `idx_article_views_ip` on `ip`
|
||||
- `idx_article_views_bot` on `is_bot`
|
||||
|
||||
### 异步记录
|
||||
```go
|
||||
// 不阻塞页面响应
|
||||
go recordArticleView(db, article.ID, c)
|
||||
```
|
||||
|
||||
## 扩展建议
|
||||
|
||||
### 未来可添加的功能
|
||||
1. **图表可视化**
|
||||
- 阅读趋势图(按天/周/月)
|
||||
- 访客地理分布
|
||||
- 浏览器/设备统计
|
||||
|
||||
2. **高级分析**
|
||||
- 用户阅读路径分析
|
||||
- 文章热度变化趋势
|
||||
- 访问高峰时段分析
|
||||
|
||||
3. **性能优化**
|
||||
- Redis缓存统计数据
|
||||
- 定期归档旧数据
|
||||
- 批量写入优化
|
||||
|
||||
4. **导出功能**
|
||||
- CSV/Excel导出
|
||||
- 自定义报表生成
|
||||
- 定期邮件报告
|
||||
|
||||
5. **实时监控**
|
||||
- WebSocket实时访问流
|
||||
- 在线访客数量
|
||||
- 实时热门文章
|
||||
|
||||
## 测试验证
|
||||
|
||||
### 编译状态
|
||||
✅ 代码编译成功(无错误)
|
||||
|
||||
### 验证清单
|
||||
- ✅ 数据库模型创建
|
||||
- ✅ 爬虫检测逻辑
|
||||
- ✅ 文章详情页集成
|
||||
- ✅ 后台handler实现
|
||||
- ✅ 前端模板创建
|
||||
- ✅ 国际化翻译
|
||||
- ✅ 路由配置
|
||||
- ✅ 数据库迁移
|
||||
- ✅ 导航入口
|
||||
|
||||
### 建议测试步骤
|
||||
1. ✅ 启动应用,确认数据库迁移成功
|
||||
2. ✅ 访问多篇文章,生成测试数据
|
||||
3. ✅ 访问 `/admin/analytics/views` 查看统计
|
||||
4. ✅ 测试筛选功能
|
||||
5. ✅ 用不同User-Agent测试爬虫识别
|
||||
6. ✅ 测试分页功能
|
||||
7. ✅ 切换语言测试国际化
|
||||
|
||||
## 文件清单
|
||||
|
||||
### 新建文件
|
||||
1. `models/article_view.go` - ArticleView数据模型
|
||||
2. `models/bot_detector.go` - 爬虫检测逻辑
|
||||
3. `handlers/admin_analytics.go` - 统计页面handler
|
||||
4. `templates/admin/analytics_views.html` - 统计页面模板
|
||||
|
||||
### 修改文件
|
||||
1. `handlers/home.go` - 添加阅读记录逻辑
|
||||
2. `models/db.go` - 添加ArticleView到迁移
|
||||
3. `main.go` - 添加analytics路由
|
||||
4. `i18n/i18n.go` - 添加翻译
|
||||
5. `templates/admin/dashboard.html` - 添加入口链接
|
||||
|
||||
## 注意事项
|
||||
|
||||
1. **首次运行**:会自动创建article_views表
|
||||
2. **性能**:异步记录不影响页面加载速度
|
||||
3. **隐私**:IP地址完整记录,考虑是否需要脱敏
|
||||
4. **存储**:长期运行可能积累大量数据,建议定期归档
|
||||
5. **爬虫识别**:基于User-Agent,可能有漏报和误报
|
||||
|
||||
## 总结
|
||||
|
||||
阅读统计系统已完整实现,包含:
|
||||
- ✅ 自动记录每篇文章的独特访问
|
||||
- ✅ 智能识别并标记爬虫
|
||||
- ✅ 功能强大的后台统计页面
|
||||
- ✅ 详细的访问记录和筛选
|
||||
- ✅ 完整的中英文支持
|
||||
- ✅ 性能优化和安全保护
|
||||
|
||||
系统可以立即投入使用,为博客管理员提供深入的阅读数据洞察!
|
||||
Reference in New Issue
Block a user