package main import ( "log" "web-training/config" "web-training/internal/handler" "web-training/internal/middleware" "web-training/pkg/database" "web-training/pkg/cache" "web-training/pkg/auth" "web-training/pkg/storage" "web-training/pkg/websocket" "github.com/gin-gonic/gin" "go.uber.org/zap" ) func main() { // 加载配置 cfg, err := config.LoadConfig("config/config.yaml") if err != nil { log.Fatalf("Failed to load config: %v", err) } // 初始化日志 logger, err := initLogger(cfg.Log) if err != nil { log.Fatalf("Failed to initialize logger: %v", err) } defer logger.Sync() // 初始化数据库 db, err := database.InitMySQL(cfg.Database) if err != nil { logger.Fatal("Failed to initialize database", zap.Error(err)) } // 初始化Redis redisClient, err := cache.InitRedis(cfg.Redis) if err != nil { logger.Fatal("Failed to initialize Redis", zap.Error(err)) } // 初始化JWT服务 jwtService := auth.NewJWTService(cfg.JWT.Secret, cfg.JWT.Expire) // 初始化存储服务 storageService := storage.NewLocalStorage(cfg.Upload.Path, cfg.Upload.MaxSize, cfg.Upload.AllowedTypes) // 初始化WebSocket Hub wsHub := websocket.NewHub() go wsHub.Run() // 设置Gin模式 gin.SetMode(cfg.Server.Mode) // 创建Gin引擎 r := gin.New() // 添加全局中间件 r.Use(middleware.LoggerMiddleware(logger)) r.Use(middleware.RecoveryMiddleware(logger)) r.Use(middleware.CORSMiddleware()) r.Use(middleware.RateLimitMiddleware(100)) // 限制每秒100个请求 // 初始化处理器 userHandler := handler.NewUserHandler(db, jwtService) productHandler := handler.NewProductHandler(db, redisClient, storageService) orderHandler := handler.NewOrderHandler(db) uploadHandler := handler.NewUploadHandler(storageService) wsHandler := handler.NewWebSocketHandler(wsHub) // 设置路由 setupRoutes(r, userHandler, productHandler, orderHandler, uploadHandler, wsHandler, jwtService) // 启动服务器 logger.Info("Starting server", zap.String("port", cfg.Server.Port)) if err := r.Run(":" + cfg.Server.Port); err != nil { logger.Fatal("Failed to start server", zap.Error(err)) } } func setupRoutes(r *gin.Engine, userHandler *handler.UserHandler, productHandler *handler.ProductHandler, orderHandler *handler.OrderHandler, uploadHandler *handler.UploadHandler, wsHandler *handler.WebSocketHandler, jwtService *auth.JWTService) { // 静态文件服务 r.Static("/static", "./web/static") r.LoadHTMLGlob("web/templates/*") // 首页 r.GET("/", func(c *gin.Context) { c.HTML(200, "index.html", gin.H{ "title": "Go Web Training", }) }) // API路由组 api := r.Group("/api/v1") { // 公开路由 api.POST("/register", userHandler.Register) api.POST("/login", userHandler.Login) // 需要认证的路由 authGroup := api.Group("/") authGroup.Use(middleware.AuthMiddleware(jwtService)) { // 用户管理 authGroup.GET("/users", userHandler.ListUsers) authGroup.GET("/users/:id", userHandler.GetUser) authGroup.PUT("/users/:id", userHandler.UpdateUser) authGroup.DELETE("/users/:id", userHandler.DeleteUser) // 商品管理 authGroup.GET("/products", productHandler.ListProducts) authGroup.POST("/products", productHandler.CreateProduct) authGroup.GET("/products/:id", productHandler.GetProduct) authGroup.PUT("/products/:id", productHandler.UpdateProduct) authGroup.DELETE("/products/:id", productHandler.DeleteProduct) // 订单管理 authGroup.GET("/orders", orderHandler.ListOrders) authGroup.POST("/orders", orderHandler.CreateOrder) authGroup.GET("/orders/:id", orderHandler.GetOrder) authGroup.PUT("/orders/:id", orderHandler.UpdateOrder) // 文件上传 authGroup.POST("/upload", uploadHandler.UploadFile) } } // WebSocket路由 r.GET("/ws", wsHandler.HandleWebSocket) } func initLogger(logConfig config.LogConfig) (*zap.Logger, error) { var logger *zap.Logger var err error if logConfig.Level == "debug" { logger, err = zap.NewDevelopment() } else { logger, err = zap.NewProduction() } if err != nil { return nil, err } return logger, nil }