目录:
(1)商品上架,下架
(2)在service-product-client添加接口
(3)实现商品上架,下架功能(ES库中添加数据)
(1)商品上架,下架
package com.atguigu.gmall.model.list;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.DateFormat;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import java.util.Date;
import java.util.List;
// Index = goods , Type = info es 7.8.0 逐渐淡化type! 修改!
/**
* 操作es提供的一个实体类
* 1.可以设置索引库和mapping
* 2.操作过程中可以封装数据
*
* @Document :文档注解
* indexName:索引库名称
* shards: 分片 集群 10 3 3 4
* replicas:副本 备份 一共有几份 9 主 两个 副本
*
* @Id: 所修饰的字段存储数据后作为文档的id skuId
*
* @Field: 文档中的字段
* FieldType:字段的类型
* 字符串内容的类型:
* 1.keyword :不分词
* 2.Text :分词
* 3.analyzer:指定分词时使用的分词器
* 4.searchAnalyzer: 搜索时的分词器
*/
@Data
@Document(indexName = "goods" , shards = 3,replicas = 2)
public class Goods {
// 商品Id skuId
@Id
private Long id;
@Field(type = FieldType.Keyword, index = false)
private String defaultImg;
// es 中能分词的字段,这个字段数据类型必须是 text!keyword 不分词!
@Field(type = FieldType.Text, analyzer = "ik_max_word" ,searchAnalyzer = "ik_smart")
private String title;
@Field(type = FieldType.Double)
private Double price;
// @Field(type = FieldType.Date) 6.8.1
@Field(type = FieldType.Date,format = DateFormat.custom,pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime; // 新品
@Field(type = FieldType.Long)
private Long tmId;
@Field(type = FieldType.Keyword)
private String tmName;
@Field(type = FieldType.Keyword)
private String tmLogoUrl;
@Field(type = FieldType.Long)
private Long category1Id;
@Field(type = FieldType.Keyword)
private String category1Name;
@Field(type = FieldType.Long)
private Long category2Id;
@Field(type = FieldType.Keyword)
private String category2Name;
@Field(type = FieldType.Long)
private Long category3Id;
@Field(type = FieldType.Keyword)
private String category3Name;
// 商品的热度! 我们将商品被用户点查看的次数越多,则说明热度就越高!
@Field(type = FieldType.Long)
private Long hotScore = 0L;
// 平台属性集合对象
// Nested 支持嵌套查询
@Field(type = FieldType.Nested)
private List<SearchAttr> attrs;
}
构建goods数据模型分析
Sku基本信息(详情业务已封装了接口)
Sku分类信息(详情业务已封装了接口)
Sku的品牌信息(无)
Sku对应的平台属性(详情业务已封装了接口)
在service-product模块中封装接口:
Sku的品牌接口:ManageService
/**
* 通过品牌Id 来查询数据
* @param tmId
* @return
*/
BaseTrademark getTrademarkByTmId(Long tmId);
实现类
@Autowired
private BaseTrademarkMapper baseTrademarkMapper;
@Override
public BaseTrademark getTrademarkByTmId(Long tmId) {
return baseTrademarkMapper.selectById(tmId);
}
ProductApiController
/**
* 通过品牌Id 集合来查询数据
* @param tmId
* @return
*/
@GetMapping("inner/getTrademark/{tmId}")
public BaseTrademark getTrademark(@PathVariable("tmId")Long tmId){
return manageService.getTrademarkByTmId(tmId);
}
也可以使用MyBatis-Plus三级封装里面的方法,不用写上面定义的接口了:
(2)在service-product-client添加接口
继续在ProductFeignClient:添加远程调用
ProductFeignClient
/**
* 通过品牌Id 集合来查询数据
* @param tmId
* @return
*/
@GetMapping("/api/product/inner/getTrademark/{tmId}")
BaseTrademark getTrademark(@PathVariable("tmId")Long tmId);
ProductDegradeFeignClient:降级方法 实现如果没有结果空返回
@Override
public BaseTrademark getTrademark(Long tmId) {
return null;
}
启动类扫描
(3)实现商品上架,下架功能(ES库中添加、删除数据)
在service-list模块添加:
封装接口
package com.atguigu.gmall.list.service;
public interface SearchService {
/**
* 上架商品列表
* @param skuId
*/
void upperGoods(Long skuId);
/**
* 下架商品列表
* @param skuId
*/
void lowerGoods(Long skuId);
}
制作操作es的接口:Long是ID的类型
package com.atguigu.gmall.list.repository;
import com.atguigu.gmall.model.list.Goods;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
public interface GoodsRepository extends ElasticsearchRepository<Goods,Long> {
}
接口实现类
package com.atguigu.gmall.list.service.impl;
@Service
public class SearchServiceImpl implements SearchService {
@Autowired
private ProductFeignClient productFeignClient;
@Autowired
private GoodsRepository goodsRepository;
/**
* 上架商品列表
* @param skuId
*/
@Override
public void upperGoods(Long skuId) {
Goods goods = new Goods();
//查询sku对应的平台属性 一个sku对应一个平台属性值,属性值用的list集合保存的,只存一个
List<BaseAttrInfo> baseAttrInfoList = productFeignClient.getAttrList(skuId);
if(null != baseAttrInfoList) {
List<SearchAttr> searchAttrList = baseAttrInfoList.stream().map(baseAttrInfo -> {
SearchAttr searchAttr = new SearchAttr();
//属性id
searchAttr.setAttrId(baseAttrInfo.getId());
//属性名称
searchAttr.setAttrName(baseAttrInfo.getAttrName());
//一个sku只对应一个属性值
List<BaseAttrValue> baseAttrValueList = baseAttrInfo.getAttrValueList();
searchAttr.setAttrValue(baseAttrValueList.get(0).getValueName());
return searchAttr;
}).collect(Collectors.toList());
goods.setAttrs(searchAttrList);
}
//查询sku信息
SkuInfo skuInfo = productFeignClient.getSkuInfo(skuId);
goods.setDefaultImg(skuInfo.getSkuDefaultImg());
goods.setPrice(skuInfo.getPrice().doubleValue());
goods.setId(skuInfo.getId());
goods.setTitle(skuInfo.getSkuName());
goods.setCreateTime(new Date());
// 查询品牌
BaseTrademark baseTrademark = productFeignClient.getTrademark(skuInfo.getTmId());
if (baseTrademark != null){
goods.setTmId(skuInfo.getTmId());
goods.setTmName(baseTrademark.getTmName());
goods.setTmLogoUrl(trademark.getLogoUrl());
}
// 查询分类
BaseCategoryView baseCategoryView = productFeignClient.getCategoryView(skuInfo.getCategory3Id());
if (baseCategoryView != null) {
goods.setCategory1Id(baseCategoryView.getCategory1Id());
goods.setCategory1Name(baseCategoryView.getCategory1Name());
goods.setCategory2Id(baseCategoryView.getCategory2Id());
goods.setCategory2Name(baseCategoryView.getCategory2Name());
goods.setCategory3Id(baseCategoryView.getCategory3Id());
goods.setCategory3Name(baseCategoryView.getCategory3Name());
}
this.goodsRepository.save(goods);
}
/**
* 下架商品列表
* @param skuId
*/
@Override
public void lowerGoods(Long skuId) {
this.goodsRepository.deleteById(skuId);
}
}
ListApiController :继续添加代码:
package com.atguigu.gmall.list.controller;
/**
* <p>
* 商品搜索列表接口
* </p>
*
*/
@RestController
@RequestMapping("api/list")
public class ListApiController {
@Autowired
private SearchService searchService;
@Autowired
private ElasticsearchRestTemplate restTemplate;
/**
* 上架商品
* @param skuId
* @return
*/
@GetMapping("inner/upperGoods/{skuId}")
public Result upperGoods(@PathVariable("skuId") Long skuId) {
searchService.upperGoods(skuId);
return Result.ok();
}
/**
* 下架商品
* @param skuId
* @return
*/
@GetMapping("inner/lowerGoods/{skuId}")
public Result lowerGoods(@PathVariable("skuId") Long skuId) {
searchService.lowerGoods(skuId);
return Result.ok();
}
}
上架测试:
ES中查询一下
依次添加8条:
添加的数据格式也是正确的
下架后再查询,变成了7