--- # System prepended metadata title: 海大餐飲外送系統-需求文件(SRD) --- # 軟體需求文件(SRD) ## 專案資訊 - **專案名稱**:海大餐飲外送系統(Bing2Go) - **撰寫日期**:2025/10/08 - **發展者**:林津瑄、郭浩、劉俊麟、宋辰星、黃俊源 --- ## 版次變更記錄 | 版次 | 變更項目 | 變更日期 | |-----|----------|----------| | 0.1 | 初版 |2025/10/08| | 0.2 | 使用者故事地圖加上會員資料、歷史訂單 | 2025/11/05 | | 0.3 | iteration2 大更新 | 2025/11/12 | | 0.4 | 描述需求用字更加精準 | 2025/12/24 | | 0.5 | 更新操作概念 | 2025/12/24 | --- ## 目錄 1. [接受準則 (Acceptance Criteria)](#接受準則-Acceptance-Criteria-of-this-document) 2. [系統概述 (System Description)](#系統概述-System-Description) 3. [操作概念 (Operational Concepts)](#操作概念-Operational-Concepts) 4. [使用者故事地圖 (User Story Map)](#使用者故事地圖-User-Story-Map) 5. [使用者介面分析 (User Interface Analysis)](#使用者介面分析-User-Interface-Analysis) 6. [功能需求 (Functional Requirements)](#功能需求-Functional-Requirements) 7. [非功能需求 (Non-functional Requirements)](#非功能需求-Non-functional-Requirements) --- ## 接受準則 (Acceptance Criteria of this document) - Clearly and properly stated(需求需清楚且適當的陳述) - Complete(需求需完整) - Consistent with each other(需求之間需維持一致性) - Uniquely identified(每項需求有明確之識別) - Appropriate to implement(需求需可被實作) - Verifiable(需求需可被驗證) --- ## 系統概述 (System Description) - 目標 - 打造一個專屬於海大學生的餐飲外送平台,讓顧客能快速下單,外送員能便捷接單,系統能維護訂單流程完整,確保穩定無錯誤。 - 特色 - 多身分會員機制:同一帳號可切換「顧客」與「外送員」。 - 訂單流程透明:從下單、配對外送員到餐點送達皆可即時追蹤。 - 自動估算功能:依地址自動計算送達時間與外送費。 - 評價系統:提供餐廳評價與餐點評分,提升使用體驗。 - 即時通訊:顧客、外送員可直接溝通。 <!-- - 餐廳分析:提供銷售數據視覺化報表,協助商家經營。 --> - 實作方案 - 開發Responsive Web Design以支援手機/桌面使用 - 前後端合一:Nuxt - UI Framework:Vuetify - 資料庫:MongoDB Atlas - 部署平台:Vercel ```mermaid flowchart TD subgraph Frontend A["Nuxt"] --> B["Vue 3"] A --> C["Vuetify"] A --> D["Pinia"] A --> E["Pages mode (SPA ssr=false)"] C --> F["@mdi/font"] D --> G["@pinia/nuxt module"] end ``` ```mermaid flowchart TD subgraph "Backend(server/)" H["Nitro / Server API routes"] --> I["Mongoose"] H --> J["Auth: jsonwebtoken<br>bcryptjs"] H --> K["Swagger <br>(swagger-jsdoc <br> swagger-ui)"] H --> L["Custom utils + middleware"] end subgraph Database M["MongoDB"] <---> I end ``` ```mermaid flowchart TD subgraph Dev & Tooling N["TypeScript (tsconfig.json)"] O["npm scripts:<br> dev/build/preview"] P["devDependencies:<br> @types/*, tsx"] Q["Alias:<br> @server, @stores, @app"] end ``` ```mermaid flowchart TD Frontend <---> Backend Backend <---> Database Frontend <---> A["Dev & Tooling"] Backend <---> A ``` --- ## 操作概念 (Operational Concepts) ### 情境:0️⃣3️⃣1️⃣點餐 0️⃣3️⃣1️⃣是海大的一名學生,翹掉下午的課在家睡醒後覺得肚子有點餓,決定用最新推出的「海大餐飲外送系統」來訂個晚餐。 1. 註冊系統 0️⃣3️⃣1️⃣點開系統,因為不確定有沒有註冊過,所以直接來註冊個帳號試試,填好暱稱、Email、密碼、按下立即註冊。 ![image](https://hackmd.io/_uploads/HJygHClebg.png) :::danger 例外!!她發現自己已經註冊過了!!,系統提示「電子信箱已經註冊」 ::: 2. 登入系統 / 選擇身份 0️⃣3️⃣1️⃣發現自己已經有帳號後,回到登入頁面,輸入電子郵件和密碼,選擇顧客身份,按下登入。 ![image](https://hackmd.io/_uploads/rJkv9uu7be.png) ![截圖 2025-12-24 上午10.48.42](https://hackmd.io/_uploads/Syt9NA_Qbe.png) :::danger 例外!!她發現自己記錯了密碼,登入失敗! 只好按下「忘記密碼?」按鈕,期待能得到幫助 ::: ![image](https://hackmd.io/_uploads/BkW-v0elWe.png) 看來是沒辦法~ 2. 選擇顧客身份,進入首頁。 0️⃣3️⃣1️⃣被絕望的心情籠罩,就在這時,他的腦海中浮現一串數字,原來,其實密碼一直在她心中,只是被上帝遮住了簾,忘了掀開~ ![image](https://hackmd.io/_uploads/rkgT_2gxWl.png) 總之他順利登入,進入首頁。 3. 瀏覽餐廳清單與餐廳內容 0️⃣3️⃣1️⃣以顧客身份進入後,顯示了附近餐廳的清單。 ![image](https://hackmd.io/_uploads/r14oj2lxbe.png) 她點進了「美胖漢堡」,看到了菜單。 ![image](https://hackmd.io/_uploads/SkA11Txebg.png) 她覺得「培根薯餅厚蛋吐司」看起來很好吃,點開,按下加號,選擇「馬上冰!」 ![image](https://hackmd.io/_uploads/B1wP-0llWl.png) 4. 下單 0️⃣3️⃣1️⃣挑了「美胖漢堡」的「壽喜牛五花厚蛋吐司」和「隆香茶室」的「海鮮雙拼花枝、蝦仁香蘭飯」,和「添好茶」的「蜂蜜鮮奶茶」,把他們加進購物冰箱,按下購物冰箱按鈕,看到了訂單摘要。 ![image](https://hackmd.io/_uploads/r1xEIeplxWe.png) 按下「前往結帳」後,0️⃣3️⃣1️⃣看到了確認訂單頁面,他突然想起來晚上要去系館和組員開會,所以在外送詳細資訊修改了外送地址,然後按下「確認送出訂單」,看到訂單狀態。 ![image](https://hackmd.io/_uploads/SyE0g6xlWg.png) ![image](https://hackmd.io/_uploads/ByEwau_X-g.png) ![image](https://hackmd.io/_uploads/SkaDaOdm-g.png) 5. 即時通訊: 0️⃣3️⃣1️⃣收到外送員訊息,外送員說明了自己壓到狗的狀態 ![截圖 2025-12-24 上午11.08.57](https://hackmd.io/_uploads/SyFOKCO7-g.png) 0️⃣3️⃣1️⃣在系館收到了剛送來一堆食物,按下「我已收到餐點」。 打開餐盒一看,香氣撲鼻,他的隊友開始抱怨太香。 他打開系統,確認訂單狀態已更新為「完成」。 這讓0️⃣3️⃣1️⃣覺得整個點餐流程流暢、方便,從選餐、下單到送餐完成,都能即時追蹤。 7. 評論 0️⃣3️⃣1️⃣在享用完餐點後,十分滿意,決定來給餐廳來個評價 ![image alt](https://hackmd.io/_uploads/rJsDbtOQbl.png) 0️⃣3️⃣1️⃣覺得這個平台幫他省下了外出排隊買飯的時間,能隨時享受熱騰騰的美食。 ### 情境:史密提威威傑格曼傑森接單當外送員 在海大的另外一邊,史密提威威傑格曼傑森登入系統,選擇以外送員身份登入。 1. 接單 他在「顧客訂單列表」,選擇用發佈時間排序,看到了0️⃣3️⃣1️⃣的訂單,身為第一名的外送員,他立刻點進訂單,然後點選「立即接單」。 ![image](https://hackmd.io/_uploads/B1K-Dpegbl.png) ![image](https://hackmd.io/_uploads/S1kYOaxxbl.png) 2. 配送 史密提威威傑格曼傑森按照外送任務的取餐/送餐指南,前往目標餐廳取餐,毅然決然地踏上餵飽0️⃣3️⃣1️⃣的道路。 ![image](https://hackmd.io/_uploads/ryghR_d7be.png) ![image alt](https://hackmd.io/_uploads/rk_3COOQbx.png) 3. 完成 把餐點送到0️⃣3️⃣1️⃣手上後,史密提威威傑格曼傑森在手機上點「已送達」,0️⃣3️⃣1️⃣也在自己的介面按下「我已收到餐點」,訂單狀態更新為「完成」。 忙碌的一天過後 史密提威威傑格曼傑森結束了一天的接單,他回到系統中的 「我的訂單」 頁面。 切換到「歷史訂單」,系統清楚列出了今天送過的餐點,包含訂單編號、顧客名稱、完成時間與報酬。 ![image](https://hackmd.io/_uploads/BJBw3pgg-e.png) 他登出,結束一天的外送工作。 走出校門的時候,他覺得這個系統讓外送工作清楚、有條理,接單方便直覺,還可以看到自己努力的成果。 ### 情境:阿爾托莉亞・潘德拉貢是系統管理員 阿爾托莉亞・潘德拉貢是一名系統管理員,她每天的工作就是維護整個「海大餐飲外送系統」的正常運作,確保餐廳、訂單、會員資料都準確並受到管控。 1. 登入與管理餐廳 阿爾托莉亞登入系統後,自動進入「管理餐廳」頁面。 她看到一份完整的餐廳列表,清楚顯示餐廳名稱與基本資訊。 如果要調整餐廳資料,只要點擊右邊的「編輯」,就能進入詳細資訊頁面。 她輸入「海大自助餐」在搜尋欄,很快就把目標餐廳找出來。 頂部右上角還有「登出」按鈕,隨時可以安全登出系統。 ![image](https://hackmd.io/_uploads/S1t6yYd7-x.png) 她按下「查看評論」,看看有沒有亂評價的小壞蛋。 ![image alt](https://hackmd.io/_uploads/HyitMYd7be.png) 2. 餐廳詳細資訊編輯 點進「海大自助餐」的詳細頁後,她開始修改餐廳資訊: 名稱、介紹、地址、電話,編輯完成後點「儲存餐廳資訊」 下方餐點清單裡,她把「rrrr」價格改成 $1231。 看到過期的菜色,直接點右邊的垃圾桶 icon 把它刪掉 另外點選「新增菜單項目」,新增了一個「素食便當 $90」。 ![image](https://hackmd.io/_uploads/BJ-kMAIXWx.png) 3. 新增餐廳 下午,學校附近新開了一家「鐵板燒專賣店」,阿爾托莉亞需要把它新增到系統。 點擊「新增餐廳」→ 填寫餐廳名稱、介紹、地址與電話,在下方新增三個菜單項目:「牛肉鐵板燒 $150」、「豬肉鐵板燒 $130」、「蔬菜鐵板燒 $100」。 點「建立餐廳」後,系統將這家新餐廳自動加到前台清單,使用者當天就能看到。 ![image](https://hackmd.io/_uploads/HkMBg0gg-l.png) 4. 管理訂單 阿爾托莉亞回到頂部 navbar,點選「查看訂單」,進入訂單管理頁面: 她先切換到「未完成」,看到目前外送員正在處理的訂單。 ![image](https://hackmd.io/_uploads/B1UlxY_QZx.png) 為了查詢上週的數據,她點擊日曆 icon,篩選日期區間,快速找到所有 10/01 ~ 10/07 的訂單。點進一筆訂單,裡面清楚顯示:顧客暱稱、餐廳、外送地址、外送員、外送員電話、訂單內容與金額 ![image](https://hackmd.io/_uploads/BkeNlF_m-e.png) ![image alt](https://hackmd.io/_uploads/rkPHlKuXZx.png) 5. 管理會員 最後,她要處理一位有爭議的使用者。 點擊「管理會員」→ 顯示所有會員清單,包含暱稱、email、身份 她輸入 studentA@ntou.edu.tw 在搜尋欄,找出這位使用者 ![image](https://hackmd.io/_uploads/BJ7KxKO7Wg.png) 點進會員詳細資訊頁,看到該會員的 ID、暱稱、email、外送地址與身份 由於該用戶多次違規,阿爾托莉亞按下「停用此帳號」,系統即時停用該帳號,保護平台秩序,守護世界和平,謝謝阿爾托莉亞。 ![image](https://hackmd.io/_uploads/HyyixYdQ-g.png) 完成了新增餐廳、修改菜單、檢查訂單與停用違規會員後,阿爾托莉亞點擊右上角的「登出」,結束了一天的管理工作。 她覺得這個後台系統的操作設計直覺、功能完整,讓她能有效維護整個外送平台的穩定性。 --- ## 使用者故事地圖 (User Story Map) ![User Story Map Template-第七組](https://hackmd.io/_uploads/rk__Ogflbg.png) ### 未登入使用者 - **代號**:AU-01 Register - **故事**:作為使用者,我想要能夠註冊帳號,以便成為平台會員。 - **註記**: - 支援 Email 與密碼規則檢核(強度/長度/複雜度)。 - **測試方法**: - 必填欄位與格式驗證(Email/密碼強度)。 - 成功註冊後自動導向登入或會員首頁。 - 重複帳號顯示明確錯誤(避免洩漏存在性)。 - **代號**:AU-02 Login --- - **故事**:作為使用者,我想要能登入帳號,以便進入會員功能。 - **註記**: - 登入後會話安全(HttpOnly/SameSite/過期)與權限。 - **測試方法**: - 正確憑證可登入並導向會員首頁。 - 錯誤密碼提示泛化與爆力嘗試限制/等待。 - 登出後會話立即失效(所有端)。 --- ### 管理員 - **代號**:ADM-RES-01 List Restaurants & Items - **故事**:身為管理員,我希望能查看所有餐廳、餐點的清單與基本資訊,方便總覽平台狀態。 - **註記**: - 支援搜尋/排序。 - 顯示狀態(上架/下架)。 - **測試方法**: - 可依名稱/分類搜尋。 - 資料欄位完整且一致。 --- - **代號**:ADM-RES-02 CRUD Restaurants & Items - **故事**:身為管理員,我希望能新增、更新或移除餐廳、餐點資訊,以維護其狀態。 - **註記**: - 刪除需二次確認與關聯檢查(不可逆)。 - 支援上/下架。 - **測試方法**: - 新增/編輯/刪除後列表即時更新。 - 欄位驗證與權限控管正確(RBAC)。 --- - **代號**:ADM-ORD-03 View All Orders - **故事**:身為管理員,我希望查看所有訂單詳細紀錄,以監控交易流程與處理異常。 - **註記**: - 可依狀態/日期/餐廳/會員篩選。 - **測試方法**: - 篩選正確。 --- - **代號**:ADM-MEM-04 list Members - **故事**:身為管理員,我希望查看所有會員清單與詳細資料,以總覽使用者狀態。 - **註記**: - 隱私資料遮罩(密碼)。 - **測試方法**: - 可依關鍵字與狀態精準查詢。 --- - **代號**:ADM-MEM-05 Disable/Delete Member - **故事**:身為管理員,我希望能刪除或停用不當行為會員,以維護營運安全與規範。 - **註記**: - 停用前風險告知與稽核記錄。 - 可恢復(停用)清楚區分。 - **測試方法**: - 停用後無法登入/下單。 --- ### 已登入的顧客 - **代號**:CUS-LIST-01 Browse Restaurants - **故事**:身為一名顧客,我希望可以瀏覽所有外送範圍內的餐廳清單,讓我可以挑選感興趣的餐廳。 - **註記**: - 顯示價格、預估時間。 - **測試方法**: - 無限滾動正常。 --- - **代號**:CUS-LIST-02 Filter & Sort - **故事**:身為一名顧客,我希望能透過評價、價格、等待時間、餐點種類、餐廳名稱篩選餐廳,讓我可以找到合適的餐廳。 - **註記**: - 條件可疊加並可一鍵清除。 - **測試方法**: - 套用/清除條件結果正確。 - 空結果有提示與返回動作。 --- - **代號**:CUS-DETAIL-03 Restaurant Detail - **故事**:身為一名顧客,當我看到感興趣的餐廳時,我希望可以看到餐廳的詳細資料頁面,讓我可以看到餐廳的位置、價格、等待時間和所有供應的餐點,讓我可以進一步挑選餐廳。 - **註記**: - 菜單分類。 - **測試方法**: - 資訊載入完整且與列表一致。 - 菜單操作流暢無誤。 --- - **代號**:CUS-CART-04 Add to Cart - **故事**:身為一名顧客,當我決定好要訂購的餐點時,我希望可以將該餐點加入購物車,讓我可以繼續瀏覽其他餐點。 - **註記**: - 同餐廳合併計算。 - 加入成功提示與可刪除。 - 當購物車內出現距離過遠的跨店餐點時,提醒顧客。 - **測試方法**: - 加入後數量/小計正確。 --- - **代號**:CUS-CART-05 Edit Cart & Summary - **故事**:身為一名顧客,我希望可以修改購物車內的資訊,包含餐點數量等,以及查看當前的總金額。 - **註記**: - 數量下限/上限檢查。 - **測試方法**: - 增減數量金額即時更新。 - 清空購物車有確認流程。 --- - **代號**:CUS-ORDER-06 Set Delivery Info - **故事**:身為顧客,我希望指定送達地點並填寫地址、電話、收件人暱稱。 - **註記**: - 檢查地址、電話格式是否合法。 - **測試方法**: - 必填未填不可下一步。 --- - **代號**:CUS-ORDER-07 Review & Place Order - **故事**:身為一名顧客,我希望我可以確認餐點的總金額、數量,並且送出訂單。 - **註記**: - 提交後建立訂單編號(避免重複送單)。 - **測試方法**: - 下單頁顯示餐點總金額與數量。 - 下單成功頁顯示訂單編號。 --- - **代號**:CUS-TRACK-08 Track Order Status - **故事**:身為一名顧客,我希望我可以確認已下單的訂單狀態,讓我追蹤訂單。 - **註記**: - 顯示預估到達時間。 - **測試方法**: - 狀態更新與推播正確。 --- - **代號**:CUS-TRACK-09 Mark as Received - **故事**:身為顧客,我希望在收到餐點後,能將訂單狀態切換成「已收到」。 - **註記**: - 需防止誤按(確認按鈕)。 - **測試方法**: - 切換成功即鎖定後續狀態。 - **代號**:CUS-TRACK-10 Modify profile - **故事**:身為顧客,我希望可以修改個人資料。 - **註記**: - 可以修改名稱、密碼、頭像。 - **測試方法**: - 顧客修改後可以看到新的資料。 --- - **代號**:CUS-TRACK-11 Set default delivery information - **故事**:身為顧客,我希望能預設常用的配送地址、電話,讓下次訂餐時自動填入該地址、電話。 - **註記**: - 預設地址、電話應在結帳時自動填入。 - **測試方法**: - 新增或修改配送地址、電話後,確認預設地址、電話自動套用至新訂單。 --- - **代號**:CUS-TRACK-12 Switch to delivery person - **故事**:身為顧客,我希望能將帳號切換成「外送員」模式,以便接單與管理配送任務。 - **註記**: - 切換後顯示不同的主頁與功能選單。 - **測試方法**: - 切換成功後可看到外送員介面,切回顧客模式仍能正常使用。 --- - **代號**:CUS-TRACK-13 View order history - **故事**:身為顧客,我希望能查看歷史訂單紀錄,以便回顧過往消費。 - **註記**: - 顯示訂單時間、餐廳名稱、金額與狀態。 - **測試方法**: - 顧客可正確看到過去的訂單紀錄。 --- ### 已登入外送員 - **代號**:DL-ORD-01 View Pending Orders - **故事**:身為外送員,我希望可以看到所有待處理的訂單資訊,以便選擇符合我路線與時間的訂單。 - **註記**: - 顯示距離、取/送點、預估里程與報酬、預計完成時間。 - **測試方法**: - 套用排序/篩選後清單結果正確且可分頁。 - 清單資料與地圖距離/時間估算一致。 --- - **代號**:DL-ORD-02 View Order Detail - **故事**:作為外送員,我希望能查看訂單的詳細資訊(餐點、店家地址、顧客聯絡方式),以便準確取餐與送達。 - **註記**: - 顧客敏感資訊遮罩,僅接單後顯示完整聯絡方式。 - **測試方法**: - 資料欄位完整。 - 未接單僅顯示部分電話/地址。 --- - **代號**:DL-ORD-03 Accept & Start Delivery - **故事**:身為一個外送員,我希望我能根據訂單資訊把餐點送到目的地。 - **註記**: - 接單二次確認並將訂單鎖定給該外送員(避免競搶)。 - **測試方法**: - 接單後其他外送員無法再接同筆訂單。 - 成功接單後狀態自動切換為「配送中」。 --- - **代號**:DL-ORD-04 Handover & Complete - **故事**:作為外送員,我希望在交付餐點後,能將訂單狀態切換成「已完成」,這樣顧客就能確認收餐。 - **註記**: - 若無人可收,提供重試/改約或客服轉接流程(避免強制完成)。 - **測試方法**: - 交付餐點後可點擊已送達。 - **代號**:DL-TRACK-05 Modify profile - **故事**:身為外送員,我希望可以修改個人資料。 - **註記**: - 可以修改名稱、密碼、頭像。 - **測試方法**: - 外送員修改後可以看到新的資料。 - **代號**:DL-TRACK-06 Set default delivery information - **故事**:身為外送員,我希望能預設常用的電話、暱稱,讓我不用在每次接單時都重新填寫。 - **註記**: - 預設電話、暱稱應在接單時自動填入外送員資訊。 - **測試方法**: - 新增或修改電話、暱稱後,確認電話、暱稱自動套用至新訂單。 - **代號**:DL-TRACK-07 Switch to customer person - **故事**:身為外送員,我希望能將帳號切換成「顧客」模式,以便點餐。 - **註記**: - 切換後顯示不同的主頁與功能選單。 - **測試方法**: - 切換成功後可看到顧客介面,切回外送員模式仍能正常使用。 - **代號**:DL-TRACK-08 View order history - **故事**:身為外送員,我希望能查看歷史訂單紀錄,以便回顧過往工作紀錄。 - **註記**: - 顯示訂單時間、餐廳名稱、金額與狀態。 - **測試方法**: - 可正確看到過去的訂單紀錄。 --- ## 使用者介面分析 (User Interface Analysis) #### 登入 ![image](https://hackmd.io/_uploads/rkgT_2gxWl.png) 尚未登入的使用者進入系統所看到的畫面,使用者可在此頁面透過輸入電子郵件、密碼及選擇身分並按下「登入」登入帳號。若帳號與密碼輸入錯誤,系統會顯示錯誤訊息並要求重新輸入。若使用者還沒註冊帳號可以按下「建立帳號」註冊帳號。若使用者忘記密碼,可以按下「忘記密碼?」。 #### 註冊 ![image](https://hackmd.io/_uploads/B1CUYnexWl.png) 尚未註冊帳號的使用者可以在這個頁面填寫必要資訊(暱稱、email、密碼)後並按下「立即註冊」即可註冊帳號,註冊成功會自動跳轉到登入頁面。也可以先填寫預設外送地址、聯絡電話,作為將來下單或接單時的預設資料。按下建立帳戶下方的藍色圓圈可以上傳頭像。想回到登入頁面可以按「已有帳號?前往登入」。 --- ### 顧客 #### 瀏覽餐廳 ![image](https://hackmd.io/_uploads/r14oj2lxbe.png) 顧客登入後會跳轉到此頁面。按下頂部 navbar 左上方「瀏覽店家」也能跳轉到此頁面。按下「電資暨綜合教學大樓」可以選擇預設地點或編輯外送地址,如果一開始沒有填寫地址預設為電資暨綜合教學大樓。按下「搜尋餐廳、美食」可以輸入想查詢的餐廳名稱或關鍵字,會根據搜尋內容顯示下方的餐廳列表。也可以按下「咖哩」或「中式」等篩選條件來篩選餐廳。按下下方餐廳列表中的餐廳卡片會跳轉到餐廳詳細資料頁面。 #### 餐廳詳細資訊 ![image](https://hackmd.io/_uploads/SkA11Txebg.png) 該頁面會顯示餐廳的簡介、地址、電話、菜單。在下方的菜單中,按下餐點右邊的「+」可以進入「餐點詳細資訊」頁面。 #### 餐點詳細資訊 ![image](https://hackmd.io/_uploads/B1wP-0llWl.png) 該頁面會顯示餐點的簡介、價格。在下方透過「+」「-」選擇餐點數量,並按下「馬上冰!」,即可將餐點加入購物冰箱。按下頂部 navbar 右上角的購物冰箱 icon 可以跳轉到購物冰箱頁面。 #### 購物冰箱 ![image](https://hackmd.io/_uploads/r1xEIeplxWe.png) 該頁面會顯示所有被加入購物冰箱的餐點,可以點餐點右邊的「+」和「-」來修改餐點數量。可以在頁面右邊瀏覽訂單的小計和總金額。可以按下「前往結帳」跳轉到結帳頁面。 #### 結帳 ![image](https://hackmd.io/_uploads/SyE0g6xlWg.png) 在「外送詳細資訊」區域可以讓顧客確認並修改成立訂單必要的資訊,包含外送地址、聯絡人暱稱、連絡電話和備註。下方的「付款方式」區域可以選擇付款方式,目前系統只支援「現場付款」。在右方的「訂單摘要」區域確認餐點的數量、價格、預估時間後,按下「確認送出訂單」即可下單,接著會跳轉到訂單狀態頁面。 #### 訂單狀態 ![image](https://hackmd.io/_uploads/BJjlNaxxbe.png) 可以在頁面上方的進度條中確認訂單的狀態,有準備中、在路上、已接收、已完成四種狀態。外送員接單後,可以確認外送員的暱稱、頭像和電話。可以在下方確認訂單和餐廳的詳細資訊。按下頂部 navbar 左上角的「我的訂單」可以跳轉到訂單列表頁面。按下「我已收到餐點」可以將訂單狀態設定為已收到。當顧客按下「我已收到餐點」以及外送員按下「已送達」系統會將訂單狀態設定為完成。 #### 訂單列表 ![image](https://hackmd.io/_uploads/SyIVH6gg-l.png) ![image](https://hackmd.io/_uploads/ByLLSTgl-l.png) 按下「未完成」或「已完成」可以瀏覽正在處理的訂單和歷史訂單。可以按下「查看詳情」跳轉到訂單狀態頁面。 #### 帳號資訊 ![image](https://hackmd.io/_uploads/rk1vL6gxWg.png) 按下頂部 navbar 右上角的使用者 icon 可以跳轉到我的帳戶頁面。可以在這個頁面修改暱稱、預設外送地址、連絡電話、密碼,按下「儲存變更」完成修改。按下頭像可以更換頭像。下方的身分管理欄位會有一個按鈕,使用者可以透過此按鈕切換現在的身分。按下「登出」可以登出帳號。 --- ### 外送員 #### 顧客訂單 ![image](https://hackmd.io/_uploads/B1K-Dpegbl.png) 按下頂部 navbar 左上角的「顧客訂單」,該頁面可以看到所有待處理的訂單,可以瀏覽訂單要取、送的地點、地址、預計送達時間及報酬。可以根據排序和搜尋快速找到符合要求的訂單。點擊「查看並接單」可以跳轉到訂單資訊頁面。 #### 訂單資訊 ![image](https://hackmd.io/_uploads/S1kYOaxxbl.png) 該頁面可以看到取餐餐廳、取餐地址、外送地點、預計送達時間、顧客暱稱、顧客電話、訂單內容、外送費。按下「取餐地址」或「外送地址」會跳轉到 Google map。按下「立即接單」可以接訂單,並跳轉到訂單狀態頁面。 #### 訂單狀態 ![image](https://hackmd.io/_uploads/rywXsallbl.png) 該頁面可以看到取餐餐廳、餐廳地址、餐廳電話、取餐品項、外送地址、顧客暱稱、顧客電話和顧客備註。當外送員已送達餐點時,按下「已送達」可以將訂單狀態改為已送達。當顧客按下「我已收到餐點」以及外送員按下「已送達」系統會將訂單狀態設定為完成。 #### 訂單列表 ![image](https://hackmd.io/_uploads/H1DFnagxZg.png) ![image](https://hackmd.io/_uploads/BJBw3pgg-e.png) 按下頂部 navbar 左上角的「我的訂單」,可以跳轉到訂單列表頁面。按下「當前任務」和「歷史訂單」可以瀏覽正在處理的訂單和歷史訂單。按下當前任務列表中的「查看詳情」,可以跳轉到訂單狀態頁面。 --- ### 管理員 #### 管理店家 ![image](https://hackmd.io/_uploads/HyQpTTllbx.png) 身份為管理員的用戶在登入後會進到管理店家頁面,該頁面會有所有餐廳列表,按下餐廳卡片或右邊的「編輯」會跳轉到餐廳詳細資訊頁面。按下「新增餐廳」可以跳轉到新增餐廳頁面。在搜尋欄輸入餐廳名稱可以搜尋餐廳。按下頂部 navbar 右上角的登出 icon 可以登出系統。 #### 餐廳詳細資訊頁面 ![image](https://hackmd.io/_uploads/HkSUJRxxbg.png) 管理員可以在這個頁面編輯餐廳的資訊,包括名稱、介紹、地址、電話;可以編輯菜單的資訊,包含餐點照片、餐點名稱、價格、介紹,按下餐點右邊的垃圾桶 icon 可以刪除餐點,按下「儲存所有變更」完成修改。按下下方的「新增菜單項目」可以新增餐點。 #### 新增餐廳 ![image](https://hackmd.io/_uploads/HkMBg0gg-l.png) 在填寫必要的資訊(名稱、介紹、地址、電話、封面圖片)後按下「建立餐廳」可以新增餐廳到列表中。按下下方的「新增菜單項目」可以新增餐點,包含餐點照片、餐點名稱、價格、介紹,按下餐點右邊的垃圾桶 icon 可以刪除餐點。 #### 查看訂單 ![image](https://hackmd.io/_uploads/By1FVpETel.png) ![image](https://hackmd.io/_uploads/H1kc4pETel.png) 按下頂部 navbar 左上方的「查看訂單」可以跳轉到此頁面。按下「未完成」和「已完成」可以瀏覽所有現在正在處理和已經完成的訂單。會顯示訂單的編號、狀態、接單地址、送單地址、訂單價格。按下訂單可以跳轉到訂單詳細資訊頁面。在搜尋欄輸入訂單編號可以搜尋訂單。按下日曆 icon 可以篩選指定日期訂單。 #### 訂單詳細資訊 ![image](https://hackmd.io/_uploads/SyT6th4Tll.png) 該頁面可以看到訂單的編號、狀態、顧客暱稱、餐廳、外送地址、外送員、外送員電話、下單時間、訂單內容與金額、外送費。 #### 管理會員 ![image](https://hackmd.io/_uploads/HJPqm6Eaex.png) 按下頂部 navbar 左上方的「管理會員」可以跳轉到此頁面。此頁面會顯示所有使用者的列表。會顯示使用者的暱稱、email、身份。按下使用者會跳轉到會員詳細資訊頁面。在搜尋欄輸入使用者暱稱或 email 可以查訊使用者。 #### 會員詳細資訊 ![image](https://hackmd.io/_uploads/B1I252Nalg.png) 此頁面會顯示使用者的 ID、暱稱、email、外送地址、身份。按下「刪除此會員」可以使該使用者無法再使用本系統。 --- ## 功能需求 (Functional Requirements) <!-- <style> table { word-break: keep-all !important; width: fit-content; overflow: auto; } </style> --> <!-- CRT: Cart MEM: Member ORD: Order TRK: Track RES: Restaurant --> ### 未登入使用者 | 編號 | 功能需求 | | ---------- | ------- | | FR-AU-01 | 系統應提供帳號註冊功能,並支援以 Email 註冊 | | FR-AU-02 | 系統應提供驗證 Email 格式之功能 | | FR-AU-03 | 系統應提供密碼檢核功能,並在不合規定時提供明確的提示 | | FR-AU-04 | 系統應檢查使用者提供的 Email 是否已被註冊 | | FR-AU-05 | 使用者註冊成功時,系統應自動將其導向至登入頁面 | | FR-AU-06 | 系統應提供帳號登入功能 | | FR-AU-06.1 | 系統應提供登入身份選擇(顧客 / 外送員) | | FR-AU-07 | 當使用者登入失敗時,系統應提供適當提示 | | FR-AU-07.1 | 當使用者忘記密碼時,系統應告知「我也沒辦法」 | | FR-AU-08 | 系統應提供登出功能,並且登出後會話應在終端立即失效 | ### 管理員 | 編號 | 功能需求 | | ------------- | ------- | | FR-ADM-RES-01 | 管理員可瀏覽所有餐廳與餐點清單,並支援搜尋 | | FR-ADM-RES-02 | 管理員可新增、更新餐廳與餐點資料 | | FR-ADM-ORD-01 | 管理員可查看所有訂單紀錄,並可依日期篩選,可依金額排序 | | FR-ADM-ORD-02 | 系統應顯示訂單中每一節點(出餐、配送、完成等)的狀態 | | FR-ADM-MEM-01 | 管理員可瀏覽會員清單與詳細資料(隱私資料需遮罩) | | FR-ADM-MEM-02 | 系統應顯示帳號狀態 | | FR-ADM-MEM-03 | 管理員可停用會員帳號 | | FR-ADM-MEM-04 | 停用帳號後,該會員不得下單 | ### 已登入的顧客 | 編號 | 功能需求 | | --------------- | ------- | | FR-CUS-RES-01 | 顧客可瀏覽餐廳清單,系統應依距離顯示餐廳 | | FR-CUS-RES-01.1 | 當顧客將頁面下滑時,系統應自動載入更多餐廳 | | FR-CUS-RES-02 | 顧客可使用價格、預估等待時間、餐點種類等條件進行篩選與排序 | | FR-CUS-RES-03 | 顧客可查看餐廳詳細資料(位置、菜單、價格等) | | FR-CUS-CRT-01 | 顧客可將餐點加入購物車 | | FR-CUS-CRT-02 | 顧客可於購物車中修改數量、刪除特定餐廳的所有餐點 | | FR-CUS-CRT-03 | 系統應即時計算餐點金額、外送費與預估時間 | | FR-CUS-ORD-01 | 顧客可設定送達地點與收件資料(電話、暱稱等) | | FR-CUS-ORD-01.1 | 系統應驗證地址與電話格式是否合法 | | FR-CUS-ORD-02 | 顧客可在下單前確認訂單明細 | | FR-CUS-ORD-03 | 系統應產生唯一訂單編號並避免重複送單 | | FR-CUS-TRK-01 | 顧客可追蹤訂單狀態與配送進度(預估時間) | | FR-CUS-TRK-02 | 顧客可在收到餐點後將訂單狀態更新為「已送達」 | | FR-CUS-01 | 顧客可修改個人資料(名稱、密碼、頭像等) | | FR-CUS-02 | 顧客可預設常用的配送地址與電話 | | FR-CUS-03 | 顧客可切換帳號身分為「外送員」模式 | | FR-CUS-04 | 顧客可查看歷史訂單紀錄 | ### 已登入的外送員 | 編號 | 功能需求 | | ------------ | ------- | | FR-DL-ORD-01 | 外送員可查看所有待接訂單清單,並依距離、金額、送達時間排序,用餐廳名稱關鍵字篩選 | | FR-DL-ORD-02 | 外送員可查看訂單詳細資訊(餐點、店家地址、送達地址) | | FR-DL-ORD-03 | 系統應保護顧客隱私,僅在接單後顯示完整聯絡方式 | | FR-DL-ORD-04 | 外送員可接單並鎖定訂單,避免其他外送員同時接取 | | FR-DL-ORD-05 | 外送員可根據地址前往餐廳與收件地點 | | FR-DL-TRK-01 | 系統應在成功接單後自動切換訂單狀態為「外送中」 | | FR-DL-TRK-02 | 外送員完成交付後可切換訂單為「已送達」 | | FR-DL-01 | 外送員可修改個人資料(名稱、密碼、頭像等) | | FR-DL-02 | 外送員可預設常用的電話 | | FR-DL-03 | 外送員可切換帳號身分為「顧客」模式 | | FR-DL-04 | 外送員可查看歷史配送紀錄 | ### 其他 (in future) | 編號 | 功能需求 | | --------- | -------------------------------------------------- | | FR-CHT-01 | 系統應提供每筆訂單的顧客與外送員之間的即時通訊功能 | | FR-REV-01 | 顧客可在訂單完成後對餐廳進行評價 | | FR-REV-02 | 系統應顯示餐廳的整體評分與評論數量 | |FR-AD-01|系統應能在前台隨機顯示一則目前啟用中的廣告| --- ## 非功能需求 (Non-functional Requirements) ### 效能與容量 | 編號 | 需求 | 指標 / 目標 | |---|---|---| | NFR-CAP-01 | 併發容量 | 100 位以上使用者同時在線操作 | | NFR-CAP-02 | 處理效能 | 使用搜尋功能時,系統應在 2 秒內顯示結果 | ### 相容性與可移植性 | 編號 | 需求 | 指標 / 目標 | |---|---|---| | NFR-COMP-01 | 瀏覽器支援 | 最新兩版 Chrome / Safari / Edge / Firefox,iOS / Android WebView | NFR-COMP-02 | RWD | 360px ~ 1920px 皆可使用 | ### 資安 | 編號 | 需求 | 指標 / 目標 | |---|---|---| | NFR-SEC-01 | 傳輸加密 | 以 HTTPS 加密傳輸 | | NFR-SEC-02 | 帳號防爆力破解 | 連續登入失敗5次鎖帳5分鐘 |