**统计功能**: - 新增UserAnswerRecord模型记录用户答题历史 - 实现GetStatistics接口,统计题库总数、已答题数、正确率 - 在提交答案时自动记录答题历史 - 前端连接真实统计接口,显示实时数据 **认证系统优化**: - 新增Auth中间件,实现基于Token的身份验证 - 登录和注册时自动生成并保存Token到数据库 - 所有需要登录的接口都通过Auth中间件保护 - 统一处理未授权请求,返回401状态码 **错题练习功能**: - 新增GetRandomWrongQuestion接口,随机获取错题 - 支持错题练习模式(/question?mode=wrong) - 优化错题本页面UI,移除已掌握功能 - 新增"开始错题练习"按钮,直接进入练习模式 **数据库迁移**: - 新增user_answer_records表,记录用户答题历史 - User表新增token字段,存储用户登录凭证 **技术改进**: - 统一错误处理,区分401未授权和404未找到 - 优化答题流程,记录历史和错题分离处理 - 移除异步记录错题,改为同步处理保证数据一致性 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
68 lines
2.2 KiB
Go
68 lines
2.2 KiB
Go
package main
|
|
|
|
import (
|
|
"ankao/internal/database"
|
|
"ankao/internal/handlers"
|
|
"ankao/internal/middleware"
|
|
"log"
|
|
|
|
"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())
|
|
|
|
// 静态文件服务
|
|
r.Static("/static", "./web/static")
|
|
r.StaticFile("/", "./web/index.html")
|
|
|
|
// API路由组
|
|
api := r.Group("/api")
|
|
{
|
|
// 健康检查
|
|
api.GET("/health", handlers.HealthCheckHandler)
|
|
|
|
// 用户相关API
|
|
api.POST("/login", handlers.Login) // 用户登录
|
|
api.POST("/register", handlers.Register) // 用户注册
|
|
|
|
// 练习题相关API
|
|
api.GET("/practice/questions", handlers.GetPracticeQuestions) // 获取练习题目列表
|
|
api.GET("/practice/questions/random", handlers.GetRandomPracticeQuestion) // 获取随机练习题目
|
|
api.GET("/practice/questions/:id", handlers.GetPracticeQuestionByID) // 获取指定练习题目
|
|
api.GET("/practice/types", handlers.GetPracticeQuestionTypes) // 获取题型列表
|
|
|
|
// 需要认证的路由
|
|
auth := api.Group("", middleware.Auth())
|
|
{
|
|
// 练习题提交(需要登录才能记录错题)
|
|
auth.POST("/practice/submit", handlers.SubmitPracticeAnswer) // 提交练习答案
|
|
auth.GET("/practice/statistics", handlers.GetStatistics) // 获取统计数据
|
|
|
|
// 错题本相关API
|
|
auth.GET("/wrong-questions", handlers.GetWrongQuestions) // 获取错题列表
|
|
auth.GET("/wrong-questions/stats", handlers.GetWrongQuestionStats) // 获取错题统计
|
|
auth.GET("/wrong-questions/random", handlers.GetRandomWrongQuestion) // 获取随机错题
|
|
auth.PUT("/wrong-questions/:id/mastered", handlers.MarkWrongQuestionMastered) // 标记已掌握
|
|
auth.DELETE("/wrong-questions", handlers.ClearWrongQuestions) // 清空错题本
|
|
}
|
|
}
|
|
|
|
// 启动服务器
|
|
port := ":8080"
|
|
if err := r.Run(port); err != nil {
|
|
panic("服务器启动失败: " + err.Error())
|
|
}
|
|
}
|