◀ Previous: Chapter 1 | Next: Chapter 3 ▶


本章以高階視角說明系統之主要架構設計與元件責任分工,涵蓋行動應用程式(App)、後端服務與雲端資源之間的關係,以及各元件在系統中的角色定位。

本章重點在於描述系統的核心組成、跨元件的主要資料流與使用者操作的主流程(happy path),以協助不同角色(App 工程師、後端工程師、設備與系統整合人員)快速理解整體系統運作方式與設計假設。

為避免重複或過早進入實作細節,本章不涵蓋以下內容:

  • BLE 裝置之 GATT/Characteristic 細節與通訊規格
  • API 之逐一 endpoint 定義、request/response schema
  • 資料庫 table schema 與索引設計
  • 各類錯誤處理、例外情境與重試策略

上述細部設計與規格將於後續章節(Component-level Design、Data & Contract Specs、Error Handling & Operational Flows)中分別說明。

Component Diagram

┌────────────────────────────────────────────────────────────────────┐
│                              系統組件圖                              │
│                                                                      │
│  ┌──────────────┐                                                  │
│  │ 健身設備      │◄──── FTMS/BLE                                   │
│  │              │                                                   │
│  └──────────────┘                                                  │
│         ▲                                                            │
│         │                                                            │
│         │                      ┌────────────────────────────┐      │
│         │                      │          App               │      │
│         │                      │                            │      │
│         │                      │  ┌──────────────────────┐ │      │
│         └──────────────────────┼──│  Course Presets      │ │      │
│                                │  │  Interaction         │ │      │
│  ┌──────────────┐              │  │  Settings            │ │      │
│  │ 其他設備      │◄──── BLE    │  └──────────────────────┘ │      │
│  │ (如心率帶)    │              │                            │      │
│  └──────────────┘              │  ┌──────────────────────┐ │      │
│                                │  │        UI            │ │      │
│                                │  └──────────────────────┘ │      │
│                                │                            │      │
│                                │  ┌──────────────────────┐ │      │
│                                │  │  Workout Engine      │ │      │
│                                │  └──────────────────────┘ │      │
│                                │                            │      │
│                                │  ┌──────────────────────┐ │      │
│                                │  │  Local Storage       │ │      │
│                                │  │  Auth                │ │      │
│                                │  └──────────────────────┘ │      │
│                                │                            │      │
│                                │  ┌──────────────────────┐ │      │
│                                │  │  BLE Manager         │ │      │
│                                │  │  Pose Service        │ │      │
│                                │  │  API Client          │ │      │
│                                │  └──────────────────────┘ │      │
│                                └────────┬───────────────────┘      │
│                                         │                          │
│                                         │ HTTPS                    │
│                                         ▼                          │
│                                ┌─────────────────┐                 │
│                                │     Cloud       │                 │
│                                │                 │                 │
│                                │  Python Backend │                 │
│                                │  API            │                 │
│                                │                 │                 │
│                                │  Object Storage │                 │
│                                │                 │                 │
│                                └─────────────────┘                 │
│                                                                      │
└────────────────────────────────────────────────────────────────────┘

本圖為系統之 Component Diagram,說明 App、後端服務與雲端資源之主要元件構成與責任分工。App 端以 Workout Engine 為核心,整合健身設備、相機與使用者操作所產生之事件,並透過 API 與雲端服務互動。本圖僅描述高階結構與元件關係,細部實作與資料規格將於後續章節說明。

Deployment / Cloud Architecture

本區為 Fugu 先暫時列出,實際上仍由城紹規劃決定。

雲端架構概述

  • 後端服務:單體 Python 應用(FastAPI/Flask)
  • 資料庫:PostgreSQL(單一實例)
  • 物件儲存:AWS S3/Azure Blob Storage/Google Cloud Storage
  • CDN:CloudFront/Azure CDN(用於影片串流)
  • 部署環境:單一區域(台灣或亞太)
  • 負載平衡:基本 Load Balancer(AWS ALB/Azure Load Balancer)

影片內容託管策略

  • 儲存:原始 mp4 影片存放於 Object Storage
  • 串流:透過 CDN 加速分發

High-level User Workout Flow

以下為使用者完成一次運動的主要路徑(Happy Path)之序列圖:

User     App      Auth     BLE      Fitness  Workout  Local    Backend  Database
                           Mgr      Device   Engine   Storage  API
  │        │        │        │        │        │        │        │        │
  │─(1)───>│        │        │        │        │        │        │        │
  │ Open   │        │        │        │        │        │        │        │
  │ app    │        │        │        │        │        │        │        │
  │        │─(2)───>│        │        │        │        │        │        │
  │        │ Check  │        │        │        │        │        │        │
  │        │ login  │        │        │        │        │        │        │
  │        │        │        │        │        │        │        │        │
  │        │        └───┐    │        │        │        │        │        │
  │        │        ┌───┘    │        │        │        │        │        │
  │        │        │        │        │        │        │        │        │
  │        │<───────┤        │        │        │        │        │        │
  │        │  No    │        │        │        │        │        │        │
  │        │ session│        │        │        │        │        │        │
  │<───────┤        │        │        │        │        │        │        │
  │ Show   │        │        │        │        │        │        │        │
  │ login  │        │        │        │        │        │        │        │
  │ screen │        │        │        │        │        │        │        │
  │        │        │        │        │        │        │        │        │
  │        │        │─(3)────────────────────────────────────────>│        │
  │        │        │ Token  │        │        │        │        │        │
  │        │        │ valid? │        │        │        │        │        │
  │        │        │        │        │        │        │        │─(4)───>│
  │        │        │        │        │        │        │        │Validate│
  │        │        │        │        │        │        │        │<───────┤
  │        │        │        │        │        │        │        │   OK   │
  │        │        │<────────────────────────────────────────────┤        │
  │        │        │        │        │        │        │       OK│        │
  │        │<─(5)───┤        │        │        │        │        │        │
  │        │ Logged │        │        │        │        │        │        │
  │        │   in   │        │        │        │        │        │        │
  │        │        │        │        │        │        │        │        │
  │        │─(6)────────────>│        │        │        │        │        │
  │        │ Check  │        │        │        │        │        │        │
  │        │  BLE   │        │        │        │        │        │        │
  │        │ perms  │        │        │        │        │        │        │
  │        │        │        │        │        │        │        │        │
  │        │        │        └───┐    │        │        │        │        │
  │        │        │        ┌───┘    │        │        │        │        │
  │        │        │        │ Scan   │        │        │        │        │
  │        │        │        │        │        │        │        │        │
  │        │        │        │─(7)───>│        │        │        │        │
  │        │        │        │Connect │        │        │        │        │
  │        │        │        │─(8)───>│        │        │        │        │
  │        │        │        │Subscribe       │        │        │        │
  │        │        │        │ notify │        │        │        │        │
  │        │        │        │<───────┤        │        │        │        │
  │        │        │        │ Ready  │        │        │        │        │
  │        │<─(9)───────────┤        │        │        │        │        │
  │        │ Device │        │        │        │        │        │        │
  │        │ ready  │        │        │        │        │        │        │
  │        │        │        │        │        │        │        │        │
  │─(10)──>│        │        │        │        │        │        │        │
  │ Start  │        │        │        │        │        │        │        │
  │workout │        │        │        │        │        │        │        │
  │        │─(11)───────────────────────────>│        │        │        │
  │        │        │        │ Start  │        │        │        │        │
  │        │        │        │ session│        │        │        │        │
  │        │        │        │        │<─(12)──┤        │        │        │
  │        │        │        │        │ Start  │        │        │        │
  │        │        │        │        │workout │        │        │        │
  │        │        │        │        │(ctrl)  │        │        │        │
  │        │        │        │        │        │        │        │        │
  │        │        │   ┌───────────────────────────┐   │        │        │
  │        │        │   │ LOOP: During workout      │   │        │        │
  │        │        │   │    │        │        │        │   │        │        │
  │        │        │   │    │        │─(13)──>│        │   │        │        │
  │        │        │   │    │        │ Live   │        │   │        │        │
  │        │        │   │    │        │metrics │        │   │        │        │
  │        │        │   │    │<───────┼────────┤        │   │        │        │
  │        │        │   │    │Metrics │        │        │   │        │        │
  │        │        │   │    │ events │        │        │   │        │        │
  │        │        │   │    │        │        │─(14)──>│   │        │        │
  │        │        │   │    │        │        │ Append │   │        │        │
  │        │        │   │    │        │        │records │   │        │        │
  │        │        │   └───────────────────────────┘   │        │        │
  │        │        │        │        │        │        │        │        │
  │─(15)──>│        │        │        │        │        │        │        │
  │  End   │        │        │        │        │        │        │        │
  │workout │        │        │        │        │        │        │        │
  │        │─(16)───────────────────────────>│        │        │        │
  │        │        │        │  End   │        │        │        │        │
  │        │        │        │ session│        │        │        │        │
  │        │        │        │        │<─(17)──┤        │        │        │
  │        │        │        │        │ Stop   │        │        │        │
  │        │        │        │        │workout │        │        │        │
  │        │        │        │        │        │─(18)──>│        │        │
  │        │        │        │        │        │Finalize│        │        │
  │        │        │        │        │        │summary │        │        │
  │        │        │        │        │        │        │        │        │
  │        │        │        │        │        │─(19)───────────>│        │
  │        │        │        │        │        │ Upload │        │        │
  │        │        │        │        │        │summary │        │        │
  │        │        │        │        │        │ and    │        │        │
  │        │        │        │        │        │metrics │        │        │
  │        │        │        │        │        │        │        │─(20)──>│
  │        │        │        │        │        │        │        │Persist │
  │        │        │        │        │        │        │        │<───────┤
  │        │        │        │        │        │        │        │ Stored │
  │        │        │        │        │        │<─(21)──────────┤        │
  │        │        │        │        │        │ Upload │        │        │
  │        │        │        │        │        │success │        │        │
  │        │<─(22)──────────────────────────┤        │        │        │
  │        │  Show  │        │        │        │        │        │        │
  │        │workout │        │        │        │        │        │        │
  │        │ result │        │        │        │        │        │        │
  │        │        │        │        │        │        │        │        │

流程說明

此流程描述使用者完成一次運動的主要路徑:App 啟動後先確認登入狀態,必要時透過後端 API 驗證或更新憑證。使用者開始運動後,Workout Engine 建立 session 並透過 BLE Manager 連接健身設備、訂閱即時數據通知;運動過程中接收的 metrics 事件會持續寫入本機儲存。運動結束時,Workout Engine 完成本次 session 的摘要資料,並將 summary 與 metrics 上傳至後端,由後端寫入資料庫,最後 App 顯示運動結果與摘要資訊。


◀ Previous: Chapter 1 | Next: Chapter 3 ▶