昨天完成了共享後端與權限的設計,今天開始把它變成可以接線的程式。我希望未來聚餐或旅行時,每個人都能拿自己的手機加入帳本,不必把所有登記工作交給同一個人。要走到那一步,首先需要讓系統知道使用者是誰,以及這個人是否真的被允許加入這本帳。
今天新增了一個獨立的共享空間,可以從本機版首頁進入。介面延續中性可愛的方向,這次以天空藍、奶油黃與少量薄荷色來區分提示和操作區域。登入、建立帳本、加入邀請和管理成員各有自己的位置,讓使用者依照順序操作,也讓原本的本機記帳功能繼續保留。現在的共享帳本與本機帳本是分開管理的,不會因為打開這個頁面就自動把舊帳目上傳。
身分確認採用電子郵件驗證碼。使用者先填信箱,收到驗證碼後再輸入;只有驗證成功,畫面才會顯示共享帳本。寄送請求成功不等於已經登入,更不等於信件一定抵達收件匣。程式也處理了寄送過於頻繁、驗證失敗、連線失敗與登入過期的情況。這一版的登入只保留在目前頁面的記憶體,重新整理或離開後需要再次驗證,尚未加入自動續期。
共享帳本建立後,擁有者可以產生邀請連結和 QR Code。兩者代表同一份邀請,朋友掃碼或開啟連結後,仍然需要登入並按下確認加入,不會只因為拿到網址就直接看到帳目。QR Code 在自己的裝置上產生,不需要把邀請內容交給第三方圖片服務。邀請預設二十四小時有效,最多讓十位新成員加入,也可以提前撤銷。
邀請背後保存的不是原始邀請碼,而是它的雜湊值。資料庫會檢查連結是否過期、是否撤銷、名額是否已滿,再決定能不能加入。同一位有效成員重複操作不會多建立一個身分,也不會再消耗一次名額;被移除的成員不能靠舊邀請重新取得權限。這些規則都放在資料庫端,不只是把畫面上的按鈕藏起來。
今天也把避免重複送出的機制寫進去了。每次修改帶有請求識別碼,若網路中斷後重試相同內容,伺服器會回傳原本的結果,避免多開一本帳或重複加入。管理邀請時也會檢查帳本版本;如果朋友已經加入而使帳本更新,舊畫面的操作會收到提示,必須重新整理後再繼續。這一版仍採手動重新整理,還沒有即時同步。
測試方面,今天通過了十五項連線與登入狀態測試、二十項嵌入式 PostgreSQL 資料庫測試,以及九項共享畫面的模擬操作測試。我也重新跑了原本十九項本機操作流程,確認新增入口沒有破壞既有記帳與備份流程。本次合計六十三項檢查通過,其中資料庫測試實際執行了 SQL 與 RLS,包含陌生人讀不到帳本、成員不能發邀請、撤銷或到期後不能加入,以及移除後立即失去讀取權限。
不過,這些測試仍有清楚的界線。資料庫測試使用替代的登入身分來源,並不是在 Supabase 上完成真實登入;模擬畫面也不能代替手機操作或 QR Code 掃描。現在還沒有填入實際 Supabase 專案的公開連線設定,也尚未配置寄信服務,所以共享頁會顯示尚未設定並停用雲端操作,不會假裝已經登入或成功邀請朋友。真正的收信、跨裝置加入、多人同時搶最後名額與瀏覽器畫面驗收都還需要補上。
現在可以查看的成果,是原本可用的本機分帳工具,加上今天新增的共享入口與待接線流程。本機版仍能建立多本帳本、記錄支出、平均或自訂分攤、查看誰要付給誰,並進行備份與還原。共享支出、各自提交分攤和現金找零還沒有接上,因此不能把今天的成果當成整套多人分帳已經完成。
今天的收穫是,邀請朋友加入並不只是做一個分享按鈕,而是要把身分、權限、有效期限和重複操作一起考慮。Day 20 的程式、資料庫 migration、測試與接線說明已經完成,文章也整理成紀錄;雲端接線與真實驗收仍待完成。下一步先用實際開發專案把這條加入流程跑通,再開始接上共同帳目與同步功能。