您当前的位置: 首页 >  redis

84分布式电商项目 - Redis存储购物车

杨林伟 发布时间:2019-07-19 14:58:55 ,浏览量:2

判断当前用户是否登陆,如果未登录采用 Cookie 存储,如果登录则采用 Redis 存储。登录后要进行 Cookie 购物车与 Redis 购物车的合并操作,并清除 Cookie 购物车。

获取当前登录人账号

spring-security.xml 更改配置: 去掉


添加


 	 
	  
	 
	  
 

access="IS_AUTHENTICATED_ANONYMOUSLY"用于设置资源可以在不登陆时可以访问。

此 配 置 与 security="none"的 区 别 在 于 当 用 户 未 登 陆 时 获 取 登 陆 人 账 号 的 值 为anonymousUser ,而 security="none"的话,无论是否登陆都不能获取登录人账号的值。

代码实现: 在 pinyougou-cart-web 的 findCartList 和addGoodsToCartList 方法中,获取用户名

//得到登陆人账号,判断当前是否有人登陆
String username = SecurityContextHolder.getContext().getAuthentication().getName();

测试:当用户未登陆时,username 的值为anonymousUser

远程购物车存取 服务层接口

pinyougou-cart-interface 中 CartService.java 定义方法

	/**
	 * 需求:查询redis购物车数据
	 * @return
	 */
	List findRedisCartList(String username);

	/**
	 * 把购物车列表保存到redis购物车
	 * @param cartList
	 * @param username
	 */
	void saveCartListToRedisCart(List cartList, String username);
服务层实现

pinyougou-cart-service 中 CartServiceImpl.java 实现方法


	/**
	 * 需求:查询redis购物车数据
	 * 
	 * @return
	 */
	public List findRedisCartList(String username) {
		// 查询redis服务购物车列表
		List cartList = (List) redisTemplate.boundHashOps(
				"cartList").get(username);
		// 判断查询购物车数据是否有值
		if (cartList == null) {
			return new ArrayList();
		}
		return cartList;
	}

	/**
	 * 把购物车列表保存到redis购物车
	 *
	 * @param cartList
	 * @param username
	 */
	public void saveCartListToRedisCart(List cartList, String username) {
		// TODO Auto-generated method stub
		redisTemplate.boundHashOps("cartList").put(username, cartList);
	}
控制层

修改 CartController.java 的 findCartList 方法

/**
	 * 需求:查询购物车列表
	 * 
	 * @return
	 */
	@RequestMapping("/findCartList")
	public List findCartList(HttpServletRequest request) {
		// 判断用户此时是否处于登录状态
		// 获取用户名
		String username = SecurityContextHolder.getContext()
				.getAuthentication().getName();
		
		//定义集合
		List cartList = null;
		// 查询cookie购物车数据
		String cartListStr = CookieUtil.getCookieValue(request, "cartList", true);
		// 登录
		if (!username.equals("anonymousUser")) {
			//登录
		   cartList = cartService.findRedisCartList(username);		
		   
		   return cartList;
			
		}	
		
		//未登录
		// 判断集合是否存在值
		if (StringUtils.isBlank(cartListStr)) {
			cartListStr = "[]";
		}
		// 把购物车字符串转换成对象
		cartList = JSON.parseArray(cartListStr, Cart.class);	
		
		return cartList;
	}

修改 addGoodsToCartList 方法

@RequestMapping("addGoodsToCartList")
	@CrossOrigin(origins="http://item.pinyougou.com",allowCredentials="true")
	public PygResult addGoodsToCartList(String itemId, Integer num,
			HttpServletRequest request, HttpServletResponse response) {

		try {
			
			itemId = itemId.replace(",", "");
			
			// 获取用户登录身份信息
			String username = SecurityContextHolder.getContext()
					.getAuthentication().getName();

			// 查询购物车列表
			List cartList = this.findCartList(request);

			// 添加购物车
			cartList = cartService.addGoodsToCartList(cartList, Long.parseLong(itemId), num);

			// 判断用户是否处于登录状态
			if (username.equals("anonymousUser")) {
				// 未登录
				CookieUtil.setCookie(request, response, "cartList",
						JSON.toJSONString(cartList), 46800, true);

			} else {
				// 登录
				cartService.saveCartListToRedisCart(cartList, username);
			}

			return new PygResult(true, "购物车添加成功");

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return new PygResult(false, "购物车添加失败");
		}

	}

跳板页

(1)创建跳板页:pinyougou-cart-web 工程新建 login.html ,页面添加脚本


	location.href="cart.html";

(2)购物车页面链接到跳板页

请登录
购物车合并 服务接口层

pinyougou-cart-interface 工程的 CartService.java 定义方法

/**
	 * 需求:合并购物车数据
	 * @param username
	 * @param cartListStr
	 */
	List mergeCart(String username, String cartListStr);
服务实现层

pinyougou-cart-service 工程 CartServiceImpl.java 实现方法

/**
	 * 需求:合并购物车数据
	 * 
	 * @param username
	 * @param cartListStr
	 */
	public List mergeCart(String username, String cartListStr) {
		// 根据用户名查询所有购物车数据
		List cartList1 = (List) redisTemplate.boundHashOps("cartList").get(username);
		// 把cookie购物车数据转换集合
		List cartList2 = JSON.parseArray(cartListStr, Cart.class);
		
		//循环redis购物车
		for (Cart cart : cartList2) {
			//获取当前商家列表
			List orderItemList = cart.getOrderItemList();
			//循环
			for (TbOrderItem tbOrderItem : orderItemList) {
				//返回合并后redis购物车集合
				cartList1 =	this.addGoodsToCartList(cartList1, tbOrderItem.getItemId(), tbOrderItem.getNum());
				
			}
		}
		
		return cartList1;

	}
控制层

修改 pinyougou-cart-web 工程 CartController 类的 findCartList 方法

/**
	 * 需求:查询购物车列表
	 * 
	 * @return
	 */
	@RequestMapping("/findCartList")
	public List findCartList(HttpServletRequest request) {
		// 判断用户此时是否处于登录状态
		// 获取用户名
		String username = SecurityContextHolder.getContext()
				.getAuthentication().getName();
		
		//定义集合
		List cartList = null;
		// 查询cookie购物车数据
		String cartListStr = CookieUtil.getCookieValue(request, "cartList", true);
		// 登录
		if (!username.equals("anonymousUser")) {
			//判断cookie购物车不为空,合并
			if(StringUtils.isNotBlank(cartListStr)){
				//合并购物车
				cartList = 	cartService.mergeCart(username,cartListStr);
				
			}
			//登录
		   cartList = cartService.findRedisCartList(username);		
		   
		   return cartList;
			
		}	
		
		//未登录
		// 判断集合是否存在值
		if (StringUtils.isBlank(cartListStr)) {
			cartListStr = "[]";
		}
		// 把购物车字符串转换成对象
		cartList = JSON.parseArray(cartListStr, Cart.class);	
		
		return cartList;
	}
关注
打赏
1688896170
查看更多评论

杨林伟

暂无认证

  • 2浏览

    0关注

    3183博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.1151s