购物车的设计与思路
1:在做任何业务的时候,首先要做的是把思路的流程捋清楚。再进行代码的编写,以及实现!
2:对业务涉及到的技术,如果没接触过的,首先要学习至会用为止。
3:如果思路不是很清楚的,可以查找类似的案列情况,学习思路流程。
4:具体的业务情况,还是要根据自己的情况,进行设计。
开始讲购物车,涉及的技术知识
1:Cookie —>cookie数据存放在客户的浏览器上
2:Session —>session数据放在服务器上
3:Redis —>储存的数据类型:(字符串) String, (集合) List, (哈希) hash, (集合) set, (有序集合) sorted set)
先看几个图片吧
这是京东的购物流程(用户未登录的情况下的)
这是用户登录以后的流程。就拿买手机举例子。
同一个手机,比如荣耀20,不同参数的价格不同(6+64G的,和8+128G的)
这个例子是为了说明,价格不一定在商品表内。
价格表可能是独立出来的一张表,且与商品表是多对一的关系
商品表(一)-----------> 价格表(多)
这里,我把表结构设计一下
Product 商品表 (可以在数据库建表)
Price 价格类别表 (可以在数据库建表)
ShoppingCart 购物车类 (暂存表,数据存到Redis中去)
ShoppingItem 购物项类 (暂存表,数据存到Redis中去)
搭建SpringBoot项目工程
引入相关的依赖,关于jedis的,fastjson的依赖
Swagger是接口测试的工具。(有兴趣的可以看看我写的有一篇关于Swagger的文章,简单配置使用)
这里,持久层 我用的是JPA,不是Mybatis
<!-- 引入Swagger的依赖工具 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
<!-- fastjson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.49</version>
</dependency>
<!-- jedis-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.6.0</version>
</dependency>
<!-- jpa-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
项目的大概目录结构
SwaggerConfig配置类
/**
* @Auther: Administrator
* @Date: 2020/4/23
* @Description:
*/
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket createRestApi () {
return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.any()).build();
}
private ApiInfo apiInfo () {
return new ApiInfoBuilder()
.title("SpringBoot API Doc")
.description("good")
.version("1.0")
.build();
}
}
需要用到的几个类,上面讲过的,代码直接粘贴上来。
/**
* 商品
*/
@Data
public class Product {
/**
* 商品的ID
*/
private Long id;
/**
* 商品的名称
*/
private String productName;
/**
* 商家的ID (一个商家多个产品)
*/
private String businessId;
/**
* 价格的ID (一个商品多个价格)
*/
private Integer priceId;
}
/**
* 价格
*/
@Data
public class Price {
/**
* 价格的ID
*/
private Long id;
/**
* 价格
*/
private BigDecimal priceValue;
/**
* 类别 (不同的类别 不同的价格)
*/
private Integer type;
}
/**
* 购物车
*/
@Data
public class ShoppingCart {
private static final long serialVersionUID = 1l;
private List<ShoppingItem> items = new ArrayList<ShoppingItem>();
public List<ShoppingItem> getItems() {
return items;
}
public void setItems(List<ShoppingItem> items) {
this.items = items;
}
/**
* 添加购物项目
*/
public void addShoppingItem (ShoppingItem shoppingItem) {
if (items.contains(shoppingItem)) {
for (ShoppingItem item: items) {
item.setProductCount(shoppingItem.getProductCount() + item.getProductCount());
}
} else {
items.add(shoppingItem);
}
}
/**
* 数量
*/
public Integer getTotalCount () {
Integer totalCount = 0;
for (ShoppingItem shoppingItem: items) {
totalCount += shoppingItem.getProductCount();
}
return totalCount;
}
/**
* 金额
*/
public BigDecimal getTotalMoney () {
BigDecimal totalMoney = new BigDecimal(0);
for (ShoppingItem shoppingItem: items) {
BigDecimal count = new BigDecimal(shoppingItem.getProductCount().toString());
BigDecimal productPrice = new BigDecimal(shoppingItem.getProductPrice().toString());
totalMoney = totalMoney.add(count.multiply(productPrice));
}
return totalMoney;
}
}
/**
* 购物项
*/
@Data
public class ShoppingItem {
/**
* 商品
*/
private Product product;
/**
* 数量
*/
private Integer productCount;
/**
* 价格
*/
private BigDecimal productPrice;
}
接下来,把service以及ipml的粘贴出来后,就是业务流程的问题了,
在这里,还是要再去看看Redis的数据存储结构,以便接下来的业务。