谷粒商城-高级-61 -商城业务-购物车-环境搭建
一、创建购物车微服务
在当前项目,创建一个购物车微服务:gulimall-cart

选择依赖包:
二、初始化配置
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目录下:
静态资源导入到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编写

根据上图购物车内容,分析组装购物车对应的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 -商城业务-认证服务-环境搭建
为者常成,行者常至
自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)