krebikshaw
    • Create new note
    • Create a note from template
      • Sharing URL Link copied
      • /edit
      • View mode
        • Edit mode
        • View mode
        • Book mode
        • Slide mode
        Edit mode View mode Book mode Slide mode
      • Customize slides
      • Note Permission
      • Read
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Write
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Engagement control Commenting, Suggest edit, Emoji Reply
    • Invite by email
      Invitee

      This note has no invitees

    • Publish Note

      Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

      Your note will be visible on your profile and discoverable by anyone.
      Your note is now live.
      This note is visible on your profile and discoverable online.
      Everyone on the web can find and read all notes of this public team.
      See published notes
      Unpublish note
      Please check the box to agree to the Community Guidelines.
      View profile
    • Commenting
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
      • Everyone
    • Suggest edit
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
    • Emoji Reply
    • Enable
    • Versions and GitHub Sync
    • Note settings
    • Note Insights New
    • Engagement control
    • Make a copy
    • Transfer ownership
    • Delete this note
    • Save as template
    • Insert from template
    • Import from
      • Dropbox
      • Google Drive
      • Gist
      • Clipboard
    • Export to
      • Dropbox
      • Google Drive
      • Gist
    • Download
      • Markdown
      • HTML
      • Raw HTML
Menu Note settings Note Insights Versions and GitHub Sync Sharing URL Create Help
Create Create new note Create a note from template
Menu
Options
Engagement control Make a copy Transfer ownership Delete this note
Import from
Dropbox Google Drive Gist Clipboard
Export to
Dropbox Google Drive Gist
Download
Markdown HTML Raw HTML
Back
Sharing URL Link copied
/edit
View mode
  • Edit mode
  • View mode
  • Book mode
  • Slide mode
Edit mode View mode Book mode Slide mode
Customize slides
Note Permission
Read
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Write
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Engagement control Commenting, Suggest edit, Emoji Reply
  • Invite by email
    Invitee

    This note has no invitees

  • Publish Note

    Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

    Your note will be visible on your profile and discoverable by anyone.
    Your note is now live.
    This note is visible on your profile and discoverable online.
    Everyone on the web can find and read all notes of this public team.
    See published notes
    Unpublish note
    Please check the box to agree to the Community Guidelines.
    View profile
    Engagement control
    Commenting
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    • Everyone
    Suggest edit
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    Emoji Reply
    Enable
    Import from Dropbox Google Drive Gist Clipboard
       Owned this note    Owned this note      
    Published Linked with GitHub
    • Any changes
      Be notified of any changes
    • Mention me
      Be notified of mention me
    • Unsubscribe
    # Product Spec 第一階段版本 ### ☞ 產品簡介與功能(Product Value) #### 產品名稱: * Give++ #### 產品簡介: * Give++ 為一個二手物品交易平台,提供一個簡易及便利的交易環境 #### 產品目標說明: * Give++ 不是為了提供大型賣家成立電商網站,而是要讓一般的市民朋友,家裡有用不到的東西時,可以放上平台,彼此交換的物品的一個共享網站。不提供商業用途(促銷、優惠方案、團購優惠)等功能,只提供簡單的「找尋物品」&「刊登物品」兩項功能。本產品不具備商業目標,故本平台不會向賣方或買方酌收任何手續費用。 ### ☞ 系統架構: [會員系統](#會員系統) Krebikshaw * [會員註冊](#會員註冊) * [會員登入](#會員登入) * [會員編輯資料](#會員編輯資料) * [會員申請為賣家](#會員申請為賣家) * p2[會員聯絡平台](#會員聯絡平台) * [查看賣家聯絡資訊](#查看賣家聯絡資訊) [商品系統](#商品系統) Small Leaf * [網站搜尋功能](#搜尋功能) * [網站分類功能](#分類功能) * [賣家刊登商品](#刊登功能) * [賣家管理商品](#賣家管理商品) [購物車系統](#購物車系統) Nicolas * [商品加入購物車](#商品加入購物車) * [買家選擇購物車商品結帳](#買家選擇購物車商品結帳) * p3[商品異動即時更新](#商品異動即時更新) [訂單系統](#訂單系統) Nicolas * [買家編輯訂單狀態](#買家編輯訂單狀態) * [賣家編輯訂單狀態](#賣家編輯訂單狀態) [後台管理系統](#後台管理系統) Ruofan * [管理員管理用戶](#管理員管理用戶) * [管理員管理商品](#管理員管理商品) * p2[管理員編輯條款](#管理員編輯條款) * p2[管理員編輯 FAQ](#管理員編輯FAQ) * p2[管理員查看通知](#管理員查看通知) * p2[管理員回覆訊息](#管理員回覆訊息) [網站系統](#網站系統) Krebikshaw * p2[用戶查看通知中心](#用戶查看通知中心) * [用戶查看常見問題](#用戶查看常見問題) * [用戶查看條款](#用戶查看條款) [資料庫欄位表](#資料庫欄位表) ## 權限分級 | 權限 | 分級 | 管理員 | 賣家 | 用戶 | 路人 | | ------ | ---- | ------ | ---- | ---- | ---- | | 所有人 | 1 | O | O | O | O | | 用戶 | 2 | O | O | O | | | 賣家 | 3 | O | O | | | | 管理員 | 4 | O | | | | ## 會員系統 ### 會員註冊 #### ☞ 描述 第一階段僅需讓使用者自行輸入帳號密碼即可,不需要串接 facebook 或 google 的登入方法 #### ☞ 條件 |角色|權限|狀態| |-|-|-| |路人|1|未登入| #### ☞ 路由 ##### 註冊/登入頁面 ###### 路由 | 路由 | 按鈕 | | ------------------------- | ---- | | 前往[註冊頁面](#註冊頁面) | 註冊 | ##### 註冊頁面 ###### 操作 | 操作 | 按鈕 | Method | 後端 API | NEXT | | --- | ---- | ------ | ------------- | ---------------- | | 註冊網站 | 註冊 | POST | /users/register | 註冊成功回到首頁 | #### ☞ 介面 ##### [註冊/登入頁面](https://app.zeplin.io/project/5f9284129655d35999923975/screen/5f9aa89d4cb1634943583833) |元素|規則| |- |- | |註冊按鈕|跳至註冊頁面| |登入按鈕|跳至登入頁面| ##### [註冊頁面](https://app.zeplin.io/project/5f9284129655d35999923975/screen/5f9edcefcdf9508ca32227b5) |元素|規則|錯誤提示| |- |- |- | |帳號|必填 + 僅接受英文、數字、符號 + 不接受空行|帳號格式錯誤| |密碼|必填 + 僅接受英文、數字、符號 + 不接受空行|密碼格式錯誤| |信箱|必填 + 需含有 @ 字元|信箱格式錯誤| |註冊|跳至首頁|| #### ☞ 邏輯 ![](https://i.imgur.com/rIwntXP.png) |流程|規則| |-|-| |驗證|確認欄位是否符合規則、確認帳號是否已被註冊| #### ☞ 異常情形處理 暫無 #### ☞ 資料結構 |欄位|型態|長度|必填|預設|備註| |-|-|-|-|-|-| |帳號|varchar|24|Y||| |密碼|varchar|64|Y||需經過 hash| |信箱|varchar|24|Y||| ### 會員登入 #### ☞ 描述 第一階段僅需讓使用者自行輸入帳號密碼即可,不需要串接 facebook 或 google 的登入方法 #### ☞ 條件 |角色|權限|狀態| |-|-|-| |路人|1|未登入| #### ☞ 路由 ##### 登入頁面 ###### 操作 | 操作 | 按鈕 | Method | 後端 API | NEXT | | --- | ---- | ------ | ---------- | ---------------- | | 登入網站 | 登入 | POST | /users/login #### ☞ 介面 ##### [登入介面](https://app.zeplin.io/project/5f9284129655d35999923975/screen/5f9aaa50f90b314ab86e9e57) |元素|規則|錯誤提示| |- |- |- | |帳號|必填 + 僅接受英文、數字、符號 + 不接受空行|帳號或密碼錯誤| |密碼|必填 + 僅接受英文、數字、符號 + 不接受空行|帳號或密碼錯誤| |登入|跳至首頁|| #### ☞ 邏輯 ![](https://i.imgur.com/xt5IpoU.png) |流程|規則| |-|-| |驗證|確認欄位是否符合規則、確認帳號密碼是否正確| #### ☞ 異常情形處理 暫無 #### ☞ 資料結構 |欄位|型態|長度|必填|預設|備註| |-|-|-|-|-|-| |帳號|varchar|24|Y||| |密碼|varchar|64|Y||需經過 hash| ### 會員編輯資料 #### ☞ 描述 包含編輯個人資料、編輯賣家資料、編輯賣家公告等功能 #### ☞ 條件 |類型|角色|權限|狀態| |-|-|-|-| |編輯個人資料|用戶|2|登入| |編輯賣家資料|用戶|3|登入 + 賣家身份| |編輯賣家公告|用戶|3|登入 + 賣家身份| #### ☞ 路由 ##### 我的資料頁面 ###### 渲染 | 說明 | Method | 後端 API | | -------------------- | ------ | ------------- | | 取得自己的使用者資料 | GET | /users/me | ###### 路由 | 路由 | 按鈕 | | --------------------------------- | -------- | | 前往[重設密碼頁面](#重設密碼頁面) | 重設密碼 | | 回到上一頁 | 返回 | ###### 操作 | 操作 | 按鈕 | Method | 後端 API | 備註 | | -------- | -------- | ------ | ------------- | ------------------------------ | | 更改照片 | 選擇照片 | | | 串 Imgur API 將 url 放進 input | | 更改內容 | 更新 | PATCH | /users/me | | ##### 重設密碼頁面 ###### 路由 | 路由 | 按鈕 | | ---------- | ---- | | 回到上一頁 | 返回 | ###### 操作 | 操作 | 按鈕 | Method | 後端 API | 備註 | | ---------- | ---- | ------ | ------------- | ---- | | 更改密碼 | 更新 | PATCH | /users/password | | | 驗證 EMAIL | 驗證 | POST | | | ##### 我的賣家資料頁面 ###### 渲染 | 說明 | Method | 後端 API | | ---------------------- | ------ | --------------- | | 取得該使用者的賣家資料 | GET | /users/me | ###### 路由 | 路由 | 按鈕 | | ---------- | ---- | | 前往[重設密碼頁面](#重設密碼頁面) | 重設密碼 | | 回到上一頁 | 返回 | ###### 操作 | 操作 | 按鈕 | Method | 後端 API | 備註 | | ----------------- | -------- | ------ | --------------- | ------------------------------ | | 上傳大頭貼 | 選擇圖片 | | | 串 Imgur API 將 url 放進 input | | 上傳 Banner | 選擇圖片 | | | 串 Imgur API 將 url 放進 input | | 上傳 Line QR Code | 選擇圖片 | | | 串 Imgur API 將 url 放進 input | | 更改賣家資料 | 更新 | PATCH | /users/me | | ##### 編輯賣家公告視窗 ###### 渲染 | 說明 | Method | 後端 API | | ------------ | ------ | --------------------- | | 取得自己的賣家公告 | GET | demo/vendor/:id | ###### 操作 | 操作 | 按鈕 | Method | 後端 API | 備註 | | ------------------ | ---- | ------ | --------------- | ---- | | 修改自己的賣家公告 | 更新 | PATCH | /users/announcment | | #### ☞ 介面 ##### [我的資料頁面](https://app.zeplin.io/project/5f9284129655d35999923975/screen/5f9bfaf3bfd8eeb489b52c44) |元素|規則|錯誤提示| |- |- |- | |姓名|必填 + 不接受空行|此欄位為必填| |暱稱|必填 + 不接受空行|此欄位為必填| |地址|必填 + 不接受空行|此欄位為必填| |電子郵件|必填 + 不接受空行 + 需包含 @ 字元|此欄位為必填| |生日|必填|此欄位為必填| |大頭照|檔案大小 <= 1000K|照片檔案過大| ##### [重設密碼頁面](https://app.zeplin.io/project/5f9284129655d35999923975/screen/5f9edddfcb32a020fa0ba971) |元素|規則|錯誤提示| |- |- |- | |舊密碼|必填 + 不接受空行|此欄位為必填| |新密碼|必填 + 不接受空行|此欄位為必填| |再次輸入新密碼|必填 + 不接受空行|此欄位為必填| |電子郵件|必填 + 不接受空行 + 需包含 @ 字元|此欄位為必填| ##### [我的賣家資料頁面](https://app.zeplin.io/project/5f9284129655d35999923975/screen/5f9ac053d8c541b3c18974e0) |元素|規則|錯誤提示| |- |- |- | |姓名|必填 + 不接受空行|此欄位為必填| |暱稱|必填 + 不接受空行|此欄位為必填| |身分證字號|必填 + 不接受空行 + 第一碼為大寫英文 + 長度需為 10 碼|此欄位為必填| |地址|必填 + 不接受空行|此欄位為必填| |電子郵件|必填 + 不接受空行 + 需包含 @ 字元|此欄位為必填| |生日|必填|此欄位為必填| |QRcode|檔案大小 <= 500K|照片檔案過大| |大頭照|檔案大小 <= 1000K|照片檔案過大| |封面照|檔案大小 <= 1500K|照片檔案過大| |匯款帳號|銀行代碼 + 帳號|帳號規格不符| ##### [編輯賣家公告視窗](https://app.zeplin.io/project/5f9284129655d35999923975/screen/5f9a0c5d451b70b9521c75a3) |元素|規則|錯誤提示| |- |- |- | |輸入框|x|x| #### ☞ 邏輯 ![](https://i.imgur.com/fCNIsp0.png) |流程|規則| |-|-| |非敏感資訊|確認欄位是否符合規則| |敏感資訊|確認欄位是否符合規則 + 確認驗證是否通過| |賣家公告|x| #### ☞ 異常情形處理 暫無 #### ☞ 資料結構 |欄位|型態|長度|必填|預設|備註| |-|-|-|-|-|-| |姓名|varchar|24|Y||| |暱稱|varchar|64|Y||| |密碼|varchar|64|Y||需經過 hash| |信箱|varchar|24|Y||| |生日|datetime||Y||| |地址|varchar|24|Y||| |LINE ID|varchar|24|||| |頭貼 Url|varchar|24|||| |封面照 Url|varchar|24|||| |身分證字號|varchar|24|Y||| |匯款帳號|varchar|24|Y||| ### 會員申請為賣家 #### ☞ 描述 一般用戶註冊後即享有購買權限 開通賣家身份後,方可擁有刊登權限 #### ☞ 條件 |類型|角色|權限|狀態| |-|-|-|-| |編輯資料|用戶|2 or 3|登入| |刊登商品|用戶|3|登入 + 賣家身份| #### ☞ 路由 路由 | 路由 | 按鈕 | | ---------- | ---- | | 回到上一頁 | 取消 | 操作 | 操作 | 按鈕 | Method | 後端 API | 備註 | | ------------ | ---- | ------ | -------- | ---- | | 提交內容 | 送出 | POST | users/apply | | #### ☞ 介面 ##### [申請成為賣家頁面](https://app.zeplin.io/project/5f9284129655d35999923975/screen/5f9bfcc55d3b993d0a685735) |元素|規則|錯誤提示| |- |- |- | |身分證字號|必填 + 不接受空行 + 開頭為大寫英文 + 長度 = 10碼|欄位規格不符| #### ☞ 邏輯 ![](https://i.imgur.com/v8B7xvS.png) |流程|規則| |-|-| |註冊|確認欄位是否符合規則| |開通賣家資格|確認欄位是否符合規則 + 確認驗證是否通過| #### ☞ 異常情形處理 暫無 #### ☞ 資料結構 |欄位|型態|長度|必填|預設|備註| |-|-|-|-|-|-| |身分證字號|varchar|24|Y||| ### 會員聯絡平台 #### ☞ 描述 兩種方式: 1. 透過表單方式,向平台提出意見 2. 透過「幫助按鈕」以聊天視窗方式,與平台進行溝通 (列為 p2 暫不做) #### ☞ 條件 |類型|角色|權限|狀態| |-|-|-|-| |表單方式|任何|1|x| |聊天視窗|用戶|2|登入| #### ☞ 路由 路由 | 路由 | 按鈕 | | ---------- | ---- | | 回到上一頁 | 取消 | 操作 | 操作 | 按鈕 | Method | 後端 API | 備註 | | ------------ | ---- | ------ | -------- | ---- | | 提交內容 | 送出 | POST | | | #### ☞ 介面 ##### [表單頁面](https://app.zeplin.io/project/5f9284129655d35999923975/screen/5f9aa52b11e3e2bac4900905) |元素|規則|錯誤提示| |- |- |- | |姓名|必填 + 不接受空行|此欄位為必填| |電子郵件|必填 + 不接受空行 + 需包含 @ 字元|此欄位為必填| |電話|必填 + 不接受空行|此欄位為必填| |內容|必填|此欄位為必填| #### ☞ 異常情形處理 暫無 #### ☞ 資料結構 |欄位|型態|長度|必填|預設|備註| |-|-|-|-|-|-| |身份|varchar|24|Y||| |內容|text||Y||| ### 查看賣家聯絡資訊 #### ☞ 描述 賣家可設定電子信箱、電話、Line QRcode 使用者可查看賣家聯絡資訊,主動聯絡賣家 #### ☞ 條件 |類型|角色|權限|狀態| |-|-|-|-| |查看賣家聯絡資訊|任何|1|x| #### ☞ 路由 ##### 聯絡賣家視窗 ###### 渲染 | 說明 | Method | 後端 API | | ---------------------- | ------ | -------- | | 取得該賣家資料 | GET | /users/:id | #### ☞ 介面 [查看賣家聯絡資訊](https://app.zeplin.io/project/5f9284129655d35999923975/screen/5f9aa4d60910b846d2cafc2c) #### ☞ 邏輯 暫無 #### ☞ 異常情形處理 暫無 #### ☞ 資料結構 暫無 ------ ## 商品系統 ### 搜尋功能 #### ☞ 描述 使用者可透過搜尋欄位,輸入關鍵字即可查詢包含關鍵字的商品 #### ☞ 條件 |類型|角色|權限|狀態| |-|-|-|-| |搜尋商品|任何|1|x| #### ☞ 路由 ###### 渲染 | 說明 | Method | 後端 API | | ------------ | ------ | ---------------------- | | 取得搜尋商品 | GET | products/search`<keyword>` | ###### 路由 | 路由 | 按鈕 | | ----------------------------------- | -------------- | | 前往[搜尋結果頁面](#搜尋結果頁面) | 搜尋 icon | ###### 操作 | 操作 | 按鈕 | Method | 後端 API | 備註 | | ---------------- | -------- | ------ | ---------------------- | --- | | 載入更多商品資料 | 查看更多 | GET | products/search`<keyword>` | cursor-based | #### ☞ 介面 [商品搜尋結果](https://app.zeplin.io/project/5f9284129655d35999923975/screen/5f9aa028f547dd4902d0df78) #### ☞ 邏輯 暫無 #### ☞ 異常情形處理 暫無 #### ☞ 資料結構 暫無 ### 分類功能 #### ☞ 描述 使用者可以藉由點選分類列表的按鈕篩選出該分類商品 #### ☞ 條件 |類型|角色|權限|狀態| |-|-|-|-| |瀏覽任一分類商品|任何|1|x| #### ☞ 路由 ###### 渲染 | 說明 | Method | 後端 API | | -------------- | ------ | --------------------------- | | 取得分類商品 | GET | /products/category/:id | ###### 路由 | 路由 | 按鈕 | | ----------------------------------- | -------------- | | 前往[某商品頁面](#單一商品詳細頁面) | 商品圖片或名稱 | #### ☞ 介面 [分類搜尋結果](https://app.zeplin.io/project/5f9284129655d35999923975/screen/5fa1143411fbca3382d984e6) #### ☞ 邏輯 暫無 #### ☞ 異常情形處理 暫無 #### ☞ 資料結構 暫無 ### 單一商品詳細頁面 #### ☞ 描述 點選商品圖片或名稱即可瀏覽該商品詳細資訊 #### ☞ 條件 |類型|角色|權限|狀態| |-|-|-|-| |瀏覽單一商品|任何|1|x| #### ☞ 路由 ###### 渲染 | 說明 | Method | 後端 API | 備註 | | -------------- | ------ | -------- |---| | 取得該商品資料 | GET | products/:id || | 取得該賣家三個商品 | GET | /products/vendor/:id?limit=3 |WF 未統一 網頁板:3 手機板:4| ###### 路由 | 路由 | 按鈕 | | ----------------------------------- | -------------- | | 前往[某商品頁面](#單一商品詳細頁面) | 商品圖片或名稱 | | 前往[賣家頁面](#賣家賣場頁面) | 看更多(網頁版), 賣家頭像或名稱(手機板) | ###### 操作 | 操作 | 按鈕 | Method | 後端 API | 備註 | | -------------------- | ---------- | ------ | ----------------------- | ---- | | 將商品加入購物車 | 加入購物車 | POST | /carts/:id | | | 打開賣家聯絡資訊視窗 | 聯絡賣家 | GET | users/:id | P2 | | 關注賣家 | 加入關注 | POST | | P2 | #### ☞ 介面 [單一商品詳細資料](https://app.zeplin.io/project/5f9284129655d35999923975/screen/5f9a28b401719cb914d125c3) #### ☞ 邏輯 暫無 #### ☞ 異常情形處理 暫無 #### ☞ 資料結構 暫無 ### 刊登功能 #### ☞ 描述 賣家可在後台刊登新商品 #### ☞ 條件 |類型|角色|權限|狀態| |-|-|-|-| |刊登商品|用戶|3|登入 + 賣家身份| #### ☞ 路由 ###### 路由 | 路由 | 按鈕 | | ------------ | ------ | | 回上一頁 | 取消 | ###### 操作 | 操作 | 按鈕 | Method | 後端 API | 備註 | | ------------ | -------- | ------ | ---------------- | ------------------------------ | | 上傳商品照片 | 選擇照片 | | | 串 Imgur API 將 url 放進 input | | 新增商品 | 送出(網頁版) 確定新增商品(手機版) | POST | products/new | | #### ☞ 介面 [刊登商品](https://app.zeplin.io/project/5f9284129655d35999923975/screen/5f9aa4198f1176bb15fa4fee) |元素|規則|錯誤提示| |- |- |- | |名稱|必填|此欄位為必填| |商品介紹|必填|此欄位為必填| |圖片|檔案大小 <= 1500K|此欄位為必填| |分類|必填|此欄位為必填| |價格|必填|此欄位為必填| |*數量|必填|此欄位為必填| |備貨時間|必填|此欄位為必填| |出貨地點|必填|此欄位為必填| |取貨方式|必填|此欄位為必填| |付款方式|必填|此欄位為必填| |備註|選填|| #### ☞ 邏輯 暫無 #### ☞ 異常情形處理 暫無 #### ☞ 資料結構 |欄位|型態|長度|必填|預設|備註| |-|-|-|-|-|-| |名稱|varchar|24|Y||| |商品介紹|text||Y||| |圖片|varchar|64|Y||| |分類|int||Y||| |價格|int||Y||| |數量|int||Y||WF 缺少欄位| |備貨時間|int||Y||WF 是否需要統一| |出貨地點|varchar||Y||填寫? 勾選? 下拉選單?| |取貨方式|tinyint||Y||0:面交| |付款方式|tinyint||Y||0: 貨到付款| |備註|text||||| ### 賣家管理商品 #### ☞ 描述 賣家可以在後台管理上架/未上架商品 #### ☞ 條件 |類型|角色|權限|狀態| |-|-|-|-| |管理商品|用戶|3|登入 + 賣家身份| #### ☞ 路由 ##### 賣家後台 ###### 渲染 | 說明 | Method | 後端 API | | ---------------- | ------ | ------------------- | | 取得自己的賣家商品 | GET | demo/vendor/:id/products/ | ###### 路由 | 路由 | 按鈕 | | ---------------------------------------- | ------------ | | 前往[某商品頁面](#單一商品詳細頁面) | 檢視 | | 前往[編輯商品頁面](#編輯商品頁面) | 編輯 | ###### 操作 | 操作 | 按鈕 | Method | 後端 API | 備註 | | -------------------- | ------------ | ------ | ---------------------------------- | ------------ | | 查看未上架商品 | 已下架 | PATCH | demo/vendor/:id/products/unchecked | | | 載入更多賣家商品 | 看更多 | GET | demo/vendor/:id/products/ | cursor-based | | 將商品改為下架狀態 | 下架(網頁版) 刪除(手機板) | PATCH | demo/vendor/:id/products/:id | | ##### 編輯商品頁面 ###### 路由 | 路由 | 按鈕 | | ------------ | ------ | | 回上一頁 | 取消 | ###### 操作 | 操作 | 按鈕 | Method | 後端 API | 備註 | | ------------ | -------- | ------ | ---------------- | ------------------------------ | | 上傳商品照片 | 選擇照片 | | | 串 Imgur API 將 url 放進 input | | 編輯商品 | 送出(網頁版), 確定編輯商品(手機版) | PATCH | products/:id | | #### ☞ 介面 [賣家商店頁面](https://app.zeplin.io/project/5f9284129655d35999923975/screen/5f9aa4b2a5efb31dc9708c0e) [賣家後台頁面](https://app.zeplin.io/project/5f9284129655d35999923975/screen/5f9aa3bbe58db245d57cdd7b) 編輯商品頁面 |元素|規則|錯誤提示| |- |- |- | |名稱|必填|此欄位為必填| |商品介紹|必填|此欄位為必填| |圖片|檔案大小 <= 1500K|此欄位為必填| |分類|必填|此欄位為必填| |價格|必填|此欄位為必填| |*數量|必填|此欄位為必填| |備貨時間|必填|此欄位為必填| |出貨地點|必填|此欄位為必填| |取貨方式|必填|此欄位為必填| |付款方式|必填|此欄位為必填| |備註|選填|| #### ☞ 邏輯 暫無 #### ☞ 異常情形處理 暫無 #### ☞ 資料結構 |欄位|型態|長度|必填|預設|備註| |-|-|-|-|-|-| |名稱|varchar|24|Y||| |商品介紹|text||Y||| |圖片|varchar|64|Y||| |分類|int||Y||| |價格|int||Y||| |數量|int||Y||WF 缺少欄位| |備貨時間|int||Y||WF 是否需要統一| |出貨地點|varchar||Y||填寫? 勾選? 下拉選單?| |取貨方式|tinyint||Y||0:面交| |付款方式|tinyint||Y||0: 貨到付款| |備註|text||||| ------ ## 購物車系統 ### 商品加入購物車 #### ☞ 描述 身為使用者,可以再商品頁面把商品加入購物車中,並且可以在購物車頁面看到自己購物車的商品 #### ☞ 條件 | 角色 | 權限 | 狀態 | | ---- | ---- | ------ | | 用戶 | 2 | 登入 | #### ☞ 路由 ##### 購物車頁面 渲染 | 說明 | Method | 後端 API | | ---------------------- | ------ | ---------- | | 取得自己所有購物車商品 | GET | /carts/:id | 路由 | 路由 | 按鈕 | | ------------ | -------- | | 前往結帳頁面 | 前往結帳 | | 回到上一頁 | 返回 | 操作 | 操作 | 按鈕 | Method | 後端 API | 備註 | | -------------------- | -------------- | ------ | -------------------- | ----------------------- | | 更改購物車商品數量 | 數量下拉式選單 | PATCH | /carts/cart-item/:id | | | 刪除購物車商品 | 刪除 icon | DELETE | /carts/cart-item/:id | | | 刪除購物車同賣家商品 | 刪除 icon | DELETE | /carts/seller/:id | | | 選擇收件地 | | | | 預設面交,其他選項為 P2 | | 選擇運送方式 | | | | 預設面交,其他選項為 P2 | #### ☞ 介面 ##### [購物車頁面](https://app.zeplin.io/project/5f9284129655d35999923975/screen/5f9a5c7b8a33301fc85e02b0) [購物車明細](https://app.zeplin.io/project/5f9284129655d35999923975/screen/5f9a6d03ce58c8244317359a) #### ☞ 邏輯 X #### ☞ 異常情形處理 X #### ☞ 資料結構 Table cart_items | 欄位 | 型態 | 長度 | 必填 | 預設 | 備註 | | ---------------- | ------- | ---- | ---- | ---- | ---- | | id | int | int | Y | | | | ProductId | int | 64 | Y | | | | SellerId | int | 64 | Y | | | | CartId | int | 64 | Y | | | | product_name | varchar | 255 | Y | | | | product_quantity | int | 64 | Y | | | | product_price | int | 64 | Y | | | ### 買家選擇購物車商品結帳 #### ☞ 描述 買家可以選擇購物車內的商品並進入結帳畫面 #### ☞ 條件 | 角色 | 權限 | 狀態 | | ---- | ---- | ------ | | 用戶 | 2 | 登入 | #### ☞ 路由 ##### 訂單結帳頁面 渲染 | 說明 | Method | 後端 API | 備註 | | -------------------- | ------ | ---------- | ------------------------------------ | | 取得本次要結帳的商品 | | | 由前端從購物車頁面的打勾狀態篩選出來 | | 取得賣家的寄件資訊 | GET | /users/:id | | | 取得自己的收件資訊 | GET | /users/me | | 路由 | 路由 | 按鈕 | | ----------------------------- | ---------- | | 返回[購物車](#我的購物車頁面) | 返回購物車 | 操作 | 操作 | 按鈕 | Method | 後端 API | 備註 | | ------------------ | -------- | ------ | -------- | ----------- | | 打開編輯收件人視窗 | 編輯按鈕 | | | | | 送出訂單 | 送出訂單 | POST | | /orders/new | ##### 編輯收件人視窗 渲染 | 說明 | Method | 後端 API | 備註 | | -------------------- | ------ | ---------- | ------------------------------------ | | 取得自己的收件資訊 | GET | /users/me | | 操作 | 操作 | 按鈕 | Method | 後端 API | 備註 | | ------------------ | -------- | ------ | -------- | ----------- | | 更改自己的收件資訊 | 更新 | PATCH | | /users/me | | 送出訂單 | 送出訂單 | POST | | /orders/new | ##### 完成訂單頁面 渲染 | 說明 | Method | 後端 API | | ---------------------- | ------ | ------------------ | | 取得單一訂單資訊 | GET | /orders/:id | 路由 | 路由 | 按鈕 | | ----------------------------- | ---------- | | 返回[首頁](#首頁) | 返回首頁 | #### ☞ 介面 ##### [訂單結帳頁面](https://app.zeplin.io/project/5f9284129655d35999923975/screen/5f9d5ca2463eaa452d6b7311) ![](https://i.imgur.com/LUbdhtd.png) ##### [編輯收件人視窗](https://app.zeplin.io/project/5f9284129655d35999923975/screen/5f9d5ce903d49bbb4011e196) [查看收件人資訊](https://app.zeplin.io/project/5f9284129655d35999923975/screen/5f9d5d81c0bfb92a18f92f06) | 元素 | 規則 | 錯誤提示 | | ------ | ----------------- | ------------ | | 收件人 | 必填 + 不接受空行 | 欄位規格不符 | | 手機 | 必填 + 不接受空行 | 欄位規格不符 | | 地址 | 必填 + 不接受空行 | 欄位規格不符 | ##### [訂單完成頁面](https://app.zeplin.io/project/5f9284129655d35999923975/screen/5f9d5cb1a96d9cba0013f26b) #### ☞ 邏輯 x #### ☞ 異常情形處理 x #### ☞ 資料結構 table users | 欄位 | 型態 | 長度 | 必填 | 預設 | 備註 | | -------- | ------- | ---- | ---- | ---- | ---- | | nickname | varchar | 255 | Y | | | | phone | varchar | 255 | Y | | | | address | varchar | 255 | Y | | | table orders | 欄位 | 型態 | 長度 | 必填 | 預設 | 備註 | | -------------- | ------- | ---- | ---- | ---- | ---- | | order_number | int | 64 | Y | | | | seller_id | int | 64 | Y | | | | seller_name | varchar | 255 | Y | | | | seller_email | varchar | 255 | Y | | | | seller_phone | varchar | 255 | Y | | | | seller_address | text | | Y | | | | client_id | init | 64 | Y | | | | client_name | varchar | 255 | Y | | | | client_email | varchar | 255 | Y | | | | client_phone | varchar | 255 | Y | | | | client_address | varchar | 255 | Y | | | | total_quantity | int | 64 | Y | | | | shipping | int | 64 | | | | | total_amount | int | 64 | Y | | | | content | text | | | | | | is_sent | boolean | | | 0 | | | is_paid | boolean | | | 0 | | | is_canceled | boolean | | | 0 | | | is_completed | boolean | | | 0 | | | is_refunded | boolean | | | 0 | | table orders_items | 欄位 | 型態 | 長度 | 必填 | 預設 | 備註 | | ------------------- | ------- | ---- | ---- | ---- | --------------- | | ProductId | int | 64 | Y | | | | OrderId | int | 64 | Y | | | | product_name | varchar | 255 | Y | | | | product_category_id | varchar | 255 | Y | | | | product_picture_url | varchar | 255 | Y | | | | product_info | text | | Y | | | | product_price | init | 64 | Y | | | | product_quantity | init | 64 | Y | | | ### 商品異動即時更新(列為 p2 先不做) ------ ## 訂單系統 ### 買家編輯訂單狀態 #### ☞ 描述 - 訂單成立之後,買家可以將付款狀態改為已付款 - 訂單成立之後,買家可以取消訂單 - 訂單成立之後,買家可以完成訂單 #### ☞ 條件 | 角色 | 權限 | 狀態 | | ---- | ---- | ------ | | 用戶 | 2 | 登入 | #### ☞ 路由 ##### 買家訂單明細頁面 渲染 | 說明 | Method | 後端 API | | ---------------- | ------ | ----------- | | 取得單一訂單資料 | GET | /orders/:id | 路由 | 路由 | 按鈕 | | ------------------------------------- | ------ | | 前往[我的訂單列表](#我的訂單列表頁面) | 回總覽 | 操作 | 操作 | 按鈕 | Method | 後端 API | 備註 | | -------- | -------- | ------ | -------------------- | ---- | | 付款完成 | 付款完成 | PATCH | /orders/:id/pay | | | 取消訂單 | 取消訂單 | PATCH | /orders/:id/cancel | | | 完成訂單 | 完成訂單 | PATCH | /orders/:id/complete | | #### ☞ 介面 ##### [買家訂單列表頁面](https://app.zeplin.io/project/5f9284129655d35999923975/screen/5f9aa0cd1125e0ba5276aca8) ##### [買家訂單明細頁面](https://app.zeplin.io/project/5f9284129655d35999923975/screen/5f9bf869cb32a020fa078830) #### ☞ 邏輯 x #### ☞ 異常情形處理 x #### ☞ 資料結構 table orders | 欄位 | 型態 | 長度 | 必填 | 預設 | 備註 | | -------------- | ------- | ---- | ---- | ---- | ---- | | order_number | int | 64 | Y | | | | is_paid | boolean | | | 0 | | | is_canceled | boolean | | | 0 | | | is_completed | boolean | | | 0 | | ### 賣家編輯訂單狀態 #### ☞ 描述 - 訂單成立之後,賣家可以將出貨狀態改為已出貨 - 訂單成立之後,賣家可以取消訂單 #### ☞ 條件 | 角色 | 權限 | 狀態 | | ---- | ---- | ---- | | 賣家 | 3 | 登入 | #### ☞ 路由 ##### 賣家銷售訂單明細頁面 渲染 | 說明 | Method | 後端 API | | -------------------- | ------ | ----------- | | 取得單一銷售訂單資料 | GET | /orders/:id | 路由 | 路由 | 按鈕 | | ----------------------------------------- | ------ | | 前往[我的銷售訂單總覽頁面](#我的銷售頁面) | 回總覽 | 操作 | 操作 | 按鈕 | Method | 後端 API | 備註 | | ------------ | -------- | ------ | ------------------ | ---- | | 更改訂單狀態 | 已出貨 | PATCH | /orders/:id/send | | | 取消訂單 | 取消訂單 | PATCH | /orders/:id/cancel | | #### ☞ 介面 ##### [賣家訂單明細頁面](https://app.zeplin.io/project/5f9284129655d35999923975/screen/5f9bf8221a3aa943b663c3ac) ##### [賣家訂單列表頁面](https://app.zeplin.io/project/5f9284129655d35999923975/screen/5f9aa10396e7f8b5cd71a8c3) #### ☞ 邏輯 x #### ☞ 異常情形處理 x #### ☞ 資料結構 table orders | 欄位 | 型態 | 長度 | 必填 | 預設 | 備註 | | -------------- | ------- | ---- | ---- | ---- | ---- | | order_number | int | 64 | Y | | | | is_sent | boolean | | | 0 | | | is_canceled | boolean | | | 0 | | ------ ## 後台管理系統 ### 管理員管理用戶 #### ☞ 描述 管理員在這個頁面可以編輯用戶的權限,分為停權&正常兩種。 也可以在這個頁面連結到用戶的賣家頁面,查看資料是否有異常。 #### ☞ 條件 |類型|角色|權限|狀態| |-|-|-|-| |查看用戶的賣家頁面|管理員|4|O | |編輯用戶的權限|管理員|4|O | #### ☞ 路由 | 路由 | 按鈕 | | ---------- | ---- | | 前往[賣家頁面](#賣家頁面) | 連結 | | 選擇賣家權限為 正常 or 停權 | 編輯 | | 編輯完成賣家權限後 | 送出 | | 取消編輯賣家權限 | 取消 | | 首頁 | 返回 | | 上一頁 | 返回 | | 下一頁 | 前往 | | 最後一頁 | 前往 | | 載入搜尋結果的前 10 筆用戶資料 | 搜尋 | | 回到管理首頁 |回到管理首頁 | | 回到平台首頁 | LOGO | | 夜間模式 | 月亮icon | | 登出| 登出 | | FAQ| FAQ | | 條款| 條款 | | 關於我們| 關於我們 | | social media| social media | #### ☞ 操作 | 操作 | 按鈕 | Method | 後端 API | 備註 | | ------------------------------ | -------- | ------ | ------------------------------- | ------ | | 重新載入前 10 筆用戶資料 | 用戶管理 | GET | /users?limit=10 | 不換頁 | | 載入搜尋結果的前 10 筆用戶資料 | 搜尋 | GET | /users/:name?limit=10 | 不換頁 | | 載入第一頁 | 首頁 | GET | /users?limit=10 | 不換頁 | | 載入下一頁的 10 筆用戶資料 | 下一頁 | GET | /users?limit=10 | 不換頁 | | 載入上一頁的 10 筆用戶資料 | 上一頁 | GET | /users?limit=10 | 不換頁 | | 載入最後一頁的用戶資料 | 最後一頁 | GET | /users?limit=10 | 不換頁 | | 編輯使用者權限 | 送出 | PATCH |/user/:id | | #### ☞ 介面 [管理用戶頁面](https://app.zeplin.io/project/5f9284129655d35999923975/screen/5faf6ffbad786b64847ff812) [設定用戶權限](https://app.zeplin.io/project/5f9284129655d35999923975/screen/5f9bf4bdd301e1473e0c18d5) #### ☞ 邏輯 x #### ☞ 異常情形處理 x #### ☞ 資料結構 |欄位|型態|長度|必填|預設|備註| |-|-|-|-|-|-| |is_admin(1:管理員)|boolean||Y||| |avatar_url用戶照片|varchar||Y||| | status權限|tinyint||Y||0: 正常、1:停權| | username用戶名稱|varchar ||Y||| | id|int ||||| ### 管理員管理商品 #### ☞ 描述 進入管理員後台首頁會有一整排的商品待審查畫面。 #### ☞ 條件 |類型|角色|權限|狀態| |-|-|-|-| |若是商品審查通過,按下送出的icon會把商品送到是否確認商品上架的頁面。 若是商品審查未通過,按下送出會發通知告知賣家。|管理員|4|O | #### ☞ 路由 | 路由 | 按鈕 | | ---------- | ---- | | 前往[類別設定頁面](#類別設定頁面) | 類別設定 | | 前往[用戶管理頁面](#用戶管理頁面) | 用戶管理 | | 前往[商品管理頁面](#商品管理頁面) | 商品管理 | | 前往[訊息中心頁面](#訊息中心頁面) | 訊息中心| | 前往[查看通知頁面](#查看通知頁面) | 查看通知| | 前往[條款管理頁面](#條款管理頁面) | 條款管理| | 前往[FAQ管理頁面](#FAQ管理頁面) | FAQ管理| | 首頁 | 返回 | | 審查通過的商品送到待上架商品管理頁面|送出 icon | | 審查未通過的上品發出通知給賣家|送出 icon | | 上一頁 | 返回 | | 下一頁 | 前往 | | 最後一頁 | 前往 | | 回到管理首頁 |回到管理首頁 | | 回到平台首頁 | LOGO | | 夜間模式 | 月亮icon | | 登出| 登出 | | FAQ| FAQ | | 條款| 條款 | | 關於我們| 關於我們 | | social media| social media | #### ☞ 介面 []() [審核商品頁面](https://app.zeplin.io/project/5f9284129655d35999923975/screen/5fa109ec0718838d0caaa61d) ###### 渲染 | 渲染 | 按鈕 | Method | 後端 API | 備註 | | --- | ---- | ------ | ------------- | ---------------- | | 載入待審查商品的前 10 筆商品資料 |載入|GET|/product/:name?limit=10 |不換頁 | ###### 操作 | 操作 | 按鈕 | Method | 後端 API | 備註 | | --- | ---- | ------ | ------------- | ---------------- | | 編輯商品的審核狀態 |送出 |PATCH |/manages/audit |這樣要用迴圈 call 很多次,不知道有沒有更好的做法 | | 載入搜尋結果的前 10 筆待審核商品資料 |搜尋 |GET|/products/unaudited:name?limit=10 |不換頁 | | 載入第一頁 | 首頁 | GET | /product?limit=10 | 不換頁 | | 載入下一頁的 10 筆商品資料 | 下一頁 | GET | /product?limit=10 | 不換頁 | | 載入上一頁的 10 筆商品資料 | 上一頁 | GET | /product?limit=10 | 不換頁| | 載入最後一頁的商品資料 | 最後一頁 | GET | /product?limit=10 | 不換頁 | #### ☞ 邏輯 x #### ☞ 異常情形處理 x #### ☞ 資料結構 |欄位|型態|長度|必填|預設|備註| |-|-|-|-|-|-| |is_admin(1:管理員)|boolean||Y||| |picture_url商品照片|varchar||Y||上傳 Imgur 後的圖片 URL| | info商品敘述|text||Y||| | name商品名稱|varchar ||Y||| | price商品金額|int ||Y||| | createdAt刊登時間|datetime ||Y||| | status審查狀態|tinyint ||Y|0:未審查 |0: 未審查、1:已審核通過、2:未通過| | id|int ||||| ### 管理員編輯條款(列為 p2 先不做) #### ☞ 描述 在這個頁面可以新增、編輯、刪除條款 #### ☞ 條件 |類型|角色|權限|狀態| |-|-|-|-| |新增條款。|管理員|4|O | |編輯條款。|管理員|4|O | |刪除條款。|管理員|4|O | #### ☞ 路由 | 路由 | 按鈕 | | ---------- | ---- | | 首頁 | 返回 | | 上一頁 | 返回 | | 下一頁 | 前往 | | 最後一頁 | 前往 | | 編輯條款 | 編輯 | | 新增條款 | 新增 | | 刪除條款 | 刪除 | | 回到管理首頁 |回到管理首頁 | | 回到平台首頁 | LOGO | | 夜間模式 | 月亮icon | | 登出| 登出 | | FAQ| FAQ | | 條款| 條款 | | 關於我們| 關於我們 | | social media| social media | #### ☞ 介面 [編輯條款](https://app.zeplin.io/project/5f9284129655d35999923975/screen/5fa159ed6b0be17e5bd0e9d0) ###### 操作 | 操作 | 按鈕 | Method | 後端 API | 備註 | | ------------ | -------- | ------ | ------------------- | ---- | | 編輯條款視窗 | 編輯 | PATCH | /manages/rules/:id | | | 刪除條款 | 刪除 | DELETE | /manages/rules/:id | | | 新增條款 | 送出 | POST | /manages/rules/new | | | 取得所點選的條款資料 | |GET| /manages/rules/:id | | 取得所有條款資料 | |GET| /manages/rules | #### ☞ 邏輯 x #### ☞ 異常情形處理 x #### ☞ 資料結構 |欄位|型態|長度|必填|預設|備註| |-|-|-|-|-|-| |is_admin(1:管理員)|boolean||Y||| |rule條款名稱|text||Y||| | content條款內容|text||Y||| | id|int ||||| ### 管理員分類管理(列為 p2 先不做) #### ☞ 描述 在這個頁面僅供瀏覽 #### ☞ 條件 |類型|角色|權限|狀態|備註| |-|-|-|-|-| |新增分類。|管理員|4|O | | #### ☞ 路由 | 路由 | 按鈕 | | ---------- | ---- | | 首頁 | 返回 | | 上一頁 | 返回 | | 下一頁 | 前往 | | 最後一頁 | 前往 | | 回到管理首頁 |回到管理首頁 | | 回到平台首頁 | LOGO | | 夜間模式 | 月亮icon | | 登出| 登出 | | FAQ| FAQ | | 條款| 條款 | | 關於我們| 關於我們 | | social media| social media | #### ☞ 介面 [管理分類](https://app.zeplin.io/project/5f9284129655d35999923975/screen/5fa118079579ec19b1b8a533) #### ☞ 邏輯 x #### ☞ 異常情形處理 x #### ☞ 資料結構 |欄位|型態|長度|必填|預設|備註| |-|-|-|-|-|-| |is_admin(1:管理員)|boolean||Y||| ### 管理員FAQ管理(列為 p2 先不做) #### ☞ 描述 在這個頁面可以新增、編輯、刪除FAQ #### ☞ 條件 |類型|角色|權限|狀態|備註| |-|-|-|-|-| |新增FAQ。|管理員|4|O | | |編輯FAQ。|管理員|4|O || #### ☞ 路由 | 路由 | 按鈕 | | ---------- | ---- | | 首頁 | 返回 | | 上一頁 | 返回 | | 下一頁 | 前往 | | 最後一頁 | 前往 | | 編輯FAQ | 編輯 | | 新增FAQ | 新增 | | 刪除FAQ | 刪除 | | 回到管理首頁 |回到管理首頁 | | 回到平台首頁 | LOGO | | 夜間模式 | 月亮icon | | 登出| 登出 | | FAQ| FAQ | | 條款| 條款 | | 關於我們| 關於我們 | | social media| social media | #### ☞ 介面 [新增FAQ頁面](https://app.zeplin.io/project/5f9284129655d35999923975/screen/5fa15b0d8e1e54b0a6f0ca9d) ###### 操作 | 操作 | 按鈕 | Method | 後端 API | 備註 | | -------- | ---- | ------ | --------------- | ---- | | 取得所有 FAQ | GET | GET| /manages/faqs | | | 編輯 FAQ 視窗 | 編輯 | PATCH | /manages/faqs/:id | | | | 刪除 FAQ | 刪除 | DELETE | /manages/faqs/:id | | | 新增常見問題 | 送出 | POST |/manages/faqs/new | | | 取得所點選的 FAQ 資料 | | GET |/manages/faqs/:id | #### ☞ 邏輯 x #### ☞ 異常情形處理 x #### ☞ 資料結構 |欄位|型態|長度|必填|預設|備註| |-|-|-|-|-|-| |is_admin(1:管理員)|boolean||Y||| |question問題|text||Y||| |answer回答|text||Y||| |createdAt |datetime||Y||| | id|int ||Y||| | Faqs_categoryId|int ||Y||| ### 管理員查看通知 #### ☞ 描述 查看用戶透過站內信的來信 #### ☞ 條件 |類型|角色|權限|狀態|備註| |-|-|-|-|-| |傳送回覆信件|管理員|4|O | | |查看所有用戶寄來的站內信|管理員|4|O || |封存已看過且已回覆的站內信|管理員|4|O || #### ☞ 路由 | 路由 | 按鈕 | | ---------- | ---- | | 首頁 | 返回 | | 上一頁 | 返回 | | 下一頁 | 前往 | | 最後一頁 | 前往 | | 封存訊息 | x icon | | 看完整訊息 | 查看更多 | | 回覆訊息 | 送出 | | 搜尋個別用戶的訊息 | 搜尋 | | 回到管理首頁 |回到管理首頁 | | 回到平台首頁 | LOGO | | 夜間模式 | 月亮icon | | 登出| 登出 | | FAQ| FAQ | | 條款| 條款 | | 關於我們| 關於我們 | | social media| social media | #### ☞ 介面 [查看站內信](https://app.zeplin.io/project/5f9284129655d35999923975/screen/5fafa372a5c17766f86474ea) ###### 操作 | 操作 | 按鈕 | Method | 後端 API | 備註 | | -------- | -------- | ------ | --------------------------- | ---- | | 新增留言 | 送出留言 | POST | /users/:id/board/comment | | | 取得所有用戶寄來的站內信 | | GET | /manages/mail| | | 取得單一用戶寄來的站內信 | | GET | /manages/mail/:id| | | 編輯留言板留言 | | PATCH | /users/:id/board/comment/:id| | | 刪除留言板留言 | | DELETE | /users/:id/board/comment/:id| | #### ☞ 邏輯 x #### ☞ 異常情形處理 x #### ☞ 資料結構 |欄位|型態|長度|必填|預設|備註| |-|-|-|-|-|-| |is_admin(1:管理員)|boolean||Y||| |name站內信主旨|varchar||Y||| |email用戶信箱|varchar||Y||| |createdAt |datetime||Y||| | id|int ||Y||| | content來信內容|text ||Y||| | phone用戶手機號碼|varchar ||Y||| | usernamem用戶名稱|varchar ||Y||| | avatar_url用戶照片|varchar ||Y||| ### 管理員訊息中心(列為 p2 先不做) #### ☞ 描述 查看用戶透過幫助內聯絡我們的留言板的訊息 #### ☞ 條件 |類型|角色|權限|狀態|備註| |-|-|-|-|-| |傳送回覆訊息|管理員|4|O | | |查看所有用戶發送的訊息|管理員|4|O || |封存已看過且已回覆的站內信|管理員|4|O || #### ☞ 路由 | 路由 | 按鈕 | | ---------- | ---- | | 首頁 | 返回 | | 上一頁 | 返回 | | 下一頁 | 前往 | | 最後一頁 | 前往 | | 封存訊息 | x icon | | 看完整訊息 | 查看更多 | | 回覆訊息 | 送出 | | 搜尋個別用戶的訊息 | 搜尋 | | 回到管理首頁 |回到管理首頁 | | 回到平台首頁 | LOGO | | 夜間模式 | 月亮icon | | 登出| 登出 | | FAQ| FAQ | | 條款| 條款 | | 關於我們| 關於我們 | | social media| social media | #### ☞ 介面 [聊天視窗](https://app.zeplin.io/project/5f9284129655d35999923975/screen/5fa109ec18ebceac639a6867) ###### 操作 | 操作 | 按鈕 | Method | 後端 API | 備註 | | -------- | -------- | ------ | --------------------------- | ---- | | 新增留言 | 送出留言 | POST | /users/:id/board/comment | | | 取得使用者留言板所有留言 | | GET | /users/:id/board| | | 編輯留言板留言 | 編輯 | PATCH | /users/:id/board/comment/:id| | | 刪除留言板留言 | 刪除 | DELETE | /users/:id/board/comment/:id| | #### ☞ 邏輯 x #### ☞ 異常情形處理 x #### ☞ 資料結構 |欄位|型態|長度|必填|預設|備註| |-|-|-|-|-|-| |is_admin(1:管理員)|boolean||Y||| |name站內信主旨|varchar||Y||| |createdAt |datetime||Y||| | id|int ||Y||| | content來信內容|text ||Y||| | usernamem用戶名稱|varchar ||Y||| | avatar_url用戶照片|varchar ||Y||| ------ ## 網站系統 ### 用戶查看常見問題 #### ☞ 描述 導到一個新的頁面顯示於頁面上 第一版的問題內容,不提供新增及編輯,寫死於資料庫當中 #### ☞ 條件 |類型|角色|權限|狀態| |-|-|-|-| |查看常見問題|任何|1|x| #### ☞ 路由 渲染 | 說明 | Method | 後端 API | | -------------- | ------ | -------- | | 取得所有 FAQ | GET | manages/faq | #### ☞ 介面 [常見問題](https://app.zeplin.io/project/5f9284129655d35999923975/screen/5fc8b4f53ba1b63c81dcf009) #### ☞ 邏輯 暫無 #### ☞ 異常情形處理 暫無 #### ☞ 資料結構 |欄位|型態|長度|必填|預設|備註| |-|-|-|-|-|-| |Question|varchar|24|Y||| |Answer|text||Y||| ### 用戶查看條款 #### ☞ 描述 導到一個新的頁面顯示於頁面上 第一版的條款內容,不提供新增及編輯,寫死於資料庫當中 #### ☞ 條件 |類型|角色|權限|狀態| |-|-|-|-| |查看常見問題|任何|1|x| #### ☞ 路由 渲染 | 說明 | Method | 後端 API | | -------------- | ------ | -------- | | 取得所有條款 | GET | manages/rule | 路由 | 路由 | 按鈕 | | ---------------- | -------------- | | 回到上一頁 | 取消 | #### ☞ 介面 [條款列表](https://app.zeplin.io/project/5f9284129655d35999923975/screen/5fa11147ca626c4cd3cd85fb) [單一條款明細](https://app.zeplin.io/project/5f9284129655d35999923975/screen/5fa111476b5aaa4e7a69cd16) #### ☞ 邏輯 暫無 #### ☞ 異常情形處理 暫無 #### ☞ 資料結構 |欄位|型態|長度|必填|預設|備註| |-|-|-|-|-|-| |標題|24|Y||| |內容|text||Y||| ------ ## 資料庫欄位表 ``` Table users { id int PK username varchar password varchar nickname varchar email varchar address varchar // 地址 role tinyint // 0:一般用戶、1:管理員 is_vendor tinyint // 0: 非賣家、1:已開通賣家 announcment text // 賣家頁面的公告 account varchar // 賣家匯款帳號 socialmedia_id varchar // 暫定為 LINE 帳號 birthday datetime id_card_no varchar // 身份證字號 avatar_url varchar // 使用者照片 banner_url varchar // 賣家頁面的 banner 圖片 status tinyint // 0: 正常、1:停權 deletedAt timestamp createdAt datetime updatedAt datetime } Table boards { id int UserId int createdAt datetime updatedAt datetime } Table board_comments { id int user_id int comment varchar deletedAt timestamp createdAt datetime updatedAt datetime } Table products { id int PK name varchar CategoryId int picture_url varchar // 上傳 Imgur 後的圖片 URL info text // 商品敘述 price int quantity int delivery tinyint // 出貨方式 0:面交、1:郵寄 status tinyint // 0: 未審查、1:已審核通過、2:未通過 UserId int // 關聯到 users,識別此商品的賣家 deletedAt timestamp createdAt datetime updatedAt datetime } Table product_categories { id int PK name varchar deletedAt timestamp createdAt datetime updatedAt datetime } Table orders { id int PK order_number int // unique 訂單編號,例如 AE20201101001 seller_id int // 關聯到 users,識別此訂單賣家 client_id int // 關聯到 users,識別此訂單買家 total_quantity init // 訂單總數量 shipping init // 訂單運費 total_amount int // 訂單總金額 content varchar // 訂單備註內容 client_address varchar client_email varchar is_paid tinyint // *是否付款:0 未付款、1 已付款、2 已收到退款 is_sent tinyint // *是否寄送:0 賣家未出貨、1 賣家點選已出貨 is_completed tinyint // *是否完成交易:0 訂單未完成、1 訂單已完成、2 訂單取消中、3 訂單已取消 is_refunded tinyint // *是否完成交易:0 未退款、1 已退款 createdAt datetime updatedAt datetime } Table order_items { id int PK ProductId int // 關聯 product,拿到此項 order item 的商品細節 OrderId int // 關聯 order,識別此 order item 是屬於哪張訂單 product_name varchar // 下單商品名稱 product_quantity int // 下單商品數量 product_price int // 下單商品價格,若此價格跟實際商品價格有出入,則通知買家後刷新價格 createdAt datetime updatedAt datetime } Table carts { id int PK seller_id int // 關聯到 users,識別此購物車的賣家 client_id int // 關聯到 users,識別此購物車的買家 createdAt datetime updatedAt datetime } Table cart_items { id int PK ProductId int CartId int // 關連到 carts,識別是哪一輛購物車 is_empty tinyint // 0: 正常狀態、1:沒庫存購物車失效凍結 product_name varchar product_quantity int product_price int createdAt datetime updatedAt datetime } Table faq { id int PK question text Faqs_categoryId int answer text deletedAt timestamp createdAt datetime updatedAt datetime } Table faq_categories { id int PK name varchar deletedAt timestamp createdAt datetime updatedAt datetime } Table rules { id int PK rule text content text deletedAt timestamp createdAt datetime updatedAt datetime } Ref: "products"."CategoryId" < "product_categories"."id" Ref: "products"."UserId" < "users"."id" Ref: "orders"."seller_id" < "users"."id" Ref: "orders"."client_id" < "users"."id" Ref: "order_items"."OrderId" < "orders"."id" Ref: "order_items"."ProductId" < "products"."id" Ref: "cart_items"."ProductId" < "products"."id" Ref: "cart_items"."CartId" < "carts"."id" Ref: "carts"."seller_id" < "users"."id" Ref: "carts"."client_id" < "users"."id" Ref: "boards"."UserId" < "users"."id" Ref: "faq"."Faqs_categoryId" < "faq_categories"."id" Ref: "board_comments"."user_id" < "boards"."UserId" ```

    Import from clipboard

    Paste your markdown or webpage here...

    Advanced permission required

    Your current role can only read. Ask the system administrator to acquire write and comment permission.

    This team is disabled

    Sorry, this team is disabled. You can't edit this note.

    This note is locked

    Sorry, only owner can edit this note.

    Reach the limit

    Sorry, you've reached the max length this note can be.
    Please reduce the content or divide it to more notes, thank you!

    Import from Gist

    Import from Snippet

    or

    Export to Snippet

    Are you sure?

    Do you really want to delete this note?
    All users will lose their connection.

    Create a note from template

    Create a note from template

    Oops...
    This template has been removed or transferred.
    Upgrade
    All
    • All
    • Team
    No template.

    Create a template

    Upgrade

    Delete template

    Do you really want to delete this template?
    Turn this template into a regular note and keep its content, versions, and comments.

    This page need refresh

    You have an incompatible client version.
    Refresh to update.
    New version available!
    See releases notes here
    Refresh to enjoy new features.
    Your user state has changed.
    Refresh to load new user state.

    Sign in

    Forgot password

    or

    By clicking below, you agree to our terms of service.

    Sign in via Facebook Sign in via Twitter Sign in via GitHub Sign in via Dropbox Sign in with Wallet
    Wallet ( )
    Connect another wallet

    New to HackMD? Sign up

    Help

    • English
    • 中文
    • Français
    • Deutsch
    • 日本語
    • Español
    • Català
    • Ελληνικά
    • Português
    • italiano
    • Türkçe
    • Русский
    • Nederlands
    • hrvatski jezik
    • język polski
    • Українська
    • हिन्दी
    • svenska
    • Esperanto
    • dansk

    Documents

    Help & Tutorial

    How to use Book mode

    Slide Example

    API Docs

    Edit in VSCode

    Install browser extension

    Contacts

    Feedback

    Discord

    Send us email

    Resources

    Releases

    Pricing

    Blog

    Policy

    Terms

    Privacy

    Cheatsheet

    Syntax Example Reference
    # Header Header 基本排版
    - Unordered List
    • Unordered List
    1. Ordered List
    1. Ordered List
    - [ ] Todo List
    • Todo List
    > Blockquote
    Blockquote
    **Bold font** Bold font
    *Italics font* Italics font
    ~~Strikethrough~~ Strikethrough
    19^th^ 19th
    H~2~O H2O
    ++Inserted text++ Inserted text
    ==Marked text== Marked text
    [link text](https:// "title") Link
    ![image alt](https:// "title") Image
    `Code` Code 在筆記中貼入程式碼
    ```javascript
    var i = 0;
    ```
    var i = 0;
    :smile: :smile: Emoji list
    {%youtube youtube_id %} Externals
    $L^aT_eX$ LaTeX
    :::info
    This is a alert area.
    :::

    This is a alert area.

    Versions and GitHub Sync
    Get Full History Access

    • Edit version name
    • Delete

    revision author avatar     named on  

    More Less

    Note content is identical to the latest version.
    Compare
      Choose a version
      No search result
      Version not found
    Sign in to link this note to GitHub
    Learn more
    This note is not linked with GitHub
     

    Feedback

    Submission failed, please try again

    Thanks for your support.

    On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?

    Please give us some advice and help us improve HackMD.

     

    Thanks for your feedback

    Remove version name

    Do you want to remove this version name and description?

    Transfer ownership

    Transfer to
      Warning: is a public team. If you transfer note to this team, everyone on the web can find and read this note.

        Link with GitHub

        Please authorize HackMD on GitHub
        • Please sign in to GitHub and install the HackMD app on your GitHub repo.
        • HackMD links with GitHub through a GitHub App. You can choose which repo to install our App.
        Learn more  Sign in to GitHub

        Push the note to GitHub Push to GitHub Pull a file from GitHub

          Authorize again
         

        Choose which file to push to

        Select repo
        Refresh Authorize more repos
        Select branch
        Select file
        Select branch
        Choose version(s) to push
        • Save a new version and push
        • Choose from existing versions
        Include title and tags
        Available push count

        Pull from GitHub

         
        File from GitHub
        File from HackMD

        GitHub Link Settings

        File linked

        Linked by
        File path
        Last synced branch
        Available push count

        Danger Zone

        Unlink
        You will no longer receive notification when GitHub file changes after unlink.

        Syncing

        Push failed

        Push successfully