![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiQDOxEzX3xCZlhXam9VbsUmepNXZy9CXwJWZ3xCdh1mcvZ2Lc1zaHRGcWdUYuVzVa9GczoVdG1mWfVGc5RHLwIzX39GZhh2csATMflHLwEzX4xSZz91ZsAzMfRHLGZkRGZkRfJ3bs92YskmNhVTYykVNQJVMRhXVEF1X0hXZ0xiNx8VZ6l2cssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLyITNzEjYzQ2NlJWO2QWZyYzXwMDNwMDM2AzLchDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
商品服務
1.新增商品
1.1 品牌的關聯
1.1.1 PubSub依賴缺失
打開新增商品頁面的時候會出現的錯誤提示:
原因是缺少:PubSub相關依賴
解決辦法
- 使用npm添加依賴:npm install --save pubsub-js(失敗的話使用此指令:cnpm install --save pubsub-js)
-
在src下的main.js中引用:
import PubSub from ‘pubsub-js’
Vue.prototype.PubSub = PubSub
- 在.eslintrc.js中添加一下配置
1.1.2 品牌關聯
拷貝對應的前端頁面檔案
添加後端對應的服務
然後service中查詢處理
最後的顯示效果
1.1.3 會員等級
首先我們需要啟動會員子產品,并且配置對應的網關路由資訊
1.1.4 規格參數
在新增商品的第二步我們就需要設定對應的規格參數,而這些規格參數是根據前面一步選擇的三級分類來查詢出來的。
響應對應的資料,我們需要先建立對應的VO對象。
package com.msb.mall.product.vo;
import com.baomidou.mybatisplus.annotation.TableId;
import com.msb.mall.product.entity.AttrEntity;
import lombok.Data;
import java.util.List;
@Data
public class AttrGroupWithAttrsVo {
/**
* 分組id
*/
@TableId
private Long attrGroupId;
/**
* 組名
*/
private String attrGroupName;
/**
* 排序
*/
private Integer sort;
/**
* 描述
*/
private String descript;
/**
* 組圖示
*/
private String icon;
/**
* 所屬分類id
*/
private Long catelogId;
// 關聯對應的屬性資訊
private List<AttrEntity> attrs;
}
然後建立對應的controller
然後建立對應的service
1.2 釋出商品
1.2.1 VO 接收資料
前端頁面送出的JSON資料非常複雜,我們需要在後端服務通過對應的VO對象來接收這些相關的資料。
然後通過線上的json格式處理工具生成對應的VO工具類
1.2.2 儲存對應的資料
需要儲存的資料拆解為一下六個部分。
1.2.3 儲存商品基本資訊
1.2.4 儲存商品描述
需要注意的地方:
1.2.4 儲存圖集資訊
1.2.5 儲存規格參數
1.2.6 SKU基本資訊存儲
1.2.7 SKU的圖集
1.2.8 SKU的銷售屬性
1.3 遠端服務調用
1.3.1 滿減,折扣,會員價儲存
在coupon服務中定義相關的接口及處理的service
然後我們在Product服務中來處理接口的調用
然後在商品的service中完成服務的調用
完成滿減折扣和會員價的service存儲
public void saveSkuReduction(SkuReductionDTO dto) {
// 5.3 儲存滿減資訊,折扣,會員價
// mall_sms: sms_sku_ladder sms_full_reduction sms_member_price
// 1.折扣
SkuLadderEntity ladderEntity = new SkuLadderEntity();
ladderEntity.setSkuId(dto.getSkuId());
ladderEntity.setFullCount(dto.getFullCount());
ladderEntity.setDiscount(dto.getDiscount());
ladderEntity.setAddOther(dto.getCountStatus());
if(ladderEntity.getFullCount() > 0){
ladderService.save(ladderEntity);
}
// 2.滿減
SkuFullReductionEntity fullReductionEntity = new SkuFullReductionEntity();
BeanUtils.copyProperties(dto,fullReductionEntity);
if(fullReductionEntity.getFullPrice().compareTo(new BigDecimal(0)) == 1){
this.save(fullReductionEntity);
}
// 3.會員價
List<MemberPriceEntity> memberPriceEntities = dto.getMemberPrice().stream().map(item -> {
MemberPriceEntity priceEntity = new MemberPriceEntity();
priceEntity.setSkuId(dto.getSkuId());
priceEntity.setMemberLevelId(item.getId());
priceEntity.setMemberPrice(item.getPrice());
priceEntity.setAddOther(1); // 是否可疊加
return priceEntity;
}).collect(Collectors.toList());
memberPriceService.saveBatch(memberPriceEntities);
}
1.3.2 會員積分存儲
會員積分資訊也是存儲在Coupon服務中,我們同樣需要通過Fegin來調用。
2.SPU管理
提供不同條件的檢索,分類,品牌,狀态,關鍵字檢索。
背景我們需要在Service中完成對應的操作。
/**
* SPU資訊檢索
* 分頁查詢
* 分類 品牌 狀态 關鍵字查詢
* @param params
* @return
*/
@Override
public PageUtils queryPageByCondition(Map<String, Object> params) {
QueryWrapper<SpuInfoEntity> wrapper = new QueryWrapper<>();
// 設定對應的檢索條件
// 1. 關鍵字查詢
String key = (String) params.get("key");
if(!StringUtils.isEmpty(key)){
// 需要添加關鍵字查詢
wrapper.and((w)->{
w.eq("id",key)
.or().like("spu_name",key)
.or().like("spu_description",key);
});
}
// status
String status = (String) params.get("status");
if(!StringUtils.isEmpty(status)){
wrapper.eq("publish_status",status);
}
// catalogId
String catalogId = (String) params.get("catalogId");
if(!StringUtils.isEmpty(catalogId) && !"0".equalsIgnoreCase(catalogId)){
wrapper.eq("catalog_id",catalogId);
}
// brandId
String brandId = (String) params.get("brandId");
if(!StringUtils.isEmpty(brandId) && !"0".equalsIgnoreCase(brandId)){
wrapper.eq("brand_id",brandId);
}
IPage<SpuInfoEntity> page = this.page(
new Query<SpuInfoEntity>().getPage(params),
wrapper
);
return new PageUtils(page);
}
然後解決頁面顯示資料的問題,比如類别和品牌顯示的編号,建立時間和更新時間顯示格式問題。
重新開機服務
上面的是設定全局的格式化方式,如果我也特殊設定,這時我們可以在對應的entity對象的屬性上通過@JsonFormat 來指定,此處指定的會覆寫掉全局的設定。
針對顯示的分類和品牌顯示id的問題,我們需要通過對應的vo對象來傳輸,同時我們需要在service中完成對應的邏輯
顯示的效果
3.商品管理
/**
* SKU 資訊檢索的方法
* 類别
* 品牌
* 價格區間
* 檢索的關鍵字
* 分頁查詢
*
* @param params
* @return
*/
@Override
public PageUtils queryPageByCondition(Map<String, Object> params) {
QueryWrapper<SkuInfoEntity> wrapper = new QueryWrapper<>();
// 檢索關鍵字
String key = (String) params.get("key");
if(!StringUtils.isEmpty(key)){
wrapper.and(w->{
w.eq("sku_id",key).or().like("sku_name",key);
});
}
// 分類
String catalogId = (String)params.get("catalogId");
if(!StringUtils.isEmpty(catalogId) && !"0".equalsIgnoreCase(catalogId)){
wrapper.eq("catalog_id",catalogId);
}
// 品牌
String brandId = (String)params.get("brandId");
if(!StringUtils.isEmpty(brandId) && !"0".equalsIgnoreCase(brandId)){
wrapper.eq("brand_id",brandId);
}
// 價格區間
String min = (String) params.get("min");
if(!StringUtils.isEmpty(min)){
wrapper.ge("price",min);
}
String max = (String) params.get("max");
if(!StringUtils.isEmpty(max)){
try {
// 如果max=0那麼我們也不需要加這個條件
BigDecimal bigDecimal = new BigDecimal(max);
if(bigDecimal.compareTo(new BigDecimal(0)) == 1){
// 說明 max > 0
wrapper.le("price",max);
}
}catch (Exception e){
e.printStackTrace();
}
}
IPage<SkuInfoEntity> page = this.page(
new Query<SkuInfoEntity>().getPage(params),
wrapper
);
return new PageUtils(page);
}