• e3mall_day12


    一.购物车工程搭建

      >创建e3-cart聚合工程以及下面的子模块,还有e3-cart-web工程,全部参照其他已有的工程实现

    二.添加购物车-代码实现

     

     

     1     @Value("${COOKIE_CART_EXPIRE}")
     2     private Integer COOKIE_CART_EXPIRE;
     3     
     4     @Autowired
     5     private ItemService itemService;
     6     @Autowired
     7     private CartService cartService;
     8 
     9     @RequestMapping("/cart/add/{itemId}")
    10     public String addCart(@PathVariable Long itemId, @RequestParam(defaultValue="1")Integer num,
    11             HttpServletRequest request, HttpServletResponse response) {22         //从cookie中取购物车列表
    23         List<TbItem> cartList = getCartListFromCookie(request);
    24         //判断商品在商品列表中是否存在
    25         boolean flag = false;
    26         for (TbItem tbItem : cartList) {
    27             //如果存在数量相加
    28             if (tbItem.getId() == itemId.longValue()) {
    29                 flag = true;
    30                 //找到商品,数量相加
    31                 tbItem.setNum(tbItem.getNum() + num);
    32                 //跳出循环
    33                 break;
    34             }
    35         }
    36         //如果不存在
    37         if (!flag) {
    38             //根据商品id查询商品信息。得到一个TbItem对象
    39             TbItem tbItem = itemService.getItemById(itemId);
    40             //设置商品数量
    41             tbItem.setNum(num);
    42             //取一张图片
    43             String image = tbItem.getImage();
    44             if (StringUtils.isNotBlank(image)) {
    45                 tbItem.setImage(image.split(",")[0]);
    46             }
    47             //把商品添加到商品列表
    48             cartList.add(tbItem);
    49         }
    50         //写入cookie
    51         CookieUtils.setCookie(request, response, "cart", JsonUtils.objectToJson(cartList), COOKIE_CART_EXPIRE, true);
    52         //返回添加成功页面
    53         return "cartSuccess";
    54     }
    55     
    56     /**
    57      * 从cookie中取购物车列表的处理
    58      * <p>Title: getCartListFromCookie</p>
    59      * <p>Description: </p>
    60      * @param request
    61      * @return
    62      */
    63     private List<TbItem> getCartListFromCookie(HttpServletRequest request) {
    64         String json = CookieUtils.getCookieValue(request, "cart", true);
    65         //判断json是否为空
    66         if (StringUtils.isBlank(json)) {
    67             return new ArrayList<>();
    68         }
    69         //把json转换成商品列表
    70         List<TbItem> list = JsonUtils.jsonToList(json, TbItem.class);
    71         return list;
    72     }

    三.展示购物车列表

        /**
         * 展示购物车列表
         * <p>Title: showCatList</p>
         * <p>Description: </p>
         * @param request
         * @return
         */
        @RequestMapping("/cart/cart")
        public String showCatList(HttpServletRequest request, HttpServletResponse response) {
            //从cookie中取购物车列表
            List<TbItem> cartList = getCartListFromCookie(request);//把列表传递给页面
            request.setAttribute("cartList", cartList);
            //返回逻辑视图
            return "cart";
        }

    四.更新购物车数量

        /**
         * 更新购物车商品数量
         */
        @RequestMapping("/cart/update/num/{itemId}/{num}")
        @ResponseBody
        public E3Result updateCartNum(@PathVariable Long itemId, @PathVariable Integer num
                , HttpServletRequest request ,HttpServletResponse response) {//从cookie中取购物车列表
            List<TbItem> cartList = getCartListFromCookie(request);
            //遍历商品列表找到对应的商品
            for (TbItem tbItem : cartList) {
                if (tbItem.getId().longValue() == itemId) {
                    //更新数量
                    tbItem.setNum(num);
                    break;
                }
            }
            //把购物车列表写回cookie
            CookieUtils.setCookie(request, response, "cart", JsonUtils.objectToJson(cartList), COOKIE_CART_EXPIRE, true);
            //返回成功
            return E3Result.ok();
        }

      》如果服务端返回406,大部分情况是没有导入jeckson的包,还有一种情况是请求的页面为html,因此浏览器希望得到的数据类型是html,但是响应的数据是其他数据类型,也会导致这个问题,一般解决方案是请求后缀改为action

    五..删除购物车商品

        /**
         * 删除购物车商品
         */
        @RequestMapping("/cart/delete/{itemId}")
        public String deleteCartItem(@PathVariable Long itemId, HttpServletRequest request,
                HttpServletResponse response) {//从cookie中取购物车列表
            List<TbItem> cartList = getCartListFromCookie(request);
            //遍历列表,找到要删除的商品
            for (TbItem tbItem : cartList) {
                if (tbItem.getId().longValue() == itemId) {
                    //删除商品
                    cartList.remove(tbItem);
                    //跳出循环
                    break;
                }
            }
            //把购物车列表写入cookie
            CookieUtils.setCookie(request, response, "cart", JsonUtils.objectToJson(cartList), COOKIE_CART_EXPIRE, true);
            //返回逻辑视图,重定向到显示购物车列表
            return "redirect:/cart/cart.html";
        }
    }

    六.登录时使用购物车分析

     

     

     

     七.用户登录拦截器实现

        @Autowired
        private TokenService tokenService;
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            // 前处理,执行handler之前执行此方法。
            //返回true,放行    false:拦截
            //1.从cookie中取token
            String token = CookieUtils.getCookieValue(request, "token");
            //2.如果没有token,未登录状态,直接放行
            if (StringUtils.isBlank(token)) {
                return true;
            }
            //3.取到token,需要调用sso系统的服务,根据token取用户信息
            E3Result e3Result = tokenService.getUserByToken(token);
            //4.没有取到用户信息。登录过期,直接放行。
            if (e3Result.getStatus() != 200) {
                return true;
            }
            //5.取到用户信息。登录状态。
            TbUser user = (TbUser) e3Result.getData();
            //6.把用户信息放到request中。只需要在Controller中判断request中是否包含user信息。放行
            request.setAttribute("user", user);
            return true;
        }

    八.服务端添加单个商品-实现

      》service层:

        @Autowired
        private JedisClient jedisClient;
        @Value("${REDIS_CART_PRE}")
        private String REDIS_CART_PRE;
        @Autowired
        private TbItemMapper itemMapper;
        
        @Override
        public E3Result addCart(long userId, long itemId, int num) {
            //向redis中添加购物车。
            //数据类型是hash key:用户id field:商品id value:商品信息
            //判断商品是否存在
            Boolean hexists = jedisClient.hexists(REDIS_CART_PRE + ":" + userId, itemId + "");
            //如果存在数量相加
            if (hexists) {
                String json = jedisClient.hget(REDIS_CART_PRE + ":" + userId, itemId + "");
                //把json转换成TbItem
                TbItem item = JsonUtils.jsonToPojo(json, TbItem.class);
                item.setNum(item.getNum() + num);
                //写回redis
                jedisClient.hset(REDIS_CART_PRE + ":" + userId, itemId + "", JsonUtils.objectToJson(item));
                return E3Result.ok();
            }
            //如果不存在,根据商品id取商品信息
            TbItem item = itemMapper.selectByPrimaryKey(itemId);
            //设置购物车数据量
            item.setNum(num);
            //取一张图片
            String image = item.getImage();
            if (StringUtils.isNotBlank(image)) {
                item.setImage(image.split(",")[0]);
            }
            //添加到购物车列表
            jedisClient.hset(REDIS_CART_PRE + ":" + userId, itemId + "", JsonUtils.objectToJson(item));
            return E3Result.ok();
        }

    九.登录状态下-添加购物车

        @RequestMapping("/cart/add/{itemId}")
        public String addCart(@PathVariable Long itemId, @RequestParam(defaultValue="1")Integer num,
                HttpServletRequest request, HttpServletResponse response) {
            //判断用户是否登录
            TbUser user = (TbUser) request.getAttribute("user");
            //如果是登录状态,把购物车写入redis
            if (user != null) {
                //保存到服务端
                cartService.addCart(user.getId(), itemId, num);
                //返回逻辑视图
                return "cartSuccess";
            }
            //如果未登录使用cookie
            //从cookie中取购物车列表
            List<TbItem> cartList = getCartListFromCookie(request);
            //判断商品在商品列表中是否存在
            boolean flag = false;
            for (TbItem tbItem : cartList) {
                //如果存在数量相加
                if (tbItem.getId() == itemId.longValue()) {
                    flag = true;
                    //找到商品,数量相加
                    tbItem.setNum(tbItem.getNum() + num);
                    //跳出循环
                    break;
                }
            }
            //如果不存在
            if (!flag) {
                //根据商品id查询商品信息。得到一个TbItem对象
                TbItem tbItem = itemService.getItemById(itemId);
                //设置商品数量
                tbItem.setNum(num);
                //取一张图片
                String image = tbItem.getImage();
                if (StringUtils.isNotBlank(image)) {
                    tbItem.setImage(image.split(",")[0]);
                }
                //把商品添加到商品列表
                cartList.add(tbItem);
            }
            //写入cookie
            CookieUtils.setCookie(request, response, "cart", JsonUtils.objectToJson(cartList), COOKIE_CART_EXPIRE, true);
            //返回添加成功页面
            return "cartSuccess";
        }

    十.登录状态下-展示购物车列表-Service

        @Override //合并cookie和redis的购物车
    public E3Result mergeCart(long userId, List<TbItem> itemList) { //遍历商品列表 //把列表添加到购物车。 //判断购物车中是否有此商品 //如果有,数量相加 //如果没有添加新的商品 for (TbItem tbItem : itemList) { addCart(userId, tbItem.getId(), tbItem.getNum()); } //返回成功 return E3Result.ok(); } @Override //获取redis中的购物车列表数据 public List<TbItem> getCartList(long userId) { //根据用户id查询购车列表 List<String> jsonList = jedisClient.hvals(REDIS_CART_PRE + ":" + userId); List<TbItem> itemList = new ArrayList<>(); for (String string : jsonList) { //创建一个TbItem对象 TbItem item = JsonUtils.jsonToPojo(string, TbItem.class); //添加到列表 itemList.add(item); } return itemList; }

    十一.登录状态下-展示购物车列表-表现层

        
        /**
         * 展示购物车列表
         * <p>Title: showCatList</p>
         * <p>Description: </p>
         * @param request
         * @return
         */
        @RequestMapping("/cart/cart")
        public String showCatList(HttpServletRequest request, HttpServletResponse response) {
            //从cookie中取购物车列表
            List<TbItem> cartList = getCartListFromCookie(request);
            //判断用户是否为登录状态
            TbUser user = (TbUser) request.getAttribute("user");
            //如果是登录状态
            if (user != null) {
                //从cookie中取购物车列表
                //如果不为空,把cookie中的购物车商品和服务端的购物车商品合并。
                cartService.mergeCart(user.getId(), cartList);
                //把cookie中的购物车删除
                CookieUtils.deleteCookie(request, response, "cart");
                //从服务端取购物车列表
                cartList = cartService.getCartList(user.getId());
                
            }
            //把列表传递给页面
            request.setAttribute("cartList", cartList);
            //返回逻辑视图
            return "cart";
        }

    十二..登录状态下-修改、删除购物车

      》service:

        @Override
        public E3Result updateCartNum(long userId, long itemId, int num) {
            //从redis中取商品信息
            String json = jedisClient.hget(REDIS_CART_PRE + ":" + userId, itemId + "");
            //更新商品数量
            TbItem tbItem = JsonUtils.jsonToPojo(json, TbItem.class);
            tbItem.setNum(num);
            //写入redis
            jedisClient.hset(REDIS_CART_PRE + ":" + userId, itemId + "", JsonUtils.objectToJson(tbItem));
            return E3Result.ok();
        }
    
        @Override
        public E3Result deleteCartItem(long userId, long itemId) {
            // 删除购物车商品
            jedisClient.hdel(REDIS_CART_PRE + ":" + userId, itemId + "");
            return E3Result.ok();
        }

      》controller:

        /**
         * 更新购物车商品数量
         */
        @RequestMapping("/cart/update/num/{itemId}/{num}")
        @ResponseBody
        public E3Result updateCartNum(@PathVariable Long itemId, @PathVariable Integer num
                , HttpServletRequest request ,HttpServletResponse response) {
            //判断用户是否为登录状态
            TbUser user = (TbUser) request.getAttribute("user");
            if (user != null) {
                cartService.updateCartNum(user.getId(), itemId, num);
                return E3Result.ok();
            }
            //从cookie中取购物车列表
            List<TbItem> cartList = getCartListFromCookie(request);
            //遍历商品列表找到对应的商品
            for (TbItem tbItem : cartList) {
                if (tbItem.getId().longValue() == itemId) {
                    //更新数量
                    tbItem.setNum(num);
                    break;
                }
            }
            //把购物车列表写回cookie
            CookieUtils.setCookie(request, response, "cart", JsonUtils.objectToJson(cartList), COOKIE_CART_EXPIRE, true);
            //返回成功
            return E3Result.ok();
        }
        
        /**
         * 删除购物车商品
         */
        @RequestMapping("/cart/delete/{itemId}")
        public String deleteCartItem(@PathVariable Long itemId, HttpServletRequest request,
                HttpServletResponse response) {
            //判断用户是否为登录状态
            TbUser user = (TbUser) request.getAttribute("user");
            if (user != null) {
                cartService.deleteCartItem(user.getId(), itemId);
                return "redirect:/cart/cart.html";
            }
            //从cookie中取购物车列表
            List<TbItem> cartList = getCartListFromCookie(request);
            //遍历列表,找到要删除的商品
            for (TbItem tbItem : cartList) {
                if (tbItem.getId().longValue() == itemId) {
                    //删除商品
                    cartList.remove(tbItem);
                    //跳出循环
                    break;
                }
            }
            //把购物车列表写入cookie
            CookieUtils.setCookie(request, response, "cart", JsonUtils.objectToJson(cartList), COOKIE_CART_EXPIRE, true);
            //返回逻辑视图
            return "redirect:/cart/cart.html";
        }
  • 相关阅读:
    poj 1236 Network of Schools 强连通分量 (添加几条边可以使整个图变成强连通图)
    poj 2363 Sightseeing ( 找次短路和最短路的条数 )
    poj 3013
    poj 1679 The Unique MST 最小生成树
    poj 1797 Heavy Transportation (spfa 最短路 )
    hdu 2680 Choose the best route (spfa)
    畅通工程续
    find the longest of the shortest
    SimpleDateFormate的使用
    SimpleDateFormate的使用
  • 原文地址:https://www.cnblogs.com/ibcdwx/p/13565380.html
Copyright © 2020-2023  润新知