当前位置: 首页 > news >正文

open harmony 项目实战:学习打卡功能如何设计更有激励感

open harmony 项目实战:学习打卡功能如何设计更有激励感

学习类 App 想让用户持续打开,不能只靠内容堆叠,还要给用户一点“我正在进步”的反馈。

“语文视界”的学习中心里做了每日打卡、本周进度、连续学习天数和今日任务展示。这个功能不复杂,但很适合作为教育类 App 的留存入口。☀️

一、学习中心展示什么

学习中心第一屏包含:

  • 连续学习天数
  • 今日学习状态
  • 本周打卡进度
  • 今日背诵任务
  • 诗词背诵、默写、配对、朝代排序模块

这些内容组合起来,会让用户一打开页面就知道:今天有没有学、已经坚持多久、接下来可以做什么。

二、核心状态

@StatecurrentStreak: number =0;@StatetodayCompleted: boolean = false;@StateprivatecheckInDatesStr: string ='';

currentStreak是连续天数,todayCompleted表示今天是否完成,checkInDatesStr记录已打卡日期。

项目里用|分隔日期:

2026-6-28|2026-6-29|2026-6-30

这种做法简单,适合轻量本地状态。

三、读取本地数据

进入页面时会加载持久化数据:

privateloadPersistedData(): void {this.migrateLegacyCheckInIfNeeded();constraw = AppStorage.get<string>('learn_checkin_dates');this.checkInDatesStr = raw !== undefined && raw.length >0? raw :'';consttoday =this.getTodayDate();constlastCheckIn = AppStorage.get<string>('learn_last_checkin_date') ||'';this.todayCompleted =this.isDateChecked(today); }

这里还调用了migrateLegacyCheckInIfNeeded,说明项目考虑到了旧版本数据兼容。

四、旧数据迁移

如果旧版本只保存了learn_checkin_todaylearn_streak_date,新版本会迁移到日期列表:

privatemigrateLegacyCheckInIfNeeded():void{consthasNew = AppStorage.get<string>('learn_checkin_dates');if(hasNew !== undefined && hasNew.length >0) {return; }constoldDate = AppStorage.get<string>('learn_streak_date');constoldDone = AppStorage.get<boolean>('learn_checkin_today');if(oldDate !== undefined && oldDate.length >0&& oldDone ===true) { AppStorage.setOrCreate('learn_checkin_dates', oldDate); AppStorage.setOrCreate('learn_last_checkin_date', oldDate); } }

这个细节很适合写到文章里,因为它比普通 Demo 更像真实项目。

五、防止重复打卡

用户点击打卡时,先判断今天是否已经打过:

if(this.isDateChecked(today)) { promptAction.showToast({ message:'今日已打卡 ♡', duration:1500});return; }

已经打卡就提示,不重复增加天数。

六、连续天数计算

项目会比较上次打卡日期和昨天:

constyesterday = this.getYesterdayDate();letstreak = AppStorage.get<number>('learn_streak');if(streak === undefined) {streak=0; }if(last=== yesterday) {streak= streak +1; }elseif (last!== today) {streak=1; }

如果昨天也打卡,就连续天数 +1;如果中断了,就从 1 开始。

七、保存打卡状态

privatesavePersistedData(): void {AppStorage.setOrCreate('learn_streak',this.currentStreak);AppStorage.setOrCreate('learn_streak_date',this.getTodayDate());AppStorage.setOrCreate('learn_checkin_today',this.todayCompleted);AppStorage.setOrCreate('learn_checkin_dates',this.checkInDatesStr);AppStorage.setOrCreate('learn_last_checkin_date',this.getTodayDate()); }

保存字段比较多,是为了兼容当前页面展示和旧版本逻辑。

八、本周进度展示

页面通过 7 个格子展示周一到周日:

ForEach([0, 1, 2, 3, 4, 5, 6], (index:number)=> {Column(){Text(this.getWeekDayName(index));Column(){if(this.isWeekSlotChecked(index)) {Text('✓'); }else{Text('○'); } } } });

这类视觉反馈能让用户快速感知自己的学习节奏。

九、激励感来自哪里

这个功能的激励感主要来自四点:

  • 数字反馈:连续多少天。
  • 状态反馈:今日已完成/进行中。
  • 视觉反馈:本周格子点亮。
  • 即时反馈:Toast 提示打卡成功。

学习类产品不一定要做复杂游戏化,简单而稳定的反馈就很有效。

总结

每日打卡功能本身不难,真正值得注意的是状态设计:日期怎么存、连续天数怎么算、重复打卡怎么拦、旧数据怎么迁移、本周进度怎么展示。

这个项目用AppStorage就实现了一套完整的本地打卡方案,轻量但够用,很适合 OpenHarmony 教育类 App 借鉴。🌟

http://www.gsyq.cn/news/1611338.html

相关文章:

  • Python异常处理完整教程
  • Java垃圾回收机制详解
  • Nginx反向代理教程
  • C++类与对象开发实践
  • React性能优化技巧
  • 别再只盯着内核了!手把手教你用BusyBox为嵌入式Linux打造最小根文件系统
  • MoE稀疏激活原理与工程实践:解密大模型2%参数激活真相
  • Rust语言快速入门
  • Spring MVC开发实践
  • Linux权限管理教程
  • Rust枚举使用技巧
  • C++基础语法完整教程
  • VisualGGPK2完整指南:轻松管理《流放之路》游戏资源文件
  • 算法复杂度理论与实践:当渐近分析遇上真实硬件
  • 网盘下载助手终极指南:一键获取九大网盘直链地址
  • Python多线程开发入门指南
  • 【KAE报错】安装KAE后,使用openssl测试KAE是否生效报错_Invalid_engine_quot;kaequot;
  • VSCode + Markdown All in One:打造你的高效Emoji输入工作流(2024版)
  • Rust生命周期全面解析
  • 终极指南:快速上手OpenVINO AI音频插件,免费为Audacity注入AI超能力
  • Claude 3.5 Sonnet推理链路‘静默坍缩’:结构化指令零延迟实现原理
  • Python函数设计最佳实践
  • AI视频剪辑技术解析:从特征提取到故事构建的自动化流程
  • 基于YOLOv8的铁轨障碍物检测系统:从数据准备到边缘部署全流程实践
  • 从安装到工程化:本地AI智能体框架Hermes Agent实战指南
  • Saga 模式实现:从补偿事务到状态机编排,分布式事务的最终一致性之路
  • 物理信息神经网络PINNs在布洛赫-托雷(Bloch-Torrey)方程上的应用求解 【torch案例】(Python代码实现)
  • 3步解锁文本分析:KH Coder如何让零基础用户玩转多语言内容挖掘
  • HunterPie终极指南:5分钟掌握《怪物猎人:世界》智能覆盖层
  • 基于YOLOv8的铁路安全巡检系统:从算法原理到工程部署全流程