專案介紹
香譜是一款香水收藏與試香紀錄工具。去專櫃試了好幾支,隔週就忘了哪支喜歡;收藏越來越多,每天出門前也不知道該噴哪一支。香譜把試香感想、收藏檔案跟每日使用紀錄放在一起,讓這些紀錄反過來幫你挑今天的香水。
整個服務跑在 Cloudflare Workers 上,搭配 D1、R2、KV 跟 Durable Objects,可以安裝成 PWA,在沒有網路的專櫃也能先記下來,回到線上再自動同步。
核心功能
技術架構
前端
以 Hono JSX 產生頁面外殼,互動區塊用 React 19 islands 掛載,搭配 Tailwind CSS v4、Base UI 跟 Framer Motion 處理抽屜、分頁等手機原生感的操作。
後端
執行於 Cloudflare Workers,D1 是資料跟版本的基準,R2 存放香水圖片,KV 只快取可丟棄的讀取結果,key 包含會員跟 D1 版本,資料更新後自然失效。
認證系統
使用 WorkOS AuthKit 登入,Worker 處理 PKCE、callback 跟 Session 更新。密封後的 Session 放在 HttpOnly Cookie,HTTPS 環境使用 __Host- 前綴,瀏覽器只拿得到會員基本資料。
離線同步
IndexedDB 保存資料快照跟離線操作佇列(outbox),恢復連線後依序送出。Durable Objects 透過 WebSocket 通知同一會員的其他裝置重新讀取 D1,前景每五分鐘再補查一次版本。
資料隔離跟共用目錄
會員資料各自隔離
評分、心得、使用跟購買紀錄都屬於個人。所有私人查詢都經過同一個資料存取層,從已驗證的會員身分產生查詢範圍;資料庫 triggers 再檢查跨表關聯的擁有者,私人 API、頁面跟圖片也不進共享快取。
共用目錄需經審核
找不到的香水只要填品牌跟名稱,就能先建立自己的紀錄,同時提出收錄申請。管理員逐欄核實來源跟使用範圍後才會公開;審核通過會自動連結共用資料,個人的評價、紀錄跟私人圖片都保留。
不批次爬取
來源整理預設不啟用任何網站,需要先記錄網域的讀取依據,再逐筆讀取產品頁的結構化資料。只保存待核實的欄位建議,不複製圖片、介紹文案或評論。
推薦機制
推薦不呼叫生成式 AI,而是用規則計算:個人偏好標籤、評分、適合的場合跟天氣、近期使用紀錄,再加上選填的即時天氣(體感溫度、濕度、降雨機率)。每一支推薦都會附上理由,例如「偏熱友善:清新,個人天氣:多雲」,讓你知道它為什麼被選出來。






