1. 程式人生 > >淘淘商城68-商城購物車系統實現之登入與未登入狀態下展示購物車

淘淘商城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測試訪問

未登入狀態