// api/router.go package api import ( "github.com/Nanqipro/YunQue-Tech-Projects/ai_english_learning/serve/api/handlers" "github.com/Nanqipro/YunQue-Tech-Projects/ai_english_learning/serve/config" "github.com/Nanqipro/YunQue-Tech-Projects/ai_english_learning/serve/internal/database" "github.com/Nanqipro/YunQue-Tech-Projects/ai_english_learning/serve/internal/handler" "github.com/Nanqipro/YunQue-Tech-Projects/ai_english_learning/serve/internal/middleware" "github.com/Nanqipro/YunQue-Tech-Projects/ai_english_learning/serve/internal/services" "github.com/gin-gonic/gin" "github.com/go-playground/validator/v10" ) // SetupRouter 配置所有路由 func SetupRouter() *gin.Engine { // 根据环境设置Gin模式 gin.SetMode(config.GlobalConfig.Server.Mode) // 创建路由引擎,不使用默认中间件 router := gin.New() // 添加自定义中间件 router.Use(middleware.RequestID()) router.Use(middleware.RequestResponseLogger()) router.Use(middleware.ErrorHandler()) router.Use(middleware.CORS()) router.Use(middleware.RateLimiter()) // 静态文件服务 - 提供上传文件的访问 router.Static("/uploads", "./uploads") // 初始化数据库连接 db := database.GetDB() // 初始化验证器 validate := validator.New() // 初始化服务 userService := services.NewUserService(db) vocabularyService := services.NewVocabularyService(db) learningSessionService := services.NewLearningSessionService(db) listeningService := services.NewListeningService(db) readingService := services.NewReadingService(db) writingService := services.NewWritingService(db) speakingService := services.NewSpeakingService(db) testService := services.NewTestService(db) notificationService := services.NewNotificationService(db) wordBookService := services.NewWordBookService(db) studyPlanService := services.NewStudyPlanService(db) // 初始化处理器 authHandler := handlers.NewAuthHandler(userService) userHandler := handlers.NewUserHandler(userService) vocabularyHandler := handler.NewVocabularyHandler(vocabularyService) learningSessionHandler := handler.NewLearningSessionHandler(learningSessionService) listeningHandler := handlers.NewListeningHandler(listeningService, validate) readingHandler := handlers.NewReadingHandler(readingService) writingHandler := handlers.NewWritingHandler(writingService) speakingHandler := handlers.NewSpeakingHandler(speakingService) testHandler := handlers.NewTestHandler(testService) notificationHandler := handler.NewNotificationHandler(notificationService) wordBookHandler := handler.NewWordBookHandler(wordBookService) studyPlanHandler := handler.NewStudyPlanHandler(studyPlanService) aiHandler := handler.NewAIHandler() uploadHandler := handler.NewUploadHandler() // 健康检查和系统信息路由 router.GET("/health", handlers.HealthCheck) router.GET("/health/readiness", handlers.ReadinessCheck) router.GET("/health/liveness", handlers.LivenessCheck) router.GET("/version", handlers.GetVersion) // 为 /hello 路径注册 HelloHandler router.GET("/hello", handlers.HelloHandler) // 认证相关路由(无需认证) auth := router.Group("/api/v1/auth") { auth.POST("/register", authHandler.Register) auth.POST("/login", authHandler.Login) auth.POST("/refresh", authHandler.RefreshToken) } // 用户相关路由(需要认证) user := router.Group("/api/v1/user") user.Use(middleware.AuthMiddleware()) { user.GET("/profile", userHandler.GetUserProfile) user.PUT("/profile", userHandler.UpdateUserProfile) user.GET("/stats", userHandler.GetUserStats) user.GET("/learning-progress", userHandler.GetUserLearningProgress) user.POST("/change-password", authHandler.ChangePassword) } // 词汇相关路由 vocabulary := router.Group("/api/v1/vocabulary") vocabulary.Use(middleware.AuthMiddleware()) { // 词汇分类 vocabulary.GET("/categories", vocabularyHandler.GetCategories) vocabulary.POST("/categories", vocabularyHandler.CreateCategory) vocabulary.PUT("/categories/:id", vocabularyHandler.UpdateCategory) vocabulary.DELETE("/categories/:id", vocabularyHandler.DeleteCategory) // 词汇管理 vocabulary.GET("/categories/:id/vocabularies", vocabularyHandler.GetVocabulariesByCategory) vocabulary.GET("/:id", vocabularyHandler.GetVocabularyByID) vocabulary.POST("/", vocabularyHandler.CreateVocabulary) vocabulary.GET("/search", vocabularyHandler.SearchVocabularies) // 用户单词学习进度 vocabulary.GET("/words/:id/progress", vocabularyHandler.GetUserWordProgress) vocabulary.PUT("/words/:id/progress", vocabularyHandler.UpdateUserWordProgress) // 用户词汇进度 vocabulary.GET("/progress/:id", vocabularyHandler.GetUserVocabularyProgress) vocabulary.PUT("/progress/:id", vocabularyHandler.UpdateUserVocabularyProgress) vocabulary.GET("/stats", vocabularyHandler.GetUserVocabularyStats) // 词汇测试 vocabulary.POST("/tests", vocabularyHandler.CreateVocabularyTest) vocabulary.GET("/tests/:id", vocabularyHandler.GetVocabularyTest) vocabulary.PUT("/tests/:id/result", vocabularyHandler.UpdateVocabularyTestResult) // 每日学习统计 vocabulary.GET("/daily", vocabularyHandler.GetDailyVocabularyStats) // 学习相关API vocabulary.GET("/study/today", vocabularyHandler.GetTodayStudyWords) vocabulary.GET("/study/statistics", vocabularyHandler.GetStudyStatistics) vocabulary.GET("/study/statistics/history", vocabularyHandler.GetStudyStatisticsHistory) // 词汇书相关API vocabulary.GET("/books/categories", vocabularyHandler.GetVocabularyBookCategories) vocabulary.GET("/books/system", vocabularyHandler.GetSystemVocabularyBooks) vocabulary.GET("/books/:id/words", vocabularyHandler.GetVocabularyBookWords) vocabulary.GET("/books/:id/progress", vocabularyHandler.GetVocabularyBookProgress) // 学习会话相关API vocabulary.POST("/books/:id/learn", learningSessionHandler.StartLearning) vocabulary.GET("/books/:id/tasks", learningSessionHandler.GetTodayTasks) vocabulary.GET("/books/:id/statistics", learningSessionHandler.GetLearningStatistics) vocabulary.POST("/words/:id/study", learningSessionHandler.SubmitWordStudy) } // 学习统计相关路由(全局统计,不限词汇书) learning := router.Group("/api/v1/learning") learning.Use(middleware.AuthMiddleware()) { learning.GET("/today/statistics", learningSessionHandler.GetTodayOverallStatistics) learning.GET("/today/review-words", learningSessionHandler.GetTodayReviewWords) } // 听力训练相关路由 listening := router.Group("/api/v1/listening") listening.Use(middleware.AuthMiddleware()) { // 听力材料管理 listening.GET("/materials", listeningHandler.GetListeningMaterials) listening.GET("/materials/:id", listeningHandler.GetListeningMaterial) listening.POST("/materials", listeningHandler.CreateListeningMaterial) listening.PUT("/materials/:id", listeningHandler.UpdateListeningMaterial) listening.DELETE("/materials/:id", listeningHandler.DeleteListeningMaterial) listening.GET("/materials/search", listeningHandler.SearchListeningMaterials) // 听力练习记录 listening.POST("/records", listeningHandler.CreateListeningRecord) listening.PUT("/records/:id", listeningHandler.UpdateListeningRecord) listening.GET("/records", listeningHandler.GetUserListeningRecords) listening.GET("/records/:id", listeningHandler.GetListeningRecord) // 听力学习统计和进度 listening.GET("/stats", listeningHandler.GetUserListeningStats) listening.GET("/progress/:material_id", listeningHandler.GetListeningProgress) } // 阅读理解相关路由 reading := router.Group("/api/v1/reading") reading.Use(middleware.AuthMiddleware()) { // 阅读材料管理 reading.GET("/materials", readingHandler.GetReadingMaterials) reading.GET("/materials/:id", readingHandler.GetReadingMaterial) reading.POST("/materials", readingHandler.CreateReadingMaterial) reading.PUT("/materials/:id", readingHandler.UpdateReadingMaterial) reading.DELETE("/materials/:id", readingHandler.DeleteReadingMaterial) reading.GET("/materials/search", readingHandler.SearchReadingMaterials) // 阅读练习记录 reading.POST("/records", readingHandler.CreateReadingRecord) reading.PUT("/records/:id", readingHandler.UpdateReadingRecord) reading.GET("/records", readingHandler.GetUserReadingRecords) reading.GET("/records/:id", readingHandler.GetReadingRecord) // 阅读学习统计和进度 reading.GET("/stats", readingHandler.GetReadingStats) reading.GET("/progress/:material_id", readingHandler.GetReadingProgress) reading.GET("/recommendations", readingHandler.GetRecommendedMaterials) } // 写作练习相关路由 writing := router.Group("/api/v1/writing") writing.Use(middleware.AuthMiddleware()) { // 写作题目管理 writing.GET("/prompts", writingHandler.GetWritingPrompts) writing.GET("/prompts/:id", writingHandler.GetWritingPrompt) writing.POST("/prompts", writingHandler.CreateWritingPrompt) writing.PUT("/prompts/:id", writingHandler.UpdateWritingPrompt) writing.DELETE("/prompts/:id", writingHandler.DeleteWritingPrompt) writing.GET("/prompts/search", writingHandler.SearchWritingPrompts) writing.GET("/prompts/recommendations", writingHandler.GetRecommendedPrompts) // 写作提交管理 writing.POST("/submissions", writingHandler.CreateWritingSubmission) writing.GET("/submissions", writingHandler.GetUserWritingSubmissions) writing.GET("/submissions/:id", writingHandler.GetWritingSubmission) writing.PUT("/submissions/:id/submit", writingHandler.SubmitWriting) writing.PUT("/submissions/:id/grade", writingHandler.GradeWriting) // 写作学习统计和进度 writing.GET("/stats", writingHandler.GetWritingStats) writing.GET("/progress/:prompt_id", writingHandler.GetWritingProgress) } // 口语练习相关路由 speaking := router.Group("/api/v1/speaking") speaking.Use(middleware.AuthMiddleware()) { // 口语场景管理 speaking.GET("/scenarios", speakingHandler.GetSpeakingScenarios) speaking.GET("/scenarios/:id", speakingHandler.GetSpeakingScenario) speaking.POST("/scenarios", speakingHandler.CreateSpeakingScenario) speaking.PUT("/scenarios/:id", speakingHandler.UpdateSpeakingScenario) speaking.DELETE("/scenarios/:id", speakingHandler.DeleteSpeakingScenario) speaking.GET("/scenarios/search", speakingHandler.SearchSpeakingScenarios) speaking.GET("/scenarios/recommendations", speakingHandler.GetRecommendedScenarios) // 口语记录管理 speaking.POST("/records", speakingHandler.CreateSpeakingRecord) speaking.GET("/records", speakingHandler.GetUserSpeakingRecords) speaking.GET("/records/:id", speakingHandler.GetSpeakingRecord) speaking.PUT("/records/:id/submit", speakingHandler.SubmitSpeaking) speaking.PUT("/records/:id/grade", speakingHandler.GradeSpeaking) // 口语学习统计和进度 speaking.GET("/stats", speakingHandler.GetSpeakingStats) speaking.GET("/progress/:scenario_id", speakingHandler.GetSpeakingProgress) } // AI相关路由 ai := router.Group("/api/v1/ai") ai.Use(middleware.AuthMiddleware()) { // 写作批改 ai.POST("/writing/correct", aiHandler.CorrectWriting) // 口语评估 ai.POST("/speaking/evaluate", aiHandler.EvaluateSpeaking) // AI使用统计 ai.GET("/stats", aiHandler.GetAIUsageStats) } // 文件上传相关路由 upload := router.Group("/api/v1/upload") upload.Use(middleware.AuthMiddleware()) { // 音频文件上传 upload.POST("/audio", uploadHandler.UploadAudio) // 图片文件上传 upload.POST("/image", uploadHandler.UploadImage) // 文件信息查询 upload.GET("/file/:file_id", uploadHandler.GetFileInfo) // 文件删除 upload.DELETE("/file/:file_id", uploadHandler.DeleteFile) // 上传统计 upload.GET("/stats", uploadHandler.GetUploadStats) } // 综合测试相关路由 test := router.Group("/api/v1/tests") test.Use(middleware.AuthMiddleware()) { // 测试模板管理 test.GET("/templates", testHandler.GetTestTemplates) test.GET("/templates/:id", testHandler.GetTestTemplateByID) // 测试会话管理 test.POST("/sessions", testHandler.CreateTestSession) test.GET("/sessions", testHandler.GetUserTestHistory) test.GET("/sessions/:id", testHandler.GetTestSession) test.PUT("/sessions/:id/start", testHandler.StartTest) test.POST("/sessions/:id/answers", testHandler.SubmitAnswer) test.PUT("/sessions/:id/pause", testHandler.PauseTest) test.PUT("/sessions/:id/resume", testHandler.ResumeTest) test.PUT("/sessions/:id/complete", testHandler.CompleteTest) // 测试结果管理 test.GET("/results/:id", testHandler.GetTestResultByID) test.DELETE("/results/:id", testHandler.DeleteTestResult) // 测试统计 test.GET("/stats", testHandler.GetUserTestStats) } // 通知相关路由 notification := router.Group("/api/v1/notifications") notification.Use(middleware.AuthMiddleware()) { // 获取通知列表 notification.GET("", notificationHandler.GetNotifications) // 获取未读通知数量 notification.GET("/unread-count", notificationHandler.GetUnreadCount) // 标记通知为已读 notification.PUT("/:id/read", notificationHandler.MarkAsRead) // 标记所有通知为已读 notification.PUT("/read-all", notificationHandler.MarkAllAsRead) // 删除通知 notification.DELETE("/:id", notificationHandler.DeleteNotification) } // 生词本相关路由 wordBook := router.Group("/api/v1/word-book") wordBook.Use(middleware.AuthMiddleware()) { // 切换收藏状态 wordBook.POST("/toggle/:id", wordBookHandler.ToggleFavorite) // 获取生词本列表 wordBook.GET("", wordBookHandler.GetFavoriteWords) // 获取指定词汇书的生词本 wordBook.GET("/books/:id", wordBookHandler.GetFavoriteWordsByBook) // 获取生词本统计 wordBook.GET("/stats", wordBookHandler.GetFavoriteStats) // 批量添加到生词本 wordBook.POST("/batch", wordBookHandler.BatchAddToFavorite) // 从生词本移除 wordBook.DELETE("/:id", wordBookHandler.RemoveFromFavorite) } // 学习计划相关路由 studyPlan := router.Group("/api/v1/study-plans") studyPlan.Use(middleware.AuthMiddleware()) { // 创建学习计划 studyPlan.POST("", studyPlanHandler.CreateStudyPlan) // 获取学习计划列表 studyPlan.GET("", studyPlanHandler.GetUserStudyPlans) // 获取今日计划 studyPlan.GET("/today", studyPlanHandler.GetTodayStudyPlans) // 获取计划详情 studyPlan.GET("/:id", studyPlanHandler.GetStudyPlanByID) // 更新计划 studyPlan.PUT("/:id", studyPlanHandler.UpdateStudyPlan) // 删除计划 studyPlan.DELETE("/:id", studyPlanHandler.DeleteStudyPlan) // 更新计划状态 studyPlan.PATCH("/:id/status", studyPlanHandler.UpdatePlanStatus) // 记录学习进度 studyPlan.POST("/:id/progress", studyPlanHandler.RecordStudyProgress) // 获取计划统计 studyPlan.GET("/:id/statistics", studyPlanHandler.GetStudyPlanStatistics) } return router }