淘淘商城70-商城购物车系统实现之登录与未登录状态下删除购物车中的商品

版权声明:本文为博主原创文章,如有转载请注明出处,谢谢。 https://blog.csdn.net/pdsu161530247/article/details/82251023

目录

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中。并没有,删除成功。

猜你喜欢

转载自blog.csdn.net/pdsu161530247/article/details/82251023