| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- 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
- }
|