Files
urldb/main.go

270 lines
12 KiB
Go
Raw Normal View History

2025-07-10 01:27:35 +08:00
package main
import (
"log"
"os"
2025-07-18 09:42:07 +08:00
"github.com/ctwj/urldb/utils"
2025-07-17 14:08:52 +08:00
2025-07-18 09:42:07 +08:00
"github.com/ctwj/urldb/db"
"github.com/ctwj/urldb/db/repo"
"github.com/ctwj/urldb/handlers"
"github.com/ctwj/urldb/middleware"
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-07-17 17:42:52 +08:00
// 初始化日志系统
if err := utils.InitLogger(nil); err != nil {
log.Fatal("初始化日志系统失败:", err)
}
defer utils.GetLogger().Close()
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-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-07-12 21:23:23 +08:00
// 创建全局调度器
scheduler := utils.GetGlobalScheduler(
repoManager.HotDramaRepository,
repoManager.ReadyResourceRepository,
repoManager.ResourceRepository,
repoManager.SystemConfigRepository,
2025-07-15 12:50:24 +08:00
repoManager.PanRepository,
2025-07-18 00:34:27 +08:00
repoManager.CksRepository,
2025-07-25 22:24:08 +08:00
repoManager.TagRepository,
repoManager.CategoryRepository,
2025-07-12 21:23:23 +08:00
)
2025-07-18 00:34:27 +08:00
// 检查系统配置,决定是否启动各种自动任务
2025-07-12 21:23:23 +08:00
systemConfig, err := repoManager.SystemConfigRepository.GetOrCreateDefault()
if err != nil {
2025-07-17 17:42:52 +08:00
utils.Error("获取系统配置失败: %v", err)
2025-07-12 21:23:23 +08:00
} else {
// 检查是否启动待处理资源自动处理任务
if systemConfig.AutoProcessReadyResources {
scheduler.StartReadyResourceScheduler()
2025-07-17 17:42:52 +08:00
utils.Info("已启动待处理资源自动处理任务")
2025-07-12 21:23:23 +08:00
} else {
2025-07-17 17:42:52 +08:00
utils.Info("系统配置中自动处理待处理资源功能已禁用,跳过启动定时任务")
2025-07-12 21:23:23 +08:00
}
// 检查是否启动热播剧自动拉取任务
if systemConfig.AutoFetchHotDramaEnabled {
scheduler.StartHotDramaScheduler()
2025-07-17 17:42:52 +08:00
utils.Info("已启动热播剧自动拉取任务")
2025-07-12 21:23:23 +08:00
} else {
2025-07-17 17:42:52 +08:00
utils.Info("系统配置中自动拉取热播剧功能已禁用,跳过启动定时任务")
2025-07-12 21:23:23 +08:00
}
2025-07-18 00:34:27 +08:00
// 检查是否启动自动转存任务
if systemConfig.AutoTransferEnabled {
scheduler.StartAutoTransferScheduler()
utils.Info("已启动自动转存任务")
} else {
utils.Info("系统配置中自动转存功能已禁用,跳过启动定时任务")
}
2025-07-12 21:23:23 +08:00
}
2025-07-10 01:27:35 +08:00
// 创建Gin实例
r := gin.Default()
// 配置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-07-16 18:05:29 +08:00
// 设置公开API中间件的Repository管理器
middleware.SetRepositoryManager(repoManager)
// 创建公开API处理器
publicAPIHandler := handlers.NewPublicAPIHandler()
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-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)
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)
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-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-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)
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)
// 调度器管理路由(查询接口无需认证)
api.GET("/scheduler/status", handlers.GetSchedulerStatus)
api.GET("/scheduler/hot-drama/names", handlers.FetchHotDramaNames)
api.POST("/scheduler/hot-drama/start", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.StartHotDramaScheduler)
api.POST("/scheduler/hot-drama/stop", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.StopHotDramaScheduler)
api.POST("/scheduler/hot-drama/trigger", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.TriggerHotDramaScheduler)
2025-07-12 21:23:23 +08:00
// 待处理资源自动处理管理路由
api.POST("/scheduler/ready-resource/start", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.StartReadyResourceScheduler)
api.POST("/scheduler/ready-resource/stop", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.StopReadyResourceScheduler)
api.POST("/scheduler/ready-resource/trigger", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.TriggerReadyResourceScheduler)
2025-07-18 00:34:27 +08:00
// 自动转存管理路由
api.POST("/scheduler/auto-transfer/start", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.StartAutoTransferScheduler)
api.POST("/scheduler/auto-transfer/stop", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.StopAutoTransferScheduler)
api.POST("/scheduler/auto-transfer/trigger", middleware.AuthMiddleware(), middleware.AdminMiddleware(), handlers.TriggerAutoTransferScheduler)
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-07-10 01:27:35 +08:00
}
// 静态文件服务
r.Static("/uploads", "./uploads")
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)
}