1. 程式人生 > >淘淘商城27_購物車_02_展示購物車資訊/商品數量修改/刪除

淘淘商城27_購物車_02_展示購物車資訊/商品數量修改/刪除

一、展示購物車資訊

1.Controller

/**
	 * 展示購物車資訊
	 * @param request
	 * @param response
	 * @param model
	 * @return
	 */
    @RequestMapping("/cart/cart")
	public String showCart(HttpServletRequest request, HttpServletResponse response, Model model){
		List<TbItem> list = getCartList(request, response);
		model.addAttribute("cartList", list);
		return "cart";
	}

2. cart.jsp

3. cartSuccess.jsp

4. 測試

 

5. 除錯bug

 

如圖所示,如果我們一直重新整理的話,去購物車結算時,商品數量變多了

解決辦法:通過redirect方式跳轉,就不會一直重新整理數量了

在新增購物車成功時不讓它直接跳轉到成功頁面(cartSuccess.jsp),而是經過一下跳轉即可

二、修改購物車商品數量

1. 

 

 

2.Controller

/**
	 * 修改購物車中商品數量
	 * @param itemId
	 * @param num
	 * @param request
	 * @param response
	 * @return
	 */
	@RequestMapping("/cart/update/num/{itemId}/{num}")
	@ResponseBody
	public TaotaoResult updateCartItemNum(@PathVariable Long itemId, @PathVariable Integer num, 
			HttpServletRequest request, HttpServletResponse response){
		//1.從cookie中查詢出購物車
		List<TbItem> list = getCartList(request, response);
		//2.遍歷購物車
		for (TbItem tbItem : list) {
			if (tbItem.getId()==itemId.longValue()) {//購物車中的商品id與前端傳過來的商品id相同
				tbItem.setNum(num);//3.修改購物車中商品數量
				list.add(tbItem);//將商品新增到購物車中
				break;
			}
		}
		//4.將購物車儲存到cookie中,設定生命週期,通常是7天,按秒算
	    CookieUtils.setCookie(request, response, TT_CART, JsonUtils.objectToJson(list), COOKIE_CART_EXPIRE);
	    return TaotaoResult.ok();
	}

三、刪除購物車

1. cart.jsp

2. Controller

/**
	 * 刪除購物車商品
	 * @param itemId
	 * @param request
	 * @param response
	 * @return
	 */
	@RequestMapping("/cart/delete/{itemId}")
	@ResponseBody
	public String deleteCartItem(@PathVariable Long itemId, HttpServletRequest request, HttpServletResponse response){
		//1.從cookie中查詢出購物車
		List<TbItem> list = getCartList(request, response);
		//2.遍歷購物車
		for (TbItem tbItem : list) {
			if (tbItem.getId()==itemId.longValue()) {//購物車中的商品id與前端傳過來的商品id相同
				list.remove(tbItem);//刪除購物車中商品
				break;
			}
		}
		//4.將購物車儲存到cookie中,設定生命週期,通常是7天,按秒算
	    CookieUtils.setCookie(request, response, TT_CART, JsonUtils.objectToJson(list), COOKIE_CART_EXPIRE);
	    return "redirect:/cart/cart.html";
	}

3. 測試

 

四、購物車總結

購物車很複雜,但是因為我們時間有限,所以只是簡單的用cookie實現了一下。

但是在實際應用中,購物車很複雜,就拿京東來說,購物車會涉及到滿減(比如:滿500減99等)、京豆(比如:500京豆可以抵30元),這樣如果使用者買了許多商品,付款後,突然有一,兩件商品覺得不好,要退款,這裡就麻煩了,是退全部的錢,還是隻退優惠後的錢,等等,這裡涉及到的邏輯就夠複雜的。

其實淘寶就是一套很好的業務邏輯,他們在使用者未登陸之前是不能將商品新增到購物車中的,這是商品是新增到cookie中的,在使用者登入成功以後,會將商品儲存到redis中。

 

  1. 在使用者未登入情況下寫cookie。當用戶登入後,訪問購物車列表時,
    1. 把cookie中的資料同步到redis。
    2. 把cookie中的資料刪除
    3. 展示購物車列表時以redis為準。
    4. 如果redis中有資料cookie中也有資料,需要做資料合併。相同商品數量相加,不同商品新增一個新商品。
  2. 如果使用者登入狀態,展示購物車列表以redis為準。如果未登入,以cookie為準。

 

五、感言

購物車目前就到這裡了,若以後就機會再詳細的寫一些