Files
life_goals/docs/03-架构设计/技术选型与数据结构.md
adminandClaude Sonnet 4.6 a1561c7d43 chore: 初始化仓库结构
- 建立 monorepo 结构:app/ + server/ + docs/
- 纳入全部需求/架构/开发计划文档
- 新增 docs/PROGRESS.md 功能状态总览
- 新增 docs/decisions/ ADR 决策记录(001-004)
- 新增根目录 README.md 含 AI 阅读指引
- 新增 .gitignore

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 16:39:16 +08:00

208 lines
6.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 🏗️ 架构设计 — 技术选型与数据结构
> 来源:[Notion 原始文档](https://www.notion.so/36a401dc38a6813c88b1f89d0df5b12b)
## 技术选型
| 维度 | 选择 | 理由 |
|------|------|------|
| 框架 | React (JSX) | 组件化、状态管理成熟,适合复杂交互 |
| 样式 | Inline CSS + CSS Variables | 无需构建工具,展开即用 |
| 存储 | Artifact Storage API | 跨设备持久化,免登录 |
| 备用存储 | localStorage | 离线备用,与 Storage API 双写 |
| AI 接口 | Anthropic API /v1/messages | 直接调用,无需后端 |
| AI 模型 | claude-sonnet-4-20250514 | 性价最优,响应快 |
| 字体 | Noto Serif SC | 中文手写书感,与"人生"主题匹配 |
---
## 数据结构设计
### 目标树 — `GoalTree`
```javascript
{
root: {
id: "root",
text: "我的人生主目标",
level: "life", // life | year | month | week | day
children: ["id1", "id2"],
expanded: true
},
nodes: {
"id1": {
id: "id1",
text: "年度目标 A",
level: "year",
children: ["id3"],
expanded: true
}
// ...
}
}
```
**设计决策:**
- 使用 flat 结构(nodes 字典)而非嵌套对象,方便增删改
- children 存 id 数组,保持顺序
- level 自动推断:父节点 level 的下一级
### 每日复盘 — `Checkins`
```javascript
{
"2026-05-24": {
score: 8,
note: "今天完成了...",
aiReply: "AI 点评内容..."
}
// 以日期为 key
}
```
**设计决策:**
- 以日期字符串为 key,天然去重
- AI 点评随复盘存储,无需单独请求
---
## 模块划分
```
App
├── GoalNode — 目标树节点(递归组件)
├── ScoreRing — SVG 圆形评分环
├── CheckIn — 每日复盘输入表单
├── History — 历史复盘列表 + 柱状图
├── Advisor — AI 对话界面
└── callAI() — Anthropic API 封装函数
```
## 数据流
```
用户输入
↓
React State (useState)
↓
localStorage (备用)
↓↑
Artifact Storage API (主存储,跨设备)
```
## AI 调用流
```
用户提交复盘
↓
收集目标树全文 + 近期复盘记录
↓
构建 System Prompt (教练角色 + 目标上下文)
↓
Anthropic /v1/messages
↓
返回点评文字 → 显示 + 存储
```
---
## 性能考虑
- AI 请求只在用户主动提交时触发,不自动定时
- 目标树数据小,本地状态即可实时更新,无需节流
- Storage API 异步写入,不阻塞 UI
---
## 移动端打包策略
采用**两阶段**路线,先低成本验证市场,再投入打包成本。
### 阶段一:PWA(需求验证)
> 目标:以最小改动让用户在手机上"安装"并使用,验证产品市场价值。
| 项目 | 说明 |
|------|------|
| 方式 | 浏览器打开后「添加到主屏幕」 |
| 改动 | 加 `manifest.json` + Service Worker 即可 |
| 存储 | 沿用 localStorage(Artifact Storage API 不适用独立部署) |
| 限制 | iOS Safari 对 PWA 支持有限;无法上架应用商店 |
| 验证指标 | 用户留存、复盘频率、AI 功能使用率 |
### 阶段二:Capacitor 原生打包(正式发布)
> 触发条件:PWA 阶段验证产品有市场价值后启动。
| 项目 | 说明 |
|------|------|
| 工具 | Capacitor(@capacitor/android + @capacitor/ios) |
| 构建工具 | 需引入 Vite(当前无构建工具) |
| 存储替换 | Artifact Storage API → `@capacitor-community/sqlite` 或 localStorage |
| Android | Android Studio 打包 APK/AAB,可上架 Google Play |
| iOS | Xcode(需 Mac)打包 IPA,需 Apple 开发者账号($99/年) |
**存储迁移注意:** 当前 Artifact Storage API 是 Claude 平台专属,独立打包后必须替换,localStorage 备用数据可作为迁移来源。
---
## 账号体系与云同步策略
### 核心决策
产品分三个阶段演进:
| 阶段 | 登录 | 存储 | 目标 |
|------|------|------|------|
| **① 开发调试期** | 免登录 | 本地 | 稳定核心功能,快速迭代 |
| **② 用户增长期** | 可选注册登录 | 本地(默认)/ 服务端(登录后) | 沉淀用户数据,建立留存 |
| **③ 商业化期** | 登录必要 | 服务端 | 开展会员收费功能 |
> 设计原则:先让用户体验到价值,再引导注册沉淀数据,最后以数据和高级功能驱动付费。
### 存储模式对比
| 模式 | 触发条件 | 存储位置 | 跨设备同步 |
|------|---------|---------|-----------|
| 游客模式(默认) | 打开即用 | 本地 SQLite / localStorage | ❌ |
| 登录模式(可选) | 用户主动注册 / 登录 | 服务端 DB + 本地缓存 | ✅ |
### 数据迁移策略(游客 → 登录)
用户注册时,需处理本地已有数据的合并:
```
用户首次登录
├── 服务端无数据 → 直接上传本地数据 ✅ 无冲突
├── 服务端有数据 → 提示用户选择合并策略 ⚠️ 需 UI 设计
│ ├── 以服务端为主(覆盖本地)
│ ├── 以本地为主(覆盖服务端)
│ └── 按节点时间戳合并(推荐)
└── 已登录换设备 → 拉取服务端数据,正常同步 ✅ 无冲突
```
### AI 调用迁移(引入后端时)
当前 AI 调用在**前端直接请求 Anthropic API**,API Key 暴露在客户端。引入后端后需同步迁移:
```
当前(无后端):
客户端 ──→ Anthropic API ⚠️ API Key 暴露
引入后端后:
客户端 ──→ 自有服务端 ──→ Anthropic API ✅ Key 安全,可做用量控制
```
**后端引入时机:** 与账号体系同步实现,无需提前单独做。
### 架构演进路线
```
Phase 2 PWA Phase 3 Capacitor Phase 4+ 账号体系
──────────── ───────────────── ─────────────────
localStorage → 本地 SQLite → 本地 SQLite(游客默认)
↕ 可选登录同步
服务端 DB + 账号 API
AI 调用走服务端代理
```