乒乓球口袋教练 HarmonyOS 学习应用(04):测验题库与动作判断反馈
一、动作判断反馈需要保存哪些上下文测验不是把选项染成对错颜色就结束。为了让动作判断有学习价值结果页需要保留模块、题目、选择、正确答案和解释的上下文否则用户只得到一个分数不知道是发球落点、接发判断还是相持节奏出现偏差。export interface QuizQuestion { id: string; moduleId: string; question: string; options: QuizOption[]; correctLabel: string; explanation: string; } function option(label: string, text: string): QuizOption { return { label, text } as QuizOption; } function question( id: string, moduleId: string, title: string, a: string, b: string, c: string, d: string, correctLabel: string, explanation: string ): QuizQuestion { return { id, moduleId, question: title, options: [ option(A, a), option(B, b), option(C, c), option(D, d) ],二、题库为空时为什么不能继续提交QuizPage 先根据 moduleId 获取题目。若当前模块没有题目页面应显示空状态并停止进入结果页提交空集合会得到没有意义的 0/0 记录还可能把“历史最佳”污染成无法解释的数字。事实唯一来源页面职责正常结果模型或服务的回读渲染可观察状态边界结果明确的缺项或失败分支说明原因并保留入口重进结果持久化或模型再次解析不复用旧页面变量Column() { TopBar({ title: this.moduleTitle · 测验 }); if (this.questions.length 0) { Column() { Text(该模块暂无测验题目) .fontSize(AppText.fsSubtitle) .fontColor(this.palette.textSecondary); } .layoutWeight(1) .justifyContent(FlexAlign.Center) .width(100%); } else { Column() { // 进度条 Row({ space: AppSizes.s3 }) { Text((this.currentIndex 1).toString() / this.questions.length.toString()) .fontSize(AppText.fsBody) .fontWeight(AppText.fwSemi) .fontColor(this.palette.primary); Stack() { Column() .width(100%).height(4) .borderRadius(2) .backgroundColor(this.palette.bgElevated); Row() { Column() .width(100%).height(4) .borderRadius(2) .backgroundColor(this.palette.primary); } .width(((this.currentIndex 1) / this.questions.length * 100).toString() %) .height(4); } .layoutWeight(1) .height(4);三、结果页怎样只写入一次成绩结果页以一次进入标记保护 submitResult。组件回到前台或重新渲染时可以显示先前结果和解释却不能再次把同一成绩追加到结果列表。保存记录包含 moduleId、score、total 和时间后续统计有足够信息区分不同模块。if (params ! undefined params ! null) { this.moduleId params.moduleId; this.score params.score; this.total params.total; const m: LearnModule | undefined findModule(this.moduleId); this.moduleTitle m ! undefined ? m.title : 测验; if (!this.saved) { QuizService.submitResult(this.moduleId, this.score, this.total); this.saved true; } } } build() { Column() { TopBar({ title: 测验结果 }); Scroll() { Column({ space: AppSizes.s5 }) { Column().height(AppSizes.s5); // 分数圆环 Stack({ alignContent: Alignment.Center }) { Column() .width(160).height(160) .borderRadius(80) .border({ width: 8, color: this.palette.bgElevated }); Column() .width(160).height(160) .borderRadius(80) .border({ width: 8, color: this.ringColor() }) .opacity(1); Column({ space: AppSizes.s1 }) { Text(this.score.toString() / this.total.toString())四、历史最佳如何限制在当前模块历史最佳只在相同 moduleId 的结果中比较。不同专项题量和难度不同把所有测验混在一起会让一个小模块的满分覆盖另一个模块的练习轨迹。模块边界同时是题库加载、结果保存和最佳分展示的共同边界。风险不能采用的做法当前链路的处理数据不存在用默认对象继续渲染停在可解释的空或失败状态页面重进复用上一次内存字段重新查询模型或服务重复动作追加同一业务事实通过稳定 id 或进入标记收敛} static bestScore(moduleId: string): number { const results: QuizResult[] QuizService.allResults(); let best: number 0; for (const r of results) { if (r.moduleId moduleId r.score best) { best r.score; } } return best; } static hasCompleted(moduleId: string): boolean { return QuizService.allResults().some(r r.moduleId moduleId); } static completedModuleCount(): number { const done: Setstring new Setstring(); for (const r of QuizService.allResults()) { done.add(r.moduleId); } return done.size; } static hasPerfect(): boolean { return QuizService.allResults().some(r r.score r.total); }五、从答题到结果页的验收验收时完成一个有题模块的答题并进入结果页回读本次得分与解释返回再进确认不会多写一次随后切换另一模块完成答题确认两个模块的历史最佳分别保留。也应打开空题模块确认没有生成伪成绩。验收阶段操作应观察到的结果建立事实完成一次与主题直接对应的动作服务或模型能回读该事实页面回读进入目标页或结果页标题、数据和状态相互一致重进验证返回、重启或切换模块后再次进入结果不依赖上一页残留六、取舍与后续维护当前实现把业务事实集中到模型与服务页面只负责呈现和触发操作。这样做会多出类型、查询和回读代码却能避免同一份统计或记录在多个页面分叉。需要扩展新课程、新资源或新题目时应先补齐稳定标识与服务合同再补页面入口。ArkTS 的响应式状态机制可参考 HarmonyOS ArkTS 状态管理文档。本文的代码和验收围绕同一个原则可见结果必须能回到对应模型、服务或持久化事实不以邻近页面和控件文字代替主题结果。七、围绕事实来源继续演进乒乓球口袋教练 HarmonyOS 学习应用04测验题库与动作判断反馈 关注的不是给页面再增加一层显示逻辑而是让“动作判断反馈需要保存哪些上下文”始终能回到唯一的业务事实。模型字段、服务返回值和页面展示应当保持单向关系事实先发生页面随后回读页面不保存第二份能够被误认为真实数据的临时副本。处理“题库为空时为什么不能继续提交”时新增条件必须先归属到课程模型、资源服务、日志事实或测验结果之一。把条件散落在多个组件里短期看起来省事后续就会出现入口不同、重进不同、统计不同的问题。把规则放回稳定入口页面只根据结果改变可见状态能让同一结论在不同入口被复查。“结果页怎样只写入一次成绩”说明当前实现选择了页面重建后重新查询而不是把对象和统计快照长期塞进路由参数。读取会增加少量成本却避免课程改名、资源替换、日志编辑或题库切换后继续显示旧内容。学习应用的结果需要能解释不能只追求一次渲染恰好看起来正确。异常分支也应保留语义历史最佳只在相同 moduleId 的结果中比较。不同专项题量和难度不同把所有测验混在一起会让一个小模块的满分覆盖另一个模块的练习轨迹。模块边界同时是题库加载、结果保存和最佳分展示的共同边界。 这要求页面区分数据不存在、动作未完成和资源不可用并提供返回选择、补充输入、重新下载或再次答题等对应操作不能把不同原因压缩成同一条模糊的成功或失败提示。最后执行“从答题到结果页的验收”时至少观察一次主题动作、一次目标页回读和一次重进或切换后的回读。三次观察都指向相同模型或服务结果才说明实现链路没有依赖旧页面残留。 最后执行“从答题到结果页的验收”时至少观察一次主题动作、一次目标页回读和一次重进或切换后的回读。三次观察都指向相同模型或服务结果才说明实现链路没有依赖旧页面残留。面向维护的检查可以沿三个问题展开输入对象的稳定标识是什么哪个服务或模型决定结果页面如何把该结果显示出来。题库按模块提供问题与选项结果页只在首次进入时保存一次成绩并回读同模块历史最佳避免重复提交和跨模块串分。 这三个问题分别对应数据合同、调用边界和可见反馈只要其中一层被绕过新增入口就可能产生和原入口不同的事实。对失败路径也要保留同样的追踪能力。先让服务返回清晰的不可用、缺项或未完成状态再由页面提供与原因匹配的操作。这样日志、课程、资源和题目发生变化时回归测试能够看到具体的分歧点而不是只能面对一张没有信息的空白页面。这种组织不会承诺所有后续需求都零成本。新增字段需要同步更新模型、服务与验收但它把变更范围限制在可枚举的位置避免把同一判断复制到首页、详情、个人页和结果页后再分别修补。

相关新闻

OC6830E 2.7~36V宽输入升压控制器:兼容单节锂电至24V工业总线-聚能芯-欧创芯官方授权一级代理

OC6830E 2.7~36V宽输入升压控制器:兼容单节锂电至24V工业总线-聚能芯-欧创芯官方授权一级代理

在EPC/笔记本车载适配器及各类升压、升降压转换应用中,电源设计人员经常面临宽输入电压范围、高转换效率与系统简洁性之间的多重挑战。传统方案往往需要外置功率MOS管和复杂的外围电路,增加了设计难度和BOM成本。OC6830E是一款专为升压、升降压开关电源设…

2026/10/20 3:32:09 阅读更多 →
乒乓球口袋教练 HarmonyOS 学习应用(02):本地视频资源与播放器入口

乒乓球口袋教练 HarmonyOS 学习应用(02):本地视频资源与播放器入口

一、课程 id 与视频文件不能直接拼接 课程标题会随着教学内容调整,rawfile 文件名却受构建产物约束。让页面直接从标题推导文件名,会把改名和资源替换变成隐性风险。当前资源表使用 courseId 连接课程和视频资产,播放器只接收已经解析过的资…

2026/10/20 18:35:27 阅读更多 →
2026年TikTok算法突变,我砸了15万才总结出这3条跨境社媒避坑铁律(深度复盘)

2026年TikTok算法突变,我砸了15万才总结出这3条跨境社媒避坑铁律(深度复盘)

一、一场悄然来临的变革:当流量逻辑开始“转弯” 2025年末至2026年初,许多跨境社交媒体从业者隐约感觉到一丝异样。曾经屡试不爽的内容策略,互动数据开始波动;稳定增长的流量曲线,出现了难以解释的平缓甚至下滑。起初&…

2026/10/19 15:57:33 阅读更多 →

最新新闻

AI搜索时代的口碑优化:从口径库到内容证据链的实战指南

AI搜索时代的口碑优化:从口径库到内容证据链的实战指南

在各行业都在谈“数字化”的时候,真正影响消费决策的通道其实已经换了。以前大家搜一个品牌,是翻链接、看标题、挑网站;现在打开对话式AI,直接问一句“这座城有什么值得吃的”“这家店的真实口碑怎么样”,然后就看AI给…

2026/10/21 5:29:11 阅读更多 →
基于 AAS 的 Attack Tree Construction:攻击树建模、路径分析与防御优先级工程实践

基于 AAS 的 Attack Tree Construction:攻击树建模、路径分析与防御优先级工程实践

AI 技能AI 插件人工智能 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and planning, backed by 2,600 agentic skills. Includes CLI, local MCP, c…

2026/10/21 5:29:11 阅读更多 →
agentic-awesome-skills 反逆向技术 Skill 深度解析:授权安全边界、反调试/反虚拟机检测与脱壳实战方法论

agentic-awesome-skills 反逆向技术 Skill 深度解析:授权安全边界、反调试/反虚拟机检测与脱壳实战方法论

agentic-awesome-skills 反逆向技术 Skill 深度解析:授权安全边界、反调试/反虚拟机检测与脱壳实战方法论 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, sta…

2026/10/21 5:29:11 阅读更多 →
技能盘点与评估实战:从能力分级到团队技能树构建

技能盘点与评估实战:从能力分级到团队技能树构建

每次做团队能力盘点或者写个人年度总结的时候,我总会下意识地打开某个名为“skills”的文件夹。里面堆着这些年整理过的技能清单、评估表格、学习路径图,还有无数份技术面试的记录。这个不起眼的词,几乎涵盖了技术从业者职业发展里最核心的一…

2026/10/21 5:29:11 阅读更多 →
零散技能如何变成核心竞争力?从技能清单到技能体系

零散技能如何变成核心竞争力?从技能清单到技能体系

直接说结论:“skills”这个词,看起来是个简单的复数名词,但它背后藏着一个几乎所有职场人都会遇到的问题——技能学了一堆,简历上写得密密麻麻,真到用的时候却总觉得哪哪儿都不顺手。我见过太多人把技能当成荣誉清单&a…

2026/10/21 5:29:11 阅读更多 →
代码托管平台访问慢?从DNS到资源加载的全链路优化指南

代码托管平台访问慢?从DNS到资源加载的全链路优化指南

1. 为什么打开代码托管平台会慢:先搞懂瓶颈在哪很多人一遇到页面转圈,第一反应就是“网不行”,然后开始重启路由器、切换网络,折腾半天发现该慢还是慢。我刚开始也这样,后来才意识到,打开这类海外代码托管平…

2026/10/21 5:28:10 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事:AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里,按宣传口径,本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”,而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起:用户到底在追求什么“封号重开”这四个字,放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流,背后是大量的时间和精力成本。正常情况下,没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”,而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时,就意识到:单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/21 4:27:17 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →