购物车(Java实现)

购物车:

一, 将未登录的购物车存在redis 中!

实现思路:
1.设定一个UUID保存在cookie 中

private String getUUID(HttpServletRequest request) {
    Cookie[] cookies = request.getCookies();
    boolean isMatch=false;
    if(cookies!=null && cookies.length>0){
        for (Cookie cookie : cookies) {
            if ("user-Key".equals(cookie.getName())){
                String value = cookie.getValue();
                userKey=value;
                isMatch=true;
            }
        }
    }
    // 没有userKey 则创建一个uuId
    if (!isMatch){
        userKey = UUID.randomUUID().toString().replace("-","");
    }
    return userKey;
}

2.编写接口

void addToCart(String skuId, Integer skuNum,String userKey);

3.实现类

@Override
public void addToCart(String skuId, Integer skuNum,String userKey) {

    Jedis jedis = redisUtil.getJedis();
    String userCartKey = CartConst.USER_KEY_PREFIX+userKey+CartConst.USER_CART_KEY_SUFFIX;

    // 获取缓存中的所有数据
    Map<String, String> map = jedis.hgetAll(userCartKey);
    boolean isMath = false;
    for (String sId : map.keySet()) {
        // 判断两个商品Id 是否相同
        if (sId.equals(skuId)){
          String cartInfoJson = map.get(sId);
            CartInfo cartInfo = JSON.parseObject(cartInfoJson, CartInfo.class);
            // 数量相加
            cartInfo.setSkuNum(cartInfo.getSkuNum()+skuNum);
            // 将结果放回map
            map.put(sId,JSON.toJSONString(cartInfo));
            isMath=true;
        }
    }
    if (!isMath){
        // 根据skuId 获取cartInfo
        SkuInfo skuInfo = manageService.getSkuInfo(skuId);

        CartInfo cartInfo = new CartInfo();
        cartInfo.setSkuId(skuId);
        cartInfo.setCartPrice(skuInfo.getPrice());
        cartInfo.setSkuPrice(skuInfo.getPrice());
        cartInfo.setSkuName(skuInfo.getSkuName());
        cartInfo.setImgUrl(skuInfo.getSkuDefaultImg());
        cartInfo.setUserId(null);
        cartInfo.setSkuNum(skuNum);
        map.put(cartInfo.getSkuId(),JSON.toJSONString(cartInfo));
    }

    // 将map 放入缓存
    jedis.hmset(userCartKey,map);
    jedis.close();
}

4.控制器

@RequestMapping("addToCart")
@LoginRequire(autoRedirect = false)
public String addToCart(HttpServletRequest request, HttpServletResponse response){
    // 获取skuId,skuNum
    String skuId = request.getParameter("skuId");
    String skuNum = request.getParameter("skuNum");
    // 获取userId
    String userId = (String) request.getAttribute("userId");
    if (userId!=null){
        // 登录 mysql - redis 直接将操作数据库的删掉即可!
        cartService.addToCart(skuId,userId,Integer.parseInt(skuNum));
    }else {
        // 未登录
            userKey = getUUID(request);
               Cookie cookie = new Cookie("user-Key", userKey);
            // 添加cookie
            response.addCookie(cookie);
            cartService.addToCart(skuId,Integer.parseInt(skuNum), this.userKey);
    }
    SkuInfo skuInfo = manageService.getSkuInfo(skuId);
    request.setAttribute("skuNum",skuNum);
    request.setAttribute("skuInfo",skuInfo);
    return "success";
}

二,查询购物车商品

控制器

@RequestMapping("cartList")
@LoginRequire(autoRedirect = false)
public String cartList(HttpServletRequest request,HttpServletResponse response){
    // 获取userId
    String userId = (String) request.getAttribute("userId");
    userKey = getUUID(request);
    // 声明集合
    List<CartInfo> cartInfoList = null;
    if (userId!=null){
        // 合并购物车:
        // List<CartInfo> cartListCK = cartCookieHandler.getCartList(request);

        List<CartInfo> cartListCK = cartService.getRedisCartList(userKey);
        if (cartListCK!=null && cartListCK.size()>0){
            // 调用合并方法
            cartInfoList = cartService.mergeToCartList(cartListCK,userId);
            // 清空未登录数据
            // cartCookieHandler.deleteCartCookie(request,response);
            cartService.deleteCartRedis(userKey);
        }else {
            // 获取登录的购物车数据
            cartInfoList =  cartService.getCartList(userId);
        }

    }else {
        // 获取未登录
        // cartInfoList = cartCookieHandler.getCartList(request);
        //  userKey = getUUID(request);
         cartInfoList = cartService.getRedisCartList(userKey);
    }

    request.setAttribute("cartInfoList",cartInfoList);

    return "cartList";
}

接口实现类

List<CartInfo> getRedisCartList(String userKey);

void deleteCartRedis(String userKey);
@Override
public List<CartInfo> getRedisCartList(String userKey) {
    List<CartInfo> cartInfoList  = new ArrayList<>();
    Jedis jedis = redisUtil.getJedis();
    String userCartKey = CartConst.USER_KEY_PREFIX+userKey+CartConst.USER_CART_KEY_SUFFIX;
    List<String> stringList = jedis.hvals(userCartKey);
    for (String cartJson : stringList) {
        cartInfoList.add(JSON.parseObject(cartJson,CartInfo.class));
    }
    return cartInfoList;
}
@Override
public void deleteCartRedis(String userKey) {
    Jedis jedis = redisUtil.getJedis();
    String userCartKey = CartConst.USER_KEY_PREFIX+userKey+CartConst.USER_CART_KEY_SUFFIX;
    jedis.del(userCartKey);
    jedis.close();
}
  • 5
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值