# Habo 需求分析文档

> 版本: 3.1.2 | 最后更新: 2026-04-13

---

## 1. 项目定位

### 1.1 产品定义

**Habo** 是一款**极简主义的习惯追踪应用**，帮助用户通过每日打卡、进度可视化和心理模型引导，建立并维持长期习惯。

### 1.2 解决的核心问题

| 痛点 | 描述 |
|------|------|
| **习惯难以坚持** | 人们制定了计划但缺乏日常反馈机制，几天后放弃 |
| **缺乏正向激励** | 完成习惯后没有即时奖励感，大脑无法建立正向反馈回路 |
| **数据孤岛** | 习惯数据存储在云端，依赖网络，存在隐私顾虑 |
| **功能过度** | 现有习惯类 App 功能繁杂，设置成本高，反而降低使用意愿 |
| **缺乏科学方法** | 用户不了解习惯形成的心理学原理，只靠意志力 |

### 1.3 目标用户画像

| 画像 | 特征 | 核心需求 |
|------|------|----------|
| **自律建设者** | 想建立新习惯（运动、阅读、冥想）但经常中断的成年人 | 简单打卡 + 可视化连续天数 |
| **数据驱动型** | 喜欢用数据量化自我、追踪进步的用户 | 统计图表 + 导出功能 |
| **隐私敏感型** | 不信任云服务，希望所有数据留在本地的用户 | 纯本地存储 + 本地备份 |
| **多设备用户** | 在手机、平板、桌面端都需要使用 | 跨平台支持（Android/iOS/macOS/Linux） |

### 1.4 差异化定位

与 Habitica、Streaks、Loop 等竞品相比，Habo 的核心差异化：

- **极简设计** — 无社交、无游戏化、无广告，聚焦习惯本身
- **心理学模型内置** — Cue-Routine-Reward 习惯循环、两天法则、习惯合约（惩罚/问责伙伴）
- **纯本地架构** — 零网络依赖，数据完全由用户掌控
- **跨平台开源** — Flutter 实现的真正跨平台体验
- **数值型习惯** — 不仅支持"做了/没做"，还支持"做了多少"（如跑步 5km、喝水 8 杯）

---

## 2. 功能需求

### 2.1 功能矩阵

#### P0 — 核心功能（MVP 必须）

| ID | 功能 | 描述 |
|----|------|------|
| F01 | 习惯创建 | 创建新习惯，设置标题和基础配置 |
| F02 | 每日打卡 | 日历视图中对每一天标记状态：完成 / 失败 / 跳过 |
| F03 | 日历视图 | 月度日历展示，每天显示对应的打卡状态标记 |
| F04 | 连续天数 | 计算并展示当前连续完成天数和最高连续记录 |
| F05 | 习惯列表 | 展示所有活跃习惯，支持拖拽排序 |
| F06 | 编辑/删除 | 编辑习惯属性或永久删除 |
| F07 | 持久化存储 | 所有数据本地 SQLite 存储，关闭应用不丢失 |
| F08 | 浅色/深色主题 | 跟随系统或手动切换浅色/深色主题 |

#### P1 — 重要功能

| ID | 功能 | 描述 |
|----|------|------|
| F09 | 两天法则 | 允许用户启用"两天法则"——允许间隔一天失败而不打断连续天数 |
| F10 | 习惯循环 (Cue-Routine-Reward) | 基于《原子习惯》的习惯循环模型，设置提示、例行、奖励 |
| F11 | 习惯合约 | 设置惩罚和问责伙伴，失败时显示惩罚提醒 |
| F12 | 统计总览 | 饼图展示所有习惯的整体完成率分布 |
| F13 | 个人统计 | 每个习惯的详细统计：最高连续、当前连续、月度柱状图 |
| F14 | 数值型习惯 | 支持设置目标值和单位的习惯类型（如 10000 步） |
| F15 | 进度追踪 | 数值型习惯可以记录部分进度，不要求一次性完成 |
| F16 | 分类系统 | 习惯可归属多个分类，支持按分类筛选显示 |
| F17 | 通知提醒 | 每日定时提醒用户打卡 |
| F18 | 备份/恢复 | 导出/导入 JSON 备份文件，支持跨设备数据迁移 |
| F19 | 引导页 | 首次使用时展示三步引导（定义习惯 → 记录天数 → 观察进步） |
| F20 | 归档功能 | 将不再追踪的习惯归档而非删除，保留历史数据 |
| F21 | 音效反馈 | 打卡时播放音效，增强即时满足感 |
| F22 | 备注/日记 | 每日打卡时可添加文字备注 |

#### P2 — 增强功能

| ID | 功能 | 描述 |
|----|------|------|
| F23 | Material You 主题 | Android 12+ 动态取色主题 |
| F24 | OLED 黑色主题 | 纯黑背景，适配 OLED 屏幕省电 |
| F25 | 自定义颜色 | 用户可自定义完成、失败、跳过、进度的颜色 |
| F26 | 生物识别锁 | 指纹/面容锁定应用，保护隐私 |
| F27 | 桌面小组件 | iOS/Android 主屏幕小组件显示今日完成进度 |
| F28 | 一键打卡 | 无需打开菜单，单击直接标记完成 |
| F29 | 深度链接 | 支持 `habo://` URL scheme 跳转到指定页面 |
| F30 | 周起始日设置 | 用户可选择周日或周一作为日历的起始日 |
| F31 | 显示月份名称 | 可选在日历中显示月份名称 |
| F32 | 27 种语言 | 支持中英日韩等 27 种语言的完整界面翻译 |

### 2.2 功能依赖关系

```
F01 (创建) ──→ F02 (打卡) ──→ F04 (连续天数)
     │              │
     │              ├──→ F12 (统计总览)
     │              └──→ F13 (个人统计)
     │
     ├──→ F03 (日历视图)
     ├──→ F05 (列表) ──→ F16 (分类)
     ├──→ F06 (编辑/删除)
     ├──→ F10 (习惯循环) ──→ F11 (习惯合约)
     ├──→ F14 (数值型) ──→ F15 (进度追踪)
     └──→ F20 (归档)
```

---

## 3. 非功能性需求

### 3.1 平台支持

| 平台 | 最低版本 | 说明 |
|------|----------|------|
| Android | API 21 (Android 5.0) | 支持 split-per-abi APK 分包 |
| iOS | 12.0+ | 完整功能 |
| Linux | - | 通过 sqflite_common_ffi 支持 |
| macOS | - | 原生窗口管理 |

### 3.2 性能要求

| 指标 | 要求 |
|------|------|
| 启动时间 | 冷启动 < 2 秒（含 splash screen） |
| 日历切换 | 月份切换流畅 60fps，无明显卡顿 |
| 数据容量 | 支持至少 100 个习惯 × 365 天的事件记录 |
| 备份文件 | 支持 10MB 以内的备份文件导入 |
| 内存占用 | 日常使用 < 100MB RAM |

### 3.3 安全与隐私

| 要求 | 实现方式 |
|------|----------|
| 数据不离开设备 | 纯 SQLite 本地存储，无网络请求 |
| 生物识别保护 | 通过 `local_auth` 调用系统指纹/面容识别 |
| 备份文件控制 | 用户手动导出/导入，应用不自动上传 |
| 无第三方分析 | 不集成 Google Analytics、Firebase 等追踪服务 |

### 3.4 可访问性

| 要求 | 说明 |
|------|------|
| Material Design 规范 | 遵循 Material Design 无障碍指南 |
| 高对比度 | 深色/OLED 主题提供高对比度 |
| 大字体支持 | 响应系统字体缩放设置 |
| 语义化标签 | Flutter Semantics 为屏幕阅读器提供语义信息 |

---

## 4. 用户故事

### 4.1 核心用户故事

| 编号 | 用户故事 | 验收标准 |
|------|---------|----------|
| US01 | 作为用户，我想快速创建一个新习惯，以便开始追踪 | 输入标题 → 点击保存 → 习惯出现在列表中 |
| US02 | 作为用户，我想在日历上点击某天标记完成，以便记录我的每日进度 | 点击日期 → 选择"完成" → 日历显示绿色标记 |
| US03 | 作为用户，我想看到当前连续天数，以便获得坚持的动力 | 连续 2 天以上完成时显示绿色连续天数徽章 |
| US04 | 作为用户，我想查看月度统计图表，以便了解长期趋势 | 统计页显示柱状图，可切换年份和事件类型 |
| US05 | 作为用户，我想导出数据备份，以便在更换设备时迁移数据 | 设置页点击备份 → 生成 JSON 文件 → 保存到文件系统 |
| US06 | 作为用户，我想设置每日提醒通知，以便不忘记打卡 | 设置通知时间 → 每天定时收到通知 |
| US07 | 作为用户，我想追踪数值型目标（如每天 8 杯水），以便记录部分完成 | 创建数值习惯 → 输入进度值 → 查看百分比完成度 |
| US08 | 作为用户，我想启用两天法则，以便在偶尔失败时不中断连续记录 | 开启两天法则 → 失败一天后次日完成 → 连续天数不中断 |
| US09 | 作为用户，我想用分类管理习惯，以便快速筛选查看 | 创建分类 → 习惯关联分类 → 按分类筛选列表 |
| US10 | 作为用户，我想归档不再追踪的习惯，以便保持列表整洁但不丢失历史 | 点击归档 → 习惯从主列表消失 → 可在归档列表中查看 |

### 4.2 边界场景

| 场景 | 期望行为 |
|------|----------|
| 用户 31 天没有任何事件记录 | 连续天数显示为 0，无徽章 |
| 用户连续完成 100 天 | 连续天数正确显示 100 |
| 用户在两天法则下连续两天失败 | 连续天数归零 |
| 数值习惯进度超过目标值 | 标记为已完成，进度条满格 |
| 备份文件格式错误 | 显示错误提示，不覆盖现有数据 |
| 应用从后台恢复且已启用生物识别 | 弹出认证对话框，认证失败可重试 |
| 跨午夜使用应用（23:59 → 00:01） | 自动检测日变化，刷新日历视图 |
| 空标题尝试保存 | 显示错误提示"The habit title cannot be empty" |

---

## 5. 设计原则

| 原则 | 说明 |
|------|------|
| **极简优先** | 默认只显示标题和日历，高级选项折叠隐藏 |
| **即时反馈** | 每次打卡有视觉（颜色变化）和听觉（音效）反馈 |
| **正向强化** | 奖励通知优先于惩罚通知，连续天数优先于失败天数 |
| **零配置可用** | 安装后即可使用，不需要注册、登录或网络 |
| **用户控制** | 所有数据可导出、可删除，用户完全掌控 |
