咻揪趣 MVP · v0.19.0
架構規劃 · 文件 完整架構藍圖與進度 · 產生於 2026-09-22 15:45

完整架構藍圖與進度

版本:v0.13.0 · 更新:2026-09-21 · 上線部署依使用者指示延後處理

一句話結論: 「完整架構」不是一件事,是四層;其中三層可以在這台機器上做完並驗證,第四層(原生 App)做不到——需要 Xcode/Android SDK 與開發者帳號。目前已完成 L1 平台底層L2 的 T2–T5(KOL 公開頁、相簿、即時協作、站內通知)。

1. 四層架構與現況

L1
平台底層 完成
可追溯的資料庫遷移框架、真正的帳號系統(scrypt + session)、地圖角色權限(owner/editor/viewer)、地圖可見性(private/link/public)、API 版本化(/api/v1)。
L2
產品功能層 T2–T5 完成
核心流程、雷達、夜間、PWA 分享之外,本輪新增:KOL 公開頁與一鍵匯入(T2)、照片相簿(T3)、SSE 即時協作(T4)、站內通知(T5)。待做:跨地圖搜尋、多日行程排程、行程匯出格式。
L3
商業層 待做(含外部依賴)
導購串接可先做 adapter 並用替身服務驗證;訂閱收款需要你的金流帳號才能真的跑。
L4
原生層 本機無法完成
iOS/Android App 與原生分享面板需要 macOS + Xcode 與 Android 開發者帳號——這台 Windows 主機無法建置與驗證,是唯一的硬阻擋。

2. L1 平台底層(v0.12.0)

Schema 版本
v3
版本化遷移,可追溯
自動化檢查
147 項
七套全綠
帳號權限測試
38 / 38
含角色與隱私邊界
阻斷級缺陷
0
preflight 判定
交付項內容怎麼驗的
版本化遷移schema_migrations 表+遞增版本;已套用者永不修改最高版本 = 遷移定義數;npm run wipe 清空資料後 schema 仍在
帳號系統註冊/登入/登出//auth/me;scrypt(N=16384);session token 只存 SHA-256 雜湊弱密碼 400、重複 Email 409、回應不含雜湊、資料庫內為 scrypt$…
登入安全連續失敗 10 次鎖定 10 分鐘門檻後回 429;鎖定期間連正確密碼也被擋
權限模型owner/editor/viewer × private/link/public,API 層強制檢查viewer 新增 403、editor 201、非成員讀取/改設定 403
隱私邊界公開連結頁對非成員隱藏評價;成員名單不含 Email 且僅成員可讀公開頁 notes=[]、非成員讀名單 403
API 版本化/api/v1/* 與舊路徑等價,前端全面改走 v1兩個路徑回應一致
正式模式需登入production 預設不開放訪客(MAPSYNC_ALLOW_GUEST=1 可覆寫)未登入取 bootstrap 回 401;註冊後取得自己的空白地圖

3. L2 產品功能層(T2–T5,v0.13.0)

交付項內容怎麼驗的
T2 KOL 公開頁與一鍵匯入公開連結頁 /api/public/maps/:slug(免登入可讀)、POST /api/maps/import 把別人的圖釘複製進自己的地圖並自動去重3 個地點含 1 個重複 → 匯入 copied=2、skipped=1;再匯一次 0/3;未登入匯入 401
T3 照片上傳與相簿POST /api/pins/:id/photos(PNG/JPEG/WebP)、靜態提供 /uploads/*、刪除照片依檔案簽章驗證(偽造 content-type 被拒 400)、7MB 回 413、非成員 403、照片可取回且 MIME 正確
T4 SSE 即時協作GET /api/maps/:id/stream 依地圖分組推播,保留最近 50 則供重連補送訂閱者 2.6 秒內收到 pin.created;私人地圖非成員訂閱 403;公開連結地圖允許訂閱(與公開頁一致)
T5 站內通知邀請加入、他人新增圖釘/評價都會產生通知;未讀數、單則已讀、全部已讀邀請與新增皆產生通知;已讀後未讀數下降;通知不跨使用者外洩

本輪順手修掉的兩個問題

  • 大檔案上傳直接斷線:超過大小上限時原本會 destroy() 連線,客戶端收到 ECONNRESET 而不是 413。已改為排空後正常回應 413。
  • 照片刪不掉:回傳給前端的照片 id 與實際寫入資料庫的 id 各自生成,導致刪除時找不到。已統一為同一組 id。
  • 前端對應(都可直接用)

  • 公開頁:開 /m/<slug> 會顯示該地圖的地點、標籤與 KOL 推薦語,並提供「一鍵匯入我的地圖」。非成員看不到親友實測。
  • 相簿:圖釘詳情卡可直接上傳照片(PNG/JPEG/WebP,上限 5 MB)並即時顯示。
  • 即時更新:同一張地圖的成員一改動,其他人的畫面會自動更新(不用重新整理),並跳出提示。
  • 通知:「我的」頁有通知卡(未讀數、單則/全部已讀)。
  • 4. 待做清單(依賴關係排序)

    順位項目依賴能否在本機完成並驗證
    T6導購 adapter(Klook/KKday/Inline)需你確認金流與分潤⚠️ 可先做 adapter 並用替身服務驗證
    T7訂閱與付費需金流帳號⚠️ 需外部帳號才能真的收款
    T9跨地圖搜尋、多日行程排程、行程匯出格式✅ 可以
    T10原生 App 與原生分享面板需 macOS/Xcode/Android SDK/開發者帳號❌ 本機無法

    5. 建議的下一步

    選項
    適合的情況
    做 T9(搜尋/多日行程/匯出格式)
    想把單人與多人使用的體驗收得更完整。純本機可完成、可驗證。
    做 T6(導購 adapter)
    想先鋪商業化的路。可先做 adapter 與替身驗證,但真實分潤需你與平台談。
    先停下、等有真人試用
    若尚未有人真的用過,繼續加功能的邊際價值很低——建議先上線(見《上線待辦與協助清單》)再回來排序。
    提醒:功能可以一直加,但決定產品成敗的仍然是有沒有人用。真人回饋的優先序高於功能數量。