主要改动: 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>
93 lines
2.2 KiB
Go
93 lines
2.2 KiB
Go
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)
|
||
}
|