Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Q14. [個人技能題組][Backend] 功能:商品訂購。 #15

Open
wildwindjen opened this issue Mar 16, 2017 · 10 comments
Open

Q14. [個人技能題組][Backend] 功能:商品訂購。 #15

wildwindjen opened this issue Mar 16, 2017 · 10 comments

Comments

@wildwindjen
Copy link
Contributor

wildwindjen commented Mar 16, 2017

訂購商品的流程如下:
[訂購]
會員來到商品瀏覽頁面,點選想要購買的商品,加入購物車,等到東西買齊了,就點選購物車,來到結賬畫面。結賬畫面先顯示目前所有挑選商品數量及單價資訊,沒問題的話會員會按下「付款」,成功的話會 mail 該筆交易記錄的資訊給會員。

[查閱訂單記錄]
會員可以查閱訂單記錄。訂單記錄會出現「已付款」跟「未付款」的單。未付款的單可以被刪除或修改,已付款的單子則不行。

請提供簡易的前端頁面,並開發出對應的後端 API。

a. 描述一下這次 sql 你用到哪些新語法?
b. 畫出這次題目每個情境的流程圖,並標示所對應的 API。
c. 請提供驗收項目清單。

答題時間: 40 hr

@dwatow
Copy link

dwatow commented Apr 4, 2017

「於 2017/04/04 開始答題」
訂購商品的流程如下:
[訂購]
會員來到商品瀏覽頁面,點選想要購買的商品,加入購物車,等到東西買齊了,
就點選購物車,來到結賬畫面。
結賬畫面先顯示目前所有挑選商品數量及單價資訊,
沒問題的話會員會按下「付款」,成功的話會 mail 該筆交易記錄的資訊給會員。

[查閱訂單記錄]
會員可以查閱訂單記錄。訂單記錄會出現「已付款」跟「未付款」的單。
未付款的單可以被刪除或修改,已付款的單子則不行。
read_order

請提供簡易的前端頁面,並開發出對應的後端 API。

table schema

order
id(pk)
create_date
member

order_product
order_id(pk)
product_id

a. 描述一下這次 sql 你用到哪些新語法?
加入一對多關聯

b. 畫出這次題目每個情境的流程圖,並標示所對應的 API。
[訂購]

[查閱訂單記錄]

c. 請提供驗收項目清單。
刪除不存在訂單 -> error
刪除已付款訂單 -> error
刪除未付款訂單 -> success

「於 2017/04/04 答題結束」

@dustfantasy
Copy link

dustfantasy commented Apr 12, 2017

「於 2017/04/12 開始答題」

a.
sum(table column)
指定column的總和

group by
以指定的column分類出結果。

ifnull(sum(b.quentity),0)
可以在sum(b.quentity)結果為null時轉換成0。

alter table [table1] add foreign key (table1 column) references table2 (table2 column)
建立外鍵
b.
https://gitlab.com/enioy74/Practice1

c.
A.新增至購物車的資料確定外鍵是否運行
1.以正確資料[productid:1,quentity:12],預期結果收到'回傳成功'的資訊。
2.以錯誤資料[productid:6,quentity:12],預期結果收到'沒有此商品'的資訊。

B.確定無法修改已完成付款訂單
1.選擇未完成訂單進行修改,預期結果收到'修改成功'的資訊。
2.選擇完成訂單進行修改,預期結果收到'無法更改訂單'的資訊。
3.選擇不存在的訂單進行修改,預期結果收到'無法更改訂單'的資訊。

C.確定無法刪除已完成付款訂單
1.選擇未完成訂單進行刪除,預期結果收到'刪除成功'的資訊。
2.選擇完成訂單進行刪除,預期結果收到'訂單已付款'的資訊。
3.選擇不存在的訂單進行刪除,預期結果收到'無此訂單'的資訊。

D.付款時寄信是否確實達成
執行API後檢查印出資訊並至信箱查看。

E.付款時是否查看存貨不足
1.訂購數量在存貨之下,預期結果收到'付款成功 請至信箱確認'的資訊。
2.訂購數量在存貨之上,預期結果收到 存貨不足的商品id+'已無存貨' 的資訊。

F.付款時查看存貨是否扣除
付款完成至資料庫進行比對。

G.付款時查看transaction機制是否運行
在付款中圖進行中斷,查看資料庫庫存是否被變更。

「於 2017/04/12 答題結束」

@PenguinRun
Copy link

PenguinRun commented Apr 19, 2017

「於2017/04/19 開始答題」

controllers
models

a. 描述一下這次 sql 你用到哪些新語法?
沒有
b. 畫出這次題目每個情境的流程圖,並標示所對應的 API。
文件
c. 請提供驗收項目清單。

驗收「DB錯誤情況」

  • 測試資料:「輸入錯誤DB密碼」,預期節果:「回應:伺服器錯誤,請稍後在試!」
  • 測試資料:「輸入錯誤DB帳號」,預期結果:「回應:伺服器錯誤,請稍後在試!」
  • 測試資料:「輸入錯誤DB資料庫」,預期結果:「回應:伺服器錯誤,請稍後在試!」

驗收「認證token(HEADER)」

  • 測試資料:「x-access-token:[正確token]」,預期結果:「能使用其他需token功能」
  • 測試資料:「x-access-token:」,預期結果:「回應:請輸入token!」
  • 測試資料:「x-access-token:[錯誤token]」,預期結果:「回應:token錯誤!」
  • 測試資料:「x-access-token:[過期token]」,預期結果:「回應:token錯誤!」

新增整筆訂單(需token)

驗收「確認必填欄位」

  • 測試資料:「ProductID: 4, 5, 6 ; Quantity: 5, 5, 5」,預期結果「如下所述」
{
  "result": {
    "state": "order successful!",
    "orderData": {
      "OrderID": 4,
      "CustomerID": 141,
      "ProductID": 6,
      "OrderQuantity": 5,
      "IsComplete": 0
    }
  }
}
  • 測試資料:「ProductID:」,預期結果「回應:please enter the [ProductID] value」
  • 測試資料:「ProductID: 1,2,3 ; Quantity: 」,預期結果:「回應:please enter the [Quantity] value」

新增單筆訂單(需token)

驗收「確認必填欄位」

  • 測試資料:「OrderID:」,預期結果「回應:please enter the [OrderID] value」
  • 測試資料:「OrderID:1 ; ProductID:」,預期結果「回應:please enter the [ProductID] value」
  • 測試資料:「OrderID:1 ; ProductID:2; OrderQuantity:」,預期結果「回應:please enter the [OrderQuantity] value」

驗收「如果訂貨量超過庫存」

  • 測試資料:「OrderID:4 ; ProductID:2 ; OrderQuantity:2」,預期結果「如下所述」
{
  "result": "order successful!",
  "orderList": {
    "OrderID": "4",
    "CustomerID": 141,
    "ProductID": "2",
    "OrderQuantity": "2",
    "isComplete": "0"
  }
}
  • 測試資料:「OrderID:4 ; ProductID:1 ; Quantity: 5」,預期結果「如下所述」
{
  "result": "不好意思,車子的庫存不足!",
  "orderList": {
    "OrderID": "4",
    "CustomerID": 141,
    "ProductID": "1",
    "OrderQuantity": "5",
    "isComplete": "0"
  }
}

驗收「如果訂單完成」

  • 測試資料:「輸入isComplete欄位為1的已完成訂單」,預期結果:「回應:sorry, 該訂單已經付款完成了」

更新單筆訂單(需token)

驗收「確認必填欄位」

  • 測試資料:「OrderID:」,預期結果「回應:please enter the [OrderID] value」
  • 測試資料:「OrderID:4 ; ProductID:」,預期結果「回應:please enter the [ProductID] value」
  • 測試資料:「OrderID:4 ; ProductID:6; OrderQuantity:」,預期結果「回應:please enter the [OrderQuantity] value」

驗收「有無該筆資料」

  • 測試資料:「OrderID:422 ; ProductID:1 ; OrderQuantity:2」,預期結果「回應:沒有該筆資料!」
  • 測試資料:「OrderID:4 ; ProductID:6 ; OrderQuantity:2」,預期結果「回應:如下所述」
{
  "result": {
    "state": "update successful",
    "updateOrderList": {
      "quantity": "2"
    }
  }
}

刪除單筆/多筆訂單(需token)

驗收「確認必填欄位」
成功:

  • (單筆)測試資料:「CombinationID:5, 1」,預期結果:「如下所述」
{
  "result": {
    "state": "delete the order product is successful!",
    "ID": "5, 1"
  }
}
  • (多筆)測試資料:「CombinationID:5, 2 ; CombinationID:5,3」,預期結果:「如下所述」
{
  "result": {
    "state": "delete the order product is successful!",
    "ID": [
      "5, 2",
      "5,3"
    ]
  }
}

錯誤:

  • (單筆)測試資料:「CombinationID:」,預期結果:「回應:請輸入CombinationID」
  • (多筆)測試資料:「CombinationID:1,2 ; CombinationID:」,預期結果:「回應:請輸入CombinationID」

訂單完成(付款完成)(需token)

  • 情境:直接抓取顧客ID來顯示還未付款完成的訂單,當客戶端使用"PUT" method傳送request時,觸發功能。

驗收「是否有存貨」

  • 測試資料:「若有車子存貨不足」,預期結果:「回應:不好意思,車子的庫存不足!」
  • 測試資料:「若商品皆有存貨」,預期結果:「如下所述」
{
  "result": "訂單編號:4 付款已完成,謝謝您使用該服務!詳細的訂單資訊已寄送至[email protected]"
}

驗收「是否有成功扣除存貨」

  • 至資料庫查看已完成訂單之產品項目是否有成功扣除。實際結果:「有成功扣除」

驗收「是否收到信件」

  • 測試資料:「使用自身mail當測試」,實際結果:「有收到系統所發出的mail」

「因不小心把不該上傳的東西上傳到remote 在修改remote repositories後已經是2017/04/24。答題結束。」

@wildwindjen
Copy link
Contributor Author

@PenguinRun
今天是 2017/04/23 囉,我沒看到你依規定來延長時間。

@YenChunchen
Copy link

YenChunchen commented Apr 25, 2017

「於2017/04/25 開始答題」
https://github.com/YenChunchen/myshop
a. 描述一下這次 sql 你用到哪些新語法?

  • 表格連結
  • select * [資料表名稱] where [篩選欄位] in [篩選值]

b. 畫出這次題目每個情境的流程圖,並標示所對應的 API。

c. 請提供驗收項目清單。
createcart
1.判斷所需欄位是否正確

  • 測試任一欄位為空或不存在時,預期回應(請輸入正確欄位)
    *以上得到預期結果則通過欄位驗證

2.驗證是否為會員及購物車是否存在

  • 輸入不在 member中的id,預期回應(請登入會員)
  • 輸入已在cart中的memberid,預期回應(該購物車已存在)
    *以上得到預期結果則通過會員及購物車存在驗證

3.驗證該次購物車中的品項是否存在,庫存是否足夠

  • 輸入不在 products中的id(products_id:999,products_quentity:1),預期回應("id:999不存在")
  • 輸入超出product[store]欄位的值(products_id:10,products_quentity:999),預期回應(id:10庫存不足)
  • 輸入以上兩種情況資訊(products_id:999,products_quentity:1&(products_id:10,products_quentity:999)),預期回應(id:999不存在,id:10庫存不足)
  • 輸入不在cart中的合法資訊(products_id:10,20;products_quentity:1,5;orderguy_id:10),預期回應(商品已加入購物車)
    *以上得到預期結果則通過品項及庫存驗證

orderlist(POST)
1.驗證email,ispay,orderguy_id欄位

  • email為空或不存在,預期回應(請輸入email)
  • ispay為空或不存在,預期回應(付款狀態錯誤)
  • orderguy_id為空或不存在,預期回應(請輸入正確會員id)
  • orderguy_id不為數字(orderguy_id:AAA),預期回應(請輸入正確會員id)
    *以上得到預期結果則通過email,ispay,orderguy_id欄位驗證

2.驗證該會員是否有購物及訂單是否已存在

  • 輸入不在cart[orderguy_id]中的值(orderguy_id:38),預期回應(該會員暫無購物車)
  • 輸入已建立完成的定單資訊,預期回應(該會員訂單已存在)
  • 輸入未建立的定單資訊(email:[email protected];ispay:1,orderguy_id:10),預期回應(訂單成立)
    *以上得到預期結果則通過會員購物及訂單存在驗證

payment

  1. 驗證id欄位
  • id為空或不存在,預期回應(訂單id錯誤)
  • 輸入id:aaa,預期回應(訂單id錯誤)
    *以上得到預期結果則通過id欄位驗證

2.判斷訂單付款狀態及訂單是否存在

  • 輸入已付款過的訂單id,預期回應(訂單已付款)
  • 輸入不在orderlist中的訂單id,預期回應(無該筆訂單)
    -輸入未付款的合法訂單id,,預期回應(付款完成)
    *以上得到預期結果則通過付款狀態及訂單存在驗證

orderlist(GET)
1.判斷是否有訂單資訊

  • 如orderlist中有資料,預期回應(顯示所有訂單)
    -如orderlist中無資料,預期回應(顯示空值)
    *以上得到預期結果則通過訂單資訊驗證

updateorderlist(GET)

  1. 驗證id欄位及訂單是否存在
  • id為空或不存在,預期回應(id錯誤)
  • 輸入id:aaa,預期回應(id錯誤)
  • 輸入不在orderlist中的訂單編號(id:10),預期回應(空值)
    *以上得到預期結果則通過id欄位,訂單存在驗證

updateorderlist({PUT)

  1. 驗證id欄位及訂單是否存在
  • id為空或不存在,預期回應(id錯誤)
  • 輸入id:aaa,預期回應(id錯誤)
  • 輸入不在orderlist中的訂單編號(id:10),預期回應(無該筆訂單)
    *以上得到預期結果則通過id欄位,訂單存在驗證

2.驗證email,products_id,products_quentity欄位

  • email,products_id,products_quentity任一欄位為空或不存在,預期回應(欄位錯誤)
    *以上得到預期結果則通過email,products_id,products_quentit欄位驗證

3.驗證訂單付款狀態

  • 輸入已付款訂單資訊,預期回應(訂單已付款,無法修改)
    *以上得到預期結果則通過訂單付款驗證

4.驗證該次修改的品項是否存在,庫存是否足夠

  • 輸入不在 products中的id(products_id:999,products_quentity:1),預期回應("id:999不存在")
  • 輸入超出product[store]欄位的值(products_id:10,products_quentity:999),預期回應(id:10庫存不足)
  • 輸入以上兩種情況資訊(products_id:999,products_quentity:1&(products_id:10,products_quentity:999)),預期回應(id:999不存在,id:10庫存不足)
  • 輸入不在cart中的合法資訊(products_id:10,20;products_quentity:1,5;orderguy_id:10),預期回應(訂單修改成功)
    *以上得到預期結果則通過品項及庫存驗證

deleteorderlist

  1. 驗證id欄位及訂單是否存在
  • id為空或不存在,預期回應(id錯誤)
  • 輸入id:aaa,預期回應(id錯誤)
  • 輸入不在orderlist中的訂單編號(id:10),預期回應(無該筆訂單)
    *以上得到預期結果則通過id欄位,訂單存在驗證

2.驗證訂單付款狀態

  • 輸入已付款訂單資訊,預期回應(訂單已付款,無法刪除)
    -輸入未付款訂單資訊,預期回應(刪除成功)
    *以上得到預期結果則通過訂單付款驗證

@PenguinRun
Copy link

@wildwindjen 已完成答題

@wildwindjen
Copy link
Contributor Author

@YenChunchen

	controller/order/order.js line:16~25
	看能不能寫成這個樣子:

	check_cartfields(orderguy_id,item_ids,item_nums)
	.then(function(){
		create_cart_todb.create_cart(info,item_ids).then(function(result){ 
	})
	.catch(function(err){
		............
	});

	create_cart_todb
		應該可以不需要寫到兩層迴圈,巢狀迴圈越少層越好。
		請利用「查表」的方式,優化 model/order/create_cart_todb.js line:67~99 的寫法。 
		不知道什麼叫查表,可以先問 ken,他忘記了再跟我說。

@wildwindjen
Copy link
Contributor Author

基本上我覺得 @dustfantasy 在程式碼的切分,是最簡潔的,符合我們之前討論過的重點原則。其他人可以參考他的 code 。

還可以更好的地方:

1.
	controllers/member.js line 13~14
	這邊的動作是在做 get member data by id
	這個情境,希望的結果都會是回傳單一筆

	所以可以想像得到,未來只要是「取得單一會員資料」,都要寫這兩行。
	這樣「同一個應用情境,就會有重複 code 」出現了。
	那與其直接使用 get_member_data 
	還不如多提供一個 get_member_data_by_id

2. 
	每個 controller 都固定出現

	catch(err){ 
		resobj.error = err;
		res.json(resobj); 
	}

	有沒有辦法解決這個議題。
	提示:從 controller 提升到 framwork 來統一處理。但是也要想想可能的風險跟成本是什麼。

@HoHow
Copy link

HoHow commented May 16, 2017

「於 2017/05/16 開始答題」
請提供簡易的前端頁面,並開發出對應的後端 API。
https://github.com/HoHow/first_member/blob/master/controllers/order.js

a. 描述一下這次 sql 你用到哪些新語法?
join 結合商品與購物車來算價格
sum 計算商品總價

b. 畫出這次題目每個情境的流程圖,並標示所對應的 API。
flow

c. 請提供驗收項目清單。
驗收結帳:

商品進入訂單->購物車清空->寄送mail給使用者
超過商品庫存:message:XXX已無庫存

驗收取消訂單

正確訂單ID:message:取消訂單成功
錯誤訂單ID:message:無此ID訂單

驗收訂單清單

已登入使用者:有訂單->可以看到自己的訂單清單
                         無訂單->此會員未有訂單
未登入使用者:請先登入

「於 2017/05/16 結束答題」

@wildwindjen
Copy link
Contributor Author

@HoHow
你驗收清單也太陽春了吧。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

6 participants