kizumi_header_banner_img

Hello! 欢迎光临Aurora.歆の小破站!

加载中

文章导读

槐序待办:一个从零手写的专注与任务管理工具


avatar
Aurora.歆Official 2026年10月6日 69

为什么做这个

市面上的待办 App 已经很多了。滴答清单、Things、TickTick、微软 To Do…… 功能都很全,界面也很精致。

但用久了总觉得哪里不对劲:

  • 太复杂。打开一个 App 要等三秒,闪屏、广告、签到、会员弹窗轮番上来,我就想记一条”下午三点给客户回电话”而已。

  • 太重。很多 App 默认要注册账号、要联网、要把你的数据上传到它的服务器,我才刚打开,它还不知道我要不要用呢。

  • 不自由。想改个配色,想加个小功能,想导出个数据,都得看人家脸色。

  • 数据不是我的。今天这家公司倒闭了,明天那个 App 下架了,我的任务记录就没了。

所以我想:能不能做一个刚刚好的工具?

  • 打开就能用,不用注册、不用联网,数据先存在浏览器本地

  • 想要云同步的时候,可以登录账号,手机电脑数据自动同步

  • 界面干净,没有广告、没有签到、没有会员弹窗

  • 代码开源,100% 原生 HTML/CSS/JS,想改哪里改哪里

  • 数据是我的,随时导出 JSON,随时导入回来

于是就有了 槐序待办。

它长什么样

打开后的第一眼,是两个区域:

左边是一个番茄钟 —— 25 分钟专注、5 分钟休息,圆形进度环随着时间一秒秒收缩。下面还有”今日专注”的统计卡:完成了几颗番茄、专注了多少分钟、今天的任务完成率、连续专注了几天、本周累计多少颗。

右边是一个任务列表 —— 顶部是日期筛选(全部/今天/昨天/近 7 天/指定日期),中间是输入框和分类标签,下面是任务清单。每条任务有优先级色条、分类标签、创建时间。

整体配色是柔和的紫粉渐变,深色模式下是深蓝墨色。没有刺眼的对比,看久了眼睛不累。

手机上还有一个移动端专属界面 —— 底部三个 Tab 切换(专注/待办/我的),所有操作都适配了手指触摸,长按任务删除,右上角点一下就能切换深色模式。

它有哪些功能

🍅 番茄钟

  • 25 分钟专注 + 5 分钟休息,标准番茄工作法

  • 圆形进度环,进度可视化

  • 到点响铃(用 Web Audio 合成,不需要音频文件)

  • 完成番茄后自动切换到休息模式,休息结束自动切回专注

  • “自动循环”开关:打开后一个番茄接一个番茄自动推进,不用手点

  • 每完成一颗番茄,底部会点亮一个小圆点

✅ 待办清单

  • 添加任务:输入框回车即可

  • 优先级:高(红)/ 中(橙)/ 低(绿),左侧色条一眼区分

  • 分类:默认带”工作/生活/学习”,可以自己加、选颜色

  • 拖拽排序:按住左侧的 ⋮⋮ 手柄可以拖到任意位置

  • 双击编辑:改文字不用删了重写

  • 筛选:日期 + 分类 + 状态(全部/进行中/已完成)三层组合

  • 搜索:右上角搜索框实时过滤

📊 数据统计

  • 今日完成的番茄数、专注分钟数

  • 今日任务完成率

  • 连续专注天数(streak):每天有番茄记录就 +1,断一天清零

  • 本周累计番茄:从周一算到今天

🎨 界面

  • 深色 / 浅色两套主题,一键切换,记住你的选择

  • 首次打开跟随系统偏好

  • 大字体、高对比度,远处也看得清

☁️ 多用户 + 云同步(可选)

  • 不登录也能用,数据存本地

  • 登录后数据自动同步到服务器

  • 电脑上加的任务,手机登录同一账号后自动出现

  • 支持注册、登录、退出、注销

📱 PWA

  • 桌面版可以”安装到桌面”

  • 装完后是一个独立窗口,没有浏览器地址栏,像原生 App

  • 支持离线打开(本地模式完全可用)

技术上是怎么做出来的

这个项目有一个原则:能用原生就绝不用框架。

  • 前端:HTML + CSS + JavaScript,没有 React、Vue、Tailwind

  • 后端:Node.js + Express + SQLite,就三个依赖

  • 数据存储:localStorage(本地)+ SQLite(云端)

  • 认证:JWT + bcrypt 加密密码

  • 离线:Service Worker 缓存

数据同步怎么解决冲突

多设备同步最麻烦的是:手机和电脑同时改了数据,怎么办?

我的方案很简单:时间戳最后写入者获胜。

  • 每次本地数据变更,记一个时间戳 local_updated_at

  • 服务器端也存一个 updated_at

  • 打开 App 时:

    • 如果服务器更新时间 > 本地 → 拉服务器数据覆盖本地

    • 如果本地更新时间 > 服务器 → 把本地数据推上去

    • 差不多就什么都不做

这样避免了复杂的 diff 合并逻辑,代价是同一秒内两端同时修改会丢一边,但对于个人待办场景,这个概率很低,简单方案就够用了。

PWA 怎么做的

只需要三个文件:

  1. manifest.json — 告诉浏览器应用名、图标、启动方式

  2. sw.js — Service Worker,缓存静态资源,拦截请求

  3. HTML 里注册 SW

if (‘serviceWorker’ in navigator) {
navigator.serviceWorker.register(‘/sw.js’);
}

缓存策略:

  • HTML 页面:网络优先,失败时用缓存

  • 静态资源(CSS/JS/图片):缓存优先,后台更新

  • API 请求:只走网络,不缓存(避免拿到旧数据)

前后端如何交互

后端就 5 个接口:

POST /api/register 注册
POST /api/login 登录
GET /api/data 拉取云数据
POST /api/data 上传云数据
DELETE /api/account 注销账号

所有需要登录的接口都带 Authorization: Bearer <token>,后端用 JWT 验证。

部署有多简单

如果你有服务器,部署只需要:

# 1. 建目录
mkdir -p ~/huaixu-todo/{server,public}
cd ~/huaixu-todo

# 2. 把 package.json 和 server.js 放到 server/
# 3. 把 index.html、mobile.html、tx.png 放到 public/

# 4. 安装依赖并启动
cd server
npm install
node server.js

打开 http://你的IP:3000 就能用了。

配 Nginx 反代 + Let’s Encrypt 免费 HTTPS,10 分钟搞定。PWA 也自动生效。

一些设计上的小细节

  • 启动动画 3.5 秒:显示 Logo 和加载进度条,切换提示文字。为什么是 3.5 秒?因为比这短感觉像闪一下、比这长用户等得不耐烦,3.5 秒刚好让用户心理上”完成一次加载”。

  • 颜色系统用 CSS 变量:--primary、--text-2、--card-2…… 一套变量,浅色深色改一次就全部生效。

  • 对比度:深色模式下所有文字都调亮了,次要文字从 #8a93b0 提到 #b8c0d8,主文字用纯白。不看第二眼也清晰。

  • 手机端长按删除:桌面版用鼠标点 ✕ 删除,但手机上没有鼠标,一个小 ✕ 图标太难点。改成长按任务 600ms 弹出删除确认,配合震动反馈。

最后

这个项目不是要取代那些成熟的商业 App。它只是我自己需要一个简单的工具,就顺手做了出来。

如果你也有类似的需求 —— 不想要广告、不想要注册、不想要复杂 —— 欢迎来试试。

如果你懂点代码,也可以直接 fork 一份改成自己喜欢的样子。所有代码都是原生的,没有框架门槛。

愿你的番茄钟永远不会被打断,愿你的任务清单一页清空。

🍅

项目地址:https://todo.lruriawa.top
技术栈:原生 HTML/CSS/JS + Node.js + SQLite
作者:天津市槐序网络科技工作室

代码过段时间会开源到GitHub。

感谢您的支持
微信赞赏

微信扫一扫

支付宝赞赏

支付宝扫一扫



评论(0)

查看评论列表

暂无评论


发表评论

表情 颜文字
插入代码
Aurora.歆の小破站

About Me

avatar

Aurora.歆Official

网易音乐人、歌手、制作人

36
文章
18
评论
5
用户

Ads