# 甜之呼吸 後端API 文件 ### Root Path: /api/ 總共五個類別的 API * users * product * category * feature * order sss ## Users | 功能 | Method | path | | --- | --- | -------- | | 註冊 | POST |/api/register| | 登入 | POST |/api/login| | 驗證 | GET |/api/me| | 會員撈取個人資料 | GET |/api/user| | 會員編輯個人資料 | PUT |/api/user| | 管理員撈取會員資料 | GET |/api/users| | 管理員編輯會員權限 | GET |/api/users/:id| ### 註冊 URL: /api/register Method: POST 用來註冊使用者的,需要傳入 username, password email 以及 fullname,即可在系統內註冊一個使用者。( address, birthday 非必填 ) 註冊之後會拿到一個 token,是驗證身份用的,這個之後會再提到。 範例: ``` fetch('/api/register', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ fullname: 'hello', username: 'hey', password: '1234', email: '1234@123.com' }) }) .then(res => res.json()) .then(data => console.log(data)) ``` response: ``` { ok: 1, token: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImhleSIsInVzZXJJZCI6IjAwNmIwNjkwYTgyY2YiLCJpYXQiOjE2MDQxMzI4MTZ9.dfJ4z8DIASsPEytsHE3zA1i2MgNCb2zMLogfqq5ugWU" } ``` ### 登入 URL: /api/login Method: POST 傳入 username 以及 password 即可登入,登入成功以後一樣會拿到上面註冊成功的 response。 若登入會員被禁用權限(status = 0),則無法登入。 ### 身份驗證 URL:/api/me Method: GET 這個 server 會利用 HTTP Request header 中的 authorization 欄位進行驗證,假設你拿到的 token 是 1234,那 authorization 就必須帶:Bearer 1234 Server 在需要驗證身份的時候會去檢查這個 header,並把 JWT token 拿出來做比對,如果你有成功攜帶正確的 header,打這一個 API 的時候會回覆正確的使用者資料。 **可以利用回傳的 is_admin 來驗證管理權限。** 範例: ``` fetch('/api/me', { headers: { 'authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImhleSIsInVzZXJJZCI6IjAwNmIwNjkwYTgyY2YiLCJpYXQiOjE2MDQxMzI4MTZ9.dfJ4z8DIASsPEytsHE3zA1i2MgNCb2zMLogfqq5ugWU' } }) .then(res => res.json()) .then(data => console.log(data)) ``` response: ``` { "ok": 1, "data": { "username": "admin", "is_admin": true, "iat": 1608992157 } } ``` ### 會員端 #### 會員撈取個人資料 URL: /api/user Method: GET 撈取會員也是利用 HTTP Request header 中的 authorization 欄位進行驗證,假設你拿到的 token 是 1234,那 authorization 就必須帶:Bearer 1234。 Server 在需要驗證身份的時候會去檢查這個 header,並把 JWT token 拿出來做比對,如果你有成功攜帶正確的 header,打這一個 API 的時候會回覆正確的使用者資料。 ``` { "ok": 1, "data": { "username": "QQQ", "fullname": "QQ安安", "email": "QQQ@QQQ.com", "address": "安安路", "birthday": null } } ``` #### 會員編輯個人資料 URL: /api/user Method: PUT 僅可編輯 fullname, email, address, birthday 欄位,且 fullname, email 為必填欄位。 reponse: ``` { "ok": 1, "message": "編輯會員資料完成" } ``` --- ### 管理員端 URL: /api/users #### 撈取所有會員資料 URL: /api/users Method: GET 管理員撈取 GET 所有會員也是利用 HTTP Request header 中的 authorization 欄位進行驗證。 reponse: ``` { "ok": 1, "data": [ { "id": ... },{ "id": ... }, ] } ``` #### 編輯特定會員權限 URL: /api/users/:id Method: PUT 需帶入欲更改會員 id 於網址列中。 管理員 POST 編輯特定會員也是利用 HTTP Request header 中的 authorization 欄位進行驗證。並需要傳送 id (API 網址列上), is_admin, status (request body)欄位。 reponse: ``` { "ok": 1, "message": "編輯會員權限完成" } ``` ## Products | 功能 | Method | path | | --- | --- | -------- | | 撈取產品 | GET |/api/products| | 撈取單一產品 | GET |/api/product/:id| | 管理員撈取產品 | GET |/api/all_products| | 管理員新增產品 | POST |/api/product| | 管理員編輯產品 | PUT |/api/product/:id| | 管理員刪除產品 | DELETE |/api/product/:id| ### 管理員端 需利用 HTTP Request header 中的 authorization 欄位進行驗證是否有管理權限。 #### 撈取所有商品 URL: /api/all_products Method: GET 管理員查看所有未刪除的商品清單,並且和 Feature 表單關聯,可查看該商品中未刪除的規格內容。 #### 新增商品 URL: /api/product Method: POST 表單設計為每一商品至少有一個規格,在新增商品同時也會新增規格。 * 欄位:CategoryId, name, image, info, status, feature_name, price, promo_price, stock * 必填:CategoryId, name, image, feature_name, price, promo_price, stock response: ``` { ok: 1, message: "商品新增完成", } ``` #### 編輯商品 URL: /api/product/:id Method: PUT 編輯商品僅會更新商品表單,若需更新規格,需使用編輯規格 API。 * 欄位:CategoryId, name, image, info, status * 必填:CategoryId, name, image response: ``` { ok: 1, message: "商品編輯完成", } ``` #### 刪除商品 URL: /api/product/:id Method: DELETE * 備註:雖然是發 DELETE METHOD,但是後端處理是更改刪除狀態 response: ``` { ok: 1, message: "商品刪除完成", } ``` ### 訪客端 #### 撈取所有商品 URL: /api/products Method: GET 查看所有未刪除且狀態上架中的商品,並且和 Feature 表單關聯,可查看該商品中未刪除的規格內容。 #### 撈取特定商品 URL:/api/product/:id Method:GET 查看單一未刪除的商品,需帶入 id 資訊。並且和 Product 表單關聯,可查看該商品中未刪除的商品內容。 ## Category | 功能 | Method | path | | --- | --- | -------- | | 撈取分類 | GET |/api/category| | 以分類撈取產品 | GET |/api/category/product| | 以所有分類撈取所有產品 | GET |/api/category/products| | 管理員新增分類 | POST |/api/category| | 管理員編輯分類 | PUT |/api/category/:id| | 管理員刪除產品 | DELETE |/api/category/:id| ### 撈取所有分類 URL: /api/category Method: GET 查看所有未刪除的分類。 ### 以分類撈取所有產品 URL: /api/category/product Method: GET 查看所有未刪除的分類,並且和 Product 表單關聯,可查看該分類中未刪除的商品內容。(僅會顯示含有商品的分類) ### 以所有分類撈取產品 URL: /api/category/products Method: GET 查看所有未刪除的分類,並且和 Product 表單關聯,可查看該分類中未刪除的商品內容。 ### 新增分類 URL: /api/category Method: POST 需利用 HTTP Request header 中的 authorization 欄位進行驗證是否有管理權限,才可以新增商品。 * 欄位:name * 必填:name response: ``` { ok: 1, message: "分類新增完成", } ``` ### 編輯分類 URL: /api/category/:id Method: PUT 需利用 HTTP Request header 中的 authorization 欄位進行驗證是否有管理權限,才可以編輯分類。 * 欄位:name * 必填:name response: ``` { ok: 1, message: "分類編輯完成", } ``` ### 刪除分類 URL: /api/category/:id Method: DELETE 需利用 HTTP Request header 中的 authorization 欄位進行驗證是否有管理權限,才可以刪除商品。 * 備註:雖然是發 DELETE METHOD,但是後端處理是更改刪除狀態 response: ``` { ok: 1, message: "分類刪除完成", } ``` ## Feature | 功能 | Method | path | | --- | --- | -------- | | 管理員新增規格 | POST |/api/feature/:id| | 管理員編輯規格 | PUT |/api/feature/:id| | 管理員刪除產品 | DELETE |/api/feature/:id| 皆需利用 HTTP Request header 中的 authorization 欄位進行驗證是否有管理權限。 ### 新增規格 URL: /api/feature/:id Method: POST 網址列的 id 為規格隸屬的 ProductId。 查看所有未刪除的分類,並且和 Product 表單關聯,可查看該分類中未刪除的商品內容。 * 欄位:name, price, promo_price, stock * 必填:name, price, stock response: ``` { ok: 1, message: "商品新增完成", } ``` ### 編輯規格 URL: /api/feature/:id Method: PUT 網址列的 id 為規格的 id。 * 欄位:name, price, promo_price, stock * 必填:name, price, stock response: ``` { ok: 1, message: "規格編輯完成", } ``` ### 刪除規格 URL: /api/feature/:id Method: DELETE 網址列的 id 為規格的 id。 * 備註:雖然是發 DELETE METHOD,但是後端處理是更改刪除狀態 response: ``` { ok: 1, message: "規格刪除完成", } ``` ## Order | 功能 | Method | path | | --- | --- | -------- | | 生成訂單 | POST |/api/orders| | 取得訂單清單 | GET |/api/orders| | 取得特定買家訂單 | GET |/api/order/:user_id| | 取得特定訂單品項 | GET |/api/order_item/:order_number| | 編輯訂單狀態 | PUT |/api/order/:order_number| ### 新增訂單 URL: /api/orders Method: POST Header: authorization 要帶入任意合法 token Body: ``` { "UserId":"123", "buyer_fullname":"QQQ", "buyer_email":"123@sadsad", "buyer_phone":"1231233", "postal_code":"12321", "buyer_address":"213123123213", "total":213123, "order_items": [ {"product_id":1,"product_name":"蛋糕","product_image":"https://imgur.com/lxWa1BS.png",product_feature":"5吋","product_price":"500","product_quantity":"2"}, {"product_id":1,"product_name":"饅頭","product_image":"https://imgur.com/lxWa1BS.png","product_feature":"大顆","product_price":"500","product_quantity":"9"}, {"product_id":1,"product_name":"饅頭","product_image":"https://imgur.com/lxWa1BS.png","product_feature":"小顆","product_price":"100","product_quantity":"6"} ] } ``` response: ``` { ok: 1, message: "訂單建立成功" } ``` ### 取得訂單列表 URL: /api/orders Method: GET Header: authorization 要帶入管理員的 token。 ### 取得特定買家訂單 URL:/api/order/:user_id Method: GET Header: authorization 要帶入使用者的 token。 ### 取得特定訂單品項 URL:/api/order_item/:order_number Method: GET Header: NIL ### 編輯訂單狀態 URL:/api/order/:order_number Method: PUT Header: NIL Body: ``` { "is_paid":true, "is_sent":true, "is_done":true, "is_cancel":false, "status":"is_done" } ```