商城系統購物車功能分析實現

如今網上購物已經成了人們生活中不可缺乏的一部分,今天咱們來看下當咱們從商城裏面瀏覽搜索了商品,看到了本身喜歡的商品準備加入到購物車的這個功能實現。java

購物車功能實現:redis

購物車功能流程:數據庫

功能分析:json

(1)咱們平時購物的時候,有時候點擊商品頁面的加入購物車,而後商品就直接加入到購物車列表中,無論用戶是否登陸。而後咱們換了一臺設備,發現該網站咱們以前在另外一臺設備上加入購物車的商品不存在。由此咱們能夠推斷出:購物車列表的內容不是存放在數據庫,而是在cookie中。,因此購物車功能實現是在客戶端實現的。服務器

(2)購物車咱們須要實現的功能有哪些呢?cookie

展現購物車列表、向購物車列表中添加商品(add)、修改購物車列表中商品的數量、刪除列表中的商品。ide

邏輯實現:網站

1、展現購物車列表:編碼

由於購物車的商品列表是保存在cookie中的,因此咱們獲取購物車列表就是從cookie中獲取商品列表。spa

首先cookie中保存形式也是key-value的形式,key指的是保存的名稱,好比TT_CART,是一個標誌而已。value是保存的商品的具體信息,是以字符串的形式保存的,咱們一般將列表的形式轉換成json格式的數據,由於json格式的就是一個字符串的形式保存的。

cookie屬於會話跟蹤技術,寫入cookie是服務器的response寫入的,即服務器給客戶端頒發一個名詞cookie。因此咱們咱們獲取cookie就須要使用request來獲取。

cookie是客戶端的,若是直接將對象顯示很危險,因此咱們須要對商品進行編碼。

 

service層實現:

獲取到商品的列表後,咱們能夠展現該列表:controller層實現:

2、向購物車添加商品信息

咱們首先判斷購物車列表中是否存在該商品,若是存在則將該商品的數量加1,若是不存在則將商品加入購物車,從新將商品列表寫入cookie。

分析:傳入參數:id,num,request,response;返回值:能夠採用咱們的TaotaoResult,

dao層:無。

service層實現:由於以前顯示了購物車列表,因此咱們遍歷購物車列表,對吧購物車中商品的id和加入的商品的id是否一致,若是一致則數量加1,若是不一致則須要從商品信息表中獲取該上商品的信息。這裏須要調用服務層的根據id獲取商品信息的接口,即用httpclient。

這裏還有一個問題:商品信息表中的字段是很是多的,咱們難道都須要嗎,此時咱們就要考慮一個新的接收對象pojo了,只須要購物車裏面所須要的字段便可。因此從新創建一個pojo來承接商品信息的部分信息。

 

其中:這裏須要注意cookie中和cookie外的數據的形式,是json仍是java對象。

具體實現以下:controller:

service層:

@Value("${SHANG_PIN_BASE_INFORMATION_URL}")
	private String SHANG_PIN_BASE_INFORMATION_URL;

	@Override
	public TaotaoResult getCartList(long id, Integer num, HttpServletRequest request, HttpServletResponse response) {
		/*添加購物車商品,首先購物車商品是保存在cookie中的,由於咱們只要不付款是沒有什麼做用的。
		 * 如何從cookie中讀取購物車列表呢,是利用request來實現的。
		 * 第一步:首先判斷cookie中是否存在該商品,若是存在,則商品數量加1,
		 * 若是沒有則根據商品id從rest工程中獲取該商品,將商品寫入cookie。
		 * 由於咱們不須要獲取商品的所有信息,只有一部分id,title,price,image,num。因此獨立創建一個pojo才存放這些字段。
		 */
		CartItem cartItem=null;
		//從cookie中獲取商品列表的方法
		List<CartItem> itemList=getItemListByCookie(request);
		//遍歷cookie的商品列表,
		for (CartItem cItem : itemList) {
			if (cItem.getId()==id) {
				cItem.setNum(cItem.getNum()+num);
				cartItem=cItem;
				break;	
			}
			
		}
		if (itemList==null) {
			cartItem=new CartItem();
			String itemjson = HttpClientUtil.doGet(SHANG_PIN_BASE_INFORMATION_URL+id);
			//從http協議獲取的返回值是json格式的
			TaotaoResult taotaoResult= TaotaoResult.formatToPojo(itemjson, TbItem.class);
			//返回結果是taotaoresult,若是想獲取pojo對象,就利用它的getData方法
		
			if (taotaoResult.getStatus()==200) {
				TbItem item=(TbItem) taotaoResult.getData();
				cartItem.setId(item.getId());
				cartItem.setTitle(item.getTitle());
				cartItem.setPrice(item.getPrice());
				cartItem.setNum(item.getNum());
				cartItem.setImage(item.getImage()==null?"":item.getImage().split(",")[0]);
			}
			//將商品添加到購物車列表
			itemList.add(cartItem);	
		}
		//將商品添加到cookie中,由於cookie中的存值方式是key-value的形式,value是一個字符串,因此須要將轉換的商品列表轉成json的形式再保存到cookie中
		CookieUtils.setCookie(request, response,"TT_CART", JsonUtils.objectToJson(itemList), true);

		return TaotaoResult.ok();
	}
//從cookie中獲取購物車列表
	private List<CartItem> getItemListByCookie(HttpServletRequest request) {
	String cookiejson = CookieUtils.getCookieValue(request, "TT_CART",true);
	//轉換成商品列表
if (cookiejson==null) {
	return new ArrayList<>();	
}
//cookie 中保存的也是key -value的值,value是字符串,即json格式的數據
List<CartItem> list = JsonUtils.jsonToList(cookiejson, CartItem.class);		
		
		return list;
	}

  

 3、修改購物車商品的數量,這裏利用了js來實現,調用咱們的add商品的功能,num設置成1或者-1

四:刪除購物車的商品

邏輯實現:傳入要刪除商品的id,讀取購物車的商品列表,遍歷列表,比較id,若是id同樣,則從cookie中remove該商品,而後從新將商品列表寫入cookie。

返回購物車列表的頁面。

實現:controller:

service層實現:

購物車功能還有一些問題:

一、更換設備購物車商品不能同步

a)         不能把購物車商品保存到數據庫

b)        要求用戶登陸才能同步信息

c)         能夠把購物車信息保存到redis中,key就是用戶,value就是購物車列表

d)        購物車商品合併的問題。

二、提交訂單後購物車商品須要清空。

相關文章
相關標籤/搜索