DIY你自己的Weektodo


WeekToDo 是一款极简的周计划工具,界面干净、本地存储、注重隐私。特别改造版,增加了数据同步和AI总结功能(详见https://alberf.cn/archives/AI-weektodo.html),但用久了会发现几个不够顺手或不习惯的地方:

  • 待办事项只有「完成 / 未完成」,看不到一项任务到底耗了多久
  • 上周没做完的任务自动来到本周,用户却不知道它是「新任务」还是「遗留任务」
  • 一天的任务混在一起,上午要做的事和下午要做的事没有区分
  • 内置的打印功能会打印整个页面,而不是用户真正关心的「当前这一周」

于是我决定在原有代码基础上做一轮个性化改造,保留它极简的气质,同时补齐这些细节。

让时间「可被看见」

初衷

待办工具最核心的价值不是「记住要做什么」,而是「知道做了多久」。一个任务从开始到完成,中间隔了多长时间,这件事本身是有意义的——它能帮你判断一项任务是不是拖得太久,是不是该拆解,是不是该放弃。

思路

我给每个任务增加了三个时间概念:

起点日期:任务是从哪一天开始算的

起点时刻:这一天从几点开始算

完成时刻:任务是什么时候完成的

有了这三个点,「用时」就自然浮现出来了——从起点到「现在」或「完成时刻」的间隔。

呈现方式

鼠标悬浮任务时,轻量地显示「已耗时 X 小时 / X 天」

打开任务详情,可以看到具体的开始日期、开始时刻、完成时间和总用时

新增一个统计页面,把所有任务汇总起来,支持按日期范围、完成状态、所属列表筛选,也可以按周或按月聚合查看

统计结果可以导出成表格文件,方便进一步分析

取舍

时间显示有「小时」和「天」两种粒度。48 小时以内用小时,超出后自动换成天——因为对于一项长任务来说,「3.2 天」比「77 小时」更容易理解。

区分「拖动」和「迁移」

问题

WeekToDo 有一个很贴心的功能:上周没完成的任务,会自动出现在本周,提醒你「这件事还没做完」。

但问题是,用户手动把一个任务拖到另一天,和系统自动把任务挪到新一天,在程序看来是同一件事——都只是改了「任务属于哪一天」。

两者其实不同
拖动:用户觉得这个任务排期不合理,想换个日子。这时「计时起点」应该跟着改。

迁移:任务一直没完成,继续往后拖。这时「计时起点」不应该改——否则用户永远看不到这项任务真正拖了多久。

解决方式

我引入了一个「起点锚定」的概念:不管任务被挪到哪一天,它的用时起点可以独立保留。

系统迁移时,起点不动

用户拖动时,弹一个小窗询问:「是否把开始日期也改成新日期?」

这样既尊重了用户的意图,又保住了长任务的「真实年龄」。

让「遗留任务」被看见

初衷

一个任务被迁移了好几次,用户其实很难察觉。列表里它和别的任务长得一模一样,只有用心看日期才会发现「咦,这不是上周的吗?」

思路

给每个被迁移过的任务打一个来源标记:它最初是从哪一天来的。

这个标记一旦写下,就不再改变——即使任务又被迁移了好几次,用户看到的还是「它最初来自哪一天」,而不是「它昨天从哪来」。

呈现方式

列表里显示一个小小的紫色箭头图标,鼠标移上去能看到来源日期

统计页增加「迁移来源」列和「迁移筛选」,一眼能看出哪些是遗留任务

生成周总结时,AI 会单独用一段来分析这些遗留任务,给出拆解、放弃或委托的建议

上午和下午的划分

初衷

一天的任务全堆在一起,上午该干什么、下午该干什么,没有视觉上的区分。但很多人的工作节奏天然是分段的:上午处理需要专注的事,下午处理沟通协调类的事。

思路

以中午 13:00 为界,把每天的任务分成「上午」和「下午」两组:

上午标签用琥珀色,下午标签用靛蓝色,中间用横线分隔

分组仅对「日期列表」生效,自定义列表(如购物清单、想法清单)保持原样

如果某个时段没有任务,那一组的标签也不会显示,避免视觉噪音

新建任务时自动归类
用户新建任务时,系统会根据「当前时间」自动判断该分到上午还是下午:

上午创建 → 归入上午

下午创建 → 归入下午

同时,如果用户给任务设置了具体的计划时间(比如下午 4 点),用时起点会自动采用这个时间,保证语义一致。

打印体验的优化

问题

原来的打印功能会打印整个页面——侧边栏、自定义列表、周总结,全部都会印出来。但用户真正想打印的,往往只是「这一周要做的事」。

思路

与其用样式隐藏页面上不想打印的部分,不如在打印那一刻,临时生成一份只包含当前周的简洁清单,打印完再销毁。

这样打印的内容是独立的、干净的,不受当前页面布局的影响。

呈现方式

按 A4 横版排版

一周 7 天,每天一列

每一天的标题用大字写「周几」,下面用很小的灰字写「几月几日」

已完成的任务带删除线,未完成的保持原样

有任务时间的话,用小标签标出来

数据同步与部署

同步

WeekToDo 本身支持把数据同步到 S3 兼容的云存储。我在几个数据变化的节点上(编辑用时起点、拖动、完成任务等)接入了自动推送,让改动能及时上传。同时设置页里也保留了一个「立即同步」按钮,方便用户手动触发。

部署

原本项目提供了 Docker 配置,但 docker-compose.yml 只引用了一个远程镜像,不会根据本地代码重新构建。所以正确的更新方式是:

改完代码后,手动用 Dockerfile 构建本地镜像

在 docker-compose.yml 里把镜像地址指向本地构建的版本

重启容器

如果想快速看到效果,用项目自带的开发服务器 yarn run serve 更合适——它支持热重载,改完代码浏览器会自动刷新,省去每次构建镜像的时间。

一些设计上的取舍

这次改造里有几个决定,值得单独说一下:

  1. 为什么废弃了「创建时间」这个字段?
    因为它和「起点日期」「起点时刻」的语义重叠了。与其维护三个含义模糊的时间字段,不如只保留两个含义清晰的——一个管日期,一个管时刻。
  2. 为什么迁移来源只记第一次?
    因为它回答的是「这项任务最初是哪天的」,而不是「它昨天从哪来」。用户关心的是它拖了多久,而不是它被拖过几次。
  3. 为什么上午/下午不做成可配置?
    配置项越多,用户越容易迷失。13:00 是一个符合大多数人工作习惯的分界点,先用这个默认值,如果将来真的有需求,再考虑做成选项。
  4. 为什么打印不用 CSS 隐藏?
    因为页面结构复杂,很难保证「只打印当前周」的样式在所有浏览器下都一致。动态生成内容更可控,也更容易维护。

写在最后

WeekToDo 的原始设计已经非常克制和优雅。这次改造的目标不是让它变得「功能更多」,而是让它更贴合个人的使用习惯——看见时间、看见遗留、看见节奏。

如果你也在用 WeekToDo,希望这些思路对你有启发。改造后的代码仍然保持开源精神,所有改动都在原有架构内完成,没有引入额外的依赖。

工具最终是为了服务于人,而不是相反。

声明:Alber.F|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - DIY你自己的Weektodo

医疗器械质量和注册管理的数字化的尝试者