把前面10课的知识串起来,用一个完整的场景走一遍整个系统的运转过程。

第11课:完整实战串讲 —— 从零理解整个系统

本课目标

把前面10课的知识串起来,用一个完整的场景走一遍整个系统的运转过程。


场景:开了一天会,回来处理邮件

假设你开了一天会,收件箱堆了 30 封邮件。让我们看看这个系统怎么帮你。


阶段一:系统启动

你执行 bun run dev,以下事情依次发生:

code
1. Bun 服务器启动 (server/server.ts)
   └─ 监听 http://localhost:3000

2. IMAP Manager 连接 Gmail (database/imap-manager.ts)
   └─ 登录成功,进入 INBOX

3. Email Sync 初始同步 (database/email-sync.ts)
   └─ 拉取最新 50 封邮件 → 解析 → 存入 SQLite

4. Listeners Manager 加载监听器 (ccsdk/listeners-manager.ts)
   └─ 加载 finance-email-tracker ✅
   └─ 加载 todo-extractor ✅

5. Actions Manager 加载操作模板 (ccsdk/actions-manager.ts)
   └─ 加载 archive-old-newsletters ✅
   └─ 加载 forward-bugs-to-engineering ✅
   └─ 加载 add-expense / add-income ✅

6. UI State Manager 加载数据 (ccsdk/ui-state-manager.ts)
   └─ 加载 financial-dashboard 数据
   └─ 加载 task-board 数据

7. Component Manager 注册组件 (ccsdk/component-manager.ts)
   └─ 注册 FinancialDashboard 组件
   └─ 注册 TaskBoard 组件

8. WebSocket 服务就绪
   └─ 等待浏览器连接

9. IMAP IDLE 模式开启
   └─ 等待新邮件推送

阶段二:邮件同步 + 自动处理

在你打开浏览器之前,后台已经在干活了。

30 封新邮件中的每一封都会触发 Listener 检查:

code
邮件 1: "Weekly Newsletter from TechCrunch"
  → finance-email-tracker: "invoice"关键词? ❌ 跳过
  → todo-extractor: 来自 techcrunch.com? ❌ 不是工作邮件,跳过

邮件 2: "Invoice #789 from Slack - $25/month"
  → finance-email-tracker: "invoice"关键词? ✅
    → callAgent() → { is_financial: true, type: "subscription", amount: 25, vendor: "Slack" }
    → 更新 financial-dashboard ✅
    → 贴标签 "Finance" ✅
    → 通知: "💰 检测到订阅: $25 - Slack"
  → todo-extractor: 来自 slack.com? ❌ 跳过

邮件 3: "Action Required: Review Q4 Budget" from boss@company.com
  → finance-email-tracker: "budget"不在关键词里? ❌ 跳过
  → todo-extractor: 来自 company.com? ✅
    → callAgent() → { has_todos: true, todos: [
        { title: "审核Q4预算报告", priority: "high", deadline: "2026-03-01" }
    ]}
    → 更新 task-board ✅
    → 通知: "📋 从"Action Required..."中提取了1个待办"

... 依此类推处理剩余 27 封邮件 ...

你还没打开浏览器,系统已经帮你: - 识别了 4 封财务邮件,记录到看板 - 从 3 封工作邮件中提取了 5 个待办事项 - 给相关邮件贴了标签


阶段三:打开浏览器

你访问 http://localhost:3000

code
1. React 应用加载
2. WebSocket 连接建立
3. 请求收件箱数据 → GET /api/emails/inbox → 显示 30 封邮件
4. 请求 UI State → GET /api/ui-state/financial-dashboard → 渲染看板
5. 请求监听器列表 → GET /api/listeners → 显示活跃监听器

你立刻看到: - 收件箱里 30 封邮件,部分已被自动贴了 "Finance" 标签 - 财务看板已经有 4 笔交易记录 - 任务看板有 5 个待办事项


阶段四:跟 AI 聊天处理邮件

对话1:快速了解情况

code
你: 帮我总结一下今天的邮件,有什么重要的?

AI: 今天共收到 30 封邮件,我来按重要性分类:

   🔴 紧急(3封):
   1. boss@company.com - "Action Required: Review Q4 Budget"
   2. client@bigcorp.com - "Contract Renewal Deadline Tomorrow"
   3. ops@company.com - "Production Alert: Server Disk 95% Full"

   💰 财务(4封): Slack订阅、AWS账单、GitHub订阅、Notion账单
   📋 已提取5个待办到任务看板

   📨 其他: 15封订阅邮件、8封普通工作邮件

对话2:处理紧急邮件

code
你: 打开那封关于服务器磁盘的邮件

AI: [调用 email_read 工具]

   来自: ops@company.com
   主题: Production Alert: Server Disk 95% Full
   内容: 生产服务器 prod-web-03 磁盘使用率达到 95%...
         建议立即清理日志文件或扩容...

你: 把这个转发给工程团队

AI: 我已准备好转发内容,包含 AI 分析摘要。

   [🔘 转发告警给工程团队]  ← Action 按钮

你: [点击按钮]

   → forward-bugs-to-engineering handler 执行
   → callAgent() 分析告警内容,生成摘要
   → 发送转发邮件
   → "✅ 已转发给 engineering@company.com"

对话3:批量清理

code
你: 把那些过期的订阅邮件清理掉

AI: 我找到了 15 封超过 7 天的订阅/营销类邮件。

   [🔘 归档 15 封过期订阅邮件]

你: [点击]

   → archive-old-newsletters handler 执行
   → 批量归档 15 封邮件
   → "✅ 已归档 15 封邮件"
   → 收件箱实时刷新(少了15封)

阶段五:实时处理新邮件

你正在聊天时,一封新邮件到达:

code
📧 新邮件: "Payment Received: $3,000 from BigCorp"

后台静默处理:
  → IMAP IDLE 检测到新邮件
  → Email Sync 拉取并存入数据库
  → Listener 触发:
    → finance-email-tracker: "payment" ✅
      → AI 分析: { type: "income", amount: 3000, vendor: "BigCorp" }
      → 更新 financial-dashboard
      → 贴标签 "Finance"

前端实时更新:
  → 收件箱多了一封新邮件
  → 财务看板多了一笔 +$3,000 收入
  → 弹出通知: "💰 检测到收入: $3,000 - BigCorp"

你在浏览器里实时看到这一切发生,不需要刷新页面。


数据流总图

graph TD subgraph Browser["你的浏览器"] B1["收件箱"] B2["聊天"] B3["财务看板<br>4笔+$3000"] B4["任务看板<br>5个待办"] end subgraph Server["Bun 后端服务器"] S1["Claude SDK<br>(AI 对话)"] S2["Listeners<br>(自动处理)"] S3["Actions<br>(一键操作)"] S4["UI State Manager<br>(数据读写 + WebSocket 广播)"] S5["SQLite 数据库<br>emails | recipients | attachments | ui_states"] S6["IMAP Manager<br>(连接 Gmail, IDLE 实时监听)"] S1 --> S4 S2 --> S4 S3 --> S4 S4 --> S5 S5 --> S6 end Browser -->|"WebSocket 双向通道"| Server S6 --> G["Gmail 服务器"]

关键设计模式回顾

学完11课,你应该理解这些设计模式:

模式 体现在哪 核心思想
递归 AI Listener/Action 里的 callAgent() 代码控制流程,AI 做判断
事件驱动 Listener 监听邮件事件 有事才干活,没事不消耗
实时推送 WebSocket 广播 数据变了立刻通知前端
关注点分离 UI State / Component / Manager 存储、逻辑、展示各管各的
热重载 文件监听 + 自动加载 改代码不用重启
渐进式过滤 先关键词后AI 省钱:90%的邮件不需要调AI
审计日志 JSONL 日志 AI 做了什么,都有记录

沿着当前专题继续,或返回课程目录重新整理阅读顺序。

返回课程目录