Reminder模块
Vue项目提醒模块设计
[!info] related notes
Reminder模块设计思路
Overview
核心职责:高频、轻量级的循环提醒,习惯养成。与 Task 的区别在于它不需要“勾选完成”的心理负担,或者说是“打卡”性质。
一个独立的主要用于循环重复提醒的用于日常行为习惯(站起来活动、三餐、喝水等)养成的功能模块,
- 应该支持提醒任务组:将多个同类型的提醒任务归为一组,能够管理多个提醒任务,也可以达到组合提醒的效果。,比如 打游戏时的行为 或者 上班时 应该时不同的行为习惯
- 支持启动暂停,支持小组式批量启动暂停管理的循环提醒(每隔xx分或者每天9:00)
服务
基础服务
- 提醒组:创建、获取提醒组的名字、图标、颜色
- 提醒任务:创建、获取
复杂业务服务
- 提醒 的生命周期管理: 主要是暂停和恢复,应该支持 所有提醒任务的 启动暂停,以及 文件夹层级的启动暂停, 还有 单个提醒任务的提醒暂停。
- 提醒: 应该需要和 schedule 和 reminder 模块联动。
template 启用状态的逻辑(生命周期管理)
受到 group 的 启用模式、是否启用 和 reminderTemplate 的 自我启用状态 的影响
- group 启用模式 为 group(受组控制)时, template 的 enable = group.enable
- group.enableMode = individual 时,template.enable = template.selfEnable
还有在所有 提醒中 提供关闭所有reminder提醒的总开关。
领域实体对象
聚合根对象:
ReminderGroup(提醒组): 管理启用状态的容器。Reminder(提醒项): 具体的提醒规则。 值对象:EnableStrategy(启用策略): 封装你提到的 “Group vs Individual” 逻辑。ReminderSchedule(提醒时间表): 比如 “每隔 30 分钟” 或 “每天 09:00”。
架构设计建议
生命周期逻辑:
你的 Group/Individual 逻辑非常像 Feature Flag (特性开关) 的设计。 建议在实体上设计两个字段:
configEnable: 用户手动开关。effectiveEnable: 计算属性 (Getter),逻辑为group.effectiveEnable && this.configEnable。
渲染进程
presentation
实现页面是一个左右布局,
左侧是主要内容区域,以网格布局形式,展示 items(group、template)。点击item,展示粗略信息,顶部右上角显示 selfEnable 状态控制组件(switch),和实际 status 状态。点击 group,同样顶部 名称 + 控制模式 + 状态 组件,下方则是小型 网格布局,以网格形式展示 group 下的 group。使用 右键菜单来针对不同目标显示不同的 修改、增加、删除等功能。
右侧是一些数据统计,比如即将到来的 reminder。右侧应该是 可以收起或打开的。
实现细节
reminderGroup 的模式更改时页面响应式变化的问题
传入 reminderGroupCard 的对象是通过下面的响应式对象传入的,传入后在 Card 中调用了方法,通过ipc修改对象的 enableMode,并在 store 中同步,但是 Card 中还没有响应式更新 enableMode的状态。该怎么做
const reminderTemplateGroupCard = ref({
show: false,
templateGroup: null as ReminderTemplateGroup | null
});
有两种方案:
- 传入 templateGroupUuid 而非完整对象,通过传入的 uuid 获取 store 中的对象,绕过了 Card 传入的对象不是响应式的问题。
- 传入 完整对象,但是页面中渲染的属性(如 enbaled)还是通过 computed 和 传入对象的 uuid 从 store 中获取。
好像其实是一个方案
桌面作为根Group(特殊group)
这样让每个 reminderTemplate 都有所属 group, 方便控制渲染逻辑,所有 reminder 都只渲染一次,根据 groupUuid 来渲染 复用 group 的控制逻辑 来 作为 控制所有 reminder 的方法(好像不行,目前没有实现 Group 的启用状态计算业务,也没必要实现;还是额外加一个启用或者停止所有 reminder 的方法吧)
提醒任务(比较复杂,后续再看)
提醒周期:
能够选择一个时间段(或一直持续),在时间段内重复 提醒任务
可以添加专注功能(专注周期),屏蔽其他普通提醒(但保留重要提醒)
任务周期:
完成一次定义的所有任务所需要的时间
任务时间:
应该支持复杂的时间设置:
- 经过 40m 后提醒,休息 10m;
- 经过随机 3-5m 后提醒,休息 30s;持续 90m 后,休息 10m; 整个任务周期为 100m,但是任务周期里有多个小周期 3.5m-5.5m,默认的提醒周期应该为一个任务周期,但应该可以被用户设置
{
name: "专注训练",
description:"专注90m,休息10m",
duration: 100,
type: 'relative',
times: [
{
name: "专注周期",
description: "多个小周期专注3-5m,休息30s",
duration: 90,
times: [
{
name: "专注小周期",
duration: 3.5-5.5,
},
{
name: "休息小周期",
duration: 30,
}
]
},
{
name: "休息周期",
duration: 10,
}
],
}
可视化功能:
- 添加一个任务周期
- 添加一个提醒周期
基础提醒任务组:
- 起床提醒:绝对时间 8:00
- 饭点提醒:多个绝对时间点
- 睡觉提醒:绝对时间 23:00
电脑前任务组:
- 休息提醒:每过 40m 提醒一次 休息 5m