package com.alatus.mall.order.service.impl; import com.alatus.common.vo.MemberRespVo; import com.alatus.mall.order.feign.CartFeignService; import com.alatus.mall.order.feign.MemberFeignService; import com.alatus.mall.order.interceptor.LoginUserInterceptor; import com.alatus.mall.order.to.MemberAddressTo; import com.alatus.mall.order.vo.OrderConfirmVo; import com.alatus.mall.order.vo.OrderItemVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; import java.util.Map; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.alatus.common.utils.PageUtils; import com.alatus.common.utils.Query; import com.alatus.mall.order.dao.OrderDao; import com.alatus.mall.order.entity.OrderEntity; import com.alatus.mall.order.service.OrderService; @Service("orderService") public class OrderServiceImpl extends ServiceImpl<OrderDao, OrderEntity> implements OrderService { @Autowired private MemberFeignService memberFeignService; @Autowired private CartFeignService cartFeignService; @Override public PageUtils queryPage(Map<String, Object> params) { IPage<OrderEntity> page = this.page( new Query<OrderEntity>().getPage(params), new QueryWrapper<OrderEntity>() ); return new PageUtils(page); } @Override public OrderConfirmVo confirmOrder() { OrderConfirmVo confirmVo = new OrderConfirmVo(); MemberRespVo memberRespVo = LoginUserInterceptor.loginUser.get(); // 远程查询所有的用户地址列表 confirmVo.setAddress(memberFeignService.getAddress(memberRespVo.getId())); // 远程查询购物车所有选中的购物项 confirmVo.setItemVoList(cartFeignService.getCurrentCartItem()); // 用户积分 confirmVo.setIntegration(memberRespVo.getIntegration()); // TODO 订单令牌 return null; } }
package com.alatus.mall.order.service.impl; import com.alatus.common.vo.MemberRespVo; import com.alatus.mall.order.feign.CartFeignService; import com.alatus.mall.order.feign.MemberFeignService; import com.alatus.mall.order.interceptor.LoginUserInterceptor; import com.alatus.mall.order.to.MemberAddressTo; import com.alatus.mall.order.vo.OrderConfirmVo; import com.alatus.mall.order.vo.OrderItemVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; import java.util.Map; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.alatus.common.utils.PageUtils; import com.alatus.common.utils.Query; import com.alatus.mall.order.dao.OrderDao; import com.alatus.mall.order.entity.OrderEntity; import com.alatus.mall.order.service.OrderService; @Service("orderService") public class OrderServiceImpl extends ServiceImpl<OrderDao, OrderEntity> implements OrderService { @Autowired private MemberFeignService memberFeignService; @Autowired private CartFeignService cartFeignService; @Override public PageUtils queryPage(Map<String, Object> params) { IPage<OrderEntity> page = this.page( new Query<OrderEntity>().getPage(params), new QueryWrapper<OrderEntity>() ); return new PageUtils(page); } @Override public OrderConfirmVo confirmOrder() { OrderConfirmVo confirmVo = new OrderConfirmVo(); MemberRespVo memberRespVo = LoginUserInterceptor.loginUser.get(); // 远程查询所有的用户地址列表 confirmVo.setAddress(memberFeignService.getAddress(memberRespVo.getId())); // 远程查询购物车所有选中的购物项 confirmVo.setItemVoList(cartFeignService.getCurrentCartItem()); // 用户积分 confirmVo.setIntegration(memberRespVo.getIntegration()); // TODO 订单令牌 return null; } }
package com.alatus.mall.order.service; import com.alatus.mall.order.vo.OrderConfirmVo; import com.baomidou.mybatisplus.extension.service.IService; import com.alatus.common.utils.PageUtils; import com.alatus.mall.order.entity.OrderEntity; import java.util.Map; /** * 订单 * * @author alatus * @email 1571345941@qq.com * @date 2024-03-12 13:50:51 */ public interface OrderService extends IService<OrderEntity> { PageUtils queryPage(Map<String, Object> params); OrderConfirmVo confirmOrder(); }
package com.alatus.mall.order.service; import com.alatus.mall.order.vo.OrderConfirmVo; import com.baomidou.mybatisplus.extension.service.IService; import com.alatus.common.utils.PageUtils; import com.alatus.mall.order.entity.OrderEntity; import java.util.Map; /** * 订单 * * @author alatus * @email 1571345941@qq.com * @date 2024-03-12 13:50:51 */ public interface OrderService extends IService<OrderEntity> { PageUtils queryPage(Map<String, Object> params); OrderConfirmVo confirmOrder(); }
package com.alatus.mall.order.vo; import com.alatus.mall.order.to.MemberAddressTo; import lombok.Data; import java.math.BigDecimal; import java.util.List; @Data public class OrderConfirmVo { // 用户的收货地址 private List<MemberAddressTo> address; // 所有选中的购物车商品项 private List<OrderItemVo> itemVoList; // TODO 发票信息 // 优惠券信息,积分可以减免金额 private Integer integration; // 订单令牌 private String orderToken; // 总价格 private BigDecimal total; // 应付金额 private BigDecimal payPrice; public BigDecimal getTotal() { BigDecimal total = new BigDecimal(0); if(itemVoList!=null){ for (OrderItemVo orderItemVo : itemVoList) { total.add(orderItemVo.getTotalPrice()); } } return total; } public BigDecimal getPayPrice() { BigDecimal integrationBD = new BigDecimal(String.valueOf(integration)); return getTotal().subtract(integrationBD); } }
package com.alatus.mall.order.vo; import com.alatus.mall.order.to.MemberAddressTo; import lombok.Data; import java.math.BigDecimal; import java.util.List; @Data public class OrderConfirmVo { // 用户的收货地址 private List<MemberAddressTo> address; // 所有选中的购物车商品项 private List<OrderItemVo> itemVoList; // TODO 发票信息 // 优惠券信息,积分可以减免金额 private Integer integration; // 订单令牌 private String orderToken; // 总价格 private BigDecimal total; // 应付金额 private BigDecimal payPrice; public BigDecimal getTotal() { BigDecimal total = new BigDecimal(0); if(itemVoList!=null){ for (OrderItemVo orderItemVo : itemVoList) { total.add(orderItemVo.getTotalPrice()); } } return total; } public BigDecimal getPayPrice() { BigDecimal integrationBD = new BigDecimal(String.valueOf(integration)); return getTotal().subtract(integrationBD); } }
package com.alatus.mall.cart.web; import com.alatus.mall.cart.service.CartService; import com.alatus.mall.cart.vo.Cart; 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.List; import java.util.concurrent.ExecutionException; @Controller public class CartController { @Autowired private CartService cartService; @GetMapping("/currentUserCartItem") public List<CartItem> getCurrentCartItem(){ return cartService.getUserCartItems(); } @GetMapping("/cart.html") public String cartListPage(Model model) throws ExecutionException, InterruptedException { Cart cart = cartService.getCart(); model.addAttribute("cart",cart); return "cartList"; } @GetMapping("/deleteItem") public String deleteItem(@RequestParam("skuId")Long skuId){ cartService.deleteItem(skuId); return "redirect:http://cart.alatusmall.com/cart.html"; } @GetMapping("/countItem") public String countItem(@RequestParam("skuId") Long skuId, @RequestParam("num") Integer num){ cartService.changeItemCount(skuId,num); return "redirect:http://cart.alatusmall.com/cart.html"; } @GetMapping("/addToCart") public String addToCart(@RequestParam("skuId") Long skuId, @RequestParam("num") Integer num, RedirectAttributes model) throws ExecutionException, InterruptedException { if(num > 0){ cartService.addToCart(skuId,num); // RedirectAttributes的addAttribute会自动拼串,自动以参数的形式携带数据 // RedirectAttributes的addFlashAttribute()会保存在session里面,但是仅可以取一次值 model.addAttribute("skuId",skuId); return "redirect:http://cart.alatusmall.com/addToCartSuccess.html"; } return "redirect:http://cart.alatusmall.com/addToCartSuccess.html"; } @GetMapping("/checkItem") public String checkItem(@RequestParam("skuId")Long skuId,@RequestParam("check")Integer check){ cartService.checkItem(skuId,check); return "redirect:http://cart.alatusmall.com/cart.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.Cart; 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.List; import java.util.concurrent.ExecutionException; @Controller public class CartController { @Autowired private CartService cartService; @GetMapping("/currentUserCartItem") public List<CartItem> getCurrentCartItem(){ return cartService.getUserCartItems(); } @GetMapping("/cart.html") public String cartListPage(Model model) throws ExecutionException, InterruptedException { Cart cart = cartService.getCart(); model.addAttribute("cart",cart); return "cartList"; } @GetMapping("/deleteItem") public String deleteItem(@RequestParam("skuId")Long skuId){ cartService.deleteItem(skuId); return "redirect:http://cart.alatusmall.com/cart.html"; } @GetMapping("/countItem") public String countItem(@RequestParam("skuId") Long skuId, @RequestParam("num") Integer num){ cartService.changeItemCount(skuId,num); return "redirect:http://cart.alatusmall.com/cart.html"; } @GetMapping("/addToCart") public String addToCart(@RequestParam("skuId") Long skuId, @RequestParam("num") Integer num, RedirectAttributes model) throws ExecutionException, InterruptedException { if(num > 0){ cartService.addToCart(skuId,num); // RedirectAttributes的addAttribute会自动拼串,自动以参数的形式携带数据 // RedirectAttributes的addFlashAttribute()会保存在session里面,但是仅可以取一次值 model.addAttribute("skuId",skuId); return "redirect:http://cart.alatusmall.com/addToCartSuccess.html"; } return "redirect:http://cart.alatusmall.com/addToCartSuccess.html"; } @GetMapping("/checkItem") public String checkItem(@RequestParam("skuId")Long skuId,@RequestParam("check")Integer check){ cartService.checkItem(skuId,check); return "redirect:http://cart.alatusmall.com/cart.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.order.feign; import com.alatus.mall.order.vo.OrderItemVo; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import java.util.List; @FeignClient("Mall-cart") public interface CartFeignService { @GetMapping("/currentUserCartItem") List<OrderItemVo> getCurrentCartItem(); }
package com.alatus.mall.order.feign; import com.alatus.mall.order.vo.OrderItemVo; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import java.util.List; @FeignClient("Mall-cart") public interface CartFeignService { @GetMapping("/currentUserCartItem") List<OrderItemVo> getCurrentCartItem(); }
package com.alatus.mall.cart.service; import com.alatus.mall.cart.vo.Cart; import com.alatus.mall.cart.vo.CartItem; import java.util.List; import java.util.concurrent.ExecutionException; public interface CartService { void addToCart(Long skuId, Integer num) throws ExecutionException, InterruptedException; CartItem getCartItem(Long skuId); Cart getCart() throws ExecutionException, InterruptedException; void checkItem(Long skuId, Integer check); void changeItemCount(Long skuId, Integer num); void deleteItem(Long skuId); List<CartItem> getUserCartItems(); }
package com.alatus.mall.cart.service; import com.alatus.mall.cart.vo.Cart; import com.alatus.mall.cart.vo.CartItem; import java.util.List; import java.util.concurrent.ExecutionException; public interface CartService { void addToCart(Long skuId, Integer num) throws ExecutionException, InterruptedException; CartItem getCartItem(Long skuId); Cart getCart() throws ExecutionException, InterruptedException; void checkItem(Long skuId, Integer check); void changeItemCount(Long skuId, Integer num); void deleteItem(Long skuId); List<CartItem> getUserCartItems(); }
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.Cart; 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.math.BigDecimal; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.ThreadPoolExecutor; import java.util.stream.Collectors; @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 void 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); } else{ // 购物车有这个商品 CartItem oldCartItem = JSON.parseObject(res, CartItem.class); oldCartItem.setCount(oldCartItem.getCount()+num); cartOps.put(skuId.toString(),JSON.toJSONString(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); } @Override public Cart getCart() throws ExecutionException, InterruptedException { UserInfoTo userInfoTo = CartInterceptor.threadLocal.get(); Cart cart = new Cart(); String userKey = CART_PREFIX + userInfoTo.getUserId(); String templateKey = CART_PREFIX + userInfoTo.getUserKey(); if (userInfoTo.getUserId()!=null) { // 登录了 // 先获取临时购物车 List<CartItem> tempCartItems = getCartItems(templateKey); // 如果临时购物车还没有合并 List<String> skuIds = new ArrayList<>(); if(tempCartItems!=null&&tempCartItems.size()>0){ // 两个购物车要合并 for (CartItem cartItem : tempCartItems) { addToCart(cartItem.getSkuId(),cartItem.getCount()); skuIds.add(cartItem.getSkuId().toString()); } // 清除临时购物车的数据 for (int i = 0; i < skuIds.size(); i++) { redisTemplate.boundHashOps(templateKey).delete(skuIds.get(i)); } } // 登陆后的所有购物车数据(包含所有合并的购物车) List<CartItem> newCartItems = getCartItems(userKey); cart.setItems(newCartItems); } else{ // 没登陆 List<CartItem> cartItems = getCartItems(templateKey); cart.setItems(cartItems); } return cart; } @Override public void checkItem(Long skuId, Integer check) { CartItem cartItem = getCartItem(skuId); cartItem.setCheck(check == 1); getCartOps().put(skuId.toString(),JSON.toJSONString(cartItem)); } @Override public void changeItemCount(Long skuId, Integer num) { CartItem cartItem = getCartItem(skuId); cartItem.setCount(num); getCartOps().put(skuId.toString(),JSON.toJSONString(cartItem)); } @Override public void deleteItem(Long skuId) { getCartOps().delete(skuId.toString()); } @Override public List<CartItem> getUserCartItems() { UserInfoTo userInfoTo = CartInterceptor.threadLocal.get(); if (userInfoTo.getUserId()!=null) { String cartKey = CART_PREFIX + userInfoTo.getUserId(); List<CartItem> cartItems = getCartItems(cartKey); cartItems = cartItems.stream().filter(CartItem::getCheck).map(item->{ // 更新为最新价格,因为购物车价格是缓存,不一定准确 // TODO 价格我们采用远程获取的方式 item.setPrice(productFeignService.getPrice(item.getSkuId())); return item; }).collect(Collectors.toList()); return cartItems; } else{ return null; } } private List<CartItem> getCartItems(String cartKey){ BoundHashOperations<String, Object, Object> operations = redisTemplate.boundHashOps(cartKey); List<Object> values = operations.values(); if(values!=null&&values.size()>0){ List<CartItem> collect = values.stream().map((obj) -> { return JSON.parseObject(obj.toString(), CartItem.class); }).collect(Collectors.toList()); return collect; } else{ return null; } } // 获取我们要操作的购物车 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.Cart; 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.math.BigDecimal; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.ThreadPoolExecutor; import java.util.stream.Collectors; @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 void 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); } else{ // 购物车有这个商品 CartItem oldCartItem = JSON.parseObject(res, CartItem.class); oldCartItem.setCount(oldCartItem.getCount()+num); cartOps.put(skuId.toString(),JSON.toJSONString(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); } @Override public Cart getCart() throws ExecutionException, InterruptedException { UserInfoTo userInfoTo = CartInterceptor.threadLocal.get(); Cart cart = new Cart(); String userKey = CART_PREFIX + userInfoTo.getUserId(); String templateKey = CART_PREFIX + userInfoTo.getUserKey(); if (userInfoTo.getUserId()!=null) { // 登录了 // 先获取临时购物车 List<CartItem> tempCartItems = getCartItems(templateKey); // 如果临时购物车还没有合并 List<String> skuIds = new ArrayList<>(); if(tempCartItems!=null&&tempCartItems.size()>0){ // 两个购物车要合并 for (CartItem cartItem : tempCartItems) { addToCart(cartItem.getSkuId(),cartItem.getCount()); skuIds.add(cartItem.getSkuId().toString()); } // 清除临时购物车的数据 for (int i = 0; i < skuIds.size(); i++) { redisTemplate.boundHashOps(templateKey).delete(skuIds.get(i)); } } // 登陆后的所有购物车数据(包含所有合并的购物车) List<CartItem> newCartItems = getCartItems(userKey); cart.setItems(newCartItems); } else{ // 没登陆 List<CartItem> cartItems = getCartItems(templateKey); cart.setItems(cartItems); } return cart; } @Override public void checkItem(Long skuId, Integer check) { CartItem cartItem = getCartItem(skuId); cartItem.setCheck(check == 1); getCartOps().put(skuId.toString(),JSON.toJSONString(cartItem)); } @Override public void changeItemCount(Long skuId, Integer num) { CartItem cartItem = getCartItem(skuId); cartItem.setCount(num); getCartOps().put(skuId.toString(),JSON.toJSONString(cartItem)); } @Override public void deleteItem(Long skuId) { getCartOps().delete(skuId.toString()); } @Override public List<CartItem> getUserCartItems() { UserInfoTo userInfoTo = CartInterceptor.threadLocal.get(); if (userInfoTo.getUserId()!=null) { String cartKey = CART_PREFIX + userInfoTo.getUserId(); List<CartItem> cartItems = getCartItems(cartKey); cartItems = cartItems.stream().filter(CartItem::getCheck).map(item->{ // 更新为最新价格,因为购物车价格是缓存,不一定准确 // TODO 价格我们采用远程获取的方式 item.setPrice(productFeignService.getPrice(item.getSkuId())); return item; }).collect(Collectors.toList()); return cartItems; } else{ return null; } } private List<CartItem> getCartItems(String cartKey){ BoundHashOperations<String, Object, Object> operations = redisTemplate.boundHashOps(cartKey); List<Object> values = operations.values(); if(values!=null&&values.size()>0){ List<CartItem> collect = values.stream().map((obj) -> { return JSON.parseObject(obj.toString(), CartItem.class); }).collect(Collectors.toList()); return collect; } else{ return null; } } // 获取我们要操作的购物车 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.product.app; import java.math.BigDecimal; import java.util.Arrays; import java.util.Map; import com.alatus.mall.product.entity.SkuInfoEntity; import com.alatus.mall.product.service.SkuInfoService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import com.alatus.common.utils.PageUtils; import com.alatus.common.utils.R; /** * sku信息 * * @author Alatus * @email 1571345941@qq.com * @date 2024-06-08 16:06:24 */ @RestController @RequestMapping("/product/skuinfo") public class SkuInfoController { @Autowired private SkuInfoService skuInfoService; /** * 获取商品价格 */ @GetMapping("/{skuId}/price") public BigDecimal getPrice(@PathVariable("skuId") Long skuId){ return skuInfoService.getById(skuId).getPrice(); } /** * 列表 */ @RequestMapping("/list") public R list(@RequestParam Map<String, Object> params){ PageUtils page = skuInfoService.queryPage(params); return R.ok().put("page", page); } /** * 信息 */ @RequestMapping("/info/{skuId}") public R info(@PathVariable("skuId") Long skuId){ SkuInfoEntity pmsSkuInfo = skuInfoService.getById(skuId); return R.ok().put("skuInfo", pmsSkuInfo); } /** * 保存 */ @RequestMapping("/save") public R save(@RequestBody SkuInfoEntity pmsSkuInfo){ skuInfoService.save(pmsSkuInfo); return R.ok(); } /** * 修改 */ @RequestMapping("/update") public R update(@RequestBody SkuInfoEntity pmsSkuInfo){ skuInfoService.updateById(pmsSkuInfo); return R.ok(); } /** * 删除 */ @RequestMapping("/delete") public R delete(@RequestBody Long[] skuIds){ skuInfoService.removeByIds(Arrays.asList(skuIds)); return R.ok(); } }
package com.alatus.mall.product.app; import java.math.BigDecimal; import java.util.Arrays; import java.util.Map; import com.alatus.mall.product.entity.SkuInfoEntity; import com.alatus.mall.product.service.SkuInfoService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import com.alatus.common.utils.PageUtils; import com.alatus.common.utils.R; /** * sku信息 * * @author Alatus * @email 1571345941@qq.com * @date 2024-06-08 16:06:24 */ @RestController @RequestMapping("/product/skuinfo") public class SkuInfoController { @Autowired private SkuInfoService skuInfoService; /** * 获取商品价格 */ @GetMapping("/{skuId}/price") public BigDecimal getPrice(@PathVariable("skuId") Long skuId){ return skuInfoService.getById(skuId).getPrice(); } /** * 列表 */ @RequestMapping("/list") public R list(@RequestParam Map<String, Object> params){ PageUtils page = skuInfoService.queryPage(params); return R.ok().put("page", page); } /** * 信息 */ @RequestMapping("/info/{skuId}") public R info(@PathVariable("skuId") Long skuId){ SkuInfoEntity pmsSkuInfo = skuInfoService.getById(skuId); return R.ok().put("skuInfo", pmsSkuInfo); } /** * 保存 */ @RequestMapping("/save") public R save(@RequestBody SkuInfoEntity pmsSkuInfo){ skuInfoService.save(pmsSkuInfo); return R.ok(); } /** * 修改 */ @RequestMapping("/update") public R update(@RequestBody SkuInfoEntity pmsSkuInfo){ skuInfoService.updateById(pmsSkuInfo); return R.ok(); } /** * 删除 */ @RequestMapping("/delete") public R delete(@RequestBody Long[] skuIds){ skuInfoService.removeByIds(Arrays.asList(skuIds)); return R.ok(); } }
package com.alatus.mall.cart.feign; import com.alatus.common.utils.R; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import java.math.BigDecimal; import java.util.List; @FeignClient("Mall-product") public interface ProductFeignService { @RequestMapping("/product/skuinfo/info/{skuId}") R info(@PathVariable("skuId") Long skuId); @GetMapping("/product/skusaleattrvalue/stringlist/{skuId}") List<String> getSkuSaleAttrValues(@PathVariable("skuId") Long skuId); @GetMapping("/{skuId}/price") BigDecimal getPrice(@PathVariable("skuId") Long skuId); }
package com.alatus.mall.cart.feign; import com.alatus.common.utils.R; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import java.math.BigDecimal; import java.util.List; @FeignClient("Mall-product") public interface ProductFeignService { @RequestMapping("/product/skuinfo/info/{skuId}") R info(@PathVariable("skuId") Long skuId); @GetMapping("/product/skusaleattrvalue/stringlist/{skuId}") List<String> getSkuSaleAttrValues(@PathVariable("skuId") Long skuId); @GetMapping("/{skuId}/price") BigDecimal getPrice(@PathVariable("skuId") Long skuId); }