package com.alatus.mall.cart.web; import com.alatus.mall.cart.service.CartService; import com.alatus.mall.cart.vo.CartItem; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.mvc.support.RedirectAttributes; import java.util.concurrent.ExecutionException; @Controller public class CartController { @Autowired private CartService cartService; @GetMapping("/cart.html") public String cartListPage(){ return "cartList"; } @GetMapping("/addToCart") public String addToCart(@RequestParam("skuId") Long skuId, @RequestParam("num") Integer num, RedirectAttributes model) throws ExecutionException, InterruptedException { if(num > 0){ CartItem cartItem = cartService.addToCart(skuId,num); model.addAttribute("skuId",skuId); return "redirect:http://cart.alatusmall.com/addToCartSuccess.html"; } return "redirect:http://cart.alatusmall.com/addToCartSuccess.html"; } @GetMapping("/addToCartSuccess.html") public String addToCartSuccessPage(@RequestParam("skuId")Long skuId,Model model){ CartItem cartItem = cartService.getCartItem(skuId); model.addAttribute("item",cartItem); return "success"; } }
package com.alatus.mall.cart.web; import com.alatus.mall.cart.service.CartService; import com.alatus.mall.cart.vo.CartItem; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.mvc.support.RedirectAttributes; import java.util.concurrent.ExecutionException; @Controller public class CartController { @Autowired private CartService cartService; @GetMapping("/cart.html") public String cartListPage(){ return "cartList"; } @GetMapping("/addToCart") public String addToCart(@RequestParam("skuId") Long skuId, @RequestParam("num") Integer num, RedirectAttributes model) throws ExecutionException, InterruptedException { if(num > 0){ CartItem cartItem = cartService.addToCart(skuId,num); model.addAttribute("skuId",skuId); return "redirect:http://cart.alatusmall.com/addToCartSuccess.html"; } return "redirect:http://cart.alatusmall.com/addToCartSuccess.html"; } @GetMapping("/addToCartSuccess.html") public String addToCartSuccessPage(@RequestParam("skuId")Long skuId,Model model){ CartItem cartItem = cartService.getCartItem(skuId); model.addAttribute("item",cartItem); return "success"; } }
package com.alatus.mall.cart.service; import com.alatus.mall.cart.vo.CartItem; import java.util.concurrent.ExecutionException; public interface CartService { CartItem addToCart(Long skuId, Integer num) throws ExecutionException, InterruptedException; CartItem getCartItem(Long skuId); }
package com.alatus.mall.cart.service; import com.alatus.mall.cart.vo.CartItem; import java.util.concurrent.ExecutionException; public interface CartService { CartItem addToCart(Long skuId, Integer num) throws ExecutionException, InterruptedException; CartItem getCartItem(Long skuId); }
标签:skuId,CartItem,cartItem,cart,购物车,-----,import,com,商城 From: https://blog.csdn.net/2201_75960169/article/details/142470236package com.alatus.mall.cart.service.impl; import com.alatus.common.utils.R; import com.alatus.mall.cart.feign.ProductFeignService; import com.alatus.mall.cart.service.CartService; import com.alatus.mall.cart.vo.CartItem; import com.alatus.mall.cart.vo.SkuInfoVo; import com.alatus.mall.cart.vo.UserInfoTo; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.BoundHashOperations; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; import com.alatus.mall.cart.interceptor.CartInterceptor; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.ThreadPoolExecutor; @Slf4j @Service public class CartServiceImpl implements CartService { @Autowired private StringRedisTemplate redisTemplate; @Autowired private ProductFeignService productFeignService; @Autowired private ThreadPoolExecutor threadPoolExecutor; private final String CART_PREFIX = "alatusmall:cart:"; @Override public CartItem addToCart(Long skuId, Integer num) throws ExecutionException, InterruptedException { BoundHashOperations<String, Object, Object> cartOps = getCartOps(); String res = (String) cartOps.get(skuId.toString()); if(StringUtils.isEmpty(res)){ CartItem cartItem = new CartItem(); // 当购物车没有该商品 // 查询商品服务目前添加的商品信息 CompletableFuture<Void> getSkuInfo = CompletableFuture.runAsync(() -> { R info = productFeignService.info(skuId); if (info.getCode() == 0) { SkuInfoVo skuInfo = info.get("skuInfo", new TypeReference<SkuInfoVo>() {}); cartItem.setCheck(true); cartItem.setCount(num); cartItem.setImage(skuInfo.getSkuDefaultImg()); cartItem.setTitle(skuInfo.getSkuTitle()); cartItem.setSkuId(skuId); cartItem.setPrice(skuInfo.getPrice()); } }, threadPoolExecutor); CompletableFuture<Void> getSkuAttrValues = CompletableFuture.runAsync(() -> { // 远程查询sku的组合信息 List<String> skuSaleAttrValues = productFeignService.getSkuSaleAttrValues(skuId); cartItem.setSkuAttr(skuSaleAttrValues); }, threadPoolExecutor); CompletableFuture.allOf(getSkuInfo,getSkuAttrValues).get(); String jsonString = JSON.toJSONString(cartItem); cartOps.put(skuId.toString(),jsonString); return cartItem; } else{ // 购物车有这个商品 CartItem oldCartItem = JSON.parseObject(res, CartItem.class); oldCartItem.setCount(oldCartItem.getCount()+num); cartOps.put(skuId.toString(),JSON.toJSONString(oldCartItem)); return oldCartItem; } } @Override public CartItem getCartItem(Long skuId) { BoundHashOperations<String, Object, Object> cartOps = getCartOps(); String res = (String)cartOps.get(skuId.toString()); return JSON.parseObject(res, CartItem.class); } // 获取我们要操作的购物车 private BoundHashOperations<String, Object, Object> getCartOps(){ UserInfoTo userInfoTo = CartInterceptor.threadLocal.get(); // 用户已登录 String cartKey = ""; if(userInfoTo.getUserId()!=null){ cartKey = CART_PREFIX + userInfoTo.getUserId(); } // 用户未登录 else{ cartKey = CART_PREFIX + userInfoTo.getUserKey(); } BoundHashOperations<String, Object, Object> operations = redisTemplate.boundHashOps(cartKey); return operations; } }
package com.alatus.mall.cart.service.impl; import com.alatus.common.utils.R; import com.alatus.mall.cart.feign.ProductFeignService; import com.alatus.mall.cart.service.CartService; import com.alatus.mall.cart.vo.CartItem; import com.alatus.mall.cart.vo.SkuInfoVo; import com.alatus.mall.cart.vo.UserInfoTo; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.BoundHashOperations; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; import com.alatus.mall.cart.interceptor.CartInterceptor; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.ThreadPoolExecutor; @Slf4j @Service public class CartServiceImpl implements CartService { @Autowired private StringRedisTemplate redisTemplate; @Autowired private ProductFeignService productFeignService; @Autowired private ThreadPoolExecutor threadPoolExecutor; private final String CART_PREFIX = "alatusmall:cart:"; @Override public CartItem addToCart(Long skuId, Integer num) throws ExecutionException, InterruptedException { BoundHashOperations<String, Object, Object> cartOps = getCartOps(); String res = (String) cartOps.get(skuId.toString()); if(StringUtils.isEmpty(res)){ CartItem cartItem = new CartItem(); // 当购物车没有该商品 // 查询商品服务目前添加的商品信息 CompletableFuture<Void> getSkuInfo = CompletableFuture.runAsync(() -> { R info = productFeignService.info(skuId); if (info.getCode() == 0) { SkuInfoVo skuInfo = info.get("skuInfo", new TypeReference<SkuInfoVo>() {}); cartItem.setCheck(true); cartItem.setCount(num); cartItem.setImage(skuInfo.getSkuDefaultImg()); cartItem.setTitle(skuInfo.getSkuTitle()); cartItem.setSkuId(skuId); cartItem.setPrice(skuInfo.getPrice()); } }, threadPoolExecutor); CompletableFuture<Void> getSkuAttrValues = CompletableFuture.runAsync(() -> { // 远程查询sku的组合信息 List<String> skuSaleAttrValues = productFeignService.getSkuSaleAttrValues(skuId); cartItem.setSkuAttr(skuSaleAttrValues); }, threadPoolExecutor); CompletableFuture.allOf(getSkuInfo,getSkuAttrValues).get(); String jsonString = JSON.toJSONString(cartItem); cartOps.put(skuId.toString(),jsonString); return cartItem; } else{ // 购物车有这个商品 CartItem oldCartItem = JSON.parseObject(res, CartItem.class); oldCartItem.setCount(oldCartItem.getCount()+num); cartOps.put(skuId.toString(),JSON.toJSONString(oldCartItem)); return oldCartItem; } } @Override public CartItem getCartItem(Long skuId) { BoundHashOperations<String, Object, Object> cartOps = getCartOps(); String res = (String)cartOps.get(skuId.toString()); return JSON.parseObject(res, CartItem.class); } // 获取我们要操作的购物车 private BoundHashOperations<String, Object, Object> getCartOps(){ UserInfoTo userInfoTo = CartInterceptor.threadLocal.get(); // 用户已登录 String cartKey = ""; if(userInfoTo.getUserId()!=null){ cartKey = CART_PREFIX + userInfoTo.getUserId(); } // 用户未登录 else{ cartKey = CART_PREFIX + userInfoTo.getUserKey(); } BoundHashOperations<String, Object, Object> operations = redisTemplate.boundHashOps(cartKey); return operations; } }