diff --git a/internal/handlers/practice_handler.go b/internal/handlers/practice_handler.go index de6fe84..6bd4315 100644 --- a/internal/handlers/practice_handler.go +++ b/internal/handlers/practice_handler.go @@ -100,7 +100,8 @@ func GetPracticeQuestions(c *gin.Context) { // 根据搜索关键词过滤(搜索题目内容或题目编号) if searchQuery != "" { - query = query.Where("question LIKE ? OR question_id LIKE ?", "%"+searchQuery+"%", "%"+searchQuery+"%") + // 将 question_id 显式转换为文本类型,避免 PostgreSQL 将其作为数字类型处理 + query = query.Where("question LIKE ? OR question_id::text LIKE ?", "%"+searchQuery+"%", "%"+searchQuery+"%") } // 获取总数 diff --git a/web/src/pages/Question.tsx b/web/src/pages/Question.tsx index 6b55873..1b18a10 100644 --- a/web/src/pages/Question.tsx +++ b/web/src/pages/Question.tsx @@ -303,15 +303,16 @@ const QuestionPage: React.FC = () => { // 随机模式:从题库中随机选择一题 if (randomMode) { - // 获取所有未答题目的索引 + // 获取所有未答题目的索引(排除当前题目) const unansweredIndexes: number[] = []; for (let i = 0; i < allQuestions.length; i++) { - if (!answeredStatus.has(i)) { + // 排除当前题目索引,避免选到同一题 + if (i !== currentIndex && !answeredStatus.has(i)) { unansweredIndexes.push(i); } } - // 如果所有题目都已回答,显示总结页面 + // 如果没有未答题目,显示总结页面 if (unansweredIndexes.length === 0) { setShowSummary(true); // 清除进度