【OpenHarmony/HarmonyOs 】错题本功能从 0 到 1:答题记录、去重收录与复习闭环 📅 发布时间:2026/7/8 1:55:20 👁️ 浏览次数: 【OpenHarmony/HarmonyOs 】错题本功能从 0 到 1答题记录、去重收录与复习闭环错题本是学习 App 里非常实用的功能。用户不是只需要“做题”更需要知道自己错在哪里、后面怎么复习。本文结合我的「化学视界」项目记录我是如何开发错题本功能的。一、为什么要做错题本化学学习有大量记忆和理解内容比如元素性质、方程式现象、实验操作、有机化学概念等。用户答错题后如果没有复习入口很容易“错过就忘”。所以我在挑战模块里加入了错题本答错时自动收录。答对后可以移除。错题列表可反复练习。设置页能看到错题数量。用户可以清空错题。这让题库不只是一次性练习而是形成“做题 → 出错 → 复习 → 掌握”的闭环。二、错题本的数据应该怎么存我没有保存完整题目内容而是只保存题目 idconst STORAGE_KEYquiz_wrong_question_ids;原因很简单题库本身已经在本地数据中错题本只需要记录“哪些题错过”。这样数据更轻也避免重复保存题干、选项和解析。读取逻辑如下functionreadIds():number[] {try{constraw AppStorage.getstring(STORAGE_KEY);if(!raw || raw.length0) {return[]; }constparsed JSON.parse(raw)asnumber[];if(!Array.isArray(parsed)) {return[]; }returnparsed.filter((n:number) typeofn number); }catch{return[]; } }这里做了容错处理如果本地数据为空、格式异常或解析失败就返回空数组避免页面崩掉。三、答错时自动加入错题集加入错题时要去重否则用户同一道题答错多次错题本会出现重复项exportfunctionaddWrongQuestionId(id:number): void { const ids readIds();if(!ids.includes(id)) { ids.push(id); writeIds(ids); } }这个逻辑虽然简单但很关键。错题本应该反映“哪些题没掌握”而不是“错了多少次”。如果要统计错误次数可以额外做字段但不应该让列表重复。四、答对后移除错题当用户在错题复习里答对某道题后可以从错题集中移除exportfunctionremoveWrongQuestionId(id:number):void{writeIds(readIds().filter((x:number) x ! id)); }我开发时把“移除”设计为明确动作只有复习答对后才移除而不是用户随便进入题目就清掉。这样更符合学习逻辑。五、把错题 id 还原成完整题目错题页面展示时需要根据 id 找回完整题目exportfunctiongetWrongQuestions():QuizQuestion[] {constlist:QuizQuestion[] [];readIds().forEach((id: number) {constq quizData.find((x: QuizQuestion) x.id id);if(q) { list.push(q); } });returnlist; }这里没有直接map而是手动判断q是否存在。这样即使后续题库调整某个旧 id 找不到也不会影响整个错题本。六、挑战页中的错题状态在QuizView中我为错题模式单独维护了一组状态StatewrongQuestions: QuizQuestion[] [];StatewrongIndex: number 0;StatewrongAnswer: string ;StatewrongAnswered: boolean false;StatewrongCorrect: boolean false;StatewrongResultAppear: boolean false;StateexplanationWrongQ: QuizQuestion | null null;为什么不复用练习模式的状态因为错题模式有自己的特殊逻辑答对后可能移除当前题。移除后列表长度会变化。解析区仍然要展示刚答过的题。当前索引需要防止越界。所以我把错题模式独立出来避免和普通练习互相影响。七、防止答对后列表错位项目里有一个很细的状态StateexplanationWrongQ: QuizQuestion |nullnull;它的作用是固定展示刚作答的那道题。因为如果用户答对后这道题会从错题列表移除列表索引可能变化。如果解析区直接依赖wrongQuestions[wrongIndex]就可能显示到下一道题。这是我开发错题本时遇到的一个真实问题数据变化后 UI 绑定对象也跟着变了。解决办法就是把“当前解析题”单独保存一份。八、设置页展示错题数量错题本不只在挑战页出现设置页也会展示入口和数量loadBadge() {this.wrongCount getWrongQuestions().length;constfavs getAllFavorites();this.favoriteCount favs.length;this.unlockCount this.achievementManager.getUnlockedCount(); }设置项中展示徽标{icon:,title:我的错题,subtitle:答错的题目自动收录,action:wrongbook,badge: this.wrongCount 0? String(this.wrongCount) :,badgeColor:#F44336}这样用户不用进入挑战页也能知道自己有没有待复习内容。九、清空错题给用户数据控制权设置页中提供了清空错题的逻辑handleClearConfirm() {if(this.clearActionType wrong) { clearWrongBook();this.wrongCount 0; }else{ clearFavorites();this.favoriteCount 0; }this.showClearConfirm false; }学习数据应该由用户控制。错题本是帮助复习的工具不应该变成无法清理的负担。十、错题本和收藏夹的区别开发时我也思考过一个问题错题本和收藏夹都能保存内容它们有什么区别我的理解是收藏夹是用户主动选择的内容。错题本是系统根据学习结果自动生成的内容。所以收藏夹更像“我觉得重要”错题本更像“我还没掌握”。这两个入口在学习闭环里承担的角色不同不能混在一起。收藏夹适合放常查元素。重点方程式。重要知识点。错题本适合放答错的题目。需要反复练习的知识点。用户短期薄弱内容。正因为这个区别我在代码里也把它们拆成两个工具类收藏由FavoritesManager管理错题由WrongBookStore管理。这样后续维护时不会互相影响。十一、错题本后续可以怎么优化当前错题本已经实现了基础闭环但还可以继续增强给错题增加“错误次数”区分偶然错误和高频错误。给错题增加“最近答错时间”优先复习近期错题。按题目分类统计薄弱模块。在学习统计页展示错题趋势。根据错题自动推荐知识点。不过我没有一开始就把这些都做进去因为基础功能要先稳定。先保证收录、复习、移除、清空这些主流程可靠再做增强会更稳。十二、我开发错题本的总结错题本的开发重点不在 UI而在学习流程❌ 答错自动收录。✅ 答对可以移除。 支持反复复习。 解析区固定当前题。 支持用户清空。从代码上看错题本只保存 id非常轻量从体验上看它把挑战模块从“做完就结束”变成了“持续复习”。这就是学习工具真正有价值的地方。
音视频编解码:VP8 / VP9 / H.264 / Opus 音视频编解码:VP8 / VP9 / H.264 / Opus WebRTC 支持哪些音视频编解码器?各有什么优缺点?怎么选?码率怎么设?这篇讲 WebRTC 常用的视频编码(VP8/VP9/H.264/AV1)和音频编码(Opus/G.71… 2026/7/8 1:55:20
AutoJS6 + Shizuku 实战:淘金币自动签到与任务脚本 🚀 目标:实现淘金币自动签到,自动做任务。 autojs 简介 autojs 安卓平台 JavaScript 自动化工具。 版本选择 autojs 涉及多个版本,下面介绍简单下。 autojs 原版 Auto.js 官网如下,但因项目年代和分支不同,情况有些特殊。 官方论坛 / 官网:https://www.autojs.or… 2026/7/8 1:51:19
CIFAR-10/100 数据集实战:PyTorch 与 TensorFlow 加载对比与 3 种预处理技巧 CIFAR-10/100 数据集实战:PyTorch 与 TensorFlow 加载对比与 3 种预处理技巧当你在深夜调试一个图像分类模型时,突然发现验证集准确率卡在60%死活上不去——这可能不是模型架构的问题,而是数据加载和预处理环节埋了雷。CIFAR-10和CIFAR-100作… 2026/7/8 1:49:18
LLM进阶指南:从调用API到构建AI应用,开发者必须掌握 说实话,我刚开始接触LLM API的时候也是一脸懵——以为调个接口就完事了,结果发现Token怎么算、上下文怎么管理、Function Calling怎么用,全都是坑。 结果你猜怎么着?**深入研究了OpenAI、Google、Anthropic等平台的开发者文档后&… 2026/7/8 3:35:49
商标注册服务商哪家好 在闽南地区,很多企业在做品牌和产品时,常常会遇到一些知识产权方面的困扰。比如商标被抢注、外观设计被抄袭、专利没保护好导致亏损等。这些问题不仅会给企业带来经济损失,还会影响企业的品牌形象和发展。因此,选择一家专业的知识… 2026/7/8 3:33:49
2026网站开发哪家公司好 2026网站开发哪家公司好搜索平台、公司或排行信息,本质上反映了企业对不确定性的担心。页面能不能做出来只是第一层问题,后续谁维护、怎么更新、能否支撑私域流量和长期扩展,才是影响系统投入产出比的关键。企业建站可以理解为企业借助小程序… 2026/7/8 3:33:49
ChatMemory 分布式部署实战:集群环境下的对话记忆 上一篇:《你的 ChatMemory 卡顿?MySQL vs Redis 性能实测》 评论区有人问:“生产环境肯定要集群部署,你的方案支持吗?” 我想了想,这是个好问题。单机部署是 Demo,生产环境要集群,多个实例如何保证对话不丢失、记忆不分裂? 这篇就讲 ChatMemory 的分布式部署方案,两种实战方… 2026/7/8 3:27:48
破局 “肺癌之殇”:精准医疗赛道,云克隆助力肿瘤标志物科研攻坚 前言2026 年全球抗癌领域迎来阶段性成果,癌症防控整体数据持续向好。美国癌症协会最新发布统计报告显示,自 1991 年至今全球癌症总死亡率累计下降 4%,约 480 万患者因此重获生存机会。其中肺癌防控进步最为突出:男性肺癌死亡率相较… 2026/7/8 3:27:48
【SWAT+教程】12专题系统学习:从模型原理到QSWAT+实操,再到香溪河流域水文模拟完整案例 当前,水资源短缺、洪旱灾害频发、水文情势变化复杂等问题,已成为制约社会经济与生态可持续发展的重要因素。国内外研究表明,受全球气候变化与人类活动加剧的双重影响,流域水文过程发生了显著变化,水资源时空分布不均、… 2026/7/8 3:25:47
BetterNCM安装器:高效管理网易云插件的最佳选择 BetterNCM安装器:高效管理网易云插件的最佳选择 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 还在为网易云音乐插件的繁琐安装流程而烦恼吗?BetterNCM安装器是… 2026/7/8 0:02:48
运动控制系统安全设置对比:ECI3808的3种限位保护与急停逻辑实现 运动控制系统安全机制深度解析:限位保护与急停逻辑的设计哲学在精密制造与自动化领域,运动控制系统的安全设计绝非简单的功能堆砌,而是一套融合了机械工程、电气原理和软件算法的防御体系。当一台数控机床以每分钟数万转的速度运转࿰… 2026/7/8 0:06:48
AI大模型应用开发:小白也能抓住的红利风口,收藏这篇入门指南! 文章指出,虽然微软等科技巨头在裁员,但英伟达等公司却在积极扩招AI相关人才,尤其是具身智能、仿真等领域。AI行业正在经历结构性调整,传统岗位被淘汰,而大模型应用开发等新岗位需求旺盛。对于想转行或学习AI的普通人来… 2026/7/8 0:10:49
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/7 11:26:57
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/7 11:26:57
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/7 11:26:58