HarmonyOs应用《重要日》开发第29篇 - 重要日设计需注意的地方
本文对比分析《重要日》项目待办事项应用到重要日管理应用的设计演进包括数据模型升级、颜色系统扩展、通知机制、日历标记增强、统计功能新增等方面该学习注意的地方。一、演进背景定位场景项目定位核心场景ImportantDays重要日管理倒数/正数、纪念日、提醒从管理要做什么到管理值得期待的日子定位的转变驱动了所有功能。二、数据模型ImportantDays: ImportantDayImportantDay: - dayID: string - title: string - targetDate: Date - isCountdown: boolean ← 新增 - color: string ← 新增替代 priority - reminderEnabled: boolean ← 新增 - reminderDaysBefore: number ← 新增 - note: string ← 新增 - isPinned: boolean ← 新增 - createTime: Date特性ImportantDay计数模式倒数/正数颜色16色自定义提醒提前N天提醒备注有置顶有完成状态无重要日不需要完成核心倒数/正数模式TraceisCountdown:boolean;getDaysDiff():number{...}getDisplayText():string{constdiffthis.getDaysDiff();if(diff0)return就是今天;if(this.isCountdown){returndiff0?还有${diff}天:已过${Math.abs(diff)}天;}else{returndiff0?已${Math.abs(diff)}天:还有${diff}天;}}这是最重要的特殊设计——同一个模型支持两种计数方式适用于不同的纪念场景。移除完成状态TodoItem 有isCompleted属性ImportantDay 移除了它。原因待办事项需要完成状态重要日是时间节点不存在完成概念倒数/正数模式已经表达了时间状态三、颜色系统扩展ImportantDays: 16色自定义颜色exportconstPRESET_COLORS:string[][#FF6B6B,#4ECDC4,#45B7D1,#FFA07A,#98D8C8,#F7DC6F,#BB8FCE,#85C1E2,#F8B739,#52BE80,#EC7063,#5DADE2,#48C9B0,#F4D03F,#AF7AC5,#85929E];颜色分析从优先级颜色到自定义颜色的设计优先级是系统定义的用户选择有限自定义颜色让用户自由分类如红色生日、蓝色工作、绿色旅行颜色贯穿整个应用增强视觉识别四、通知机制改进ImportantDays: 提前N天提醒TracereminderEnabled:boolean;TracereminderDaysBefore:number;shouldRemind():boolean{if(!this.reminderEnabled)returnfalse;constdiffthis.getDaysDiff();returndiff0diffthis.reminderDaysBefore;}设计分析特性ImportantDays提醒时机提前N天可配置可配置天数权限管理完整权限流程检查机制启动前台检查通知跳转WantAgent跳转通知管理创建/覆盖/取消新增的权限管理// 权限请求staticasyncrequestPermission():Promiseboolean{awaitnotificationManager.requestEnableNotification();returntrue;}// 权限检查staticasynccheckPermission():Promiseboolean{returnawaitnotificationManager.isNotificationEnabled();}新增的 WantAgent 跳转staticasyncgetDefaultWantAgent():PromiseWantAgent{constwantAgentInfo:wantAgent.WantAgentInfo{wants:[{bundleName:com.importantdays.app,abilityName:EntryAbility,action:action.system.home}],actionType:wantAgent.OperationType.START_ABILITY,// ...};returnawaitwantAgent.getWantAgent(wantAgentInfo);}五、日历标记增强ImportantDays: 颜色圆点标题预览// 月视图日期项if(this.hasImportantDay(dateModel)){// 颜色圆点最多3个Row(){ForEach(this.getImportantDays(dateModel).slice(0,3),(day){Circle({width:5,height:5}).fill(day.color)})}// 标题预览Text(this.getFirstDayShortText(dateModel)).fontColor(this.getFirstDayColor(dateModel))}设计分析特性ImportantDays标记方式颜色圆点标题颜色区分每个重要日独立颜色多标记最多3个圆点标题预览显示第一个重要日标题年视图12月小日历标记日期文字颜色有重要日时用重要日颜色六、统计功能新增ImportantDays: 四维统计getStats():Stats{return{total:this.allDays.length,upcoming:this.getUpcomingDays().length,past:this.getPastDays().length,today:this.getTodayDays().length};}统计的 UI 呈现列表页 12 5 1 6 全部 即将 今天 已过 我的页 ┌────────────────────────────────────┐ │ 12 5 1 6 │ │ 全部 即将 今天 已过 │ └────────────────────────────────────┘统计功能让用户快速了解重要日的整体分布。七、排序与置顶ImportantDays: 多维度排序置顶getSortedList(sortType:SortTypeEnum):ImportantDay[]{// 置项优先// 然后按 DATE_ASC / DATE_DESC / CREATE_TIME 排序}asynctogglePin(dayID:string):Promisevoid{day.isPinned!day.isPinned;}设计分析特性ImportantDays排序方式3种循环切换置顶有排序与置顶置顶独立于排序八、架构改进状态管理升级特性ImportantDays装饰器V2 (ComponentV2,Local,Param)可观察类ObservedV2Trace观察粒度属性级日历架构设计特性ImportantDays日历视图年/月/周视图无限滚动SwiperLazyForEach数据源IDataSource 实现日期导航前后月今天选择器ViewModel 分层特性ImportantDays数据管理ImportantDayManager 单例日历状态CalendarVM 单例数据源CalendarDataSource九、设计总结表模板特性本项目设计待办事项ImportantDay 重要日颜色16色自定义颜色选择器基础通知重要日提前N天提醒日历标记待办日历标记重要日圆点标题统计统计面板全部/即将/今天/已过置顶支持置顶和多种排序状态管理V2状态管理月视图年/月视图无限滚动十、改进的设计理念1. 从任务到时间节点ImportantDays 关注什么时候到来时间节点。这个设计驱动了移除完成状态新增倒数/正数模式增强日历功能2. 从统一到个性化ImportantDays 的颜色由用户自由选择。这个设计体现了16色自定义选择器颜色贯穿所有 UI颜色与模式联动3. 从被动到主动ImportantDays 的提醒是主动检查的。这个设计体现在提前N天提醒启动前台双重检查完整的权限管理流程4. 从简单到专业ImportantDays 是专业的重要日管理工具。这个设计体现在多视图日历统计面板排序与置顶年视图鸟瞰十一、总结ImportantDays 的设计之路展示了定位驱动设计应用定位的转变驱动所有功能模型即核心数据模型的升级是一切设计的基础用户体验优先每个设计都直接提升用户体验架构与时俱进从 V1 到 V2 的状态管理设计功能螺旋上升在模板基础上不断扩展和增强