1.1 需求分析

  • 使用Cookie存储购物车数据,服务层负责业务逻辑,控制器层负责读写cookie。
  • 说明:Cookie的value存储List<Cart> 的json格式字符串数据(中文需要Unicode编码,因为cookie的值不能存在中文字符)
  • 总结:
    实现cookie存储购物车控制器层代码:
    cookieName: pinyougou_cart
    cookieValue: List<Cart>集合转化成json格式的字符串,有中文需要转码。
  • 实现步骤:
  1. 定义CartController.java控制器,读写购物车。
    把商品添加到购物车,再把购物车存储Cookie
    先从浏览器中获取Cookie,从Cookie中获取原来的购物车
  • 详细步骤:(未登录的用户,购物车存储到Cookie)
  1. 获取购物车
  2. 把商品添加到购物车
  3. 把添加后的购物车存储到Cookie
  • Cookie工具类(放在common工程中)

    public final class CookieUtils {/** 定义Cookie名称的静态内部类 */public static class CookieName{/** 定义存放在Cookie中购物车的名称 */public static final String PINYOUGOU_CART = "pinyougou_cart";}/*** 根据Cookie的名称获取指定的Cookie* @param request 请求对象* @param cookieName cookie的名称* @return Cookie*/public static Cookie getCookie(HttpServletRequest request, String cookieName){/** 获取所有的Cookie */Cookie[] cookies = request.getCookies();if (cookies != null && cookies.length > 0){for (Cookie cookie : cookies){if (cookie.getName().equals(cookieName)){return cookie;}}}return null;}/*** 根据CookieName获取指定的Cookie值* @param request 请求对象* @param cookieName cookie的名称* @param encoded 是否编码* @return Cookie的值*/public static String getCookieValue(HttpServletRequest request, String cookieName, boolean encoded) {/** 获取指定的Cookie */Cookie cookie = getCookie(request, cookieName);String cookieValue = null;try {if (cookie != null) {if (encoded){cookieValue = URLDecoder.decode(cookie.getValue(), "UTF-8");}else{cookieValue = cookie.getValue();}}} catch (Exception e) {e.printStackTrace();}return cookieValue;}/*** 根据Cookie的名称删除指定的Cookie* @param request 请求对象* @param response 响应对象* @param cookieName cookie名称*/public static void deleteCookie(HttpServletRequest request, HttpServletResponse response, String cookieName) {setCookie(request, response, cookieName, null, 0, false);}/*** 设置Cookie* @param request 请求对象* @param response 响应对象* @param cookieName cookie的名称* @param cookieValue cookie的值* @param maxAge 存放Cookie的最大存放时间(按秒计算)* @param encoded 是否编码*/public static void setCookie(HttpServletRequest request, HttpServletResponse response,String cookieName, String cookieValue, int maxAge, boolean encoded) {try {/** 对Cookie的值进行判断 */if (cookieValue == null) {cookieValue = "";}if (encoded) {cookieValue = URLEncoder.encode(cookieValue, "UTF-8");}Cookie cookie = getCookie(request, cookieName);if (cookie == null){cookie = new Cookie(cookieName, cookieValue);}/** 设置Cookie的值 */cookie.setValue(cookieValue);/** 设置最大存活时间 */cookie.setMaxAge(maxAge);/** 设置访问路径 */cookie.setPath("/");/** 添加到用户浏览器 */response.addCookie(cookie);} catch (Exception e) {e.printStackTrace();}}
    }

    CartController.java控制器:

    /** 购物车控制器 */@RestController@RequestMapping("/cart")public class CartController {@Reference(timeout = 30000)private CartService cartService;@Autowiredprivate HttpServletRequest request;@Autowiredprivate HttpServletResponse response;
        /** 添加SKU商品到购物车 */@GetMapping("/addCart")public boolean addCart(Long itemId, Integer num){try{// 获取购物车集合List<Cart> carts = findCart();// 调用服务层添加SKU商品到购物车carts = cartService.addItemToCart(carts, itemId, num);// 将购物车重新存入Cookie中CookieUtils.setCookie(request, response,CookieUtils.CookieName.PINYOUGOU_CART,JSON.toJSONString(carts),3600 * 24, true);return true;}catch (Exception ex){ex.printStackTrace();}return false;}

    /** 获取购物车集合 */
       
    @GetMapping("/findCart")
        public List<Cart> findCart() {
            // 从Cookie中获取购物车集合json字符串
           
    String cartStr = CookieUtils.getCookieValue(request,
                    CookieUtils.CookieName.PINYOUGOU_CART, true);
            // 判断是否为空
           
    if (StringUtils.isBlank(cartStr)){
                cartStr = "[]";
            }
            List<Cart> carts = JSON.parseArray(cartStr, Cart.class);
            return carts;
        }
    }

服务接口层:

CartService.java:

/** 购物车服务接口 */
public interface CartService {
    /**
     * 添加SKU商品到购物车
     * @param carts 购物车(一个Cart对应一个商家)
     * @param itemId SKU商品id
     * @param num 购买数据
     * @return 修改后的购物车
     */
   
List<Cart> addItemToCart(List<Cart> carts,
                             Long itemId, Integer num);
}

服务实现层:

  • 实现思路:(对照上图结构去实现)
  1. 根据SKU商品ID查询SKU商品对象。
  2. 获取商家ID
  3. 根据商家ID判断购物车集合中是否存在该商家的购物车
  4. 如果购物车集合中不存在该商家的购物车
    4.1 创建新的购物车对象
    4.2 将新的购物车对象添加到购物车集合
  5. 如果购物车集合中存在该商家的购物车
    5.1 判断购物车订单明细集合中是否存在该商品
    5.2 如果没有,新增购物车订单明细
    5.3 如果有,在原购物车订单明细上添加数量,更改金额

创建服务接口实现类CartServiceImpl.java:

/** 购物车服务接口实现类 */
@Service(interfaceName = "com.pinyougou.cart.service.CartService")
@Transactional
public class CartServiceImpl implements CartService {
    @Autowired
    private ItemMapper itemMapper;
    /**
     * 添加SKU商品到购物车
     * @param carts 购物车(一个Cart对应一个商家)
     * @param itemId SKU商品id
     * @param num 购买数据
     * @return 修改后的购物车
     */
   
public List<Cart> addItemToCart(List<Cart> carts,
                                    Long itemId, Integer num){
        try{
            // 根据SKU商品ID查询SKU商品对象
           
Item item = itemMapper.selectByPrimaryKey(itemId);
            // 获取商家id
           
String sellerId = item.getSellerId();
            // 根据商家id判断购物车集合中是否存在该商家的购物车
           
Cart cart = searchCartBySellerId(carts, sellerId);
            if (cart == null){ // 购物车集合中不存在该商家购物车
                // 创建新的购物车对象
               
cart = new Cart();
                cart.setSellerId(sellerId);
                cart.setSellerName(item.getSeller());
                // 创建订单明细(购物中一个商品)
               
OrderItem orderItem = createOrderItem(item, num);
                List<OrderItem> orderItems = new ArrayList<>(0);
                orderItems.add(orderItem);
                // 为购物车设置订单明细集合
               
cart.setOrderItems(orderItems);

// 将新的购物车对象添加到购物车集合
               
carts.add(cart);
            }else{ // 购物车集合中存在该商家购物车
                // 判断购物车订单明细集合中是否存在该商品
               
OrderItem orderItem = searchOrderItemByItemId(
                        cart.getOrderItems(), itemId);
                if (orderItem == null){
                    // 如果没有,新增购物车订单明细
                   
orderItem = createOrderItem(item, num);
                    cart.getOrderItems().add(orderItem);
                }else{
                    // 如果有,在原购物车订单明细上添加数量,更改金额
                   
orderItem.setNum(orderItem.getNum() + num);
                    orderItem.setTotalFee(new BigDecimal(
                            orderItem.getPrice().doubleValue()
                                    * orderItem.getNum()));
                    // 如果订单明细的购买数小于等于0,则删除
                   
if (orderItem.getNum() <= 0){
                        // 删除购物车中的订单明细(商品)
                       
cart.getOrderItems().remove(orderItem);
                    }
                    // 如果cart的orderItems订单明细为0,则删除cart
                   
if (cart.getOrderItems().size() == 0){
                        carts.remove(cart);
                    }
                }
            }
            return carts;
        }catch (Exception ex){
            throw new RuntimeException(ex);
        }
    }
    /** 从购物车集合中获取该商家的购物车 */
   
private Cart searchCartBySellerId(
            List<Cart> carts, String sellerId) {
        for (Cart cart : carts){
            if (cart.getSellerId().equals(sellerId)){
                return cart;
            }
        }
        return null;
    }
    /** 创建订单明细 */
   
private OrderItem createOrderItem(Item item, Integer num) {
        // 创建订单明细
       
OrderItem orderItem = new OrderItem();
        orderItem.setSellerId(item.getSellerId());
        orderItem.setGoodsId(item.getGoodsId());
        orderItem.setItemId(item.getId());
        orderItem.setNum(num);
        orderItem.setPicPath(item.getImage());
        orderItem.setPrice(item.getPrice());
        orderItem.setTitle(item.getTitle());
        // 小计
       
orderItem.setTotalFee(new BigDecimal(
                item.getPrice().doubleValue() * num));
        return orderItem;
    }
    /** 从订单明细集合中获取指定订单明细 */
   
private OrderItem searchOrderItemByItemId(
            List<OrderItem> orderItems, Long itemId) {
        for (OrderItem orderItem : orderItems){
            if (orderItem.getItemId().equals(itemId)){
                return orderItem;
            }
        }
        return null;
    }
}

添加购物车:http://cart.pinyougou.com/cart/addCart?itemId=1369458&num=100

查看购物车:http://cart.pinyougou.com/cart/findCart

Cookie存储购物车相关推荐

  1. Redis存储购物车

    1.1 Redis存储与获取购物车 redisTemplate.boundValueOps("cart_" + userId).get(); redisTemplate.bound ...

  2. 用session和mysql实现购物车_Session和Cookie实现购物车

    使用Session和Cookie实现购物车的比较 购物车相当于现实中超市的购物车,不同的是一个是实体车,一个是虚拟车而已.用户可以在购物网站的不同页面之间跳转,以选购自己喜爱的商品,点击购买时,该商品 ...

  3. 封装的cookie存储、获取、删除方法

    2019独角兽企业重金招聘Python工程师标准>>> 封装的cookie存储.获取.删除方法 1.设置cookie function setCookie(key, value, t ...

  4. js cookie 存储checkbox_浏览器数据存储方式总结,网友:“精辟”!

    今天主要来讲下前端的数据存储,说起数据存储,大家肯定第一时间想起cookie,localstorage,sessionstorage,而其实还有userData和IndexedDB这两种数据存储,接下 ...

  5. cookie文件存放在服务器端,cookie存储在客户端还是服务器

    cookie存储在客户端还是服务器 内容精选 换一换 在很多集群架构中,集群成员的主要目的就是让集中式接口知道它能访问哪些节点,然后此中央接口通过一个两级调度为客户端提供服务,在PB到EB级系统中这个 ...

  6. 商城系统PageBean分页 Cookie存储浏览记录

    封装实体类:PageBean public class PageBean<T> {private int currentPage;//当前页private int currentCount ...

  7. php 置多条cookie,php 在cookie存储多个的简单示例

    这篇文章主要为大家详细介绍了php 在cookie存储多个的简单示例,具有一定的参考价值,可以用来参考一下. 对php在一个cookie中存储多个值得代码感兴趣的小伙伴,下面一起跟随512笔记的小编两 ...

  8. php: 远程操作浏览器cookie存储入门

    本公众号,之前写过一个 js操作 cookie 的教程 这次写一个 php部分远程操作浏览器cookie存储 一.cookie理解,其实就是 浏览器的 一个本地存储,不过这个本地存储,在http握手的 ...

  9. java 购物车 存放数据库_java-没有用户登录时存储购物车(playframework...

    我正在浏览有关Play的帖子!框架,遇到了一些讨论电子商务的帖子.由于我是这两者的初学者,所以我想做一个练习.我写下了一些用例和一些要求,如下所示.我想听听您对此的看法,希望拓宽我的技术智慧. 网页上 ...

最新文章

  1. 基于Pytorch和RDKit建立QSAR模型
  2. 干货丨机器学习新手一定要掌握的10大算法
  3. 60. Permutation Sequence
  4. python好学吗 老程序员-今天面试了一个34岁大龄程序员,有感而发
  5. 2020-12-4((ARM汇编)mov指令,LDR指令,LDR伪指令)
  6. 【Paper】Origin绘制误差棒图(标准差围绕均值)
  7. MySQL(四)复合查询与联合查询
  8. MDN文档基础知识搜集
  9. 32G内存手机到底够用吗?看完泪崩
  10. 4.maven中常用的构建命令
  11. Pyqt5_Python运用过程中一些问题和技巧
  12. mysql中如何计算同比环比_vnpy中如何计算MACD指标
  13. 编译原理 NFA确定化与DFA最小化
  14. C语言0和0.0f的区别
  15. file_get_contents failed to open stream: HTTP request failed! HTTP/1.1 400 Bad Request
  16. [OpenStack] Linuxbridge 的Permission Denied故障调查
  17. 和LinkedSee灵犀一起备战GITC全球互联网技术大会
  18. JAVA实现QQ:实现文字聊天、QQ用户登录、拉取在线用户列表、无异常退出、私聊、发文件、下载文件、离线留言、服务端推送新闻等功能(后端无界面,Utilty源码在后面、)
  19. sequoia 安装配置
  20. php 搜索引擎包含哪些技术,浅谈三大搜索引擎爬虫性感 B-G-B

热门文章

  1. 魔兽UI跟随鼠标移动
  2. 手把手教你如何电脑安装android,怎么在电脑上玩android游戏?安卓模拟器怎么安装?...
  3. 蓝桥杯, 38线译码器74Hc138
  4. 10大免费视频素材网站
  5. linux下raid(md)驱动源码解析
  6. (六)R语言生物序列比对——Needleman-Wunsch全局比对算法
  7. Nim 博弈游戏详解
  8. 左偏树初步学习 洛谷P3377
  9. 又发现一款纯js开源电子表格Luckysheet
  10. fastadmin 阿里云oss解决访问图片是下载