2025-07-10 01:27:35 +08:00
|
|
|
|
package main
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
2025-08-20 17:16:34 +08:00
|
|
|
|
"fmt"
|
2025-07-10 01:27:35 +08:00
|
|
|
|
"log"
|
|
|
|
|
|
"os"
|
2025-08-15 18:41:09 +08:00
|
|
|
|
"strings"
|
2025-10-27 18:21:59 +08:00
|
|
|
|
"time"
|
2025-07-10 01:27:35 +08:00
|
|
|
|
|
2025-10-27 18:21:59 +08:00
|
|
|
|
"github.com/ctwj/urldb/config"
|
2025-07-18 09:42:07 +08:00
|
|
|
|
"github.com/ctwj/urldb/db"
|
2025-08-25 09:51:45 +08:00
|
|
|
|
"github.com/ctwj/urldb/db/entity"
|
2025-07-18 09:42:07 +08:00
|
|
|
|
"github.com/ctwj/urldb/db/repo"
|
|
|
|
|
|
"github.com/ctwj/urldb/handlers"
|
|
|
|
|
|
"github.com/ctwj/urldb/middleware"
|
2025-10-27 18:21:59 +08:00
|
|
|
|
"github.com/ctwj/urldb/monitor"
|
2025-08-22 14:40:32 +08:00
|
|
|
|
"github.com/ctwj/urldb/scheduler"
|
2025-08-20 15:03:14 +08:00
|
|
|
|
"github.com/ctwj/urldb/services"
|
2025-08-09 23:47:30 +08:00
|
|
|
|
"github.com/ctwj/urldb/task"
|
|
|
|
|
|
"github.com/ctwj/urldb/utils"
|
2025-07-10 01:27:35 +08:00
|
|
|
|
|
|
|
|
|
|
"github.com/gin-contrib/cors"
|
|
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
|
|
"github.com/joho/godotenv"
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
func main() {
|
2025-08-20 17:16:34 +08:00
|
|
|
|
// 检查命令行参数
|
|
|
|
|
|
if len(os.Args) > 1 && os.Args[1] == "version" {
|
|
|
|
|
|
versionInfo := utils.GetVersionInfo()
|
|
|
|
|
|
fmt.Printf("版本: v%s\n", versionInfo.Version)
|
|
|
|
|
|
fmt.Printf("构建时间: %s\n", versionInfo.BuildTime.Format("2006-01-02 15:04:05"))
|
|
|
|
|
|
fmt.Printf("Git提交: %s\n", versionInfo.GitCommit)
|
|
|
|
|
|
fmt.Printf("Git分支: %s\n", versionInfo.GitBranch)
|
|
|
|
|
|
fmt.Printf("Go版本: %s\n", versionInfo.GoVersion)
|
|
|
|
|
|
fmt.Printf("平台: %s/%s\n", versionInfo.Platform, versionInfo.Arch)
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-17 17:42:52 +08:00
|
|
|
|
// 初始化日志系统
|
|
|
|
|
|
if err := utils.InitLogger(nil); err != nil {
|
|
|
|
|
|
log.Fatal("初始化日志系统失败:", err)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-10 01:27:35 +08:00
|
|
|
|
// 加载环境变量
|
|
|
|
|
|
if err := godotenv.Load(); err != nil {
|
2025-07-17 17:42:52 +08:00
|
|
|
|
utils.Info("未找到.env文件,使用默认配置")
|
2025-07-10 01:27:35 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-29 14:00:01 +08:00
|
|
|
|
// 初始化时区设置
|
|
|
|
|
|
utils.InitTimezone()
|
|
|
|
|
|
|
2025-07-27 08:55:42 +08:00
|
|
|
|
// 设置Gin运行模式
|
2025-07-27 09:14:44 +08:00
|
|
|
|
ginMode := os.Getenv("GIN_MODE")
|
|
|
|
|
|
if ginMode == "" {
|
2025-07-27 08:55:42 +08:00
|
|
|
|
// 如果没有设置GIN_MODE,根据环境判断
|
|
|
|
|
|
if os.Getenv("ENV") == "production" {
|
|
|
|
|
|
gin.SetMode(gin.ReleaseMode)
|
|
|
|
|
|
utils.Info("设置Gin为Release模式")
|
|
|
|
|
|
} else {
|
|
|
|
|
|
gin.SetMode(gin.DebugMode)
|
|
|
|
|
|
utils.Info("设置Gin为Debug模式")
|
|
|
|
|
|
}
|
2025-07-27 09:14:44 +08:00
|
|
|
|
} else {
|
|
|
|
|
|
// 如果已经设置了GIN_MODE,根据值设置模式
|
|
|
|
|
|
switch ginMode {
|
|
|
|
|
|
case "release":
|
|
|
|
|
|
gin.SetMode(gin.ReleaseMode)
|
|
|
|
|
|
utils.Info("设置Gin为Release模式 (来自环境变量)")
|
|
|
|
|
|
case "debug":
|
|
|
|
|
|
gin.SetMode(gin.DebugMode)
|
|
|
|
|
|
utils.Info("设置Gin为Debug模式 (来自环境变量)")
|
|
|
|
|
|
case "test":
|
|
|
|
|
|
gin.SetMode(gin.TestMode)
|
|
|
|
|
|
utils.Info("设置Gin为Test模式 (来自环境变量)")
|
|
|
|
|
|
default:
|
|
|
|
|
|
gin.SetMode(gin.DebugMode)
|
|
|
|
|
|
utils.Info("未知的GIN_MODE值: %s,使用Debug模式", ginMode)
|
|
|
|
|
|
}
|
2025-07-27 08:55:42 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-10 01:27:35 +08:00
|
|
|
|
// 初始化数据库
|
2025-07-10 13:56:37 +08:00
|
|
|
|
if err := db.InitDB(); err != nil {
|
2025-07-17 17:42:52 +08:00
|
|
|
|
utils.Fatal("数据库连接失败: %v", err)
|
2025-07-10 01:27:35 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-10 13:56:37 +08:00
|
|
|
|
// 创建Repository管理器
|
|
|
|
|
|
repoManager := repo.NewRepositoryManager(db.DB)
|
|
|
|
|
|
|
2025-10-27 18:21:59 +08:00
|
|
|
|
// 创建配置管理器
|
|
|
|
|
|
configManager := config.NewConfigManager(repoManager)
|
|
|
|
|
|
|
|
|
|
|
|
// 设置全局配置管理器
|
|
|
|
|
|
config.SetGlobalConfigManager(configManager)
|
|
|
|
|
|
|
|
|
|
|
|
// 加载所有配置到缓存
|
|
|
|
|
|
if err := configManager.LoadAllConfigs(); err != nil {
|
|
|
|
|
|
utils.Error("加载配置缓存失败: %v", err)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-08-09 23:47:30 +08:00
|
|
|
|
// 创建任务管理器
|
|
|
|
|
|
taskManager := task.NewTaskManager(repoManager)
|
2025-07-12 21:23:23 +08:00
|
|
|
|
|
2025-08-09 23:47:30 +08:00
|
|
|
|
// 注册转存任务处理器
|
|
|
|
|
|
transferProcessor := task.NewTransferProcessor(repoManager)
|
|
|
|
|
|
taskManager.RegisterProcessor(transferProcessor)
|
2025-07-18 00:34:27 +08:00
|
|
|
|
|
2025-09-12 18:06:09 +08:00
|
|
|
|
// 注册扩容任务处理器
|
|
|
|
|
|
expansionProcessor := task.NewExpansionProcessor(repoManager)
|
|
|
|
|
|
taskManager.RegisterProcessor(expansionProcessor)
|
|
|
|
|
|
|
2025-08-20 15:03:14 +08:00
|
|
|
|
// 初始化Meilisearch管理器
|
|
|
|
|
|
meilisearchManager := services.NewMeilisearchManager(repoManager)
|
|
|
|
|
|
if err := meilisearchManager.Initialize(); err != nil {
|
|
|
|
|
|
utils.Error("初始化Meilisearch管理器失败: %v", err)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-08-10 13:52:41 +08:00
|
|
|
|
// 恢复运行中的任务(服务器重启后)
|
|
|
|
|
|
if err := taskManager.RecoverRunningTasks(); err != nil {
|
|
|
|
|
|
utils.Error("恢复运行中任务失败: %v", err)
|
|
|
|
|
|
} else {
|
|
|
|
|
|
utils.Info("运行中任务恢复完成")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-08-09 23:47:30 +08:00
|
|
|
|
utils.Info("任务管理器初始化完成")
|
2025-07-12 21:23:23 +08:00
|
|
|
|
|
2025-07-10 01:27:35 +08:00
|
|
|
|
// 创建Gin实例
|
2025-10-27 18:21:59 +08:00
|
|
|
|
r := gin.New()
|
|
|
|
|
|
|
|
|
|
|
|
// 创建监控和错误处理器
|
|
|
|
|
|
metrics := monitor.GetGlobalMetrics()
|
|
|
|
|
|
errorHandler := monitor.GetGlobalErrorHandler()
|
|
|
|
|
|
if errorHandler == nil {
|
|
|
|
|
|
errorHandler = monitor.NewErrorHandler(1000, 24*time.Hour)
|
|
|
|
|
|
monitor.SetGlobalErrorHandler(errorHandler)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 添加中间件
|
2025-10-27 19:23:39 +08:00
|
|
|
|
r.Use(gin.Logger()) // Gin日志中间件
|
|
|
|
|
|
r.Use(errorHandler.RecoverMiddleware()) // Panic恢复中间件
|
|
|
|
|
|
r.Use(errorHandler.ErrorMiddleware()) // 错误处理中间件
|
|
|
|
|
|
r.Use(metrics.MetricsMiddleware()) // 监控中间件
|
2025-10-27 18:21:59 +08:00
|
|
|
|
r.Use(gin.Recovery()) // Gin恢复中间件
|
2025-07-10 01:27:35 +08:00
|
|
|
|
|
|
|
|
|
|
// 配置CORS
|
|
|
|
|
|
config := cors.DefaultConfig()
|
|
|
|
|
|
config.AllowOrigins = []string{"*"}
|
|
|
|
|
|
config.AllowMethods = []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"}
|
|
|
|
|
|
config.AllowHeaders = []string{"Origin", "Content-Type", "Accept", "Authorization"}
|
|
|
|
|
|
r.Use(cors.New(config))
|
|
|
|
|
|
|
2025-07-10 13:56:37 +08:00
|
|
|
|
// 将Repository管理器注入到handlers中
|
|
|
|
|
|
handlers.SetRepositoryManager(repoManager)
|
|
|
|
|
|
|
2025-08-20 15:03:14 +08:00
|
|
|
|
// 设置Meilisearch管理器到handlers中
|
|
|
|
|
|
handlers.SetMeilisearchManager(meilisearchManager)
|
|
|
|
|
|
|
2025-08-22 14:40:32 +08:00
|
|
|
|
// 设置全局调度器的Meilisearch管理器
|
|
|
|
|
|
scheduler.SetGlobalMeilisearchManager(meilisearchManager)
|
|
|
|
|
|
|
2025-08-25 09:51:45 +08:00
|
|
|
|
// 初始化并启动调度器
|
|
|
|
|
|
globalScheduler := scheduler.GetGlobalScheduler(
|
|
|
|
|
|
repoManager.HotDramaRepository,
|
|
|
|
|
|
repoManager.ReadyResourceRepository,
|
|
|
|
|
|
repoManager.ResourceRepository,
|
|
|
|
|
|
repoManager.SystemConfigRepository,
|
|
|
|
|
|
repoManager.PanRepository,
|
|
|
|
|
|
repoManager.CksRepository,
|
|
|
|
|
|
repoManager.TagRepository,
|
|
|
|
|
|
repoManager.CategoryRepository,
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
// 根据系统配置启动相应的调度任务
|
|
|
|
|
|
autoFetchHotDrama, _ := repoManager.SystemConfigRepository.GetConfigBool(entity.ConfigKeyAutoFetchHotDramaEnabled)
|
|
|
|
|
|
autoProcessReadyResources, _ := repoManager.SystemConfigRepository.GetConfigBool(entity.ConfigKeyAutoProcessReadyResources)
|
|
|
|
|
|
autoTransferEnabled, _ := repoManager.SystemConfigRepository.GetConfigBool(entity.ConfigKeyAutoTransferEnabled)
|
|
|
|
|
|
|
|
|
|
|
|
globalScheduler.UpdateSchedulerStatusWithAutoTransfer(
|
|
|
|
|
|
autoFetchHotDrama,
|
|
|
|
|
|
autoProcessReadyResources,
|
|
|
|
|
|
autoTransferEnabled,
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
utils.Info("调度器初始化完成")
|
|
|
|
|
|
|
2025-07-16 18:05:29 +08:00
|
|
|
|
// 设置公开API中间件的Repository管理器
|
|
|
|
|
|
middleware.SetRepositoryManager(repoManager)
|
|
|
|
|
|
|
|
|
|
|
|
// 创建公开API处理器
|
|
|
|
|
|
publicAPIHandler := handlers.NewPublicAPIHandler()
|
|
|
|
|
|
|
2025-08-09 23:47:30 +08:00
|
|
|
|
// 创建任务处理器
|
|
|
|
|
|
taskHandler := handlers.NewTaskHandler(repoManager, taskManager)
|
|
|
|
|
|
|
2025-08-15 18:41:09 +08:00
|
|
|
|
// 创建文件处理器
|
|
|
|
|
|
fileHandler := handlers.NewFileHandler(repoManager.FileRepository, repoManager.SystemConfigRepository, repoManager.UserRepository)
|
|
|
|
|
|
|
2025-08-20 15:03:14 +08:00
|
|
|
|
// 创建Meilisearch处理器
|
|
|
|
|
|
meilisearchHandler := handlers.NewMeilisearchHandler(meilisearchManager)
|
|
|
|
|
|
|
2025-07-10 01:27:35 +08:00
|
|
|
|
// API路由
|
|
|
|
|
|
api := r.Group("/api")
|
|
|
|
|
|
{
|
2025-07-16 18:05:29 +08:00
|
|
|
|
// 公开API路由(需要API Token认证)
|
|
|
|
|
|
publicAPI := api.Group("/public")
|
|
|
|
|
|
publicAPI.Use(middleware.PublicAPIAuth())
|
|
|
|
|
|
{
|
|
|
|
|
|
// 批量添加资源
|
|
|
|
|
|
publicAPI.POST("/resources/batch-add", publicAPIHandler.AddBatchResources)
|
|
|
|
|
|
// 资源搜索
|
|
|
|
|
|
publicAPI.GET("/resources/search", publicAPIHandler.SearchResources)
|
|
|
|
|
|
// 热门剧
|
|
|
|
|
|
publicAPI.GET("/hot-dramas", publicAPIHandler.GetHotDramas)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-10 15:07:29 +08:00
|
|
|
|
// 认证路由
|
|
|
|
|
|
api.POST("/auth/login", handlers.Login)
|
|
|
|
|
|
api.POST("/auth/register", handlers.Register)
|
|
|
|
|
|
api.GET("/auth/profile", middleware.AuthMiddleware(), handlers.GetProfile)
|
|
|
|
|
|
|
2025-07-10 01:27:35 +08:00
|
|
|
|
// 资源管理
|
|
|
|
|
|
api.GET("/resources", handlers.GetResources)
|
2025-07-10 15:07:29 +08:00
|
|
|
|
api.POST("/resources", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.CreateResource)
|
|
|
|
|
|
api.PUT("/resources/:id", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.UpdateResource)
|
|
|
|
|
|
api.DELETE("/resources/:id", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.DeleteResource)
|
2025-07-10 01:27:35 +08:00
|
|
|
|
api.GET("/resources/:id", handlers.GetResourceByID)
|
2025-07-12 21:23:23 +08:00
|
|
|
|
api.GET("/resources/check-exists", handlers.CheckResourceExists)
|
2025-07-21 22:52:41 +08:00
|
|
|
|
api.POST("/resources/:id/view", handlers.IncrementResourceViewCount)
|
2025-08-09 09:51:55 +08:00
|
|
|
|
api.GET("/resources/:id/link", handlers.GetResourceLink)
|
2025-07-22 00:09:46 +08:00
|
|
|
|
api.DELETE("/resources/batch", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.BatchDeleteResources)
|
2025-07-10 01:27:35 +08:00
|
|
|
|
|
|
|
|
|
|
// 分类管理
|
|
|
|
|
|
api.GET("/categories", handlers.GetCategories)
|
2025-07-10 15:07:29 +08:00
|
|
|
|
api.POST("/categories", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.CreateCategory)
|
|
|
|
|
|
api.PUT("/categories/:id", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.UpdateCategory)
|
|
|
|
|
|
api.DELETE("/categories/:id", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.DeleteCategory)
|
2025-07-10 01:27:35 +08:00
|
|
|
|
|
|
|
|
|
|
// 搜索
|
|
|
|
|
|
api.GET("/search", handlers.SearchResources)
|
|
|
|
|
|
|
|
|
|
|
|
// 统计
|
|
|
|
|
|
api.GET("/stats", handlers.GetStats)
|
2025-07-11 17:46:08 +08:00
|
|
|
|
api.GET("/performance", handlers.GetPerformanceStats)
|
2025-08-07 18:47:26 +08:00
|
|
|
|
api.GET("/stats/views-trend", handlers.GetViewsTrend)
|
|
|
|
|
|
api.GET("/stats/searches-trend", handlers.GetSearchesTrend)
|
2025-07-11 17:46:08 +08:00
|
|
|
|
api.GET("/system/info", handlers.GetSystemInfo)
|
2025-07-10 13:56:37 +08:00
|
|
|
|
|
|
|
|
|
|
// 平台管理
|
2025-07-11 00:49:41 +08:00
|
|
|
|
api.GET("/pans", handlers.GetPans)
|
2025-07-10 15:07:29 +08:00
|
|
|
|
api.POST("/pans", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.CreatePan)
|
|
|
|
|
|
api.PUT("/pans/:id", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.UpdatePan)
|
|
|
|
|
|
api.DELETE("/pans/:id", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.DeletePan)
|
|
|
|
|
|
api.GET("/pans/:id", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.GetPan)
|
2025-07-10 13:56:37 +08:00
|
|
|
|
|
|
|
|
|
|
// Cookie管理
|
2025-07-11 00:49:41 +08:00
|
|
|
|
api.GET("/cks", handlers.GetCks)
|
2025-07-10 15:07:29 +08:00
|
|
|
|
api.POST("/cks", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.CreateCks)
|
|
|
|
|
|
api.PUT("/cks/:id", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.UpdateCks)
|
|
|
|
|
|
api.DELETE("/cks/:id", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.DeleteCks)
|
|
|
|
|
|
api.GET("/cks/:id", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.GetCksByID)
|
2025-07-17 01:43:22 +08:00
|
|
|
|
api.POST("/cks/:id/refresh-capacity", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.RefreshCapacity)
|
2025-07-10 13:56:37 +08:00
|
|
|
|
|
|
|
|
|
|
// 标签管理
|
|
|
|
|
|
api.GET("/tags", handlers.GetTags)
|
2025-07-10 15:07:29 +08:00
|
|
|
|
api.POST("/tags", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.CreateTag)
|
|
|
|
|
|
api.PUT("/tags/:id", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.UpdateTag)
|
|
|
|
|
|
api.DELETE("/tags/:id", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.DeleteTag)
|
2025-07-10 13:56:37 +08:00
|
|
|
|
api.GET("/tags/:id", handlers.GetTagByID)
|
2025-07-16 10:54:00 +08:00
|
|
|
|
api.GET("/categories/:categoryId/tags", handlers.GetTagsByCategory)
|
2025-07-10 13:56:37 +08:00
|
|
|
|
|
|
|
|
|
|
// 待处理资源管理
|
2025-07-10 15:07:29 +08:00
|
|
|
|
api.GET("/ready-resources", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.GetReadyResources)
|
|
|
|
|
|
api.POST("/ready-resources/batch", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.BatchCreateReadyResources)
|
|
|
|
|
|
api.POST("/ready-resources/text", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.CreateReadyResourcesFromText)
|
|
|
|
|
|
api.DELETE("/ready-resources/:id", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.DeleteReadyResource)
|
|
|
|
|
|
api.DELETE("/ready-resources", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.ClearReadyResources)
|
2025-07-24 18:45:32 +08:00
|
|
|
|
api.GET("/ready-resources/key/:key", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.GetReadyResourcesByKey)
|
|
|
|
|
|
api.DELETE("/ready-resources/key/:key", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.DeleteReadyResourcesByKey)
|
2025-07-29 01:29:53 +08:00
|
|
|
|
api.GET("/ready-resources/errors", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.GetReadyResourcesWithErrors)
|
|
|
|
|
|
api.POST("/ready-resources/:id/clear-error", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.ClearErrorMsg)
|
|
|
|
|
|
api.POST("/ready-resources/retry-failed", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.RetryFailedResources)
|
2025-08-03 22:40:22 +08:00
|
|
|
|
api.POST("/ready-resources/batch-restore", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.BatchRestoreToReadyPool)
|
|
|
|
|
|
api.POST("/ready-resources/batch-restore-by-query", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.BatchRestoreToReadyPoolByQuery)
|
|
|
|
|
|
api.POST("/ready-resources/clear-all-errors-by-query", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.ClearAllErrorsByQuery)
|
2025-07-10 15:07:29 +08:00
|
|
|
|
|
|
|
|
|
|
// 用户管理(仅管理员)
|
|
|
|
|
|
api.GET("/users", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.GetUsers)
|
|
|
|
|
|
api.POST("/users", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.CreateUser)
|
|
|
|
|
|
api.PUT("/users/:id", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.UpdateUser)
|
2025-07-16 18:05:29 +08:00
|
|
|
|
api.PUT("/users/:id/password", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.ChangePassword)
|
2025-07-10 15:07:29 +08:00
|
|
|
|
api.DELETE("/users/:id", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.DeleteUser)
|
2025-07-10 21:14:17 +08:00
|
|
|
|
|
|
|
|
|
|
// 搜索统计路由
|
|
|
|
|
|
api.GET("/search-stats", handlers.GetSearchStats)
|
|
|
|
|
|
api.GET("/search-stats/hot-keywords", handlers.GetHotKeywords)
|
|
|
|
|
|
api.GET("/search-stats/daily", handlers.GetDailyStats)
|
|
|
|
|
|
api.GET("/search-stats/trend", handlers.GetSearchTrend)
|
|
|
|
|
|
api.GET("/search-stats/keyword/:keyword/trend", handlers.GetKeywordTrend)
|
2025-07-21 22:52:41 +08:00
|
|
|
|
api.POST("/search-stats", handlers.RecordSearch)
|
2025-07-10 21:14:17 +08:00
|
|
|
|
api.POST("/search-stats/record", handlers.RecordSearch)
|
2025-07-21 23:38:28 +08:00
|
|
|
|
api.GET("/search-stats/summary", handlers.GetSearchStatsSummary)
|
2025-07-11 02:30:57 +08:00
|
|
|
|
|
2025-10-07 02:30:01 +08:00
|
|
|
|
// API访问日志路由
|
|
|
|
|
|
api.GET("/api-access-logs", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.GetAPIAccessLogs)
|
|
|
|
|
|
api.GET("/api-access-logs/summary", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.GetAPIAccessLogSummary)
|
|
|
|
|
|
api.GET("/api-access-logs/stats", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.GetAPIAccessLogStats)
|
|
|
|
|
|
api.DELETE("/api-access-logs", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.ClearAPIAccessLogs)
|
|
|
|
|
|
|
2025-10-28 09:40:55 +08:00
|
|
|
|
// 系统日志路由
|
|
|
|
|
|
api.GET("/system-logs", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.GetSystemLogs)
|
|
|
|
|
|
api.GET("/system-logs/files", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.GetSystemLogFiles)
|
|
|
|
|
|
api.GET("/system-logs/summary", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.GetSystemLogSummary)
|
|
|
|
|
|
api.DELETE("/system-logs", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.ClearSystemLogs)
|
|
|
|
|
|
|
2025-07-11 02:30:57 +08:00
|
|
|
|
// 系统配置路由
|
2025-07-21 22:52:41 +08:00
|
|
|
|
api.GET("/system/config", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.GetSystemConfig)
|
2025-07-11 02:30:57 +08:00
|
|
|
|
api.POST("/system/config", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.UpdateSystemConfig)
|
2025-08-18 13:38:52 +08:00
|
|
|
|
api.GET("/system/config/status", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.GetConfigStatus)
|
2025-07-26 23:21:39 +08:00
|
|
|
|
api.POST("/system/config/toggle-auto-process", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.ToggleAutoProcess)
|
2025-07-21 22:52:41 +08:00
|
|
|
|
api.GET("/public/system-config", handlers.GetPublicSystemConfig)
|
2025-07-11 17:46:08 +08:00
|
|
|
|
|
|
|
|
|
|
// 热播剧管理路由(查询接口无需认证)
|
|
|
|
|
|
api.GET("/hot-dramas", handlers.GetHotDramaList)
|
|
|
|
|
|
api.GET("/hot-dramas/:id", handlers.GetHotDramaByID)
|
|
|
|
|
|
api.POST("/hot-dramas", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.CreateHotDrama)
|
|
|
|
|
|
api.PUT("/hot-dramas/:id", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.UpdateHotDrama)
|
|
|
|
|
|
api.DELETE("/hot-dramas/:id", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.DeleteHotDrama)
|
2025-09-09 16:27:07 +08:00
|
|
|
|
api.GET("/hot-dramas/poster", handlers.GetPosterImage)
|
2025-07-11 17:46:08 +08:00
|
|
|
|
|
2025-08-09 23:47:30 +08:00
|
|
|
|
// 任务管理路由
|
|
|
|
|
|
api.POST("/tasks/transfer", middleware.AuthMiddleware(), middleware.AdminMiddleware(), taskHandler.CreateBatchTransferTask)
|
2025-09-12 18:06:09 +08:00
|
|
|
|
api.POST("/tasks/expansion", middleware.AuthMiddleware(), middleware.AdminMiddleware(), taskHandler.CreateExpansionTask)
|
|
|
|
|
|
api.GET("/tasks/expansion/accounts", middleware.AuthMiddleware(), middleware.AdminMiddleware(), taskHandler.GetExpansionAccounts)
|
2025-08-09 23:47:30 +08:00
|
|
|
|
api.GET("/tasks", middleware.AuthMiddleware(), middleware.AdminMiddleware(), taskHandler.GetTasks)
|
|
|
|
|
|
api.GET("/tasks/:id", middleware.AuthMiddleware(), middleware.AdminMiddleware(), taskHandler.GetTaskStatus)
|
|
|
|
|
|
api.POST("/tasks/:id/start", middleware.AuthMiddleware(), middleware.AdminMiddleware(), taskHandler.StartTask)
|
|
|
|
|
|
api.POST("/tasks/:id/stop", middleware.AuthMiddleware(), middleware.AdminMiddleware(), taskHandler.StopTask)
|
2025-08-10 00:54:30 +08:00
|
|
|
|
api.POST("/tasks/:id/pause", middleware.AuthMiddleware(), middleware.AdminMiddleware(), taskHandler.PauseTask)
|
2025-08-09 23:47:30 +08:00
|
|
|
|
api.DELETE("/tasks/:id", middleware.AuthMiddleware(), middleware.AdminMiddleware(), taskHandler.DeleteTask)
|
|
|
|
|
|
api.GET("/tasks/:id/items", middleware.AuthMiddleware(), middleware.AdminMiddleware(), taskHandler.GetTaskItems)
|
2025-07-20 21:56:00 +08:00
|
|
|
|
|
|
|
|
|
|
// 版本管理路由
|
|
|
|
|
|
api.GET("/version", handlers.GetVersion)
|
|
|
|
|
|
api.GET("/version/string", handlers.GetVersionString)
|
|
|
|
|
|
api.GET("/version/full", handlers.GetFullVersionInfo)
|
|
|
|
|
|
api.GET("/version/check-update", handlers.CheckUpdate)
|
2025-08-15 18:41:09 +08:00
|
|
|
|
|
2025-08-20 15:03:14 +08:00
|
|
|
|
// Meilisearch管理路由
|
|
|
|
|
|
api.GET("/meilisearch/status", middleware.AuthMiddleware(), middleware.AdminMiddleware(), meilisearchHandler.GetStatus)
|
|
|
|
|
|
api.GET("/meilisearch/unsynced-count", middleware.AuthMiddleware(), middleware.AdminMiddleware(), meilisearchHandler.GetUnsyncedCount)
|
|
|
|
|
|
api.GET("/meilisearch/unsynced", middleware.AuthMiddleware(), middleware.AdminMiddleware(), meilisearchHandler.GetUnsyncedResources)
|
|
|
|
|
|
api.GET("/meilisearch/synced", middleware.AuthMiddleware(), middleware.AdminMiddleware(), meilisearchHandler.GetSyncedResources)
|
|
|
|
|
|
api.GET("/meilisearch/resources", middleware.AuthMiddleware(), middleware.AdminMiddleware(), meilisearchHandler.GetAllResources)
|
|
|
|
|
|
api.POST("/meilisearch/sync-all", middleware.AuthMiddleware(), middleware.AdminMiddleware(), meilisearchHandler.SyncAllResources)
|
|
|
|
|
|
api.GET("/meilisearch/sync-progress", middleware.AuthMiddleware(), middleware.AdminMiddleware(), meilisearchHandler.GetSyncProgress)
|
|
|
|
|
|
api.POST("/meilisearch/stop-sync", middleware.AuthMiddleware(), middleware.AdminMiddleware(), meilisearchHandler.StopSync)
|
|
|
|
|
|
api.POST("/meilisearch/clear-index", middleware.AuthMiddleware(), middleware.AdminMiddleware(), meilisearchHandler.ClearIndex)
|
|
|
|
|
|
api.POST("/meilisearch/test-connection", middleware.AuthMiddleware(), middleware.AdminMiddleware(), meilisearchHandler.TestConnection)
|
|
|
|
|
|
api.POST("/meilisearch/update-settings", middleware.AuthMiddleware(), middleware.AdminMiddleware(), meilisearchHandler.UpdateIndexSettings)
|
|
|
|
|
|
|
2025-08-15 18:41:09 +08:00
|
|
|
|
// 文件上传相关路由
|
|
|
|
|
|
api.POST("/files/upload", middleware.AuthMiddleware(), fileHandler.UploadFile)
|
2025-08-19 09:09:44 +08:00
|
|
|
|
api.GET("/files", middleware.AuthMiddleware(), fileHandler.GetFileList)
|
2025-08-15 18:41:09 +08:00
|
|
|
|
api.DELETE("/files", middleware.AuthMiddleware(), fileHandler.DeleteFiles)
|
|
|
|
|
|
api.PUT("/files", middleware.AuthMiddleware(), fileHandler.UpdateFile)
|
2025-09-16 00:07:02 +08:00
|
|
|
|
|
|
|
|
|
|
// 创建Telegram Bot服务
|
|
|
|
|
|
telegramBotService := services.NewTelegramBotService(
|
|
|
|
|
|
repoManager.SystemConfigRepository,
|
|
|
|
|
|
repoManager.TelegramChannelRepository,
|
|
|
|
|
|
repoManager.ResourceRepository,
|
2025-09-24 00:04:57 +08:00
|
|
|
|
repoManager.ReadyResourceRepository,
|
2025-09-16 00:07:02 +08:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
// 启动Telegram Bot服务
|
|
|
|
|
|
if err := telegramBotService.Start(); err != nil {
|
|
|
|
|
|
utils.Error("启动Telegram Bot服务失败: %v", err)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Telegram相关路由
|
|
|
|
|
|
telegramHandler := handlers.NewTelegramHandler(
|
|
|
|
|
|
repoManager.TelegramChannelRepository,
|
|
|
|
|
|
repoManager.SystemConfigRepository,
|
|
|
|
|
|
telegramBotService,
|
|
|
|
|
|
)
|
|
|
|
|
|
api.GET("/telegram/bot-config", middleware.AuthMiddleware(), middleware.AdminMiddleware(), telegramHandler.GetBotConfig)
|
|
|
|
|
|
api.PUT("/telegram/bot-config", middleware.AuthMiddleware(), middleware.AdminMiddleware(), telegramHandler.UpdateBotConfig)
|
|
|
|
|
|
api.POST("/telegram/validate-api-key", middleware.AuthMiddleware(), middleware.AdminMiddleware(), telegramHandler.ValidateApiKey)
|
2025-09-16 18:23:06 +08:00
|
|
|
|
api.GET("/telegram/bot-status", middleware.AuthMiddleware(), middleware.AdminMiddleware(), telegramHandler.GetBotStatus)
|
|
|
|
|
|
api.POST("/telegram/reload-config", middleware.AuthMiddleware(), middleware.AdminMiddleware(), telegramHandler.ReloadBotConfig)
|
|
|
|
|
|
api.POST("/telegram/test-message", middleware.AuthMiddleware(), middleware.AdminMiddleware(), telegramHandler.TestBotMessage)
|
2025-09-17 14:31:12 +08:00
|
|
|
|
api.GET("/telegram/debug-connection", middleware.AuthMiddleware(), middleware.AdminMiddleware(), telegramHandler.DebugBotConnection)
|
2025-09-16 00:07:02 +08:00
|
|
|
|
api.GET("/telegram/channels", middleware.AuthMiddleware(), middleware.AdminMiddleware(), telegramHandler.GetChannels)
|
|
|
|
|
|
api.POST("/telegram/channels", middleware.AuthMiddleware(), middleware.AdminMiddleware(), telegramHandler.CreateChannel)
|
|
|
|
|
|
api.PUT("/telegram/channels/:id", middleware.AuthMiddleware(), middleware.AdminMiddleware(), telegramHandler.UpdateChannel)
|
|
|
|
|
|
api.DELETE("/telegram/channels/:id", middleware.AuthMiddleware(), middleware.AdminMiddleware(), telegramHandler.DeleteChannel)
|
2025-09-17 00:09:59 +08:00
|
|
|
|
api.GET("/telegram/logs", middleware.AuthMiddleware(), middleware.AdminMiddleware(), telegramHandler.GetTelegramLogs)
|
|
|
|
|
|
api.GET("/telegram/logs/stats", middleware.AuthMiddleware(), middleware.AdminMiddleware(), telegramHandler.GetTelegramLogStats)
|
|
|
|
|
|
api.POST("/telegram/logs/clear", middleware.AuthMiddleware(), middleware.AdminMiddleware(), telegramHandler.ClearTelegramLogs)
|
2025-09-17 14:31:12 +08:00
|
|
|
|
api.POST("/telegram/webhook", telegramHandler.HandleWebhook)
|
2025-07-10 01:27:35 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-27 18:21:59 +08:00
|
|
|
|
// 设置监控系统
|
|
|
|
|
|
monitor.SetupMonitoring(r)
|
|
|
|
|
|
|
|
|
|
|
|
// 启动监控服务器
|
|
|
|
|
|
metricsConfig := &monitor.MetricsConfig{
|
|
|
|
|
|
Enabled: true,
|
|
|
|
|
|
ListenAddress: ":9090",
|
|
|
|
|
|
MetricsPath: "/metrics",
|
|
|
|
|
|
Namespace: "urldb",
|
|
|
|
|
|
Subsystem: "api",
|
|
|
|
|
|
}
|
|
|
|
|
|
metrics.StartMetricsServer(metricsConfig)
|
|
|
|
|
|
|
2025-07-10 01:27:35 +08:00
|
|
|
|
// 静态文件服务
|
|
|
|
|
|
r.Static("/uploads", "./uploads")
|
|
|
|
|
|
|
2025-08-15 18:41:09 +08:00
|
|
|
|
// 添加CORS头到静态文件
|
|
|
|
|
|
r.Use(func(c *gin.Context) {
|
|
|
|
|
|
if strings.HasPrefix(c.Request.URL.Path, "/uploads/") {
|
|
|
|
|
|
c.Header("Access-Control-Allow-Origin", "*")
|
|
|
|
|
|
c.Header("Access-Control-Allow-Methods", "GET, OPTIONS")
|
|
|
|
|
|
c.Header("Access-Control-Allow-Headers", "Origin, Content-Type, Accept")
|
|
|
|
|
|
}
|
|
|
|
|
|
c.Next()
|
|
|
|
|
|
})
|
|
|
|
|
|
|
2025-07-10 01:27:35 +08:00
|
|
|
|
port := os.Getenv("PORT")
|
|
|
|
|
|
if port == "" {
|
|
|
|
|
|
port = "8080"
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-17 17:42:52 +08:00
|
|
|
|
utils.Info("服务器启动在端口 %s", port)
|
2025-07-10 01:27:35 +08:00
|
|
|
|
r.Run(":" + port)
|
|
|
|
|
|
}
|