尚品汇-商品上下架添加数据到ES库(二十八)

目录:

(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喵俺第一专栏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值