金華APP 網站化開發規格（MVP）

目標：將既有 PDF 流程快速實作為一個行動優先的網站（支援桌機），核心為 GO食清單、共餐活動、發起共餐三大流程。


🧩 模組與頁面
首頁 / 快速清單

顯示公告跑馬燈與活動輪播

六大入口：GO想 / 食 / 學 / 創 / 照 / 個人

GO食

餐廳清單（照片、店名、特色、營業時間、營業狀態、距離、收藏）

搜尋列取代頁面標題

無限捲動載入

點距離可開地圖 App

收藏切換（空心/實心）

底部固定三鍵：共餐活動 / 發起共餐 / 已收藏店家

共餐活動

活動列表（公開/私人/已結束狀態燈號）

顯示地點、人數/投票人數、日期、時間

點活動進入詳情 → 選餐 → 加入共餐

多店活動需先投票 → 若同票，發起人決定最終餐廳

參加中共餐頁：列出使用者已參與活動

發起共餐

選擇餐廳（單店或多店）

設定：公開/私人、日期、時間、投票截止時間、地點、備註

設定餐點（主菜 / 配餐 / 備註）

發起後生成邀請連結（token）

發起人管理頁：票數統計、延長截止、取消共餐、決定最終餐廳（多店同票時）、收單送出 → 匯出名單 PDF/JPEG

📦 資料模型
User(id, name, role)
Restaurant(id, name, tags, photos, hours, status, lat, lng)
Favorite(user_id, restaurant_id)
Event(id, initiator_id, type, visibility, date, time, deadline, place, status, chosen_restaurant_id, invite_token)
EventRestaurant(event_id, restaurant_id)
MealOption(id, restaurant_id, title, main, side, note)
EventVote(event_id, user_id, restaurant_id, meal_option_id)
Participation(event_id, user_id)
Announcement(id, title, body, order, active)
Banner(id, image_url, link_url, order, active)

⚡ API 介面
GET /home                  # 公告、輪播
GET /restaurants           # ?query=&page=
POST /restaurants/:id/favorite
GET /events                # ?type=&status=&page=
GET /events/:id
POST /events/:id/join      # 單店
POST /events/:id/vote      # 多店
GET /me/events
POST /events               # 建立活動
POST /events/:id/meals
GET /events/:id/dashboard
POST /events/:id/finalize
POST /events/:id/extend_deadline
POST /events/:id/cancel
GET /events/:id/invite_link
POST /events/:id/choose_tie
POST /events/:id/lock_and_export

💻 前端互動行為

行動優先（Mobile First）

無限捲動 + 骨架屏

Toast 彈窗：加入/投票/成功（2 秒自動關閉）

收藏圖示即時切換

距離點擊開啟 Google Maps

多語預留（繁中為預設）

📈 優先開發順序（MVP 切分）

GO食（清單 / 搜尋 / 收藏 / 地圖 / 底部 CTA）

共餐活動（單店流程 + 參加中）

共餐活動（多店投票 + 同票決策）

發起共餐（單店 + 多店）+ 管理 / 截止 / 延長 / 取消 / 輸出

首頁 / 快速清單 / 公告輪播

⚠️ 邊界情境

投票截止後禁止操作 → 回 409

私人活動無 token → 回 403

多店未決同票 → 禁止收單送出

已結束活動 → 顯示紅燈、禁止互動

📌 待定決策（Agent 可先硬編）

登入方式：先略過 → 使用 localStorage 模擬帳號

餐點資料：暫由發起人手動輸入

地圖：使用外連 URI

名單 PDF：先用 HTML to PDF 函式庫輸出