版权声明:本文为博主原创文章,未经博主允许不得转载。 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)通过CartService
和userId
获取该用户所有的购物车信息。
(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都非常简单,都是一句,数据库取相应的数据。