新增本地持久化存储

This commit is contained in:
zyj
2025-11-22 17:48:04 +08:00
parent 62b5a3f9bc
commit ec3fc77403
6 changed files with 470 additions and 0 deletions

171
storage/download_store.go Normal file
View File

@@ -0,0 +1,171 @@
package storage
import (
"fmt"
"time"
)
// DownloadRecord 下载记录
type DownloadRecord struct {
ID string `json:"id"` // 唯一标识
URL string `json:"url"` // 下载的 URL
SiteName string `json:"site_name"` // 站点名称
Status string `json:"status"` // 状态success, failed, processing
TotalFiles int `json:"total_files"` // 总文件数
Downloaded int `json:"downloaded"` // 已下载数
CSSCount int `json:"css_count"` // CSS 文件数
ScriptCount int `json:"script_count"` // JS 文件数
ImageCount int `json:"image_count"` // 图片文件数
VideoCount int `json:"video_count"` // 视频文件数
ErrorMsg string `json:"error_msg"` // 错误信息
StartTime time.Time `json:"start_time"` // 开始时间
EndTime time.Time `json:"end_time"` // 结束时间
Duration int64 `json:"duration"` // 耗时(秒)
}
// AddDownloadRecord 添加下载记录
func (s *Store) AddDownloadRecord(record DownloadRecord) error {
if record.ID == "" {
record.ID = fmt.Sprintf("%d", time.Now().UnixNano())
}
if record.StartTime.IsZero() {
record.StartTime = time.Now()
}
return s.Set(BucketDownload, record.ID, record)
}
// GetDownloadRecord 获取下载记录
func (s *Store) GetDownloadRecord(id string) (*DownloadRecord, error) {
var record DownloadRecord
if err := s.Get(BucketDownload, id, &record); err != nil {
return nil, err
}
return &record, nil
}
// UpdateDownloadRecord 更新下载记录
func (s *Store) UpdateDownloadRecord(record DownloadRecord) error {
if record.ID == "" {
return fmt.Errorf("记录 ID 不能为空")
}
return s.Set(BucketDownload, record.ID, record)
}
// DeleteDownloadRecord 删除下载记录
func (s *Store) DeleteDownloadRecord(id string) error {
return s.Delete(BucketDownload, id)
}
// GetAllDownloadRecords 获取所有下载记录
func (s *Store) GetAllDownloadRecords() ([]DownloadRecord, error) {
var records []DownloadRecord
if err := s.GetAll(BucketDownload, &records); err != nil {
return nil, err
}
return records, nil
}
// GetDownloadRecordsBySite 根据站点名称获取下载记录
func (s *Store) GetDownloadRecordsBySite(siteName string) ([]DownloadRecord, error) {
allRecords, err := s.GetAllDownloadRecords()
if err != nil {
return nil, err
}
var filtered []DownloadRecord
for _, record := range allRecords {
if record.SiteName == siteName {
filtered = append(filtered, record)
}
}
return filtered, nil
}
// GetDownloadRecordsByStatus 根据状态获取下载记录
func (s *Store) GetDownloadRecordsByStatus(status string) ([]DownloadRecord, error) {
allRecords, err := s.GetAllDownloadRecords()
if err != nil {
return nil, err
}
var filtered []DownloadRecord
for _, record := range allRecords {
if record.Status == status {
filtered = append(filtered, record)
}
}
return filtered, nil
}
// GetRecentDownloadRecords 获取最近的 N 条下载记录
func (s *Store) GetRecentDownloadRecords(limit int) ([]DownloadRecord, error) {
allRecords, err := s.GetAllDownloadRecords()
if err != nil {
return nil, err
}
// 按时间倒序排序
for i := 0; i < len(allRecords)-1; i++ {
for j := i + 1; j < len(allRecords); j++ {
if allRecords[i].StartTime.Before(allRecords[j].StartTime) {
allRecords[i], allRecords[j] = allRecords[j], allRecords[i]
}
}
}
if limit > 0 && limit < len(allRecords) {
return allRecords[:limit], nil
}
return allRecords, nil
}
// GetDownloadStats 获取下载统计信息
func (s *Store) GetDownloadStats() (map[string]interface{}, error) {
records, err := s.GetAllDownloadRecords()
if err != nil {
return nil, err
}
stats := map[string]interface{}{
"total": len(records),
"success": 0,
"failed": 0,
"processing": 0,
"total_files": 0,
}
for _, record := range records {
switch record.Status {
case "success":
stats["success"] = stats["success"].(int) + 1
case "failed":
stats["failed"] = stats["failed"].(int) + 1
case "processing":
stats["processing"] = stats["processing"].(int) + 1
}
stats["total_files"] = stats["total_files"].(int) + record.TotalFiles
}
return stats, nil
}
// ClearOldDownloadRecords 清理指定天数之前的下载记录
func (s *Store) ClearOldDownloadRecords(days int) (int, error) {
records, err := s.GetAllDownloadRecords()
if err != nil {
return 0, err
}
cutoffTime := time.Now().AddDate(0, 0, -days)
deleted := 0
for _, record := range records {
if record.StartTime.Before(cutoffTime) {
if err := s.DeleteDownloadRecord(record.ID); err == nil {
deleted++
}
}
}
return deleted, nil
}