package main import ( "fmt" "log" "memora-api/internal/config" "memora-api/internal/handler" "memora-api/internal/model" "memora-api/internal/service" "github.com/gin-gonic/gin" "gorm.io/driver/mysql" "gorm.io/gorm" ) func main() { // 加载配置 cfg, err := config.LoadConfig("config.yaml") if err != nil { log.Fatalf("加载配置失败: %v", err) } // 连接数据库 db, err := gorm.Open(mysql.Open(cfg.Database.DSN()), &gorm.Config{}) if err != nil { log.Fatalf("连接数据库失败: %v", err) } // 自动迁移表 if err := db.AutoMigrate(&model.Word{}, &model.MemoryRecord{}); err != nil { log.Fatalf("数据库迁移失败: %v", err) } // 初始化服务 wordService := service.NewWordService(db) wordHandler := handler.NewWordHandler(wordService) // 启动 Gin r := gin.Default() // CORS 中间件 r.Use(func(c *gin.Context) { c.Writer.Header().Set("Access-Control-Allow-Origin", "*") c.Writer.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS") c.Writer.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization") if c.Request.Method == "OPTIONS" { c.AbortWithStatus(204) return } c.Next() }) // 路由 api := r.Group("/api") { // 记忆模式 api.POST("/words", wordHandler.AddWord) api.GET("/words", wordHandler.GetWords) // 复习模式 api.GET("/review", wordHandler.GetReviewWords) api.POST("/review", wordHandler.SubmitReview) // 统计 api.GET("/stats", wordHandler.GetStatistics) // 音频 api.GET("/audio", wordHandler.GetAudio) } // 启动服务器 addr := fmt.Sprintf("%s:%d", cfg.Server.Host, cfg.Server.Port) log.Printf("服务器启动在: %s", addr) if err := r.Run(addr); err != nil { log.Fatalf("启动服务器失败: %v", err) } }