#system-design

presentation — PySide6 main window · graph delegate · MD3 theme tokens application commands / queries(薄薄一層 use-case) domain entities(純資料類) ports(Protocol 介面) 零框架依賴 infrastructure pygit2 composite 十個 ops mixin: branch / commit / diff / stage merge-rebase / stash / tag remote / submodule / worktree + subprocess(git apply) 實作 ports 依賴指向內圈:presentation → application → domain ← infrastructure

GitCrisp:我和 AI 一起寫了一個 Git 桌面客戶端

· tech · 約 6 分鐘

GitCrisp 是一個桌面版的 Git 客戶端:視覺化 commit graph、逐 hunk staging、互動式 rebase、衝突解決介面、多倉庫管理,Python + PySide6(Qt…

#side-project#system-design#ai

手機 A localStorage 手機 B localStorage 電腦 C localStorage Apps Script /exec doGet / doPost LockService:鎖內合併 Google 試算表 trips 表(JSON) 明細分頁(唯讀鏡像) 同一組行程代碼 同步循環:① GET 拉雲端 → ② 本機合併 → ③ POST 推回 → ④ 伺服器鎖內再合併,回傳權威版本

旅遊分帳:把 Google Sheet 當後端,寫一個不會把帳弄丟的分帳工具

· tech · 約 6 分鐘

每次跟朋友出國,分帳都是同一個劇本:有人先墊機票、有人刷了租車、晚餐又是另一個人付——回國後對著一堆收據算「誰欠誰多少」,算到懷疑人生。市面上的分帳 App 不是要每個人都註冊帳號,就是要大家都裝同一…

#side-project#system-design#distributed-systems

站 1:單機 + tenant_id 每張表帶 tenant_id・複合索引打頭 多數 SaaS 的終點站 往下一站的觸發:連線數、資料量、 噪音鄰居——不是「感覺該分散了」 站 2:讀寫分離 replica 吃報表・商城讀流量 寫入仍單點,這站買的是時間 觸發:讀流量壓過寫、報表打擾交易 站 3:Pool + Silo 混合 小商家共居 pool shard・大主播獨立 DB 噪音鄰居的 DB 層解法=企業版分層 per-tenant 備份還原=silo 殺手優點 升艙搬家:單商家停機匯出匯入, 只影響他自己,約在深夜搬 站 4:真分片 Citus 類 shard by tenant_id / NewSQL pool 本身要水平擴的那天才需要 誠實地說: 多數直播代購 SaaS 到不了這站 每一站都有觸發條件——沒被觸發,就留在原站;演進是回應,不是興趣

平行世界:如果變成 SaaS

· tech · 約 11 分鐘 · 📚 Re:從零開始做直播代購電商平台 #20

先交代一件前面十九章都沒說的事:當年我們每一個人,都是降薪進來的。降薪換的是一個承諾——現在做的直播代購平台只是第一站,真正要造的是一艘 SaaS 大船:把整套系統賣給每一個想做直播代購的商家。 船,…

#war-story#live-commerce#system-design

直播現場 助理看直播截圖 貼進 dialog、確認 前端:優化 切正方形・轉 webp 為了體驗與頻寬 後端:保證 一律重編碼+thumbnail 原始 bytes 不落地 GCS 原圖+縮圖 兩檔 轉檔即驗證:解不開的檔,轉檔自己失敗 image_metadata:path・content type・object id DB 存 path(事實);API 回應時解出 URL(派生)——實際供圖走 GCS 掛 CDN 前端的處理是優化,後端的處理是保證

上傳容易,刪除難:圖片與資源的生命週期

· tech · 約 9 分鐘 · 📚 Re:從零開始做直播代購電商平台 #17

這章插一個看起來最不起眼的題目:商品圖。「不就是上傳檔案嗎」——這章會用一半的篇幅講上傳,另一半講一件難得多的事:刪除。上傳只要一個下午就能做完;刪除,是一輩子的事。 先看這條管線的真實使用場景,因為…

#war-story#live-commerce#system-design

佔庫存購物車(直播) 可橫跨多個檔期/實況主 不佔庫存購物車(商城) 同一張 cart item 表,來源多型 合併結帳 orders payment —— 付錢的單位 跨檔期一次付清・聚合第三方付款事實(下一章) order(檔期 A) 履約單位・檔期優惠記這層 order(檔期 B) 按檔期切 order(檔期 C) 跟著各自的出貨節奏 order item —— 會計單位:成交時定格金額,發票/退款以它為準

購物車到訂單:被主播拔掉的狀態機

· tech · 約 8 分鐘 · 📚 Re:從零開始做直播代購電商平台 #6

交易主線的最後一站:單怎麼從購物車走到訂單。留言進了購物車、身分掛好了單、庫存卡住了不變量——這章把它們聚合成一筆可以付錢、可以出貨、可以開發票的東西。標題不是比喻:這個系統裡真的有一台狀態機,被主播…

#war-story#live-commerce#system-design

同步・毫秒級 Django API 請求進、回應出 購物車・結帳・會員 即時・推送 WebSocket 客人留言 → 即時推給 主播 dashboard 非同步・秒~分 RabbitMQ(管道) Celery workers 抓留言・FSM 下單・開發票 寄 email・匯出訂單 PostgreSQL 唯一的事實:訂單・庫存・會員 Redis 速度:banned user 快速判斷 三種時間尺度各請一位專家,底下一份事實、一份速度

起手式:五個元件與一條 CI/CD

· tech · 約 6 分鐘 · 📚 Re:從零開始做直播代購電商平台 #2

全景鋪完,講留言、庫存那些戰役之前,先把當年的武器庫攤開——因為後面每一章的取捨,都是在這套技術棧的邊界裡做的。團隊很小:3 個後端、3 個前端,偶爾發包給外包 1–2 位工程師。武器庫也很樸素:Po…

#war-story#system-design#django

留言進來 FB / IG / 自建 統一留言事件 每源一個 adapter 解析 key+n 同人重複取最後一筆 身分 identity 沒帳號也要能掛單 佔庫存購物車 庫存 −n・不能超賣 結帳 兩種購物車合併 第三方金流 webhook・冪等 出貨前處理 合併出貨・交物流 逾期未付 → 釋放庫存 每一站都是系列的一章:留言接入、身分、庫存、購物車、金流、出貨前處理

全景:留言下單的一筆訂單,會經過哪些系統

· tech · 約 6 分鐘 · 📚 Re:從零開始做直播代購電商平台 #1

這是一個新系列,也是這個部落格第一個戰爭故事。我在前公司實際做過一個直播代購電商平台——使用者看直播、在留言區打字下單,後面接著庫存、金流、物流一整條鏈。這系列不是回憶錄:我想帶著現在的功力(DDIA…

#war-story#live-commerce#system-design