建議閱讀前,先閱讀《商城表設計-購物車》相關文檔
我們的購物車只有一個表:`tz_basket` 非常簡單,但是關聯了非常多的表。比如:
- 購物車有商品,關聯商品表
- 每個商品都有sku,關聯sku表
- 一個購物車有多個店鋪的商品,關聯店鋪表
- 一個購物車肯定是和用戶有關的,關聯用戶表
我們對商品進行添加,修改,其實都很簡單,最為讓人難以理解的是如何將這些字段進行組合,關聯滿減滿折等一系列的活動。
我們先來看下是如何獲取商品信息的
```java
@PostMapping("/info")
@ApiOperation(value = "獲取用戶購物車信息", notes = "獲取用戶購物車信息,參數為用戶選中的活動項數組,以購物車id為key")
public ResponseEntity<List<ShopCartDto>> info(@RequestBody Map<Long, ShopCartParam> basketIdShopCartParamMap) {
String userId = SecurityUtils.getUser().getUserId();
// 更新購物車信息,
if (MapUtil.isNotEmpty(basketIdShopCartParamMap)) {
basketService.updateBasketByShopCartParam(userId, basketIdShopCartParamMap);
}
// 拿到購物車的所有item
List<ShopCartItemDto> shopCartItems = basketService.getShopCartItems(userId);
return ResponseEntity.ok(basketService.getShopCarts(shopCartItems));
}
```
這里面傳了一個參數:`Map<Long, ShopCartParam> basketIdShopCartParamMap` 這里是當用戶改變了某件商品的滿減滿折活動時,重新改變滿減滿折信息以后計算加個的一個方法。當然在開源是沒有這個滿減模塊的,只有思路,具體實現需要靠自己了。
我們繼續往下看,這里面`basketService.getShopCartItems(userId)`使用的直接是從數據庫中獲取的數據,而真正對滿減滿折、店鋪等進行排列組合的,在于`basketService.getShopCarts(shopCartItems)` 這個方法。
我們進到`getShopCarts`方法內部,可以查看到一行代碼`applicationContext.publishEvent(new ShopCartEvent(shopCart, shopCartItemDtoList));`,這里使用的事件的模式。這個事件的主要作用是用于對模塊之間的解耦,比如我們清楚的知道當購物車需要計算價格的時候,需要滿減模塊的配合,進行“裝飾”。最后將裝飾回來的東西,返回給前端。
我們現在看看購物車返回的數據`ResponseEntity<List<ShopCartDto>>`,我們清楚一個購物車是分多個店鋪的,每一個店鋪就是一個`ShopCartDto`,我們看下這個`bean`。
```java
@Data
public class ShopCartDto implements Serializable {
@ApiModelProperty(value = "店鋪ID", required = true)
private Long shopId;
@ApiModelProperty(value = "店鋪名稱", required = true)
private String shopName;
@ApiModelProperty(value = "購物車滿減活動攜帶的商品", required = true)
private List<ShopCartItemDiscountDto> shopCartItemDiscounts;
}
```
其實一個店鋪下面是有多個商品的,但是根據京東的劃分,每當有滿減之類的活動時,滿減活動的商品總是要歸到一類的,所以,每個店鋪下面是多個滿減活動(`List<ShopCartItemDiscountDto>`),滿減活動下面是多個商品(購物項`List<ShopCartItemDto>`),到此你就能明白了`ShopCartItemDiscountDto` 里面的`ChooseDiscountItemDto` 是什么東西了,這個是選中的滿減項。
```java
public class ShopCartItemDiscountDto implements Serializable {
@ApiModelProperty(value = "已選滿減項", required = true)
private ChooseDiscountItemDto chooseDiscountItemDto;
@ApiModelProperty(value = "商品列表")
private List<ShopCartItemDto> shopCartItems;
}
```
我們再留意`ShopCartItemDto` 這個`bean` ,發現還有這個東西:
```java
@ApiModelProperty("參與滿減活動列表")
private List<DiscountDto> discounts = new ArrayList<>();
```
其實購物車的每個購物項,都是有很多個滿減的活動的,可以自主選擇滿減活動,然后進行組合,生成新的優惠。而在這選擇新的活動類型時,就需要購物車就行新的價格計算。這也就是為什么獲取用戶購物車信息,也就是`/info`接口需要一個這個參數的原因了`Map<Long, ShopCartParam> basketIdShopCartParamMap`
- 開發環境準備
- 基本開發手冊
- 項目目錄結構
- 權限管理
- 通用分頁表格
- Swagger文檔
- undertow容器
- 對xss攻擊的防御
- 分布式鎖
- 統一的系統日志
- 統一驗證
- 統一異常處理
- 文件上傳下載
- 一對多、多對多分頁
- 認證與授權
- 從授權開始看源碼
- 自己寫個授權的方法-開源版
- 商城表設計
- 商品信息
- 商品分組
- 購物車
- 訂單
- 地區管理
- 運費模板
- 接口設計
- 必讀
- 購物車的設計
- 訂單設計-確認訂單
- 訂單設計-提交訂單
- 訂單設計-支付
- 生產環境
- nginx安裝與跨域配置
- 安裝mysql
- 安裝redis
- 傳統方式部署項目
- docker
- 使用docker部署商城
- centos jdk安裝
- docker centos 安裝
- Docker Compose 安裝與卸載
- docker 鏡像的基本操作
- docker 容器的基本操作
- 通過yum安裝maven
- 常見問題