淘淘商城68-商城購物車系統實現之登錄與未登錄狀態下展示購物車

目錄

1.功能分析

2.登錄狀態下展示購物車

2.1服務層

2.1.1dao層

2.1.2service層

2.2表現層

2.2.1controller

2.3測試訪問

3.未登錄狀態下展示購物車

3.1服務層

3.2表現層

3.3測試訪問


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

未登錄狀態

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