● 个人项目 · Full-stack Product Case Study

Amily OS — 我的个人管理系统
把日常事务、计划与复盘收进一个中枢

一个由我独立设计、从 0 到 1 全栈构建的个人管理工具。它把待办、习惯、时间排程、学习、阅读与自我记录等模块统一在一个中枢里,覆盖「想做 → 排程 → 执行 → 反馈 → 复盘」的完整闭环。

Next.js 16 · React 19 Supabase (Auth + Postgres + RLS) Zustand · TanStack Query Tailwind v4 · shadcn/ui AI 编排 (DeepSeek / OpenAI) PWA 离线优先
Why build this

我为什么要做这个系统

市面上的效率工具要么太重、要么只解决单点。真正难的是:事情散落在十几个 App 里、想做的事一直停在「明天再说」、做完也没有回头看自己的闭环。

🌀

拖延与启动摩擦

任务一大就下不去手。核心难点在「开始的门槛」太高,而不是「能否完成」。需要把启动成本压到最低。

🧩

信息高度碎片化

待办、习惯、读书、学习、记账各用各的 App,没有统一视图,也无法互相印证进度。

🔄

缺反馈与复盘闭环

做完就忘,不知道自己这段时间到底在哪些事上投入、哪些在空转。需要一个「看见自己」的数据层。

Design principles

贯穿产品的 4 条原则

这些不是口号,而是落在每一个交互里的硬约束。

1

把「开始」的门槛压到最低

「5 分钟启动法」:奖励落在「开始」这一刻而非「完成」。后台计时、到点响铃,不显示实时倒计时,避免被逼迫的焦虑感。

2

即时、可见的反馈闭环

完成任务即 +积分、习惯连续打卡生成 🔥 streak、暂停可记录并回算。让努力被「看见」,靠正反馈而非自律硬撑。

3

移动优先、双端一致

竖屏优先适配手机、横屏适配桌面;同一套设计 token 在两端都稳。时间表的「实际 HH:MM – HH:MM」与暂停标注在窄屏也读得清。

4

用数据驱动复盘

偏差 / 完成率 / 按时率 / 超时热力 / 周节律雷达 —— 8 个看板把「我这段时间过得怎样」讲清楚,让人自己得出结论。

System map

系统全景:四大模块

下方四个模块是当前已经开发、并且我在日常使用的部分。点击任一模块可查看逐条功能说明(按真实二级 tab 顺序展开)。其余模块会在后续逐步设计。

说明:以上四个模块已开发并日常使用;财富中心、职业探索中心等其他模块将在后续慢慢设计,暂不列入本展示。
Feature walkthrough

核心功能的实现细节

下面展开排课引擎、反馈闭环、数据复盘,以及多模块任务同步与超载提醒的具体实现。

⏰ Time Table:按作息规则排程

把模板 + 习惯 + 待办编排成一天

排程由一组明确的规则驱动,所有常量集中在 timetable-logic.ts:

  • 紧凑 + 留白:段间自动插入休息,避免「下午段间无休息 / 空档过大」。
  • 白天任务置前:重任务尽量提前完成;只有总时长 ≥ 120 分钟 的长任务才允许排到晚上。
  • 习惯锚点:早餐 09:00、午餐 12:00、晚餐 18:00 固定占位,午休 13:00 不另插休息。
  • 跨段标记:长任务拆多段时显示「第 n/m 段」,CPA 等学习任务至少一段排早晨降低启动阻力。
  • 暂停可记录:每段可记 pause_intervals,如「19:00–19:30」,复盘时如实回算。
模板 / 习惯 / 待办 排课引擎紧凑·留白·白天置前·锚点 当日时间表

🔄 反馈闭环:让努力被「看见」

积分 / 习惯 streak / 暂停回算 构成的回路

核心假设:人靠正反馈而非意志力持续。每条动线都回到「计划」形成闭环:

  • 完成任务 → +积分,积分可在 Shop 兑换(正向强化)。
  • 习惯连续打卡生成 🔥 streak;坏习惯连错逐次加重扣分,第 3 次清零。
  • Time Table 的「实际起止 / 暂停」回算完成质量,喂给周报与复盘。
  • Plans 的 超载检测:把模板频率展开成未来 N 天占用,超阈值即预警(接近上限琥珀 / 超载红)。
做任务 +积分/🔥 周报/复盘 调整计划

📊 Data Analysis:把个人数据变成可读趋势

内嵌于指挥台的 8 图复盘看板

每张图对应一个「能改变行为」的问题。下方是其中三张的静态示意:

完成率趋势(近 14 天)
本周负荷(分钟/日)
按时率排行(模块)

其余 5 张:偏差、按时率、超时热力图、周节律雷达、积分来源去向 / 累积曲线。完整看板上线于指挥台「Data Analysis」子标签。

🔗 多模块任务同步与超载提醒

Plans / 英语 / 阅读 的计划统一落地到指挥台 Templates

各模块的计划都通过同一套机制同步成指挥台的每日任务,并在同步前预演未来两周的负载:

  • 统一落地:Plans 的阶段、英语每日学习、阅读朗诵计划,同步时都转成 task_templates 的一条条模板,进入每日生成与排程。
  • 来源追溯:模板表加 source_module + source_plan_id 列,同步时写入,使每日任务能回写到来源模块。
  • 超载预演:同步前把模板「频率 + 时长」展开成未来 OVERLOAD_DAYS=14 天的占用分钟,按日加总。
  • 阈值 REL_CAP=630 分钟:一天清醒可自由支配时间上限(1440 − 睡眠/三餐/午休/通勤),超过即超载。
  • 超载日历:Templates 顶部横向迷你日历,正常灰 / 接近上限琥珀 / 超载红;点红色日展开当天清单,勾选取消 = 该日跳过。
  • 成因分类:重复任务堆积 / 单任务爆发 / 跨模块叠加 / 阶段拐点 / 突发占用(旅行生病)/ 频率配置错误。
  • 处理方式:按日跳过、整段挂起(blackout)、改期、降频、硬冲突移动其一。
  • 两种回写:① 直接回写(改期等真改来源行);② 例外叠加(跳过/挂起只记例外、不改来源,可逆,旅行建议走此)。
Plans 英语计划 阅读计划 task_templates每日任务单元 超载日历(未来14天)灰 / 琥珀 / 红

Plans 的 abort 若曾 synced,对应 templates 转 is_abandoned + abandon_note,保持计划与每日任务状态一致。

Architecture

技术架构与 AI 编排

前端只持有「用户自己的 API Key 指纹」,密钥永不下发到浏览器;所有 AI 调用经服务端路由,按用户配置路由到对应大模型。

Browser · Next.js 16 App Router · React 19 Tailwind v4 · shadcn/ui Zustand · TanStack Query PWA 离线优先 仅持 Key 指纹·密钥不下发 API Routes (Node) /api/ai/generate /api/ai/chat /api/ai/plan · summary 按 user_ai_settings 路由 无 Key → 友好拒绝 Supabase Auth (SSR cookie) Postgres + RLS user_ai_settings 表 ~40 张业务表 多租户隔离 大模型 DeepSeek / OpenAI 用户自带 Key
Engineering

工程实现要点

下列是该项目的几个关键工程决策。

🔐 多租户 RLS 隔离

所有业务表按 user_id 行级隔离;AI 路由服务端校验登录态后再读用户配置,密钥只存服务端。

🧩 AI 多服务商可配置

用户可在设置里填 DeepSeek / OpenAI 兼容 / 自定义 的 Base URL 与 Key,后端按配置路由,部署方额度不被共用。

📱 移动优先响应式

同一套设计 token;AI 面板等模块区分移动/桌面独立布局,窄屏时间表仍清晰可读。

🗂️ 增量迁移规范

Schema 变更收敛为可重复执行的 SQL(DROP POLICY IF EXISTS 再建),列约束用同名 CONSTRAINT 改写,避免漂移。

⚡ PWA 离线优先

next-pwa 离线缓存 + 手动备份/导出(JSON/MD/Excel/Word/PDF),数据不锁死在云端。

🧠 反馈闭环建模

暂停区间、超载日历、streak 清零等规则被显式建模进数据层,而非前端假装。

Iteration log

持续发现问题、持续打磨

产品不是一次成型。这里记录几条有代表性的迭代。

2026-09 · 排课体验

修复「下午段间无休息 / 空档过大」

把排课常量收敛到 timetable-logic.ts,确立「紧凑 + 自动留白 + 白天置前 + 长任务≥120min才排晚」的稳定规则。

2026-09 · 习惯反馈

上线的 streak 与「暂停回算」

习惯连续打卡生成 🔥;Time Table 支持记 pause_intervals,复盘时如实回算完成质量,而不是假装满勤。

2026-09 · Plans 超载

全局超载检测与例外机制

把模板频率展开成未来 N 天占用,超阈值预警;支持「按日跳过 / 整段挂起 / 改期」与可逆的例外叠加。

2026-09 · 数据安全

AI Key 改为用户自填

新注册用户的 AI 能力改为「必须在设置里填自己的 API Key」,服务端不再兜底部署方的环境变量,杜绝额度被共用。

🎛️

模块功能详情