購物車
購物車的功能:用戶將商品加入購物車,從購物車中刪除商品,修改商品的信息(數量,購買時間等)
路由接口:查看購物車,添加商品,刪除商品,修改商品
redis中設置一個購物車的字典shopping
查看購物車:
將用戶ID作為主鍵在shopping中存儲一個字典(的序列化字符串),該字典中可以以商品ID作為鍵,再對應一個字典其中放置了商品名,全部的價格策略(用於修改),已選的價格策略(用於展示和去支付)等;
購物車對應的字典
{ 用戶ID:{ 課程ID:{ 課程名:"", 課程圖片:"", 已選價格策略:"", 價格策略:{ 價格策略主鍵:{ 價格:"", 周期:"", 數據庫中存儲的內容:"", } } } } }
添加商品
需要提供商品主鍵,以及選擇的價格策略ID,並且要在后端驗證該價格策略是否合法,
- 判斷商品ID是否正確
- 判斷該商品的價格策略的ID是否包含傳過來的價格策略ID
- 判斷該用戶原來是否存在購物車,不存在就去生成一個該用戶的字典
通過驗證后在該用戶的字典中新增一條記錄
刪除商品
需提供商品ID,驗證內容
- 取出該用戶的購物車
- 判斷購物車中是否有該商品,如果存在就把他刪掉
修改商品
修改商品與添加商品類似,需要提供商品ID與價格策略
- 該用戶的購物車是否存在
- 購物車中是否存在選中商品
- 以及傳遞過來的價格策略是否合法,此次的驗證不需再去數據庫中取值了,該商品下存儲了他的價格策略
去結算
選中商品后,點擊去結算會將選中商品添加進支付列表,然后通過get請求將此表渲染出來
結算頁的功能:選擇全局和單個商品的優惠券,選擇代幣
路由接口:生成結算信息,查看結算信息
redis中設置一個待結算的字典unpaid
字典結構
{ 用戶ID:{ 所選全部課程:{ 一個課程:{ 課程主鍵:n, 課程名字:"", 圖片:"", 選中的價格策略:"", 價格策略周期:"", 價格:"", 此課程可用的優惠券:{ 0:{"信息":""}, # 默認一個請選擇 } }, }, 所擁有全局的優惠券:{}, }, }
生成結算信息
接收要支付的課程ID的列表
- 判斷接收的課程ID的列表是否為空,且是個列表
- 取該用戶的購物車,如果購物車是空的可以直接驗證失敗
- 一個空字典policy_course_dict存儲該用戶的信息
- 循環傳過來的課程列表,判斷每一個課程是否在購物車里,如果不在驗證失敗
- 在循環中從購物車中拿出該課程的信息(根據選中的價格策略確定價格,周期)
- 取出該用戶所有可用的優惠券,將全局的優惠券以主鍵作為ID放進一個字典中
- 取課程的優惠券,如果該優惠券綁定的課程存在於選中課程中,將此優惠券的信息以優惠券ID作為鍵添加進優惠券字典中
- 將全部課程的信息以及全局優惠券信息寫進結算表中該用戶的字典中
查看結算信息
查看結算信息比較簡單,不需要驗證,直接從結算表中取出該用戶的數據返回就可以了
提交訂單
提供每個課程的ID,價格策略,優惠券ID,以及全局的優惠券ID,要支付的金額,使用的代幣
數據結構
{ course_price_list:[ {'policy_id':1, '':'course_id':1, 'coupon_record_id':1}, {'policy_id':2, '':'course_id':2, 'coupon_record_id':2}, ], coupon_record_id:1, alipay: 99, balance: 1 }
此處進行的驗證較多
- 課程驗證:傳遞過來的課程列表中的元素,必須與待支付頁的課程相同,可以通過將傳遞過來的課程列表中的課程ID去重,通過長度和在不在支付頁的課程ID里進行判斷,
- 價格策略驗證: 判斷該價格策略存不存在於該課程的價格策略里(購物車表里獲取)
- 課程優惠券驗證: 該課程是否有此優惠券(在去結算表里可以直接獲取)
- 代幣驗證: 用戶代幣余額與傳過來的代幣數比較
- 全局優惠券驗證:該用戶的全局優惠券里是否有傳過來的優惠券
- 價格驗證:計算出價格與傳過來的價格比較
生成訂單