main.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. package main
  2. import (
  3. "log"
  4. "web-training/config"
  5. "web-training/internal/handler"
  6. "web-training/internal/middleware"
  7. "web-training/pkg/database"
  8. "web-training/pkg/cache"
  9. "web-training/pkg/auth"
  10. "web-training/pkg/storage"
  11. "web-training/pkg/websocket"
  12. "github.com/gin-gonic/gin"
  13. "go.uber.org/zap"
  14. )
  15. func main() {
  16. // 加载配置
  17. cfg, err := config.LoadConfig("config/config.yaml")
  18. if err != nil {
  19. log.Fatalf("Failed to load config: %v", err)
  20. }
  21. // 初始化日志
  22. logger, err := initLogger(cfg.Log)
  23. if err != nil {
  24. log.Fatalf("Failed to initialize logger: %v", err)
  25. }
  26. defer logger.Sync()
  27. // 初始化数据库
  28. db, err := database.InitMySQL(cfg.Database)
  29. if err != nil {
  30. logger.Fatal("Failed to initialize database", zap.Error(err))
  31. }
  32. // 初始化Redis
  33. redisClient, err := cache.InitRedis(cfg.Redis)
  34. if err != nil {
  35. logger.Fatal("Failed to initialize Redis", zap.Error(err))
  36. }
  37. // 初始化JWT服务
  38. jwtService := auth.NewJWTService(cfg.JWT.Secret, cfg.JWT.Expire)
  39. // 初始化存储服务
  40. storageService := storage.NewLocalStorage(cfg.Upload.Path, cfg.Upload.MaxSize, cfg.Upload.AllowedTypes)
  41. // 初始化WebSocket Hub
  42. wsHub := websocket.NewHub()
  43. go wsHub.Run()
  44. // 设置Gin模式
  45. gin.SetMode(cfg.Server.Mode)
  46. // 创建Gin引擎
  47. r := gin.New()
  48. // 添加全局中间件
  49. r.Use(middleware.LoggerMiddleware(logger))
  50. r.Use(middleware.RecoveryMiddleware(logger))
  51. r.Use(middleware.CORSMiddleware())
  52. r.Use(middleware.RateLimitMiddleware(100)) // 限制每秒100个请求
  53. // 初始化处理器
  54. userHandler := handler.NewUserHandler(db, jwtService)
  55. productHandler := handler.NewProductHandler(db, redisClient, storageService)
  56. orderHandler := handler.NewOrderHandler(db)
  57. uploadHandler := handler.NewUploadHandler(storageService)
  58. wsHandler := handler.NewWebSocketHandler(wsHub)
  59. // 设置路由
  60. setupRoutes(r, userHandler, productHandler, orderHandler, uploadHandler, wsHandler, jwtService)
  61. // 启动服务器
  62. logger.Info("Starting server", zap.String("port", cfg.Server.Port))
  63. if err := r.Run(":" + cfg.Server.Port); err != nil {
  64. logger.Fatal("Failed to start server", zap.Error(err))
  65. }
  66. }
  67. func setupRoutes(r *gin.Engine,
  68. userHandler *handler.UserHandler,
  69. productHandler *handler.ProductHandler,
  70. orderHandler *handler.OrderHandler,
  71. uploadHandler *handler.UploadHandler,
  72. wsHandler *handler.WebSocketHandler,
  73. jwtService *auth.JWTService) {
  74. // 静态文件服务
  75. r.Static("/static", "./web/static")
  76. r.LoadHTMLGlob("web/templates/*")
  77. // 首页
  78. r.GET("/", func(c *gin.Context) {
  79. c.HTML(200, "index.html", gin.H{
  80. "title": "Go Web Training",
  81. })
  82. })
  83. // API路由组
  84. api := r.Group("/api/v1")
  85. {
  86. // 公开路由
  87. api.POST("/register", userHandler.Register)
  88. api.POST("/login", userHandler.Login)
  89. // 需要认证的路由
  90. authGroup := api.Group("/")
  91. authGroup.Use(middleware.AuthMiddleware(jwtService))
  92. {
  93. // 用户管理
  94. authGroup.GET("/users", userHandler.ListUsers)
  95. authGroup.GET("/users/:id", userHandler.GetUser)
  96. authGroup.PUT("/users/:id", userHandler.UpdateUser)
  97. authGroup.DELETE("/users/:id", userHandler.DeleteUser)
  98. // 商品管理
  99. authGroup.GET("/products", productHandler.ListProducts)
  100. authGroup.POST("/products", productHandler.CreateProduct)
  101. authGroup.GET("/products/:id", productHandler.GetProduct)
  102. authGroup.PUT("/products/:id", productHandler.UpdateProduct)
  103. authGroup.DELETE("/products/:id", productHandler.DeleteProduct)
  104. // 订单管理
  105. authGroup.GET("/orders", orderHandler.ListOrders)
  106. authGroup.POST("/orders", orderHandler.CreateOrder)
  107. authGroup.GET("/orders/:id", orderHandler.GetOrder)
  108. authGroup.PUT("/orders/:id", orderHandler.UpdateOrder)
  109. // 文件上传
  110. authGroup.POST("/upload", uploadHandler.UploadFile)
  111. }
  112. }
  113. // WebSocket路由
  114. r.GET("/ws", wsHandler.HandleWebSocket)
  115. }
  116. func initLogger(logConfig config.LogConfig) (*zap.Logger, error) {
  117. var logger *zap.Logger
  118. var err error
  119. if logConfig.Level == "debug" {
  120. logger, err = zap.NewDevelopment()
  121. } else {
  122. logger, err = zap.NewProduction()
  123. }
  124. if err != nil {
  125. return nil, err
  126. }
  127. return logger, nil
  128. }