当前位置: 首页 > news >正文

SpringBoot + redis处理购物车逻辑

1、pom.xml

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>

2、application.xml

spring:
characterEncoding=utf-8&useSSL=falseredis:host: 127.0.0.1port: 6379

3、CartServiceImpl.java

@Service
public class CartServiceImpl implements ICartService {private final static String CART_REDIS_KEY_TEMPLATE = "cart_%d";@Autowiredprivate ProductMapper productMapper;@Autowiredprivate StringRedisTemplate redisTemplate;private Gson gson = new Gson();@Overridepublic ResponseVo<CartVo> add(Integer uid, CartAddForm form) {Integer quantity = 1;Product product = productMapper.selectByPrimaryKey(form.getProductId());//商品是否存在if (product == null) {return ResponseVo.error(ResponseEnum.PRODUCT_NOT_EXIST);}//商品是否正常在售if (!product.getStatus().equals(ProductStatusEnum.ON_SALE.getCode())) {return ResponseVo.error(ResponseEnum.PRODUCT_OFF_SALE_OR_DELETE);}//商品库存是否充足if (product.getStock() <= 0) {return ResponseVo.error(ResponseEnum.PROODUCT_STOCK_ERROR);}//写入到redis//key: cart_1HashOperations<String, String, String> opsForHash = redisTemplate.opsForHash();String redisKey  = String.format(CART_REDIS_KEY_TEMPLATE, uid);Cart cart;String value = opsForHash.get(redisKey, String.valueOf(product.getId()));if (StringUtils.isEmpty(value)) {//没有该商品, 新增cart = new Cart(product.getId(), quantity, form.getSelected());}else {//已经有了,数量+1cart = gson.fromJson(value, Cart.class);cart.setQuantity(cart.getQuantity() + quantity);}opsForHash.put(redisKey,String.valueOf(product.getId()),gson.toJson(cart));return list(uid);}@Overridepublic ResponseVo<CartVo> list(Integer uid) {HashOperations<String, String, String> opsForHash = redisTemplate.opsForHash();String redisKey  = String.format(CART_REDIS_KEY_TEMPLATE, uid);Map<String, String> entries = opsForHash.entries(redisKey);boolean selectAll = true;Integer cartTotalQuantity = 0;BigDecimal cartTotalPrice = BigDecimal.ZERO;CartVo cartVo = new CartVo();List<CartProductVo> cartProductVoList = new ArrayList<>();for (Map.Entry<String, String> entry : entries.entrySet()) {Integer productId = Integer.valueOf(entry.getKey());Cart cart = gson.fromJson(entry.getValue(), Cart.class);//TODO 需要优化,使用mysql里的inProduct product = productMapper.selectByPrimaryKey(productId);if (product != null) {CartProductVo cartProductVo = new CartProductVo(productId,cart.getQuantity(),product.getName(),product.getSubtitle(),product.getMainImage(),product.getPrice(),product.getStatus(),product.getPrice().multiply(BigDecimal.valueOf(cart.getQuantity())),product.getStock(),cart.getProductSelected());cartProductVoList.add(cartProductVo);if (!cart.getProductSelected()) {selectAll = false;}//计算总价(只计算选中的)if (cart.getProductSelected()) {cartTotalPrice = cartTotalPrice.add(cartProductVo.getProductTotalPrice());}}cartTotalQuantity += cart.getQuantity();}//有一个没有选中,就不叫全选cartVo.setSelectedAll(selectAll);cartVo.setCartTotalQuantity(cartTotalQuantity);cartVo.setCartTotalPrice(cartTotalPrice);cartVo.setCartProductVoList(cartProductVoList);return ResponseVo.success(cartVo);}@Overridepublic ResponseVo<CartVo> update(Integer uid, Integer productId, CartUpdateForm form) {HashOperations<String, String, String> opsForHash = redisTemplate.opsForHash();String redisKey  = String.format(CART_REDIS_KEY_TEMPLATE, uid);String value = opsForHash.get(redisKey, String.valueOf(productId));if (StringUtils.isEmpty(value)) {//没有该商品, 报错return ResponseVo.error(ResponseEnum.CART_PRODUCT_NOT_EXIST);}//已经有了,修改内容Cart cart = gson.fromJson(value, Cart.class);if (form.getQuantity() != null&& form.getQuantity() >= 0) {cart.setQuantity(form.getQuantity());}if (form.getSelected() != null) {cart.setProductSelected(form.getSelected());}opsForHash.put(redisKey, String.valueOf(productId), gson.toJson(cart));return list(uid);}@Overridepublic ResponseVo<CartVo> delete(Integer uid, Integer productId) {HashOperations<String, String, String> opsForHash = redisTemplate.opsForHash();String redisKey  = String.format(CART_REDIS_KEY_TEMPLATE, uid);String value = opsForHash.get(redisKey, String.valueOf(productId));if (StringUtils.isEmpty(value)) {//没有该商品, 报错return ResponseVo.error(ResponseEnum.CART_PRODUCT_NOT_EXIST);}opsForHash.delete(redisKey, String.valueOf(productId));return list(uid);}@Overridepublic ResponseVo<CartVo> selectAll(Integer uid) {HashOperations<String, String, String> opsForHash = redisTemplate.opsForHash();String redisKey  = String.format(CART_REDIS_KEY_TEMPLATE, uid);for (Cart cart : listForCart(uid)) {cart.setProductSelected(true);opsForHash.put(redisKey,String.valueOf(cart.getProductId()),gson.toJson(cart));}return list(uid);}@Overridepublic ResponseVo<CartVo> unSelectAll(Integer uid) {HashOperations<String, String, String> opsForHash = redisTemplate.opsForHash();String redisKey  = String.format(CART_REDIS_KEY_TEMPLATE, uid);for (Cart cart : listForCart(uid)) {cart.setProductSelected(false);opsForHash.put(redisKey,String.valueOf(cart.getProductId()),gson.toJson(cart));}return list(uid);}@Overridepublic ResponseVo<Integer> sum(Integer uid) {Integer sum = listForCart(uid).stream().map(Cart::getQuantity).reduce(0, Integer::sum);return ResponseVo.success(sum);}public List<Cart> listForCart(Integer uid) {HashOperations<String, String, String> opsForHash = redisTemplate.opsForHash();String redisKey  = String.format(CART_REDIS_KEY_TEMPLATE, uid);Map<String, String> entries = opsForHash.entries(redisKey);List<Cart> cartList = new ArrayList<>();for (Map.Entry<String, String> entry : entries.entrySet()) {cartList.add(gson.fromJson(entry.getValue(), Cart.class));}return cartList;}}

http://www.lryc.cn/news/129504.html

相关文章:

  • open cv学习 (五) 图像的阈值处理
  • NVIDIA vGPU License许可服务器高可用全套部署秘籍
  • 基于CNN卷积神经网络的口罩检测识别系统matlab仿真
  • 《HeadFirst设计模式(第二版)》第九章代码——迭代器模式
  • Electron入门,项目启动。
  • 深入理解索引B+树的基本原理
  • vue3 简易用对话框实现点击头像放大查看
  • opencv 矩阵运算
  • 第四章 字符串part01
  • Python3内置函数大全
  • 什么是“新型基础设施”?建设重点是什么?
  • 混杂接口模式---vlan
  • Greenplum多级分区表添加分区报错ERROR: no partitions specified at depth 2
  • EV PV AC SPI CPI TCPI
  • 【电商领域】Axure在线购物商城小程序原型图,品牌自营垂直电商APP原型
  • Cpp基础Ⅰ之编译、链接
  • 用户新增预测(Datawhale机器学习AI夏令营第三期)
  • RGOS日常管理操作
  • 阿里云使用WordPress搭建个人博客
  • 供应链安全和第三方风险管理:讨论如何应对供应链中的安全风险,以及评估和管理第三方合作伙伴可能带来的威胁
  • 《Java极简设计模式》第04章:建造者模式(Builder)
  • Go download
  • 2023年Java核心技术面试第四篇(篇篇万字精讲)
  • 数字化时代,数据仓库和商业智能BI系统演进的五个阶段
  • 【【Verilog典型电路设计之FIFO设计】】
  • JAVA设计模式总结之23种设计模式
  • Flutter 测试小结
  • docker build -t 和 docker build -f 区别
  • Java 项目日志实例基础:Log4j
  • K8S应用笔记 —— 签发自签名证书用于Ingress的https配置