购物项目实战学习记录(9)——购物车及结算

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012525096/article/details/88073408

进入购物车页面后台逻辑

CartController

    @RequestMapping(value = "/cart", method = RequestMethod.GET)
    public String cart(Model model, HttpServletRequest request) {
        WebUser webUser = getCurrentLoginUser(request);//当前登录用户
        if (null != webUser) {
            Long userId = webUser.getUserId();
            List<Cart> carts = cartService.getCartByUserId(userId);
            if (!CollectionUtils.isEmpty(carts)) {//购物车非空
                List<Long> dealIds = carts.stream().map(cart -> cart.getDealId()).collect(Collectors.toList());
                List<Deal> deals = dealService.getDealsForCart(dealIds);
                List<CartDTO> cartDTOs = new ArrayList<>();//CartDTO用于页面显示
                Map<Long, Deal> dealMap = BaseEntity.idEntityMap(deals);
                for (Cart cart : carts) {
                    cartDTOs.add(new CartDTO(cart, dealMap.get(cart.getDealId())));
                }
                model.addAttribute("carts", cartDTOs);
            }
            return "/cart/cart";
        }
        return "redirect:/login";
    }

注:
(1)获取当前的登录用户,若因为超时退出等原因获取空,则跳转到登录页面。
(2)通过CartServiceuserId获取该用户所有的购物车信息。
(3)如果购物车非空,则从购物车信息找到对应的dealId,从而找到deal商品信息。
(4)将商品信息转换成CartDTO,加入到model中,放在前端显示。

Service

直接调用DAO进行查询。

CartService

    public List<Cart> getCartByUserId(Long userId) {
        return cartDAO.findByUserId(userId);
    }

DealService

    public List<Deal> getDealsForCart(List<Long> dealIds) {
        List<Deal> result = dealDAO.getDealsForCart(dealIds);
        return result;
    }

DAO

CartDAO

    public List<Cart> findByUserId(Long userId) {
        return super.findAll(MAPPER_NAMESPACE + ".selectByUserId", userId);
    }

DealDAO

    public List<Deal> getDealsForCart(List<Long> dealIds) {
        Map<String, Object> params = new HashMap<>();
        params.put("dealIds", dealIds);
        return findAll(MAPPER_NAMESPACE + ".selectDealsForCart", params);
    }

注:List在Mapper内,使用in (XXX)进行查询。

进入结算页面后台逻辑

从购物车结算

CartController

    @RequestMapping(value = "/settlement", method = RequestMethod.POST)
    public String settlement(String cartIds, Integer totalPrice, Model model, HttpServletRequest request) {
        if (!StringUtils.isEmpty(cartIds) && null != totalPrice && totalPrice > 0) {
            List<Long> ids = Arrays.asList(cartIds.split(",")).stream().map(id -> Long.valueOf(id)).collect(Collectors.toList());
            List<Cart> carts = cartService.getCartsByIds(ids);
            List<Long> skuIds = carts.stream().map(cart -> cart.getDealSkuId()).collect(Collectors.toList());
            List<Deal> deals = dealService.getBySkuIds(skuIds);
            Map<Long, Deal> skuIdMap = deals.stream().collect(Collectors.toMap(Deal::getSkuId, deal -> deal));
            List<CartDTO> cartDTOs = new ArrayList<>();//CartDTO用于页面显示
            for (Cart cart : carts) {
                cartDTOs.add(new CartDTO(cart, skuIdMap.get(cart.getDealSkuId())));
            }
            model.addAttribute("carts", cartDTOs);

            WebUser webUser = getCurrentLoginUser(request);
            List<Address> addresses = addressService.getByUserId(webUser.getUserId());
            model.addAttribute("addresses", addresses);
            model.addAttribute("totalPrice", totalPrice);
        }
        return "/cart/settlement";
    }

注:
(1)先获取购物车ID的列表,转换成List<Long> ids,使用JDK8流的方式进行转换,避免多层循环。
(2)通过CartService和ids找到购物车信息。
(3)从购物车信息中提取商品的skuID,使用JDK8流的方式,避免for。
(4)通过CartService和skuid找到商品信息。
(5)购物车信息转换成CartDTO用于前端显示,并把收货地址(通过UserId和AddressService得到)和总金额放入model中。

选择商品直接结算

CartController

    @RequestMapping(value = "/settlement/{skuId}")
    public String settlement(@PathVariable Long skuId, HttpServletRequest request, Model model) {
        WebUser webUser = getCurrentLoginUser(request);

        Deal deal = dealService.getBySkuId(skuId);
        Cart cart = new Cart();
        cart.setCount(1);
        cart.setDealId(deal.getId());
        cart.setDealSkuId(skuId);
        cart.setUserId(webUser.getUserId());

        CartDTO cartDTO = new CartDTO(cart, deal);
        model.addAttribute("carts", cartDTO);

        List<Address> addresses = addressService.getByUserId(webUser.getUserId());
        model.addAttribute("addresses", addresses);
        model.addAttribute("totalPrice", deal.getDealPrice());
        return "/cart/settlement";
    }

(1)与上方不同的是,这里构建一个Cart信息而不是查询(购物车没有这个)。

Service和DAO

Service和DAO都非常简单,都是一句,数据库取相应的数据。

猜你喜欢

转载自blog.csdn.net/u012525096/article/details/88073408