package main import ( "log" "os" "uptime/backend/controllers" "uptime/backend/database" "uptime/backend/middleware" "uptime/backend/models" "uptime/backend/services" "github.com/gin-contrib/cors" "github.com/gin-gonic/gin" "github.com/joho/godotenv" "golang.org/x/crypto/bcrypt" ) func main() { // 在开发环境中加载 .env 文件,如果文件不存在则忽略错误 // 在生产环境中,变量将通过环境变量直接提供 if err := godotenv.Load(); err != nil { log.Println("No .env file found, using environment variables") } database.ConnectDatabase() if os.Getenv("REDIS_URI") != "" { database.ConnectRedis() } createAdminUser() go services.StartMonitoring() r := gin.Default() config := cors.DefaultConfig() config.AllowAllOrigins = true config.AllowCredentials = true r.Use(cors.New(config)) api := r.Group("/api") { api.POST("/login", controllers.Login) authorized := api.Group("/") authorized.Use(middleware.RequireAuth) { authorized.POST("/monitors", controllers.CreateMonitor) authorized.GET("/monitors", controllers.GetMonitors) authorized.GET("/monitors/:id", controllers.GetMonitor) authorized.PUT("/monitors/:id", controllers.UpdateMonitor) authorized.DELETE("/monitors/:id", controllers.DeleteMonitor) authorized.POST("/monitors/:id/check", controllers.ManualCheck) } } r.GET("/ping", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "pong", }) }) port := os.Getenv("PORT") if port == "" { port = "8080" // Default port } r.Run(":" + port) } func createAdminUser() { username := os.Getenv("ADMIN_USERNAME") password := os.Getenv("ADMIN_PASSWORD") if username == "" || password == "" { log.Println("ADMIN_USERNAME or ADMIN_PASSWORD not set, skipping admin user creation.") return } var user models.User database.DB.First(&user, "username = ?", username) hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), 10) if err != nil { log.Fatalf("Failed to hash password: %v", err) } if user.ID == 0 { // Create new admin user admin := models.User{Username: username, Password: string(hashedPassword)} if err := database.DB.Create(&admin).Error; err != nil { log.Fatalf("Failed to create admin user: %v", err) } log.Println("Admin user created successfully.") } else { // Update existing admin user's password if err := database.DB.Model(&user).Update("password", string(hashedPassword)).Error; err != nil { log.Fatalf("Failed to update admin user: %v", err) } log.Println("Admin user password updated successfully.") } }