Spaces:
Sleeping
Sleeping
| package main | |
| import ( | |
| "context" | |
| "log" | |
| "net/http" | |
| "os" | |
| "path/filepath" | |
| "fastfileviewer/backend/internal/config" | |
| "fastfileviewer/backend/internal/db" | |
| "fastfileviewer/backend/internal/handlers" | |
| "fastfileviewer/backend/internal/middleware" | |
| "fastfileviewer/backend/internal/services" | |
| "github.com/gin-gonic/gin" | |
| ) | |
| func main() { | |
| cfg := config.Load() | |
| if cfg.AutoPassword { | |
| log.Printf("ADMIN_PASSWORD 未设置,已自动生成临时密码: %s", cfg.AdminPassword) | |
| } | |
| if err := os.MkdirAll(cfg.RootDir, 0o755); err != nil { | |
| log.Fatalf("create root dir failed: %v", err) | |
| } | |
| database, err := db.New(cfg.DBPath) | |
| if err != nil { | |
| log.Fatalf("db init failed: %v", err) | |
| } | |
| fsSvc := services.NewFSService(cfg.RootDir) | |
| taskSvc := services.NewTaskService(database, fsSvc, cfg.MaxWorkers) | |
| taskSvc.Start(context.Background()) | |
| authHandler := handlers.NewAuthHandler(cfg) | |
| fileHandler := handlers.NewFileHandler(fsSvc) | |
| taskHandler := handlers.NewTaskHandler(taskSvc) | |
| router := gin.Default() | |
| router.GET("/healthz", func(ctx *gin.Context) { | |
| ctx.JSON(http.StatusOK, gin.H{"ok": true}) | |
| }) | |
| router.POST("/api/login", authHandler.Login) | |
| api := router.Group("/api") | |
| api.Use(middleware.AuthRequired(cfg.JWTSecret)) | |
| { | |
| api.GET("/fs/list", fileHandler.List) | |
| api.POST("/fs/upload", fileHandler.Upload) | |
| api.POST("/fs/move", fileHandler.Move) | |
| api.POST("/fs/rename", fileHandler.Rename) | |
| api.POST("/fs/delete", fileHandler.Delete) | |
| api.GET("/fs/download", fileHandler.Download) | |
| api.POST("/tasks/download", taskHandler.CreateDownload) | |
| api.POST("/tasks/extract", taskHandler.CreateExtract) | |
| api.GET("/tasks", taskHandler.List) | |
| api.GET("/tasks/:id", taskHandler.Get) | |
| api.GET("/tasks/:id/stream", taskHandler.Stream) | |
| } | |
| frontendDist := filepath.Join("/app", "web", "dist") | |
| if _, err := os.Stat(frontendDist); err != nil { | |
| frontendDist = filepath.Join("web", "dist") | |
| } | |
| if _, err := os.Stat(frontendDist); err == nil { | |
| router.Static("/assets", filepath.Join(frontendDist, "assets")) | |
| router.NoRoute(func(ctx *gin.Context) { | |
| ctx.File(filepath.Join(frontendDist, "index.html")) | |
| }) | |
| } else { | |
| log.Printf("frontend dist not found, only API routes are available") | |
| } | |
| log.Printf("server listening on :%s", cfg.Port) | |
| log.Printf("storage root: %s", cfg.RootDir) | |
| if err := router.Run(":" + cfg.Port); err != nil { | |
| log.Fatalf("server failed: %v", err) | |
| } | |
| } | |