谷粒商城-高级-61 -商城业务-购物车-环境搭建

一、创建购物车微服务

在当前项目,创建一个购物车微服务:gulimall-cart

file

选择依赖包:
file

二、初始化配置

1、导入通用服务

创建好微服务后,导入 gulimall-common 通用依赖包
gulimall-cart/pom.xml

<!-- 购物车不需要数据库,购物车数据保存在redis -->
    <dependency>
      <groupId>com.atguigu.gulimall</groupId>
      <artifactId>gulimall-common</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <exclusions>
        <exclusion>
          <groupId>com.baomidou</groupId>
          <artifactId>mybatis-plus-boot-starter</artifactId>
        </exclusion>
      </exclusions>
    </dependency>

2、配置注册中心

创建 gulimall-cart/src/main/resources/application.yml

spring:
  #  配置nacos注册中心
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
  application:
    name: gulimall-cart
server:
  port: 21000

启动类添加注册发现和远程调用功能:
com/atguigu/gulimall/cart/GulimallCartApplication.java

// 添加注册发现功能
@EnableFeignClients(basePackages = "com.atguigu.gulimall.cart.feign") 
@EnableDiscoveryClient
@SpringBootApplication
public class GulimallCartApplication {

  public static void main(String[] args) {
    SpringApplication.run(GulimallCartApplication.class, args);
  }
}

三、引入静态资源

导入静态资源

导入页面到templates目录下:
file

静态资源导入到Nginx目录下。

编排微服务域名

修改域名地址 /etc/hosts, 添加认证服务域名

#gulimall
192.168.10.10 gulimall.com
192.168.10.10 search.gulimall.com
192.168.10.10 item.gulimall.com
192.168.10.10 auth.gulimall.com
192.168.10.10 cart.gulimall.com   # 购物车服务

配置网关服务

gulimall-gateway/src/main/resources/application.yml

spring:
  cloud:
    gateway:
      routes:
        - id: product_route
          uri: lb://gulimall-product
          predicates:
            - Path=/api/product/**
          filters:
            - RewritePath=/api/(?<segment>.*),/$\{segment}

        - id: third_party_route
          uri: lb://gulimall-third-party
          predicates:
            - Path=/api/thirdparty/**
          filters:
            - RewritePath=/api/(?<segment>.*),/$\{segment}

        - id: member_route
          uri: lb://gulimall-member
          predicates:
            - Path=/api/member/**
          filters:
            - RewritePath=/api/(?<segment>.*),/$\{segment}

        - id: ware_route
          uri: lb://gulimall-ware
          predicates:
            - Path=/api/ware/**
          filters:
            - RewritePath=/api/(?<segment>.*),/$\{segment}

        - id: admin_route
          uri: lb://renren-fast
          predicates:
            - Path=/api/**
          filters:
            - RewritePath=/api/(?<segment>.*),/renren-fast/$\{segment}

        - id: gulimall_host_route
          uri: lb://gulimall-product
          predicates:
            - Host=gulimall.com,item.gulimall.com

        - id: gulimall_search_route
          uri: lb://gulimall-search
          predicates:
            - Host=search.gulimall.com

        - id: gulimall_auth_route
          uri: lb://gulimall-auth-server
          predicates:
            - Host=auth.gulimall.com
        # 购物车网关
        - id: gulimall_cart_route
          uri: lb://gulimall-cart
          predicates:
            - Host=cart.gulimall.com

四、购物车需求

用户可以在登录状态下将商品添加到购物车【用户购物车/在线购物车】

  • 放入redis(采用),登录以后,会将临时购物车的数据全部合并过来,并清空临时购物车;

用户可以在未登录状态下将商品添加到购物车【游客购物车/离线购物车/临时购物车】

  • 放入localstorage

  • cookie

  • 放入redis(采用)
    浏览器即使关闭,下次进入,临时购物车数据都在

  • 用户可以使用购物车一起结算下单

  • 用户可以查询自己的购物车

  • 用户可以在购物车中修改购买商品的数量

  • 用户可以在购物车中删除商品

购物车数据结构:

Map<String k1,Map<String k2, CartItemInfo>>
k1:标识每一个用户的购物车
k2:购物项的商品id

在redis中,key:用户标识,value:Hash(k:商品id, v:购物项详情)

五、购物车VO编写

file

根据上图购物车内容,分析组装购物车对应的Vo。
gulimall-cart/src/main/java/com/atguigu/gulimall/cart/vo/CartItemVo.java

package com.atguigu.gulimall.cart.vo;

import java.math.BigDecimal;
import java.util.List;

/**
 * 购物项内容
 *
 * @author: kaiyi
 * @create: 2020-09-12 09:38
 */
 //由于需要计算属性,所以,不能用@Data注解
 //@Data 
public class CartItemVo {
  private Long skuId;

  /**
   * 是否选中
   */
  private Boolean check = true;

  private String title;

  private String image;

  /**
   * 商品套餐属性
   */
  private List<String> skuAttrValues;

  private BigDecimal price;

  private Integer count;

  private BigDecimal totalPrice;

  public Long getSkuId() {
    return skuId;
  }

  public void setSkuId(Long skuId) {
    this.skuId = skuId;
  }

  public Boolean getCheck() {
    return check;
  }

  public void setCheck(Boolean check) {
    this.check = check;
  }

  public String getTitle() {
    return title;
  }

  public void setTitle(String title) {
    this.title = title;
  }

  public String getImage() {
    return image;
  }

  public void setImage(String image) {
    this.image = image;
  }

  public List<String> getSkuAttrValues() {
    return skuAttrValues;
  }

  public void setSkuAttrValues(List<String> skuAttrValues) {
    this.skuAttrValues = skuAttrValues;
  }

  public BigDecimal getPrice() {
    return price;
  }

  public void setPrice(BigDecimal price) {
    this.price = price;
  }

  public Integer getCount() {
    return count;
  }

  public void setCount(Integer count) {
    this.count = count;
  }

  /**
   * 计算当前购物项总价
   * @return
   */
  public BigDecimal getTotalPrice() {

    return this.price.multiply(new BigDecimal("" + this.count));
  }

  public void setTotalPrice(BigDecimal totalPrice) {
    this.totalPrice = totalPrice;
  }
}

gulimall-cart/src/main/java/com/atguigu/gulimall/cart/vo/CartVo.java

package com.atguigu.gulimall.cart.vo;

import org.springframework.util.CollectionUtils;

import java.math.BigDecimal;
import java.util.List;

/**
 * 整个购物车存放的商品信息
 *
 * @desc 需要计算的属性需要重写get方法,保证每次获取属性都会进行计算
 *
 * @author: kaiyi
 * @create: 2020-09-12 09:44
 */
public class CartVo {
  /**
   * 购物车子项信息
   */
  List<CartItemVo> items;

  /**
   * 商品数量
   */
  private Integer countNum;

  /**
   * 商品类型数量
   */
  private Integer countType;

  /**
   * 商品总价
   */
  private BigDecimal totalAmount;

  /**
   * 减免价格
   */
  private BigDecimal reduce = new BigDecimal("0.00");;

  public List<CartItemVo> getItems() {
    return items;
  }

  public void setItems(List<CartItemVo> items) {
    this.items = items;
  }

  public Integer getCountNum() {
    int count = 0;
    if (items != null && items.size() > 0) {
      for (CartItemVo item : items) {
        count += item.getCount();
      }
    }
    return count;
  }

  public Integer getCountType() {
    int count = 0;
    if (items != null && items.size() > 0) {
      for (CartItemVo item : items) {
        count += 1;
      }
    }
    return count;
  }

  public BigDecimal getTotalAmount() {
    BigDecimal amount = new BigDecimal("0");
    // 计算购物项总价
    if (!CollectionUtils.isEmpty(items)) {
      for (CartItemVo cartItem : items) {
        if (cartItem.getCheck()) {
          amount = amount.add(cartItem.getTotalPrice());
        }
      }
    }
    // 计算优惠后的价格
    return amount.subtract(getReduce());
  }

  public BigDecimal getReduce() {
    return reduce;
  }

  public void setReduce(BigDecimal reduce) {
    this.reduce = reduce;
  }

}

SKU内容:
gulimall-cart/src/main/java/com/atguigu/gulimall/cart/vo/SkuInfoVo.java

package com.atguigu.gulimall.cart.vo;

import lombok.Data;

import java.math.BigDecimal;

/**
 * @author: kaiyi
 * @create: 2020-09-12 09:47
 */
@Data
public class SkuInfoVo {
  private Long skuId;
  /**
   * spuId
   */
  private Long spuId;
  /**
   * sku名称
   */
  private String skuName;
  /**
   * sku介绍描述
   */
  private String skuDesc;
  /**
   * 所属分类id
   */
  private Long catalogId;
  /**
   * 品牌id
   */
  private Long brandId;
  /**
   * 默认图片
   */
  private String skuDefaultImg;
  /**
   * 标题
   */
  private String skuTitle;
  /**
   * 副标题
   */
  private String skuSubtitle;
  /**
   * 价格
   */
  private BigDecimal price;
  /**
   * 销量
   */
  private Long saleCount;

}

六、创建控制器


相关文章:
谷粒商城-高级-57 -商城业务-认证服务-环境搭建

为者常成,行者常至