及时做APP开发实战(十五)-专注历史记录功能实现

发布时间:2026/9/15 9:49:29

及时做APP开发实战(十五)-专注历史记录功能实现 即时做APP开发实战(十五) - 专注历史记录功能实现本文将介绍如何实现专注历史记录功能包括按日期分组显示和数据统计等。一、功能需求1.1 需求分析【图1历史记录弹窗界面】┌─────────────────────────────────────┐ │ 专注历史记录 关闭 │ ├─────────────────────────────────────┤ │ ┌─────────────────────────────┐ │ │ │ 今天 共 50 分钟 │ │ │ │ ┌─────────────────────┐ │ │ │ │ │ 09:30 25分钟 学习ArkTS │ │ │ │ │ │ 10:00 25分钟 开发 App │ │ │ │ │ └─────────────────────┘ │ │ │ └─────────────────────────────┘ │ │ │ │ ┌─────────────────────────────┐ │ │ │ 昨天 共 75 分钟 │ │ │ │ ┌─────────────────────┐ │ │ │ │ │ 14:00 25分钟 撰写博客 │ │ │ │ │ │ 15:00 25分钟 代码优化 │ │ │ │ │ │ 16:00 25分钟 功能测试 │ │ │ │ │ └─────────────────────────────┘ │ │ │ └─────────────────────────────┘ │ └─────────────────────────────────────┘1.2 功能点功能说明历史记录显示显示最近7天的专注记录按日期分组今日、昨日、具体日期统计总时长每天的总专注时长记录详情时间、时长、任务名称二、数据模型设计2.1 PomodoroRecord模型【图2历史记录详情界面】exportinterfacePomodoroRecord{id:number;// 记录IDtodoId:number;// 关联的待办IDduration:number;// 专注时长分钟completedAt:number;// 完成时间戳}exportfunctioncreatePomodoroRecord(todoId:number,duration:number):PomodoroRecord{return{id:Date.now(),todoId:todoId,duration:duration,completedAt:Date.now()};}2.2 数据存储结构┌─────────────────────────────────────┐ │ 数据存储结构 │ ├─────────────────────────────────────┤ │ Preferences 存储 │ │ { │ │ pomodoroRecords: [ │ │ { │ │ id: 1703001600000, │ │ todoId: 1, │ │ duration: 25, │ │ completedAt: 1703001600000 │ │ }, │ │ { │ │ id: 1703003100000, │ │ todoId: 2, │ │ duration: 25, │ │ completedAt: 1703003100000 │ │ } │ │ ] │ │ } │ └─────────────────────────────────────┘三、ViewModel 实现3.1 获取指定日期记录/** * 获取指定日期的番茄钟记录 */getRecordsByDate(date:Date):PomodoroRecord[]{conststartOfDaynewDate(date);startOfDay.setHours(0,0,0,0);constendOfDaynewDate(date);endOfDay.setHours(23,59,59,999);returnthis.records.filter(recordrecord.completedAtstartOfDay.getTime()record.completedAtendOfDay.getTime());}3.2 获取最近 N 天历史记录/** * 获取最近 N 天的历史记录按日期分组 */getRecentHistory(days:number7):Mapstring,PomodoroRecord[]{consthistorynewMapstring,PomodoroRecord[]();consttodaynewDate();for(leti0;idays;i){constdatenewDate(today);date.setDate(date.getDate()-i);constdateStrthis.formatDate(date);constrecordsthis.getRecordsByDate(date);if(records.length0){history.set(dateStr,records);}}returnhistory;}3.3 日期显示文本/** * 获取日期的显示文本 */getDateDisplayText(dateStr:string):string{consttodaynewDate();consttodayStrthis.formatDate(today);constyesterdaynewDate(today);yesterday.setDate(yesterday.getDate()-1);constyesterdayStrthis.formatDate(yesterday);if(dateStrtodayStr){return今天;}elseif(dateStryesterdayStr){return昨天;}else{returndateStr;}}四、UI 实现4.1 历史记录弹窗BuilderHistorySheet(){Column(){// 标题栏Row(){Text(专注历史).fontSize(20).fontWeight(FontWeight.Bold)Blank()Button(关闭).onClick((){this.showHistoryfalse;})}.width(100%).padding(20)Divider()// 历史记录列表if(this.pomodoroViewModel.getRecords().length0){this.EmptyState()}else{List({space:10}){ForEach(Array.from(this.pomodoroViewModel.getRecentHistory(7).entries()),(entry:[string,PomodoroRecord[]]){ListItem(){this.HistoryDateItem(entry[0],entry[1])}},(entry:[string,PomodoroRecord[]])entry[0])}.width(100%).layoutWeight(1).padding(15)}}.width(100%).height(100%)}4.2 日期分组项BuilderHistoryDateItem(dateStr:string,records:PomodoroRecord[]){Column(){// 日期标题Row(){Text(this.pomodoroViewModel.getDateDisplayText(dateStr)).fontSize(16).fontWeight(FontWeight.Bold)Blank()// 计算总时长Text(总计${this.getTotalMinutes(records)}分钟).fontSize(14).fontColor(this.themeColors.primary)}.width(100%).margin({bottom:10})// 记录列表Column({space:8}){ForEach(records,(record:PomodoroRecord){this.RecordItem(record)})}.width(100%)}.width(100%).padding(15).backgroundColor(#FFFFFF).borderRadius(12)}4.3 单条记录项BuilderRecordItem(record:PomodoroRecord){Row(){// 时间Text(this.formatRecordTime(record.completedAt)).fontSize(14).fontColor(#666666).width(60)// 时长Text(${record.duration}分钟).fontSize(14).fontColor(this.themeColors.primary).width(60)// 待办事项名称Text(this.getTodoName(record.todoId)).fontSize(14).fontColor(#333333).layoutWeight(1).maxLines(1).textOverflow({overflow:TextOverflow.Ellipsis})}.width(100%).padding(10).backgroundColor(#F5F5F5).borderRadius(8)}4.4 辅助方法// 将时间戳格式化为时间字符串privateformatRecordTime(timestamp:number):string{constdatenewDate(timestamp);consthoursdate.getHours().toString().padStart(2,0);constminutesdate.getMinutes().toString().padStart(2,0);return${hours}:${minutes};}// 获取待办事项名称privategetTodoName(todoId:number):string{consttodothis.todoList.find(itemitem.idtodoId);returntodo?todo.text:未知事项;}// 计算总时长privategetTotalMinutes(records:PomodoroRecord[]):number{returnrecords.reduce((sum,r)sumr.duration,0);}五、入口按钮5.1 顶部导航栏按钮添加BuilderTopBar(){Row(){Text( 番茄钟).fontSize(24).fontWeight(FontWeight.Bold).fontColor(#FFFFFF)Blank()// 历史记录按钮Button({type:ButtonType.Circle}){Text().fontSize(20)}.width(36).height(36).backgroundColor(rgba(255, 255, 255, 0.2)).onClick((){this.showHistorytrue;})Text(${this.pomodoroCount}/ 4).fontSize(16).fontColor(#FFFFFF).margin({left:10})}.width(100%).height(56).padding({left:20,right:20}).backgroundColor(this.themeColors.primary)}5.绑定模态弹窗弹窗build(){Column(){// 页面内容...}.bindSheet($$this.showHistory,this.HistorySheet(),{height:500,backgroundColor:Color.White,dragBar:true,onWillDismiss:(){this.showHistoryfalse;}})}六、数据流程图┌─────────────────────────────────────┐ │ 数据流程 │ ├─────────────────────────────────────│ 1. 用户完成一个番茄钟 │ │ │ ↓ │ │ 2. 调用completePomodoro() │ │ ↓ │ │ 3. 创建PomodoroRecord │ │ ↓ │ │ 4. 保存到Preferences │ │ ↓ │ 5. 用户点击历史记录按钮 │ │ │ ↓ │ │ 6. 调用getRecentHistory(7) │ │ ↓ │ │ 7. 按日期分组返回数据 │ │ ↓ │ 8. UI 渲染历史记录列表 │ │ └─────────────────────────────────────┘七、总结本文实现了专注历史记录功能其核心要点如下点数据存储使用Preferences持久化番茄钟记2.按日期分组通过时间戳进行过滤和分组分3.友好显示以“今天”、“昨天”及具体日期等形式呈现日期统计功能每天总专注时长
延伸阅读

更多相关文章

2026/9/10 21:01:10

AI 辅助 Rust 性能优化:让模型分析 criterion 基准测试报告

AI 辅助 Rust 性能优化:让模型分析 criterion 基准测试报告专栏: AI / AI学习 / Rust性能优化一、criterion 报告对人类的"不友好"与 AI 的机会 cargo bench 跑完之后,criterion 会在 target/criterion/ 下生成一堆 HTML 报告和 JSON 数据。数…

2026/9/12 11:37:55

AI Agent 入门(一):OpenClaw 与 Hermes(openclaw输出篇)

🦞 AI Agent 入门(一):OpenClaw 与 Hermes《AI Agent 对比系列》第一篇 本系列通过对比两个真实开源 AI Agent——OpenClaw(🦞)和 Hermes——带你深入理解 AI Agent 是什么、怎么工作、能做什么…

2026/9/15 9:47:04

Spring Boot爱心捐赠系统源码深度解析:从表设计到业务闭环

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

2026/9/15 9:47:04

别再无脑卷软件工程:2026年最值得押注的4个S级技术方向

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

2026/9/15 9:47:04

LabVIEW调用UDS 0x19服务的工程化实践:图莫斯诊断VI深度解析

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

2026/9/15 9:47:04

基于ONVIF协议的智能视觉系统开发实践

1. 项目概述:打造智能视觉系统的核心模块这个项目源于我对智能机器人视觉系统的长期探索。MOSS作为科幻作品中的经典AI形象,其视觉感知能力一直是技术爱好者们热衷复现的核心功能之一。在本次实践中,我们将重点突破两个关键技术点&#xff1a…

2026/9/15 4:54:30

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/15 0:01:16

AI英语单词APP开发:自适应学习算法与移动端优化实践

1. 项目概述 作为一名在移动应用开发领域摸爬滚打多年的老手,我最近完成了一个AI英语单词APP的开发项目。这个项目将传统单词记忆方法与现代AI技术相结合,打造了一款能够智能适应不同用户学习习惯的英语学习工具。 市面上大多数单词APP都存在一个通病&a…

2026/9/15 0:01:16

Flutter与OpenHarmony结合开发手语学习APP实战

1. 项目背景与核心价值作为一名同时接触过Flutter和OpenHarmony的开发者,最近我完成了一个基于Flutter for OpenHarmony的手语学习APP实战项目。这个项目最大的特点在于实现了跨平台框架与国产操作系统深度结合的创新实践——用Flutter开发的应用能完美运行在OpenHa…

2026/9/15 0:01:16

六个月成为机器人工程师:从ROS2到SLAM的实战路径

1. 六个月的紧迫感从哪来:先搞清楚你要成为哪种机器人工程师说实话,六个月的期限并不是一个宽松的时间线。市面上任何一本正经的机器人学教材都超过五百页,ROS2的官方文档可以翻到你怀疑人生,再加上ABB、KUKA这些工业机器人厂家动…

2026/9/14 11:59:31

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/14 13:53:59

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/14 11:22:57

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码