淘淘商城68-商城購物車系統實現之登入與未登入狀態下展示購物車
目錄
1.功能分析
新增商品到購物車後,會提示去購物車結算,會跳轉到cart/cart.html,可以看到購物車中商品列。
在cart.jsp,我們可以看到需要準備一個cartList商品集合到model中。需要修改${cart.images[0]}為${cart.image}
url: /cart/cart
引數:使用者id
返回值:購物車頁面,需要傳遞模型資料list<tbitem>
2.登入狀態下展示購物車
2.1服務層
2.1.1dao層
直接通過jedisClient操作redis資料庫
2.1.2service層
在taotao-cart-interface建立介面
/**
* 根據使用者的ID查詢使用者的購物車的列表
* @param userId
* @return
*/
List<TbItem> getCartList(Long userId);
在taotao-cart-service編寫實現類
業務邏輯:
1.根據使用者的ID查詢到所有的field的值(map)
2.遍歷map物件,將其新增到List中
3.返回一個list(List<tbitem>)
/**根據userId查詢購物車列表*/ @Override public List<TbItem> getCartList(Long userId) { Map<String, String> map = jedisClient.hgetAll(TT_CART_REDIS_PRE_KEY+":"+userId); Set<Entry<String, String>> set = map.entrySet(); if(set!=null) { List<TbItem> list = new ArrayList<>(); for (Entry<String, String> entry : set) { TbItem tbItem = JsonUtils.jsonToPojo(entry.getValue(), TbItem.class); list.add(tbItem); } return list; } return null; }
2.2表現層
2.2.1controller
url: /cart/cart
引數:無
返回值:購物車展示列表的頁面
處理的邏輯:
1.通過呼叫SSO服務獲取使用者的資訊
2.判斷,如果有使用者的資訊,說明已登入,呼叫cartservice中查詢使用者列表的方法
3.如果沒有使用者資訊,說明未登入,呼叫從cookie中獲取商品列表的方法
4.將購物車物件放入request域
/** * 從redis或cookie檢視購物車 * * @param request * @return */ @RequestMapping("/cart/cart") public String getCartList(HttpServletRequest request) { // 1.從cookie中獲取token String token = CookieUtils.getCookieValue(request, COOKIE_TOKEN_KEY); // 2.根據token呼叫SSO的服務,獲取使用者的資訊 TaotaoResult result = loginService.getUserByToken(token); // 判斷 使用者是否登入 if (result.getStatus() == 200) { // 3.如果使用者已經登入,從redis中查詢 TbUser tbUser = (TbUser) result.getData(); List<TbItem> cartList = cartService.getCartList(tbUser.getId()); request.setAttribute("cartList", cartList); } else { // 4.如果使用者未登入,從cookie中查詢 } return "cart"; }
2.3測試訪問
安裝taotao-cart。
由於要呼叫taotao-sso與taotao-manager查詢使用者與商品資訊,所以需要啟動taotao-sso、taotao-manager。
需要登入在cookie中寫入toekn,所以要啟動taotao-sso-web。
需要搜尋商品,所以要啟動taotao-search、taotao-search-web。----如果手動輸入url進入商品詳情頁,可以不啟動
需要在商品詳情頁加入購物車,所以需要啟動taotao-item-web。
最後購物車這裡的taotao-cart、taotao-cart-web也要啟動。
可以看到購物車情況,還將上一個測試的商品數量疊加了。
3.未登入狀態下展示購物車
3.1服務層
服務層不變,存入cookie,需要要使用servlet原生response物件,跟service沒什麼關係,所以放在controller中。
3.2表現層
從cookie中獲取購物車列表,放入request域中
/**
* 從redis或cookie檢視購物車
*
* @param request
* @return
*/
@RequestMapping("/cart/cart")
public String getCartList(HttpServletRequest request) {
// 1.從cookie中獲取token
String token = CookieUtils.getCookieValue(request, COOKIE_TOKEN_KEY);
// 2.根據token呼叫SSO的服務,獲取使用者的資訊
TaotaoResult result = loginService.getUserByToken(token);
// 判斷 使用者是否登入
if (result.getStatus() == 200) {
// 3.如果使用者已經登入,從redis中查詢
TbUser tbUser = (TbUser) result.getData();
List<TbItem> cartList = cartService.getCartList(tbUser.getId());
request.setAttribute("cartList", cartList);
} else {
// 4.如果使用者未登入,從cookie中查詢
List<TbItem> cookieCartList = getCookieCartList(request);
request.setAttribute("cartList", cookieCartList);
}
return "cart";
}
/** 獲取購物車列表 */
private List<TbItem> getCookieCartList(HttpServletRequest request) {
// 1.從cookie中獲取購物車列表
String cartJson = CookieUtils.getCookieValue(request, COOKIE_CART_KEY, true);
// 2.將cartJson轉為List<TbItem>
if (StringUtils.isNotBlank(cartJson)) {
List<TbItem> list = JsonUtils.jsonToList(cartJson, TbItem.class);
return list;
}
return new ArrayList<>();
}
3.3測試訪問
未登入狀態