Skip to content

架构与技术栈

深入理解 TodoHeap 的系统架构与技术选择。


系统架构

三层架构

┌─────────────────────────────────────┐
│         前端层 (Presentation)        │
│    Vue 3 + Vite + TailwindCSS       │
│  ├─ UI 组件                         │
│  ├─ 状态管理 (Pinia)               │
│  ├─ 路由 (Vue Router)              │
│  └─ 本地存储 (IndexedDB)           │
└─────────────────────────────────────┘
          ↕ HTTP / WebSocket
┌─────────────────────────────────────┐
│       后端计算层 (Compute)          │
│  Supabase Edge Functions (Deno)    │
│  ├─ AI 调用与处理                   │
│  ├─ 业务逻辑                        │
│  ├─ 数据验证与转换                  │
│  └─ 权限检查 (JWT)                  │
└─────────────────────────────────────┘
          ↕ PostgreSQL Wire
┌─────────────────────────────────────┐
│       数据存储层 (Data)             │
│  Supabase PostgreSQL                │
│  ├─ todos 表                        │
│  ├─ user_settings 表                │
│  ├─ 权限政策 (RLS)                  │
│  └─ 实时同步 (Realtime)            │
└─────────────────────────────────────┘

数据流

用户操作 (UI)
    ↓ 本地验证
    ↓ Pinia 状态更新
    ↓ 乐观更新 UI
    ↓ 异步请求后端
    ↓ Edge Function 处理
    ↓ 数据库更新
    ↓ Realtime 推送更新
    ↓ 前端 Store 同步
    ↓ UI 重新渲染

前端架构

技术栈

组件技术用途
框架Vue 3响应式 UI 框架
构建Vite 7.2+极速开发服务、优化打包
路由Vue Router 4SPA 路由管理
状态管理Pinia 3.0+全局状态 (Composition 风格)
样式TailwindCSS 4.1+原子 CSS 框架
UI 组件库shadcn-vue精美组件库
编辑器Milkdown 7.17+Markdown 编辑
可视化simple-mind-map思维导图
日期选择vue-datepicker-next日期时间选择
HTTP 客户端Supabase JS SDKAPI 调用
本地存储IndexedDB离线数据存储

项目结构

frontend/src/
├── components/
│   ├── AITaskInput.vue          # AI 输入组件
│   ├── BreakdownStatusCard.vue  # 分解状态卡片
│   ├── TodoListItem.vue         # 任务条目
│   ├── TodoDetailEditor.vue     # 详情编辑器
│   ├── MindMapWrapper.vue       # 思维导图包装器
│   ├── LeftSidebar.vue          # 左侧边栏
│   └── SyncStatusIndicator.vue  # 同步状态指示

├── pages/
│   ├── Home.vue                 # 首页
│   ├── Login.vue                # 登录页
│   ├── Todo.vue                 # 主任务页
│   ├── ResetPassword.vue        # 重置密码
│   ├── 404.vue                  # 404 页
│   └── todo/
│       ├── TodoList.vue         # 列表视图
│       ├── TodoTree.vue         # 树视图
│       ├── TodoHeap.vue         # 堆视图
│       ├── Trash.vue            # 垃圾箱
│       └── Settings.vue         # 设置页

├── stores/
│   ├── auth.ts                  # 认证状态
│   ├── todos.js                 # 任务主状态
│   ├── todos.optimistic.js      # 乐观更新逻辑
│   ├── todos.realtime.js        # Realtime 同步
│   ├── todos.rollback.js        # 回滚处理
│   ├── todos.breakdown.js       # 分解状态
│   ├── syncQueue.js             # 同步队列管理
│   └── *.test.js                # 单元测试

├── lib/
│   ├── supabase.ts              # Supabase 初始化
│   └── userSettings.js          # 用户设置 API

├── utils/
│   ├── detailPanelContext.js    # 详情面板上下文
│   ├── handleAuthCallback.ts    # 认证回调处理
│   └── priorityCalculator.js    # 优先级计算器

├── router/
│   └── index.ts                 # 路由配置

├── App.vue                       # 根组件
├── main.ts                       # 应用入口
├── style.css                     # 全局样式
└── shims-vue.d.ts               # Vue 类型声明

状态管理 (Pinia)

核心状态模块:

模块职责
auth用户认证状态、登录登出
todos任务列表、垃圾箱、详情
todos.optimistic乐观更新、本地修改
todos.realtimeRealtime 监听、实时同步
todos.rollback失败回滚、状态恢复
todos.breakdownAI 分解进度、子任务
syncQueue同步队列、离线操作缓存

关键特性

乐观更新

操作立即反映在 UI 中,同时后台上传:

javascript
// 用户删除任务
deleteTodo(id)
  ├─ UI 立即移出任务
  ├─ 加入同步队列
  ├─ 异步发送删除请求
  └─ 成功 ✓ / 失败 → 回滚

离线支持

网络中断时操作暂存本地,网络恢复后自动同步:

javascript
网络中断 → 切换到离线模式
  ├─ 所有改动保存在 IndexedDB
  ├─ 同步队列持久化
  └─ UI 提示离线状态

网络恢复 → 自动同步
  ├─ 读取队列中的操作
  ├─ 按序上传
  └─ 冲突检测与合并

实时同步 (Realtime)

多个客户端间实时同步数据:

javascript
用户 A 修改任务 → Supabase Realtime

用户 B 客户端立即收到更新

自动更新本地状态与 UI

后端架构

Edge Functions

为什么用 Edge Functions?

  • 无需管理服务器
  • 自动扩展
  • 接近用户地理位置(低延迟)
  • 与数据库紧密集成
  • 支持 Deno(现代化、安全、快速)

Edge Function 三大功能

1. breakdown_task - 任务分解

请求:
  ├─ todosTree: 完整任务树
  ├─ selectedNodeId: 要分解的任务 ID
  └─ query: 分解指令(可选)

处理流程:
  ├─ 构建 Prompt(任务上下文 + 用户指令)
  ├─ 调用 AI 大模型
  ├─ 流式解析响应
  └─ 即时返回子任务

响应:
  ├─ SSE 流式数据
  ├─ 每个子任务单独推送
  └─ done 事件表示完成

2. analyze_task_create - 任务分析与入库

请求:
  ├─ query: 任务描述
  └─ parentId: 父任务 ID(可选)

处理流程:
  ├─ 使用 Tool Calling 让 AI 直接生成任务
  ├─ AI 调用 create_todo 工具
  ├─ 直接在 Function 中执行数据库插入
  └─ 返回创建结果

响应:
  ├─ { success, createdCount, tasks }
  └─ 任务立即入库可用

3. optimize_tasks - 任务优化

请求:
  ├─ todos: 所有待优化任务
  └─ strategy: 优化策略(日期重排/优先级调整)

处理流程:
  ├─ AI 分析任务间依赖关系
  ├─ 根据难度、截止日期计算最优顺序
  ├─ 生成优化方案
  └─ 返回新的优先级分配

响应:
  ├─ { success, optimizedTodos }
  └─ 前端更新所有任务优先级

技术栈

组件技术用途
运行时Deno 2.0+安全、现代的 JavaScript 运行时
语言TypeScript类型安全的开发体验
框架无(标准库)极轻量化
AIOpenAI API调用大模型
认证JWT验证用户身份
日志标准输出Supabase 自动收集

Edge Function 项目结构

supabase/functions/
├── _shared/
│   └── cors.ts          # 跨域配置

├── breakdown_task/
│   ├── index.ts         # 任务分解主逻辑
│   └── deno.json        # Deno 配置(导入、权限)

├── analyze_task_create/
│   ├── index.ts         # 任务分析与创建
│   └── deno.json

└── optimize_tasks/
    ├── index.ts         # 任务优化
    └── deno.json

数据存储架构

数据库设计

todos 表

sql
CREATE TABLE todos (
  id BIGINT PRIMARY KEY,
  user_id UUID REFERENCES users(id),
  title TEXT NOT NULL,
  status TEXT DEFAULT 'todo',      -- todo | doing | done | deleted
  priority INT DEFAULT 1,           -- 0:低 | 1:中 | 2:高
  difficulty INT,                  -- 简单|中等|困难
  deadline TIMESTAMP,
  parent_id BIGINT REFERENCES todos(id),
  created_at TIMESTAMP,
  updated_at TIMESTAMP,
  deleted_at TIMESTAMP,
  description TEXT
);

user_settings 表

sql
CREATE TABLE user_settings (
  id UUID PRIMARY KEY,
  user_id UUID REFERENCES users(id),
  theme TEXT DEFAULT 'system',     -- light | dark | system
  language TEXT DEFAULT 'zh',
  created_at TIMESTAMP,
  updated_at TIMESTAMP
);

行级安全 (RLS)

所有表启用 RLS,确保用户只能访问自己的数据:

sql
-- todos 表 RLS 策略
ALTER TABLE todos ENABLE ROW LEVEL SECURITY;

CREATE POLICY "Users can see own todos"
  ON todos
  FOR SELECT
  USING (auth.uid() = user_id);

CREATE POLICY "Users can create own todos"
  ON todos
  FOR INSERT
  WITH CHECK (auth.uid() = user_id);

Realtime 配置

启用 Realtime 以支持多设备实时同步:

sql
ALTER PUBLICATION supabase_realtime ADD TABLE todos;

前端监听:

javascript
// 监听任务表变更
const channel = supabase
  .channel('todos')
  .on(
    'postgres_changes',
    { event: '*', schema: 'public', table: 'todos' },
    (payload) => {
      // 处理变更
      updateLocalState(payload);
    }
  )
  .subscribe();

数据流示意

创建任务流程

用户输入 → 前端验证 → Pinia 更新 → UI 渲染
                      ↓ 异步
                  后端接收

                  数据库保存

                  Realtime 推送

                  其他客户端更新

AI 分解流程

用户选择任务 → 前端构建请求

Edge Function 接收

构建 AI Prompt

调用 AI API
  ↓ SSE 流式返回
前端解析并渲染

用户确认

提交创建请求

数据库保存

需求概览(已合并)

下面为原 02.需求文档.md 的核心要点,已并入本页面以便集中维护:

开发指导原则

实现顺序:功能优先 → 安全其次 → 性能最后

  1. 功能优先:先实现可以工作的最直接方案
  2. 安全其次:完成功能后补充错误处理与安全控制
  3. 性能最后:根据用户反馈再优化性能

功能需求要点

  • 支持多级子任务(父子层级)
  • 基础 CRUD:创建、编辑、删除任务
  • 支持截止日期、优先级与难度字段
  • 三大 AI 能力:
    • AI 任务输入(自然语言)
    • AI 任务分解(细化到子任务/日程)
    • AI 任务优化(优先级与日期调整)

附加与体验功能

  • 任务堆视图(优先级驱动)
  • 任务进度管理与报告
  • 思维导图式的任务管理视图

典型使用案例

  • 日常任务管理:用户输入目标,系统分解为执行步骤
  • 学习计划场景:按难度与天数拆分学习任务
  • 全局优化场景:对用户全部任务进行优先级/日期重排

(原需求文档已合并,故 02.需求文档.md 将被移除)


关键设计决策

决策选择原因
前端框架Vue 3易学、高效、中文社区大
构建工具Vite极速开发体验、原生 ESM 支持
状态管理Pinia比 Vuex 简洁、Composition API 友好
样式方案TailwindCSS快速开发、一致设计、文件体积小
后端计算Edge Functions无服务器、自动扩展、低成本
运行时Deno类型安全、快速、安全隔离
数据库PostgreSQL功能完整、可靠性高、RLS 支持
认证Supabase Auth开箱即用、多策略支持
实时同步WebSocket低延迟、双向通信

性能考虑

前端优化

  • ✅ 代码分割:按路由和功能分割
  • ✅ 懒加载:组件、库按需加载
  • ✅ 缓存:IndexedDB 离线缓存
  • ✅ 虚拟滚动:大列表性能优化

后端优化

  • ✅ 连接池:数据库连接复用
  • ✅ 查询优化:合理使用索引
  • ✅ 缓存层:边缘节点地理分布

数据库优化

  • ✅ 索引:user_id、deadline 等关键字段
  • ✅ 分区:考虑按用户或日期分区
  • ✅ 查询分析:定期检查慢查询

下一步

理解了架构后:

  1. 阅读本页的 需求概览(已合并) 部分以了解功能需求
  2. 阅读 开发流程与任务 学习参与方式
  3. 深入特定功能的技术文档

文档使用 VuePress 构建