今天來寫一下關于購物車的東西, 這裡首先抛出四個問題:
1)使用者沒登陸使用者名和密碼,添加商品, 關閉浏覽器再打開後 不登入使用者名和密碼
問:購物車商品還在嗎?
2)使用者登陸了使用者名密碼,添加商品,關閉浏覽器再打開後 不登入使用者名和密碼
問:購物車商品還在嗎?
3)使用者登陸了使用者名密碼,添加商品, 關閉浏覽器,然後再打開,登陸使用者名和密碼
4)使用者登陸了使用者名密碼,添加商品, 關閉浏覽器 外地老家打開浏覽器 登陸使用者名和密碼
上面四個問題都是以京東為模闆, 那麼大家猜猜結果是什麼呢?
1)在
2)不在了
3)在
4)在
如果你能夠猜到答案, 那麼說明你真的很棒, 那麼關于這四點是怎麼實作的呢? (如果有不認可的小夥伴可以用京東實驗一下)
下面我們就來講解下購物車的原理,最後再來說下具體的code實作.
1)使用者沒有登入, 添加商品, 此時的商品是被添加到了浏覽器的Cookie中, 是以當再次通路時(不登入),商品仍然在Cookie中, 是以購物車中的商品還是存在的.
2)使用者登入了,添加商品, 此時會将Cookie中和使用者選擇的商品都添加到購物車中, 然後删除Cookie中的商品. 是以當使用者再次通路(不登入),此時Cookie中的購物車商品已經被删除了, 是以此時購物車中的商品不在了.
3)使用者登入, 添加商品,此時商品被添加到資料庫做了持久化存儲, 再次打開登入使用者名和密碼, 該使用者選擇的商品肯定還是存在的, 是以購物車中的商品還是存在的.
4)理由3)
這裡再說下 沒登入 儲存商品到Cookie的優點以及儲存到Session和資料庫的對比:
1:Cookie: 優點: 儲存使用者浏覽器(不用浪費我們公司的伺服器) 缺點:Cookie禁用,不提供儲存
2:Session:(Redis : 浪費大量伺服器記憶體:實作、禁用Cookie) 速度很快
3:資料庫(Mysql、Redis、SOlr) 能持久化的就資料庫 速度太慢
那麼我今天要講的就是:
使用者沒登陸:購物車添加到Cookie中
使用者登陸: 儲存購物車到Redis中 (不用資料庫)
整體的思路圖解:

接下來就是代碼執行個體來實作 購物車的功能了:
首先我們看下購物車和購物項兩個JavaBean的設計:
購物車: buyerCart.java
這裡使用了@JsonIgonre注解是因為下面需要将BuyerCart 轉換成Json格式, 而這幾個字段隻有get 方法, 是以不能轉換, 需要使用忽略Json.
下面是購物項: buyerItem.java
1、将商品加入購物車中
這裡傳入的參數是skuId(庫存表的主鍵, 庫存表儲存的商品id,顔色,尺碼,庫存等資訊), 購買數量amount.
接着我們來看Controller是如何來處理的:
這裡設計一個知識點: 将對象轉換成json字元串/json字元串轉成對象
我們在這裡先寫一個小的Demo來示範json和對象之間的互轉, 這裡使用到了springmvc中的ObjectMapper類.
執行結果:
這裡我們使用了Include.NON_NULL, 如果TestTb 中屬性為null 的就不給轉換成Json, 從對象-->Json字元串 用的是 objectMapper.writeValue(). 從Json字元串-->對象使用的是objectMapper.readValue().
回歸上面我們項目中的代碼, 隻有未登入 添加商品時才會将此商品添加到Cookie中.
我們debug 可以看到:
這裡已經将對象購物車對象buyerCart轉換成了Json格式.
将商品添加到購物車, 不管是登入還是未登入, 都要先取出Cookie中的購物車, 然後将目前選擇的商品追加到購物車中.
然後登入的話 就把Cookie中的購物車清空, 并将購物車的内容添加到Redis中做持久化儲存.
如果未登入, 将選擇的商品追加到Cookie中.
将購物車追加到Redis中的代碼:insertBuyerCartToRedis(這裡面包含了判斷添加的是否是同款)
判斷使用者是否登入: String username =
sessionProviderService.getAttributterForUsername(RequestUtils.getCSessionId(request, response));
2、購物車展示頁面
最後 重定向到購物車展示頁: return "redirect:/shopping/toCart"; 這裡進入結算頁有兩種方式:
1) 在商品詳情頁 點選加入購物車.
2) 直接點選購物車按鈕 進入購物車結算頁.
下面來看下結算頁的代碼:
這裡 就是 購物車詳情展示頁面, 這裡需要注意, 如果是同一件商品連續添加, 是需要合并的.
購物車詳情展示頁面就包括兩大塊, 1) 商品詳情 2)總計(商品總額,運費)
其中1)商品詳情又包括 商品尺碼,商品顔色, 商品購買數量, 是否有貨.
取出Redis中的購物車: buyerCart = cartService.selectBuyerCartFromRedis(username);
将購物車裝滿, 前面隻是将skuId裝進購物車, 這裡還需要查出sku詳情: List items = buyerCart.getItems();
buyerItem.setSku(cartService.selectSkuById(buyerItem.getSku().getId()));
接着就傳回"cart.jsp", 這個就是購物車詳情展示頁面了.
3、去結算頁面
到了這裡就說明使用者必須要 登入, 而且購物車中必須要有商品.
是以這裡我麼你需要利用springmvc的過濾功能, 使用者點選結算的時候必須要先登入, 如果沒有登入的話就提示使用者需要登入.
取出 所指定的購物車, 因為我們結算之前在購物車詳情頁面會勾選 我們 需要購買的商品, 是以這裡是根據所勾選的商品去結算的.
BuyerCart buyerCart = cartService.selectBuyerCartFromRedisBySkuIds(skuIds, username);
從購物車中取出指定商品:
1) 當我們購買的商品隻要有一件是無貨的狀态, 那麼重新整理購物車詳情頁面, 回顯無貨的商品狀态.
2)當購物車中午商品時, 重新整理目前頁面.
購物車就這麼多東西, 可能有講解不到或者錯誤的地方, 歡迎大家指出來.如果對你有幫助的話也請點個贊支援一下,謝謝~