首页 > 其他分享 >92、商城业务---购物车---添加购物车

92、商城业务---购物车---添加购物车

时间:2023-02-12 23:56:01浏览次数:40  
标签:cartItem cart 购物车 --- gulimall import 92 com

因为我们添加成功后会跳转到下面这个页面,所以我们需要获取sku的信息和商品数量

所以当我们点击添加商品时就需要发送请求,请求如下:

1、controller层

2、serviceImpl层(将数据存储到redis中)

package com.gulimall.cart.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.gulimall.cart.feign.ProductFeignService;
import com.gulimall.cart.interceptor.CartInterceptor;
import com.gulimall.cart.service.CartService;
import com.gulimall.cart.to.UserInfoTo;
import com.gulimall.cart.vo.CartItem;
import com.gulimall.cart.vo.SkuInfoVo;
import com.gulimall.common.utils.R;
import lombok.extern.slf4j.Slf4j;
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 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
    ProductFeignService productFeignService;

    @Autowired
    StringRedisTemplate redisTemplate;

    @Autowired
    ThreadPoolExecutor executor;

    private final String CART_PREFIX = "gulimall:cart";

    @Override
    public CartItem addToCart(Long skuId, Integer num) throws ExecutionException, InterruptedException {
        BoundHashOperations<String, Object, Object> cartOps = this.getCartOps();

        //2、商品添加到购物车
        CartItem cartItem = new CartItem();

        //异步
        CompletableFuture<Void> getSkuInfo = CompletableFuture.runAsync(() -> {
            //1、远程查询当前要添加的商品的信息
            R skuInfo = productFeignService.info(skuId);
            SkuInfoVo data = skuInfo.getData("skuInfo", new TypeReference<SkuInfoVo>() {
            });


            cartItem.setCheck(true);
            cartItem.setCount(num);
            cartItem.setImage(data.getSkuDefaultImg());
            cartItem.setTitle(data.getSkuTitle());
            cartItem.setSkuId(skuId);
            cartItem.setPrice(data.getPrice());
        }, executor);

        //3、远程查询sku的组合信息
        //异步
        CompletableFuture<Void> getSkuSaleAttrValues = CompletableFuture.runAsync(() -> {
            List<String> skuSaleAttrValue = productFeignService.getSkuSaleAttrValue(skuId);
            cartItem.setSkuAttr(skuSaleAttrValue);
        }, executor);

        CompletableFuture.allOf(getSkuInfo, getSkuSaleAttrValues).get();//等待异步请求都完成

        String s = JSON.toJSONString(cartItem);
        cartOps.put(skuId.toString(), s);

        return cartItem;
    }

    /**
     * 获取到我们要操作的购物车
     * @return
     */
    private BoundHashOperations<String, Object, Object> getCartOps() {
        //先得到当前用户信息
        UserInfoTo userInfoTo = CartInterceptor.threadLocal.get();

        String cartKey = "";
        if (userInfoTo.getUserId() != null) { //已登录
            //gulimall:cart:1
            cartKey = CART_PREFIX + userInfoTo.getUserId();
        } else {
            cartKey = CART_PREFIX + userInfoTo.getUserKey();
        }

        //绑定指定的key操作Redis
        BoundHashOperations<String, Object, Object> operations = redisTemplate.boundHashOps(cartKey);

        return operations;
    }
}

之所以选用redis的hash数据结构,是因为我们要存储成如下结构:

标签:cartItem,cart,购物车,---,gulimall,import,92,com
From: https://www.cnblogs.com/morehair/p/17115048.html

相关文章

  • X-tile 寻找生存分析最佳截断值
    有的时候我们会发现,单因素cox回归某个基因对生存有意义,当以中位值绘制生存曲线的时候,却变得没意义了。这是因为中位值并不是这个基因最合适的截断值,因此,我们需要选择最合......
  • .Net Core使用Ocelot网关(一) -负载,限流,熔断,Header转换
    原文网址:https://www.cnblogs.com/linhuiy/p/12029652.html1.什么是API网关API网关是微服务架构中的唯一入口,它提供一个单独且统一的API入口用于访问内部一个或多个API。......
  • 【译】使用 ML.NET 进行机器学习 - 集群完整指南
    原文|NikolaM.Zivkovic翻译|郑子铭在之前的几篇文章中,我们探索了一些基本的机器学习算法。到目前为止,我们介绍了一些简单的回归算法,分类算法。我们使用ML.NET实......
  • ansible脚本--playbook剧本
    一、ansible-playbook概述   ansibleplaybook是设定自动化任务的一种蓝图,可以在无需人工干预或有限干预的前提下执行复杂的操作。简单来说,playbooks是一种简单的配......
  • C语言--多级指针
    可以定义指针的指针保存其他指针变量的地址eg:Typev;Type*pv=&v;Type**ppv=&pv;Type***pppv=&ppv;...二维数组二维数组的本质就是一......
  • test29 指针进阶3-8
    #define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<assert.h>#include<stdlib.h>#include<string.h>//一级指针接收地址或者指针voidprint(int*ptr,in......
  • 零信任-微软零信任介绍(2)
    微软零信任是什么?MicrosoftZeroTrust是一种安全架构,旨在在没有信任任何设备、用户或网络的情况下保护网络。这种架构使用多重验证和分段技术,以确保每个请求和资源的安全......
  • #yyds干货盘点#【愚公系列】2023年02月 微信小程序-电商项目-确认订单功能实现
    前言订单创建是从用户下单开始的,当用户对商品进行下单后,系统会引导用户来到确认订单页面,此时系统会获取用户预下单的商品信息,同时判断商品是否涉及到优惠促销的信息,这些优......
  • #yyds干货盘点#【愚公系列】2023年02月 微信小程序-电商项目-收货地址功能实现
    前言在电商系统中,收货地址是必不可少的功能,没有收货地址用户在下单就没法收到货,而且一个用户会有多个收货地址,比如寄给自己,或者寄给别人。一搬在收货地址选择中会有个默认......
  • 动态规划-拆分数字
    LeetCode链接给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k>=2 ),并使这些整数的乘积最大化。返回 你可以获得的最大乘积 。示例1:输入:n=2输出:1......