淘淘商城70-商城購物車系統實現之登錄與未登錄狀態下刪除購物車中的商品

目錄

1.功能分析

2.登錄狀態下刪除購物車中的商品

2.1服務層

2.1.1dao層

2.1.2service層

2.2表現層

2.2.1controller

2.3測試訪問

3.未登錄狀態下刪除購物車中的商品

3.1服務層

3.2表現層

3.2.1controller

3.3測試訪問


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中。並沒有,刪除成功。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章