目錄
1.功能分析
用戶點擊刪除,未登錄從cookie、已登錄從redis中刪除該商品
在cart.jsp,刪除會跳轉對應的url:/cart/delete/${cart.id}.html
2.登錄狀態下刪除購物車中的商品
url:/cart/delete/${cart.id}.html
參數:cartid,其實是就是itemId
根據商品id,從cookie或者redis中刪除接口
返回值:展示購物車列表頁面。Url需要做redirect跳轉。
2.1服務層
2.1.1dao層
直接通過jedisClient操作redis數據庫
2.1.2service層
在taotao-cart-interface創建對應接口
/**
* 根據用戶id與商品id刪除購物項
* @param userId
* @param itemId
* @return
*/
TaotaoResult deleteItemCartByItemId(Long userId,Long itemId);
在taotao-cart-service創建實現類
業務邏輯:
根據userid、itemid刪除redis中購物車列表的商品
/** 根據用戶id與商品id刪除購物項 */
@Override
public TaotaoResult deleteItemCartByItemId(Long userId, Long itemId) {
jedisClient.hdel(TT_CART_REDIS_PRE_KEY+":"+userId, itemId+"");
return TaotaoResult.ok();
}
2.2表現層
2.2.1controller
url:/cart/delete/${cart.id}.html
參數:cartid,其實是就是itemId
根據商品id,從cookie或者redis中刪除接口
返回值:展示購物車列表頁面。Url需要做redirect跳轉到商品列表展示的controller。
/**
* 根據商品id,刪除對應在購物車中的商品
*
* @param itemId
* @param request
* @param response
* @return
*/
/* /cart/delete/${cart.id}.html */
@RequestMapping("/cart/delete/{itemId}")
public String deleteItemCartByItemId(@PathVariable Long itemId, HttpServletRequest request,
HttpServletResponse response) {
// 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();
cartService.deleteItemCartByItemId(tbUser.getId(), itemId);
} else {
// 4.如果用戶沒登錄,刪除cookie中對應商品
//deleteCookieItemCart(itemId, request, response);
}
return "redirect:/cart/cart.html";// 重定向
}
2.3測試訪問
在登錄狀態,點擊刪除
刪除成功
查看redis是否還存在該用戶的購物車,redis中也被刪除了。
3.未登錄狀態下刪除購物車中的商品
在未登錄狀態都是對cookie的操作
3.1服務層
服務層不變,存入cookie,需要要使用servlet原生response對象,跟service沒什麼關係,所以放在controller中。
3.2表現層
3.2.1controller
對於沒登錄用戶刪除cookie,單獨抽出來一個私有方法。
從cookie中取出購物車,遍歷購物車,刪除商品,將更新的購物車存入cookie中。
/** 刪除cookie購物車中對應商品 */
private void deleteCookieItemCart(Long itemId, HttpServletRequest request, HttpServletResponse response) {
List<TbItem> cartList = getCookieCartList(request);
TbItem deleteItem = new TbItem();
boolean flag = false;
// 1.查看cookie中是否存在該商品
for (TbItem tbItem : cartList) {
// 2.存在就記錄下這個商品
if (tbItem.getId() == itemId.longValue()) {
deleteItem = tbItem;
flag = true;
break;
}
}
// 3.如果存在,移除商品,並更新cookie中的購物車
if (flag) {
cartList.remove(deleteItem);
CookieUtils.setCookie(request, response, COOKIE_CART_KEY, JsonUtils.objectToJson(cartList), 7 * 24 * 3600,
true);
}
}
3.3測試訪問
首先退出登錄
在未登錄狀態下刪除
刪除成功。
刷新頁面查看是否在cookie中。並沒有,刪除成功。