package main import ( "ankao/internal/database" "ankao/internal/handlers" "ankao/internal/middleware" "log" "net/http" "time" "github.com/gin-gonic/gin" ) func main() { // 初始化数据库连接 if err := database.InitDB(); err != nil { log.Fatal("数据库初始化失败:", err) } log.Println("数据库连接成功") // 创建Gin路由器 r := gin.Default() // 应用自定义中间件 r.Use(middleware.CORS()) r.Use(middleware.Logger()) // API路由组(必须在静态文件服务之前注册) api := r.Group("/api") { // 健康检查 api.GET("/health", handlers.HealthCheckHandler) // 用户相关API api.POST("/login", handlers.Login) // 用户登录 api.POST("/register", handlers.Register) // 用户注册 // 需要认证的路由 auth := api.Group("", middleware.Auth()) { // 用户相关API auth.PUT("/user/type", handlers.UpdateUserType) // 更新用户类型 auth.PUT("/user/profile", handlers.UpdateProfile) // 更新用户信息 auth.PUT("/user/password", handlers.ChangePassword) // 修改密码 // 排行榜API auth.GET("/ranking/daily", handlers.GetDailyRanking) // 获取今日排行榜 // 练习题相关API(需要登录) auth.GET("/practice/questions", handlers.GetPracticeQuestions) // 获取练习题目列表 auth.GET("/practice/questions/:id", handlers.GetPracticeQuestionByID) // 获取指定练习题目 auth.POST("/practice/explain", handlers.ExplainQuestion) // 生成题目解析(AI) // 练习题提交(需要登录才能记录错题) auth.POST("/practice/submit", handlers.SubmitPracticeAnswer) // 提交练习答案 auth.GET("/practice/statistics", handlers.GetStatistics) // 获取统计数据 // 练习进度相关API auth.GET("/practice/progress", handlers.GetPracticeProgress) // 获取练习进度 auth.DELETE("/practice/progress", handlers.ClearPracticeProgress) // 清除练习进度 // 错题本相关API auth.GET("/wrong-questions", handlers.GetWrongQuestions) // 获取错题列表(支持筛选和排序) auth.GET("/wrong-questions/stats", handlers.GetWrongQuestionStats) // 获取错题统计(含趋势) auth.GET("/wrong-questions/recommended", handlers.GetRecommendedWrongQuestions) // 获取推荐错题 auth.GET("/wrong-questions/:id", handlers.GetWrongQuestionDetail) // 获取错题详情 auth.DELETE("/wrong-questions/:id", handlers.DeleteWrongQuestion) // 删除错题 auth.DELETE("/wrong-questions", handlers.ClearWrongQuestions) // 清空错题本 // 模拟考试相关API auth.POST("/exams", handlers.CreateExam) // 创建试卷 auth.GET("/exams", handlers.GetExamList) // 获取试卷列表 auth.GET("/exams/:id", handlers.GetExamDetail) // 获取试卷详情 auth.POST("/exams/:id/start", handlers.StartExam) // 开始考试 auth.POST("/exam-records/:record_id/submit", handlers.SubmitExam) // 提交试卷答案 auth.GET("/exam-records/:record_id", handlers.GetExamRecord) // 获取考试记录详情 auth.GET("/exam-records", handlers.GetExamRecordList) // 获取考试记录列表 auth.DELETE("/exams/:id", handlers.DeleteExam) // 删除试卷 auth.POST("/exam-records/:record_id/progress", handlers.SaveExamProgress) // 保存考试进度 auth.GET("/exam-records/:record_id/answers", handlers.GetExamUserAnswers) // 获取用户答案 } // 题库管理API(需要管理员权限) admin := api.Group("", middleware.Auth(), middleware.AdminAuth()) { admin.POST("/practice/questions", handlers.CreatePracticeQuestion) // 创建题目 admin.PUT("/practice/questions/:id", handlers.UpdatePracticeQuestion) // 更新题目 admin.DELETE("/practice/questions/:id", handlers.DeletePracticeQuestion) // 删除题目 } // 用户管理API(仅yanlongqi用户可访问) userAdmin := api.Group("", middleware.Auth(), middleware.AdminOnly()) { userAdmin.GET("/admin/users", handlers.GetAllUsersWithStats) // 获取所有用户及统计 userAdmin.GET("/admin/users/:id", handlers.GetUserDetailStats) // 获取用户详细统计 } } // 静态文件服务(使用 NoRoute 避免路由冲突) // 当没有匹配到任何 API 路由时,尝试提供静态文件 r.NoRoute(gin.WrapH(handlers.StaticFileHandler("./web"))) // 创建自定义HTTP服务器,设置超时时间 port := ":8080" server := &http.Server{ Addr: port, Handler: r, ReadTimeout: 5 * time.Minute, // 读取超时:5分钟 WriteTimeout: 5 * time.Minute, // 写入超时:5分钟 IdleTimeout: 10 * time.Minute, // 空闲连接超时:10分钟 MaxHeaderBytes: 1 << 20, // 最大请求头:1MB } log.Printf("服务器启动在端口 %s,超时配置:读/写 5分钟", port) // 启动服务器 if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed { panic("服务器启动失败: " + err.Error()) } }