目錄
1.功能分析
添加商品到購物車後,會提示去購物車結算,會跳轉到cart/cart.html,可以看到購物車中商品列。
在cart.jsp,我們可以看到需要準備一個cartList商品集合到model中。需要修改${cart.images[0]}爲${cart.image}
url: /cart/cart
參數:用戶id
返回值:購物車頁面,需要傳遞模型數據list<tbitem>
2.登錄狀態下展示購物車
在淘淘商城67-商城購物車系統實現之登錄與未登錄狀態下添加商品到購物車 準備工作已經做完的情況下。
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測試訪問
未登錄狀態