足球口袋教练 HarmonyOS 规划(22):训练目录 Service 与本地课程模型边界
一、先定义目录规划要解决的冲突训练目录同时面对三种变化课程条目会持续增加首页只需要少量摘要详情页却需要步骤、器材和场地等完整信息。如果把数组、筛选条件、收藏标记和详情跳转全部放在一个页面里新增分类会迫使多个视图一起改动数据异常也只能退化成空白列表。这份规划把目录能力限定为“本地课程读模型”负责提供稳定的分类、列表和详情查询不包含云端内容管理、付费课程、账号同步与训练计时。页面只消费查询结果不直接遍历原始常量。这样的边界既能承接现有本地课程也为以后增加远端数据源保留替换点。使用场景Service 输入页面得到的结果不在本期范围首页推荐日期、画像摘要一条可进入的课程摘要自动生成完整训练计划分类浏览模块标识、关键词排序后的课程卡片云端搜索与推荐算法课程详情课程标识完整步骤与安全提示视频下载与版权管理计划回看计划中的课程标识可恢复的课程摘要多账号跨端同步二、用读模型隔离页面和原始数据目录模型需要区分“可存储的领域数据”和“直接展示的派生字段”。颜色、选中态、是否为今日任务都属于页面派生结果不应混入课程主数据课程时长、难度、步骤和所属模块则需要稳定标识才能被计划与训练记录引用。export interface TrainingCourse { id: string moduleId: string title: string subtitle: string durationMinutes: number difficulty: 入门 | 进阶 | 挑战 focus: string steps: string[] scenario?: string equipment?: string venue?: string version: number } export interface CourseSummary { id: string moduleId: string title: string durationMinutes: number difficulty: string matchedKeyword: boolean }稳定的id是计划、收藏和记录之间的连接点。标题可以修改模块可以重新排序但历史记录不能因为文案变化而失去关联。version用于本地目录升级旧计划引用已下架课程时可以按版本映射到替代课程而不是直接删除用户的计划项。三、Service 契约只暴露业务查询页面不应该知道课程来自常量、JSON 资源还是本地数据库。Service 对外只提供查询语义并统一处理空关键词、未知模块和失效课程标识。接口返回只读数组或新对象避免页面修改共享数据后影响其他页面。export interface CatalogQuery { moduleId?: string keyword?: string limit?: number } export interface TrainingCatalogService { listModules(): PromiseReadonlyArrayTrainingModule queryCourses(query: CatalogQuery): PromiseReadonlyArrayCourseSummary getCourse(courseId: string): PromiseTrainingCourse | null resolveCourse(courseId: string): PromiseTrainingCourse } export class CourseNotFoundError extends Error { constructor(public courseId: string) { super(Course unavailable: ${courseId}) } }getCourse()允许详情页展示“课程已不可用”的温和状态resolveCourse()则适合训练启动前的强校验找不到课程就中止进入计时页。两个入口看似重复却能避免所有调用方用同一种异常策略。四、本地仓库负责校验、索引与版本迁移本地仓库在启动时建立courseId - course索引同时验证重复标识、空步骤和非法时长。校验失败时保留上一版有效快照并把错误转换成可记录的诊断结果。页面不会看到半份目录也不会因为一条坏数据导致全部课程不可用。export class LocalCourseRepository { private courses: Mapstring, TrainingCourse new Map() load(items: TrainingCourse[]): CatalogLoadResult { const next new Mapstring, TrainingCourse() const errors: string[] [] for (const item of items) { if (!item.id || next.has(item.id)) { errors.push(duplicate id: ${item.id}) continue } if (item.durationMinutes 5 || item.steps.length 0) { errors.push(invalid course: ${item.id}) continue } next.set(item.id, { ...item, steps: item.steps.slice() }) } if (next.size 0) { this.courses next } return { accepted: next.size, errors } } }版本迁移不应在页面渲染时临时判断。计划仓库读取旧任务后先执行标识映射再交给目录 Service 解析。映射失败的任务保留标题与时长并标记为“待替换”这样用户仍能理解原计划发生了什么。五、页面状态只保留一次查询的生命周期目录页需要明确区分首次加载、已有数据刷新、空结果和加载失败。把它们压缩成一个items.length 0会混淆“没有匹配课程”和“数据源不可用”。ViewModel 保存查询条件与请求序号较早请求返回时不能覆盖较新的关键词结果。export type CatalogPhase idle | loading | ready | empty | error export class CatalogViewModel { phase: CatalogPhase idle items: CourseSummary[] [] message: string private requestToken: number 0 async search(service: TrainingCatalogService, query: CatalogQuery): Promisevoid { const token this.requestToken this.phase loading try { const result await service.queryCourses(query) if (token ! this.requestToken) return this.items result.slice() this.phase result.length 0 ? empty : ready } catch (error) { if (token ! this.requestToken) return this.phase error this.message 目录暂不可用请稍后重试 } } }ArkUI 组件绑定phase、items和查询条件点击课程后只传递courseId。详情页重新调用 Service 获取完整模型避免把一个可能过期的大对象塞进路由参数。状态管理的基础约束可参考华为开发者文档。六、失败和降级路径要先于远端扩展目录设计至少覆盖四类失败资源文件损坏、课程标识重复、计划引用失效、查询期间页面退出。前三类由仓库与 Service 转换为稳定结果最后一类由请求令牌或页面生命周期取消处理。任何错误都不应触发删除收藏、重置计划或清空训练记录。失败条件默认行为用户可见反馈恢复动作新目录校验失败继续使用上一版快照顶部提示内容更新失败修复资源后重新加载未知模块返回空结果展示“暂无此分类”回到全部分类课程标识失效保留计划占位项标记课程待替换选择同模块替代课查询被新输入覆盖丢弃旧响应不显示额外错误展示最新关键词结果页面退出停止写入页面状态无提示重新进入后新建查询七、实施顺序从抽模型开始第一步把课程与模块接口移出页面保持原有数据和 UI 不变第二步建立本地仓库与索引校验第三步让列表、详情、今日推荐逐一改用 Service第四步加入失效标识和版本迁移最后才考虑 JSON 资源或远端数据源。每一步都必须保持旧入口可用不能一次性同时改数据、路由和视觉。迁移期间可以保留兼容适配器把旧数组包装成TrainingCatalogService。当列表、详情和计划三个消费者都不再直接读取旧数组后再删除适配器。这样回归范围清楚出现问题也能回滚到上一个边界。八、验收条件与后续证据计划静态验收包括所有课程标识唯一、时长和步骤合法、Service 不返回共享可变数组、页面不再直接读取原始目录。交互验收包括切换模块、连续输入关键词、从计划进入详情、打开失效课程、返回后恢复筛选条件。异常验收需要注入损坏资源、重复标识和空目录。后续证据应包含四组材料构建通过记录目录页、空结果页和失效课程页的真机截图连续搜索时旧请求不覆盖新结果的日志升级前后计划标识迁移对照。只有这些证据齐全后才适合把该主题改写为实现或实战文章。九、总结训练目录模块化的关键不是新增一个名为 Service 的文件而是让课程标识、查询契约、错误策略和页面状态各有明确归属。以本地读模型为起点可以在不承诺云端能力的前提下先解决可维护性并让未来的数据源替换、版本迁移与异常验收都有稳定接口可依赖。

相关新闻

AI重构实战:基于Spec Coding与Codex的前端全栈开发提效

AI重构实战:基于Spec Coding与Codex的前端全栈开发提效

1. 先搞清楚“AI重构”到底在解决什么问题 看到“前端全栈 AI 重构实战”这个标题,很多人第一反应可能是“AI能自动重写我的项目代码了”。但如果你真这么想,落地时大概率会失望。这里的“重构”不是指把旧项目从零到一用AI重写一遍,而是指在 已有明确需求和规范 的前提下…

2026/8/16 22:03:58 阅读更多 →
Grok游戏开发工具:从环境配置到项目构建的完整实践指南

Grok游戏开发工具:从环境配置到项目构建的完整实践指南

这次我们来看一个名为 Grok 的项目,它主打的是让游戏制作变得简单。如果你对游戏开发感兴趣,但又觉得传统引擎门槛太高,这个工具可能值得一试。Grok 的核心思路是降低游戏开发的技术门槛,让更多创作者能够快速实现想法。它不是一个…

2026/8/21 23:04:33 阅读更多 →
dlt-ops:从数据管道原型到生产级部署的完整解决方案

dlt-ops:从数据管道原型到生产级部署的完整解决方案

如果你正在构建数据管道,可能已经体会过这种困境:用开源工具快速搭建原型很容易,但一旦要部署到生产环境,各种问题就接踵而至——数据质量监控缺失、错误处理不完善、缺乏可观测性、难以扩展。这正是dlt-ops要解决的核心痛点。dlt…

2026/8/15 14:09:01 阅读更多 →

最新新闻

Git配置和SourceTree使用教程详解

Git配置和SourceTree使用教程详解

标题一、Git的工作流程标题二、Git的安装 Git的安装可以参考 标题三、Git的配置 1、Git安装确认 按照《Git官方client及小乌龟Git安装手册》安装好git后,返回桌面点鼠标右键出现Git GUI Here 和Git Bash Here 证明git安装成功,如图1。Git GUI Here &…

2026/8/22 15:59:28 阅读更多 →
ingenious 工作流引擎v2正式发布

ingenious 工作流引擎v2正式发布

🚀🔥 重塑高效,引领PHP工作流引擎变革 🔥🚀 在无数个日夜的精心打磨与科技创新的不懈追求下,我们无比自豪且激动地宣布:Ingenious v2工作流引擎,这一凝聚智慧与创新精华的里程碑式作…

2026/8/22 15:59:28 阅读更多 →
Perplexity表格复制到word不再散架,AI导出鸭批量导出+无损格式一键到位

Perplexity表格复制到word不再散架,AI导出鸭批量导出+无损格式一键到位

Perplexity表格复制到word不再散架,AI导出鸭批量导出无损格式一键到位 从Perplexity生成的数据对比表、竞品分析矩阵或技术规格清单复制到Word,经常出现边框消失、合并单元格解体、列宽错乱等问题。根源在于浏览器剪贴板传递的是渲染后的可视化快照&…

2026/8/22 15:59:28 阅读更多 →
FPS射击游戏开发完整技术点全景图

FPS射击游戏开发完整技术点全景图

一、核心玩法系统(Gameplay Core) 1.1 射击系统 命中判定 Hitscan(射线检测)Projectile(弹道模拟)混合模式(近距离hitscan 远距离projectile) 弹道系统 弹道下坠(Bullet…

2026/8/22 15:59:28 阅读更多 →
Swarm-SLAM系统架构深度剖析:去中心化稀疏C-SLAM的数据流与算法原理

Swarm-SLAM系统架构深度剖析:去中心化稀疏C-SLAM的数据流与算法原理

Swarm-SLAM系统架构深度剖析:去中心化稀疏C-SLAM的数据流与算法原理 【免费下载链接】Swarm-SLAM Sparse Decentralized Collaborative Simultaneous Localization and Mapping Framework for Multi-Robot Systems 项目地址: https://gitcode.com/gh_mirrors/sw/S…

2026/8/22 15:59:27 阅读更多 →
Calibre 中文路径不再被转成拼音:NoTrans 插件快速上手与进阶用法

Calibre 中文路径不再被转成拼音:NoTrans 插件快速上手与进阶用法

Calibre 中文路径不再被转成拼音:NoTrans 插件快速上手与进阶用法 【免费下载链接】calibre-do-not-translate-my-path Switch my calibre library from ascii path to plain Unicode path. 将我的书库从拼音目录切换至非纯英文(中文)命名 …

2026/8/22 15:58:27 阅读更多 →

日新闻

沉金PCB工艺实战指南:从设计到SMT焊接的可靠性保障

沉金PCB工艺实战指南:从设计到SMT焊接的可靠性保障

在电子硬件开发领域,PCB(印制电路板)的沉金工艺是提升产品可靠性和焊接质量的关键环节。对于需要高密度互连、长期稳定运行或高频信号传输的板卡,如“黍姐仿通行证”这类可能涉及身份识别、数据交互的硬件项目,选择正确…

2026/8/22 0:00:11 阅读更多 →
电气考研电路八月强化四步法:从知识体系到真题实战的闭环攻略

电气考研电路八月强化四步法:从知识体系到真题实战的闭环攻略

这次我们来看一个针对电气考研电路科目的学习规划项目。它不是软件工具,而是一套聚焦于8月份关键节点的备考策略。对于电气工程考研的同学来说,电路分析是专业课的重中之重,也是拉开分差的关键。进入8月,复习进入强化阶段&#xf…

2026/8/22 0:00:11 阅读更多 →
消除AI代码的“AI味”:Claude Code设计优化技能配置与实战指南

消除AI代码的“AI味”:Claude Code设计优化技能配置与实战指南

大家好,我是专注于前端开发与AI工具实践的技术博主。在日常使用 Claude Code 等AI编程助手时,你是否也遇到过这样的困扰:生成的代码功能上没问题,但代码风格、组件设计、交互逻辑总透着一股“AI味”——布局单调、样式简陋、交互生…

2026/8/22 0:00:11 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/21 3:21:33 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/22 8:09:09 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/21 6:07:56 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/21 16:42:28 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/22 7:31:03 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/22 3:22:48 阅读更多 →