AnCao/scripts/import_questions.go
yanlongqi de8480a328 重构答题系统:组件拆分、进度跟踪、完成统计
主要改动:
1. 组件拆分:将Question.tsx(605行)拆分为4个子组件(303行)
   - QuestionProgress: 进度条和统计显示
   - QuestionCard: 题目卡片和答题界面
   - AnswerResult: 答案结果展示
   - CompletionSummary: 完成统计摘要

2. 新增功能:
   - 答题进度条:显示当前进度、正确数、错误数
   - 进度保存:使用localStorage持久化答题进度
   - 完成统计:答完所有题目后显示统计摘要和正确率
   - 从第一题开始:改为顺序答题而非随机

3. UI优化:
   - 移除右上角统计按钮
   - 移除底部随机题目、题目列表、筛选按钮
   - 移除"开始xxx答题"提示消息
   - 简化页面布局

4. 代码优化:
   - 提高代码可维护性和可测试性
   - 单一职责原则,每个组件负责一个特定功能

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-04 18:39:15 +08:00

93 lines
2.2 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package main
import (
"ankao/internal/database"
"ankao/internal/models"
"encoding/json"
"log"
"os"
)
// JSONQuestion JSON中的题目结构
type JSONQuestion struct {
ID string `json:"id"`
Question string `json:"question"`
Answers interface{} `json:"answers"`
Options interface{} `json:"options,omitempty"`
}
// JSONQuestionGroup JSON中的题目组结构
type JSONQuestionGroup struct {
Type string `json:"type"`
TypeName string `json:"typeName"`
List []JSONQuestion `json:"list"`
}
func main() {
log.Println("开始导入题目数据...")
// 初始化数据库
if err := database.InitDB(); err != nil {
log.Fatal("数据库初始化失败:", err)
}
// 读取JSON文件
data, err := os.ReadFile("practice_question_pool.json")
if err != nil {
log.Fatal("读取JSON文件失败:", err)
}
// 解析JSON
var groups []JSONQuestionGroup
if err := json.Unmarshal(data, &groups); err != nil {
log.Fatal("解析JSON失败:", err)
}
// 导入数据
db := database.GetDB()
totalCount := 0
for _, group := range groups {
log.Printf("导入题型: %s (%s), 题目数量: %d", group.TypeName, group.Type, len(group.List))
for _, q := range group.List {
// 将答案转换为JSON字符串存储
answerJSON, err := json.Marshal(q.Answers)
if err != nil {
log.Printf("序列化答案失败 (ID: %s): %v", q.ID, err)
continue
}
// 将选项转换为JSON字符串存储
optionsJSON := ""
if q.Options != nil {
optJSON, err := json.Marshal(q.Options)
if err != nil {
log.Printf("序列化选项失败 (ID: %s): %v", q.ID, err)
continue
}
optionsJSON = string(optJSON)
}
// 创建题目记录 - 直接使用group.Type不做类型映射
question := models.PracticeQuestion{
QuestionID: q.ID,
Type: group.Type,
TypeName: group.TypeName,
Question: q.Question,
AnswerData: string(answerJSON),
OptionsData: optionsJSON,
}
// 插入数据库
if err := db.Create(&question).Error; err != nil {
log.Printf("插入题目失败 (ID: %s): %v", q.ID, err)
continue
}
totalCount++
}
}
log.Printf("数据导入完成! 共导入 %d 道题目", totalCount)
}