【OpenHarmony/HarmonyOs 】每日学习目标系统:todayCount、连续学习与本地激励反馈

【OpenHarmony/HarmonyOs 】每日学习目标系统:todayCount、连续学习与本地激励反馈
【OpenHarmony/HarmonyOs 】每日学习目标系统todayCount、连续学习与本地激励反馈项目类型OpenHarmony / HarmonyOS ArkTS 数学学习应用项目名称数学视界对应主题全新视觉与交互体验、端侧 AI、全场景智慧学习关键词ArkTS、每日目标、学习进度、连续学习、成就激励、本地统计 一、为什么每日目标值得写学习类应用最难的不是做功能而是让用户持续回来。数学视界里有计算器、公式库、单位换算、挑战答题、趣味百科、曲线画板但如果没有一个持续激励机制这些功能容易变成“用完即走”的工具。每日学习目标就是把工具型应用变成学习型应用的关键。项目中围绕每日目标做了几件事首页展示今日进度我的页面展示目标进度用户可以修改每日目标计算、换算、绘图等行为会增加todayCount达成目标后更新连续达标天数连续完成目标可以解锁成就。这篇文章就聚焦这个本地激励系统。二、StudyData每日目标的数据基础每日目标相关数据定义在AppState.etsexport interfaceStudyData{totalStudyDays:numbercurrentStreak:numbertotalDrawings:numbertotalCalculations:numbertotalFunctions:numbertotalFormulasViewed:numbertotalUnitsConverted:numberlastStudyDate:stringdailyGoal:numbertodayCount:numberconsecutiveGoalMetDays:numberfunFactsViewed:number}这里最关键的是dailyGoal每天目标数量todayCount今日已完成数量currentStreak连续学习天数consecutiveGoalMetDays连续达成目标天数lastStudyDate最后学习日期。这些数据全部在端侧维护不需要账号系统也不需要云端学习画像。三、哪些行为算一次学习项目中多个功能会增加学习计数。例如单位换算recordUnitConversion(): void {this.studyData.totalUnitsConvertedthis.studyData.todayCountthis.updateStudyStreak()this.checkAchievement(11)this.checkDailyGoalMet() }计算器也会记录recordCalculation(): void {this.studyData.totalCalculationsthis.studyData.todayCountthis.updateStudyStreak()this.checkAchievement(2)this.checkDailyGoalMet() }画板绘制也会记录recordDrawing(): void {this.studyData.totalDrawingsthis.studyData.todayCountthis.updateStudyStreak()this.checkDailyGoalMet() }这说明每日目标不是只服务于答题而是覆盖整个数学学习行为。四、首页进度卡打开 App 就知道还差多少首页的进度卡直接读取todayCount和dailyGoalColumn() .width(Math.min( AppState.studyData.todayCount / AppState.studyData.dailyGoal *100,100) %) .height(100%) .backgroundColor(#FFFFFF) .borderRadius(10)这段代码把学习进度转成进度条宽度。底部文案也会根据目标完成情况变化Text( AppState.studyData.todayCount AppState.studyData.dailyGoal ? 太棒了今日目标达成: 再完成 Math.max(AppState.studyData.dailyGoal - AppState.studyData.todayCount,0) 次即可达成今日目标)这就是一个典型的轻量激励设计不用弹窗打扰用户但用户能随时看到当前进度。五、我的页面进度更完整的目标反馈在MyPage.ets中今日学习数量通过日期判断getTodayStudyCount(): number { const today:stringnewDate().toISOString().split(T)[0]if(AppState.studyData.lastStudyDatetoday) { returnAppState.studyData.todayCount } return0}进度百分比getGoalProgress():number{constgoal:numberAppState.settings.dailyGoalconsttoday:numberthis.getTodayStudyCount()if(goal 0)return0returnMath.min(Math.round((today / goal) *100),100) }然后用Progress组件展示Progress({ value:this.getGoalProgress(), total:100, type: ProgressType.Linear }) .color(this.getGoalProgress() 100?#2ECC71:#FF9A8B) .backgroundColor(this.getColor(#F0F0F0,#333333)) .height(8) .borderRadius(4)首页负责快速提醒我的页面负责完整查看。两个入口互补。六、连续学习跨天逻辑如何处理连续学习依赖updateStudyStreak()privateupdateStudyStreak(): void {consttoday: string new Date().toISOString().split(T)[0]if(this.studyData.lastStudyDate ) {this.studyData.lastStudyDate todaythis.studyData.totalStudyDays 1this.studyData.currentStreak 1this.goalMetCheckedToday false}elseif(this.studyData.lastStudyDate ! today) {constlastDate: Date new Date(this.studyData.lastStudyDate)consttodayDate: Date new Date(today)constdiffDays: number Math.floor((todayDate.getTime() - lastDate.getTime()) / (1000*60*60*24))if(diffDays 1) {this.studyData.currentStreak }elseif(diffDays 1) {this.studyData.currentStreak 1this.studyData.consecutiveGoalMetDays 0}this.studyData.totalStudyDaysthis.studyData.lastStudyDate todaythis.studyData.todayCount 0this.goalMetCheckedToday false} }这个逻辑处理了三种情况第一次学习初始化日期和连续天数第二天继续学习连续天数加一中断多天后回来连续天数重置。七、目标达成一天只检查一次为了避免同一天重复触发目标成就项目使用了goalMetCheckedTodayprivategoalMetCheckedToday: boolean falsecheckDailyGoalMet(): void {if(!this.goalMetCheckedToday this.studyData.todayCount this.studyData.dailyGoal) {this.goalMetCheckedToday truethis.studyData.consecutiveGoalMetDaysthis.checkGoalAchievement() } }这个细节很重要。假设每日目标是 5 次用户完成第 6 次、第 7 次时不应该反复增加连续达标天数。八、目标成就连续 7 天完成目标目标成就逻辑如下checkGoalAchievement(): void {for(let i: number 0; i this.achievements.length; i) {if(this.achievements[i].id 13 !this.achievements[i].isUnlocked) {this.achievements[i].progress this.studyData.consecutiveGoalMetDaysif(this.studyData.consecutiveGoalMetDays 7) {this.achievements[i].progress 7this.achievements[i].isUnlocked truethis.recentUnlock this.achievements[i]this.showUnlockToast true}break} } }这让每日目标从“今天做几次”升级成“连续坚持”的长期激励。九、隐私友好不需要账号也能激励很多学习 App 会把每日打卡、排名、学习报告上传到服务器。但数学视界当前的目标系统完全可以本地完成本地记录学习次数本地计算连续天数本地判断目标达成本地解锁成就。这对学习工具来说非常友好。用户不需要登录也能获得持续反馈。十、总结每日目标系统对应“全新视觉与交互体验”和“端侧 AI”主题它把分散的工具功能串成了学习路径。核心实现包括 用dailyGoal和todayCount表达每日目标 首页用进度条和鼓励文案做即时反馈 我的页面用Progress展示完整进度 用lastStudyDate和currentStreak计算连续学习 用consecutiveGoalMetDays解锁目标成就 所有统计都在端侧完成不依赖账号和云端。对数学学习 App 来说每日目标不是一个小组件而是让用户持续学习的核心机制。✨