提交 d0ce6090 authored 作者: YunaiV's avatar YunaiV

修改 system-service-app 导入的数据库脚本

上级 8646d0a6
...@@ -46,11 +46,20 @@ public interface ProductSpuRpc { ...@@ -46,11 +46,20 @@ public interface ProductSpuRpc {
CommonResult<List<ProductSpuRespDTO>> listProductSpus(List<Integer> productSpuIds); CommonResult<List<ProductSpuRespDTO>> listProductSpus(List<Integer> productSpuIds);
/** /**
* 获得商品 SPU分页 * 获得商品 SPU 分页
* *
* @param pageDTO 商品 SPU分页查询 * @param pageDTO 商品 SPU 分页查询
* @return 商品 SPU分页结果 * @return 商品 SPU 分页结果
*/ */
CommonResult<PageResult<ProductSpuRespDTO>> pageProductSpu(ProductSpuPageReqDTO pageDTO); CommonResult<PageResult<ProductSpuRespDTO>> pageProductSpu(ProductSpuPageReqDTO pageDTO);
/**
* 顺序获得商品 SPU 编号数组
*
* @param limit 数量
* @param lastSpuId 最后一个商品 SPU 编号
* @return 商品 SPU 编号数组
*/
CommonResult<List<Integer>> listProductSpuIds(Integer limit, Integer lastSpuId);
} }
...@@ -47,6 +47,10 @@ public class ProductSpuManager { ...@@ -47,6 +47,10 @@ public class ProductSpuManager {
@Autowired @Autowired
private ProductMQProducer productMQProducer; private ProductMQProducer productMQProducer;
private static ProductSpuManager self() {
return (ProductSpuManager) AopContext.currentProxy();
}
/** /**
* 创建商品 SPU 和 SKU * 创建商品 SPU 和 SKU
* *
...@@ -158,6 +162,17 @@ public class ProductSpuManager { ...@@ -158,6 +162,17 @@ public class ProductSpuManager {
return categoryBO; return categoryBO;
} }
/**
* 顺序获得商品 SPU 编号数组
*
* @param limit 数量
* @param lastSpuId 最后一个商品 SPU 编号
* @return 商品 SPU 编号数组
*/
public List<Integer> listProductSpuIds(Integer limit, Integer lastSpuId) {
return productAttrService.listProductSpuIds(limit, lastSpuId);
}
private List<ProductAttrKeyValueBO> checkProductAttr(List<ProductSkuCreateOrUpdateBO> skuBOs) { private List<ProductAttrKeyValueBO> checkProductAttr(List<ProductSkuCreateOrUpdateBO> skuBOs) {
// 第一步,校验 SKU 使用到的规格是否存在 // 第一步,校验 SKU 使用到的规格是否存在
Set<Integer> attrValueIds = new HashSet<>(); Set<Integer> attrValueIds = new HashSet<>();
...@@ -192,8 +207,4 @@ public class ProductSpuManager { ...@@ -192,8 +207,4 @@ public class ProductSpuManager {
return attrKeyValueBOs; return attrKeyValueBOs;
} }
private ProductSpuManager self() {
return (ProductSpuManager) AopContext.currentProxy();
}
} }
...@@ -49,4 +49,9 @@ public class ProductSpuRpcImpl implements ProductSpuRpc { ...@@ -49,4 +49,9 @@ public class ProductSpuRpcImpl implements ProductSpuRpc {
return success(productSpuManager.pageProductSpu(pageDTO)); return success(productSpuManager.pageProductSpu(pageDTO));
} }
@Override
public CommonResult<List<Integer>> listProductSpuIds(Integer limit, Integer lastSpuId) {
return success(productSpuManager.listProductSpuIds(limit, lastSpuId));
}
} }
...@@ -208,4 +208,18 @@ public class ProductAttrService { ...@@ -208,4 +208,18 @@ public class ProductAttrService {
return ProductAttrConvert.INSTANCE.convertList03(productAttrValueDOs); return ProductAttrConvert.INSTANCE.convertList03(productAttrValueDOs);
} }
/**
* 顺序获得商品 SPU 编号数组
*
* 一般情况下,该接口我们用于提供顺序的 SPU 编号数组,以便调用方进一步根据自己需要获取商品信息
* 例如说,搜索服务会不断获取商品编号,重建该商品编号的索引
*
* @param limit 数量
* @param lastSpuId 最后一个商品 SPU 编号
* @return 商品 SPU 编号数组
*/
public List<Integer> listProductSpuIds(Integer limit, Integer lastSpuId) {
return null;
}
} }
package cn.iocoder.mall.product.biz.bo.product;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* 商品 SKU BO
*/
@Data
@Accessors(chain = true)
public class ProductSkuBO implements Serializable {
/**
* sku 编号
*/
private Integer id;
/**
* 商品编号
*/
private Integer spuId;
/**
* 状态
*/
private Integer status;
/**
* 图片地址
*/
private String picURL;
// /**
// * 规格值数组
// */
// // TODO 芋艿,这个属性目前未进行设置
// private List<ProductAttrAndValuePairBO> attrs;
/**
* 价格,单位:分
*/
private Integer price;
/**
* 库存数量
*/
private Integer quantity;
}
...@@ -30,16 +30,8 @@ import java.util.stream.Collectors; ...@@ -30,16 +30,8 @@ import java.util.stream.Collectors;
@Service @Service
public class ProductSpuServiceImpl implements ProductSpuService { public class ProductSpuServiceImpl implements ProductSpuService {
@Autowired
private ProductSpuMapper productSpuMapper;
@Autowired
private ProductSkuMapper productSkuMapper;
@Autowired
private ProductCategoryMapper productCategoryMapper;
@Autowired @Autowired
private ProductAttrService productAttrService; private ProductAttrService productAttrService;
@Autowired
private ProductCategoryService productCategoryService;
@Override @Override
public ProductSpuDetailBO getProductSpuDetail(Integer spuId) { public ProductSpuDetailBO getProductSpuDetail(Integer spuId) {
......
package cn.iocoder.mall.product.api.bo;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* 商品 SKU BO
*/
@Data
@Accessors(chain = true)
public class ProductSkuBO implements Serializable {
/**
* sku 编号
*/
private Integer id;
/**
* 商品编号
*/
private Integer spuId;
/**
* 状态
*/
private Integer status;
/**
* 图片地址
*/
private String picURL;
// /**
// * 规格值数组
// */
// // TODO 芋艿,这个属性目前未进行设置
// private List<ProductAttrAndValuePairBO> attrs;
/**
* 价格,单位:分
*/
private Integer price;
/**
* 库存数量
*/
private Integer quantity;
}
package cn.iocoder.mall.product.api.dto;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotEmpty;
/**
* Product 规格添加 DTO
*/
@Data
@Accessors(chain = true)
public class ProductAttrAddDTO {
/**
* 名称
*/
@NotEmpty(message = "规格名不能为空")
private String name;
}
package cn.iocoder.mall.product.api.dto;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
/**
* Product 规格修改 DTO
*/
@Data
@Accessors(chain = true)
public class ProductAttrUpdateDTO {
/**
* 规格编号
*/
@NotNull(message = "规格编号不能为空")
private Integer id;
/**
* 名称
*/
@NotEmpty(message = "规格名不能为空")
private String name;
}
package cn.iocoder.mall.product.api.dto;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
/**
* Product 规格值添加 DTO
*/
@Data
@Accessors(chain = true)
public class ProductAttrValueAddDTO {
/**
* 规格编号
*/
@NotNull(message = "规格编号不能为空")
private Integer attrId;
/**
* 名称
*/
@NotEmpty(message = "规格值名不能为空")
private String name;
}
package cn.iocoder.mall.product.api.dto;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
/**
* Product 规格值修改 DTO
*
* 注意,不允许修改所属规格
*/
@Data
@Accessors(chain = true)
public class ProductAttrValueUpdateDTO {
/**
* 规格值编号
*/
@NotNull(message = "规格编号不能为空")
private Integer id;
/**
* 名称
*/
@NotEmpty(message = "规格名不能为空")
private String name;
}
package cn.iocoder.mall.product.config;
import cn.iocoder.mall.product.message.MQStreamProducer;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableBinding(MQStreamProducer.class)
public class MQStreamConfiguration {
}
package cn.iocoder.mall.product.message;
import org.springframework.cloud.stream.annotation.Output;
import org.springframework.messaging.MessageChannel;
/**
* Spring Cloud Stream Source 接口
*/
public interface MQStreamProducer {
/**
* 商品更新 Output
*/
String PRODUCT_UPDATE_OUTPUT = "product-update-output";
@Output(PRODUCT_UPDATE_OUTPUT)
MessageChannel productUpdateOutput();
// default boolean sendProductUpdateMessage(ProductUpdateMessage message) {
// // 创建 Spring Message 对象
// Message<ProductUpdateMessage> springMessage = MessageBuilder.withPayload(message)
// .build();
// // 发送消息
// return productUpdateOutput().send(springMessage);
// }
}
...@@ -35,28 +35,6 @@ public class ProductAttrServiceImpl implements ProductAttrService { ...@@ -35,28 +35,6 @@ public class ProductAttrServiceImpl implements ProductAttrService {
@Autowired @Autowired
private ProductAttrValueMapper productAttrValueMapper; private ProductAttrValueMapper productAttrValueMapper;
@Override
public ProductAttrPageBO getProductAttrPage(ProductAttrPageDTO productAttrPageDTO) {
ProductAttrPageBO productAttrPageBO = new ProductAttrPageBO();
// 查询分页数据
int offset = (productAttrPageDTO.getPageNo()-1) * productAttrPageDTO.getPageSize();
productAttrPageBO.setAttrs(ProductAttrConvert.INSTANCE.convert(productAttrMapper.selectListByNameLike(productAttrPageDTO.getName(),
offset, productAttrPageDTO.getPageSize())));
// 查询分页总数
productAttrPageBO.setCount(productAttrMapper.selectCountByNameLike(productAttrPageDTO.getName()));
// 将规格值拼接上去
if (!productAttrPageBO.getAttrs().isEmpty()) {
Set<Integer> attrIds = productAttrPageBO.getAttrs().stream().map(ProductAttrDetailBO::getId).collect(Collectors.toSet());
List<ProductAttrValueDO> attrValues = productAttrValueMapper.selectListByAttrIds(attrIds);
ImmutableListMultimap<Integer, ProductAttrValueDO> attrValueMap = Multimaps.index(attrValues, ProductAttrValueDO::getAttrId); // KEY 是 attrId ,VALUE 是 ProductAttrValueDO 数组
for (ProductAttrDetailBO productAttrDetailBO : productAttrPageBO.getAttrs()) {
productAttrDetailBO.setValues(ProductAttrConvert.INSTANCE.convert2(((attrValueMap).get(productAttrDetailBO.getId()))));
}
}
// 返回结果
return productAttrPageBO;
}
@Override @Override
public List<ProductAttrSimpleBO> getProductAttrList() { public List<ProductAttrSimpleBO> getProductAttrList() {
// 查询所有开启的规格数组 // 查询所有开启的规格数组
...@@ -74,57 +52,5 @@ public class ProductAttrServiceImpl implements ProductAttrService { ...@@ -74,57 +52,5 @@ public class ProductAttrServiceImpl implements ProductAttrService {
return attrs; return attrs;
} }
@Override
public ProductAttrValueBO addProductAttrValue(Integer adminId, ProductAttrValueAddDTO productAttrValueAddDTO) {
// 校验规格名不重复
if (productAttrValueMapper.selectByAttrIdAndName(productAttrValueAddDTO.getAttrId(), productAttrValueAddDTO.getName()) != null) {
throw ServiceExceptionUtil.exception(ProductErrorCodeEnum.PRODUCT_ATTR_VALUE_EXISTS.getCode());
}
// 插入到数据库
ProductAttrValueDO productAttrValueDO = ProductAttrConvert.INSTANCE.convert(productAttrValueAddDTO)
.setStatus(ProductAttrConstants.ATTR_VALUE_STATUS_ENABLE);
productAttrValueDO.setCreateTime(new Date());
productAttrValueDO.setDeleted(DeletedStatusEnum.DELETED_NO.getValue());
productAttrValueMapper.insert(productAttrValueDO);
// 返回成功
return ProductAttrConvert.INSTANCE.convert2(productAttrValueDO);
}
@Override
public Boolean updateProductAttrValue(Integer adminId, ProductAttrValueUpdateDTO productAttrValueUpdateDTO) {
// 校验存在
ProductAttrValueDO productAttrValueDO = productAttrValueMapper.selectById(productAttrValueUpdateDTO.getId());
if (productAttrValueDO == null) {
throw ServiceExceptionUtil.exception(ProductErrorCodeEnum.PRODUCT_ATTR_VALUE_NOT_EXIST.getCode());
}
// 校验规格名不重复
ProductAttrValueDO existsAttrDO = productAttrValueMapper.selectByAttrIdAndName(productAttrValueDO.getAttrId(), productAttrValueUpdateDTO.getName());
if (existsAttrDO != null && !existsAttrDO.getId().equals(productAttrValueUpdateDTO.getId())) {
throw ServiceExceptionUtil.exception(ProductErrorCodeEnum.PRODUCT_ATTR_VALUE_EXISTS.getCode());
}
// 更新到数据库
ProductAttrValueDO updateProductValue = ProductAttrConvert.INSTANCE.convert(productAttrValueUpdateDTO);
productAttrValueMapper.update(updateProductValue);
// 返回成功
return true;
}
@Override
public Boolean updateProductAttrValueStatus(Integer adminId, Integer productAttrValueId, Integer status) {
// 校验存在
ProductAttrValueDO productAttrValueDO = productAttrValueMapper.selectById(productAttrValueId);
if (productAttrValueDO == null) {
throw ServiceExceptionUtil.exception(ProductErrorCodeEnum.PRODUCT_ATTR_VALUE_NOT_EXIST.getCode());
}
// 校验状态
if (productAttrValueDO.getStatus().equals(status)) {
throw ServiceExceptionUtil.exception(ProductErrorCodeEnum.PRODUCT_ATTR_VALUE_STATUS_EQUALS.getCode());
}
// 更新到数据库
ProductAttrValueDO updateProductAttrValue = new ProductAttrValueDO().setId(productAttrValueId).setStatus(status);
productAttrValueMapper.update(updateProductAttrValue);
// 返回成功
return true;
}
} }
...@@ -42,9 +42,6 @@ public class ProductSpuServiceImpl implements ProductSpuService { ...@@ -42,9 +42,6 @@ public class ProductSpuServiceImpl implements ProductSpuService {
@Autowired @Autowired
private ProductAttrServiceImpl productAttrService; private ProductAttrServiceImpl productAttrService;
@Autowired
private MQStreamProducer mqStreamProducer;
// @Override // @Override
// public ProductSpuBO getProductSpuDetail(Integer id) { // public ProductSpuBO getProductSpuDetail(Integer id) {
// ProductSpuDO productSpuDO = productSpuMapper.selectById(id); // ProductSpuDO productSpuDO = productSpuMapper.selectById(id);
...@@ -86,15 +83,6 @@ public class ProductSpuServiceImpl implements ProductSpuService { ...@@ -86,15 +83,6 @@ public class ProductSpuServiceImpl implements ProductSpuService {
return spus; return spus;
} }
@Override
public ProductSpuDetailBO addProductSpu(Integer adminId, ProductSpuAddDTO productSpuAddDTO) {
// 如果新增生成,发送创建商品 Topic 消息
// TODO 芋艿,先不考虑事务的问题。等后面的 fescar 一起搞
sendProductUpdateMessage(productSpuDetailBO.getId());
// 返回成功
return productSpuDetailBO;
}
@Override @Override
public Boolean updateProductSpuSort(Integer adminId, Integer spuId, Integer sort) { public Boolean updateProductSpuSort(Integer adminId, Integer spuId, Integer sort) {
// 校验 Spu 是否存在 // 校验 Spu 是否存在
......
package cn.iocoder.mall.searchservice.enums.product;
/**
* 搜索商品分页查询的排序字段枚举
*/
public enum SearchProductPageQuerySortFieldEnum {
/**
* 购买价格
*/
BUY_PRICE("buyPrice");
/**
* 字段
*/
private final String field;
SearchProductPageQuerySortFieldEnum(String field) {
this.field = field;
}
public String getField() {
return field;
}
public static boolean contains(String field) {
for (SearchProductPageQuerySortFieldEnum fieldEnum : values()) {
if (field.equals(fieldEnum.getField())) {
return true;
}
}
return false;
}
}
package cn.iocoder.mall.searchservice.convert.product; package cn.iocoder.mall.searchservice.convert.product;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.productservice.rpc.category.dto.ProductCategoryRespDTO; import cn.iocoder.mall.productservice.rpc.category.dto.ProductCategoryRespDTO;
import cn.iocoder.mall.productservice.rpc.spu.dto.ProductSpuRespDTO; import cn.iocoder.mall.productservice.rpc.spu.dto.ProductSpuRespDTO;
import cn.iocoder.mall.searchservice.dal.es.dataobject.ESProductDO; import cn.iocoder.mall.searchservice.dal.es.dataobject.ESProductDO;
import cn.iocoder.mall.searchservice.service.product.bo.SearchProductCreateBO; import cn.iocoder.mall.searchservice.service.product.bo.SearchProductBO;
import cn.iocoder.mall.searchservice.service.product.bo.SearchProductSaveBO;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
import org.mapstruct.Mapping; import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers; import org.mapstruct.factory.Mappers;
import org.springframework.data.domain.Page;
@Mapper @Mapper
public interface SearchProductConvert { public interface SearchProductConvert {
...@@ -23,8 +26,12 @@ public interface SearchProductConvert { ...@@ -23,8 +26,12 @@ public interface SearchProductConvert {
@Mapping(source = "spu.picUrls", target = "picUrls") @Mapping(source = "spu.picUrls", target = "picUrls")
@Mapping(source = "spu.visible", target = "visible") @Mapping(source = "spu.visible", target = "visible")
@Mapping(source = "spu.sort", target = "sort") @Mapping(source = "spu.sort", target = "sort")
SearchProductCreateBO convert(ProductSpuRespDTO spu, ProductCategoryRespDTO category); SearchProductSaveBO convert(ProductSpuRespDTO spu, ProductCategoryRespDTO category);
ESProductDO convert(SearchProductCreateBO bean); ESProductDO convert(SearchProductSaveBO bean);
@Mapping(source = "content", target = "list")
@Mapping(source = "getTotalElements", target = "total")
PageResult<SearchProductBO> convert(Page<ESProductDO> searchPage);
} }
...@@ -11,7 +11,7 @@ import cn.iocoder.mall.productservice.rpc.spu.ProductSpuRpc; ...@@ -11,7 +11,7 @@ import cn.iocoder.mall.productservice.rpc.spu.ProductSpuRpc;
import cn.iocoder.mall.productservice.rpc.spu.dto.ProductSpuRespDTO; import cn.iocoder.mall.productservice.rpc.spu.dto.ProductSpuRespDTO;
import cn.iocoder.mall.searchservice.convert.product.SearchProductConvert; import cn.iocoder.mall.searchservice.convert.product.SearchProductConvert;
import cn.iocoder.mall.searchservice.service.product.SearchProductService; import cn.iocoder.mall.searchservice.service.product.SearchProductService;
import cn.iocoder.mall.searchservice.service.product.bo.SearchProductCreateBO; import cn.iocoder.mall.searchservice.service.product.bo.SearchProductSaveBO;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference; import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -62,7 +62,7 @@ public class SearchProductManager { ...@@ -62,7 +62,7 @@ public class SearchProductManager {
return false; return false;
} }
// 保存商品到 ES 中 // 保存商品到 ES 中
SearchProductCreateBO searchProductCreateBO = SearchProductConvert.INSTANCE.convert( SearchProductSaveBO searchProductCreateBO = SearchProductConvert.INSTANCE.convert(
productSpuResult.getData(), getProductCategoryResult.getData()); productSpuResult.getData(), getProductCategoryResult.getData());
ProductSkuRespDTO productSku = listProductSkusResult.getData().stream() ProductSkuRespDTO productSku = listProductSkusResult.getData().stream()
.min(Comparator.comparing(ProductSkuRespDTO::getPrice)).orElse(null); .min(Comparator.comparing(ProductSkuRespDTO::getPrice)).orElse(null);
...@@ -72,7 +72,7 @@ public class SearchProductManager { ...@@ -72,7 +72,7 @@ public class SearchProductManager {
searchProductCreateBO.setOriginalPrice(productSku.getPrice()); searchProductCreateBO.setOriginalPrice(productSku.getPrice());
searchProductCreateBO.setBuyPrice(productSku.getPrice()); searchProductCreateBO.setBuyPrice(productSku.getPrice());
searchProductCreateBO.setQuantity(productSku.getQuantity()); searchProductCreateBO.setQuantity(productSku.getQuantity());
searchProductService.createSearchProduct(searchProductCreateBO); searchProductService.saveSearchProduct(searchProductCreateBO);
return true; return true;
} }
......
package cn.iocoder.mall.searchservice.service.product; package cn.iocoder.mall.searchservice.service.product;
import cn.iocoder.common.framework.util.CollectionUtils;
import cn.iocoder.common.framework.util.StringUtils;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.common.framework.vo.SortingField;
import cn.iocoder.mall.searchservice.convert.product.SearchProductConvert; import cn.iocoder.mall.searchservice.convert.product.SearchProductConvert;
import cn.iocoder.mall.searchservice.dal.es.dataobject.ESProductDO; import cn.iocoder.mall.searchservice.dal.es.dataobject.ESProductDO;
import cn.iocoder.mall.searchservice.dal.es.repository.ESProductRepository; import cn.iocoder.mall.searchservice.dal.es.repository.ESProductRepository;
import cn.iocoder.mall.searchservice.service.product.bo.SearchProductCreateBO; import cn.iocoder.mall.searchservice.enums.product.SearchProductPageQuerySortFieldEnum;
import cn.iocoder.mall.searchservice.service.product.bo.SearchProductBO;
import cn.iocoder.mall.searchservice.service.product.bo.SearchProductConditionBO;
import cn.iocoder.mall.searchservice.service.product.bo.SearchProductPageQueryBO;
import cn.iocoder.mall.searchservice.service.product.bo.SearchProductSaveBO;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.LongTerms;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
@Service @Service
public class SearchProductService { public class SearchProductService {
@Autowired @Autowired
private ESProductRepository productRepository; private ESProductRepository productRepository;
@Autowired
private ElasticsearchTemplate elasticsearchTemplate; // 因为需要使用到聚合操作,只好引入 ElasticsearchTemplate 。
/**
* 搜索商品分页结果
*
* @param pageQueryBO 分页查询条件
* @return 商品信息
*/
public PageResult<SearchProductBO> getSearchPage(SearchProductPageQueryBO pageQueryBO) {
checkSortFieldInvalid(pageQueryBO.getSorts());
// 执行查询
Page<ESProductDO> searchPage = productRepository.search(pageQueryBO.getCid(), pageQueryBO.getKeyword(),
pageQueryBO.getPageNo(), pageQueryBO.getPageSize(), pageQueryBO.getSorts());
// 转换结果
return SearchProductConvert.INSTANCE.convert(searchPage);
}
private void checkSortFieldInvalid(List<SortingField> sorts) {
if (CollectionUtils.isEmpty(sorts)) {
return;
}
sorts.forEach(sortingField -> Assert.isTrue(SearchProductPageQuerySortFieldEnum.contains(sortingField.getField()),
String.format("排序字段(%s) 不在允许范围内", sortingField.getField())));
}
public void createSearchProduct(SearchProductCreateBO createBO) { /**
ESProductDO productDO = SearchProductConvert.INSTANCE.convert(createBO); * 保存商品信息到 ES 中
*
* @param saveBO 商品信息
*/
public void saveSearchProduct(SearchProductSaveBO saveBO) {
ESProductDO productDO = SearchProductConvert.INSTANCE.convert(saveBO);
productRepository.save(productDO); productRepository.save(productDO);
} }
/**
* 获得指定关键字对应的搜索条件
*
* 在我们搜索商品时,需要获得关键字可选择的分类、品牌等等搜索条件,方便用户进一步检索
*
* @param keyword 关键字
* @param fields 需要返回的搜索条件。目前可传入的参数为
* 1. category :商品分类,会返回商品分类编号
* @return 搜索条件
*/
public SearchProductConditionBO getSearchCondition(String keyword, Collection<String> fields) {
// 创建 ES 搜索条件
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
// 筛选
if (StringUtils.hasText(keyword)) { // 如果有 keyword ,就去匹配
nativeSearchQueryBuilder.withQuery(QueryBuilders.multiMatchQuery(keyword,
"name", "sellPoint", "categoryName"));
} else {
nativeSearchQueryBuilder.withQuery(QueryBuilders.matchAllQuery());
}
// 聚合
if (fields.contains("category")) { // 商品分类
nativeSearchQueryBuilder.addAggregation(AggregationBuilders.terms("cids").field("cid"));
}
// 执行查询,返回结果
return elasticsearchTemplate.query(nativeSearchQueryBuilder.build(), response -> {
SearchProductConditionBO result = new SearchProductConditionBO();
// categoryIds 聚合
Aggregation categoryIdsAggregation = response.getAggregations().get("cids");
if (categoryIdsAggregation != null) {
result.setCids(new ArrayList<>());
for (LongTerms.Bucket bucket : (((LongTerms) categoryIdsAggregation).getBuckets())) {
result.getCids().add(bucket.getKeyAsNumber().intValue());
}
}
// 返回结果
return result;
});
}
} }
package cn.iocoder.mall.search.biz.bo; package cn.iocoder.mall.searchservice.service.product.bo;
import lombok.Data; import lombok.Data;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.List; import java.util.List;
/** /**
* 商品 ES BO * 搜索商品 BO
*/ */
@Data @Data
@Accessors(chain = true) @Accessors(chain = true)
public class ProductBO implements Serializable { public class SearchProductBO {
private Integer id; private Integer id;
......
package cn.iocoder.mall.search.biz.bo; package cn.iocoder.mall.searchservice.service.product.bo;
import lombok.Data; import lombok.Data;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
...@@ -10,26 +10,11 @@ import java.util.List; ...@@ -10,26 +10,11 @@ import java.util.List;
*/ */
@Data @Data
@Accessors(chain = true) @Accessors(chain = true)
public class ProductConditionBO { public class SearchProductConditionBO {
/** /**
* 商品分类数组 * 商品分类数组
*/ */
private List<Category> categories; private List<Integer> cids;
@Data
@Accessors(chain = true)
public static class Category {
/**
* 分类编号
*/
private Integer id;
/**
* 分类名称
*/
private String name;
}
} }
package cn.iocoder.mall.search.biz.dto; package cn.iocoder.mall.searchservice.service.product.bo;
import cn.iocoder.common.framework.util.CollectionUtil; import cn.iocoder.common.framework.vo.PageParam;
import cn.iocoder.common.framework.vo.SortingField; import cn.iocoder.common.framework.vo.SortingField;
import lombok.Data; import lombok.Data;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import java.util.List; import java.util.List;
import java.util.Set;
/** /**
* 商品检索分页 DTO * 商品检索分查询 BO
*/ */
@Data @Data
@Accessors(chain = true) @Accessors(chain = true)
public class ProductSearchPageDTO { public class SearchProductPageQueryBO extends PageParam {
public static final Set<String> SORT_FIELDS = CollectionUtil.asSet("buyPrice");
/** /**
* 分类编号 * 分类编号
...@@ -25,18 +22,10 @@ public class ProductSearchPageDTO { ...@@ -25,18 +22,10 @@ public class ProductSearchPageDTO {
* 关键字 * 关键字
*/ */
private String keyword; private String keyword;
/**
* 页码
*/
private Integer pageNo;
/**
* 分页大小
*/
private Integer pageSize;
/** /**
* 排序字段数组 * 排序字段数组
*
*
*/ */
private List<SortingField> sorts; private List<SortingField> sorts;
......
...@@ -6,11 +6,11 @@ import lombok.experimental.Accessors; ...@@ -6,11 +6,11 @@ import lombok.experimental.Accessors;
import java.util.List; import java.util.List;
/** /**
* 搜索商品创建 BO * 搜索商品保存 BO
*/ */
@Data @Data
@Accessors @Accessors
public class SearchProductCreateBO { public class SearchProductSaveBO {
private Integer id; private Integer id;
......
package cn.iocoder.mall.search.biz.bo;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.List;
@Data
@Accessors(chain = true)
public class ProductPageBO implements Serializable {
/**
* 管理员数组
*/
private List<ProductBO> list;
/**
* 总量
*/
private Integer total;
}
package cn.iocoder.mall.search.biz.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories;
@Configuration
@EnableElasticsearchRepositories(basePackages = "cn.iocoder.mall.search.biz.dao")
public class JPAConfiguration {
}
package cn.iocoder.mall.search.biz.constant;
/**
* ES 字段分析器的枚举类
*
* 关于 IK 分词,文章 https://blog.csdn.net/xsdxs/article/details/72853288 不错。
* 目前项目使用的 ES 版本是 6.7.1 ,可以在 https://www.elastic.co/cn/downloads/past-releases/elasticsearch-6-7-1 下载。
* 如果不知道怎么安装 ES ,可以看 https://blog.csdn.net/chengyuqiang/article/details/78837712 简单。
*/
public class FieldAnalyzer {
/**
* IK 最大化分词
*
* 会将文本做最细粒度的拆分
*/
public static final String IK_MAX_WORD = "ik_max_word";
/**
* IK 智能分词
*
* 会做最粗粒度的拆分
*/
public static final String IK_SMART = "ik_smart";
}
package cn.iocoder.mall.search.biz.convert;
import cn.iocoder.mall.search.biz.bo.ProductBO;
import cn.iocoder.mall.search.biz.dataobject.ESProductDO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.List;
@Mapper
public interface ProductSearchConvert {
ProductSearchConvert INSTANCE = Mappers.getMapper(ProductSearchConvert.class);
List<ProductBO> convert(List<ESProductDO> list);
}
package cn.iocoder.mall.search.biz.dao;
import cn.iocoder.common.framework.util.CollectionUtil;
import cn.iocoder.common.framework.util.StringUtil;
import cn.iocoder.common.framework.vo.SortingField;
import cn.iocoder.mall.search.biz.dataobject.ESProductDO;
import org.elasticsearch.common.lucene.search.function.FunctionScoreQuery;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder;
import org.elasticsearch.index.query.functionscore.ScoreFunctionBuilders;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
import static org.elasticsearch.index.query.QueryBuilders.matchQuery;
@Repository
public interface ProductRepository extends ElasticsearchRepository<ESProductDO, Integer> {
@Deprecated
ESProductDO findByName(String name);
default Page<ESProductDO> search(Integer cid, String keyword, Integer pageNo, Integer pageSize,
List<SortingField> sortFields) {
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder()
.withPageable(PageRequest.of(pageNo - 1, pageSize));
// 筛选条件 cid
if (cid != null) {
nativeSearchQueryBuilder.withFilter(QueryBuilders.termQuery("cid", cid));
}
// 筛选
if (StringUtil.hasText(keyword)) {
FunctionScoreQueryBuilder.FilterFunctionBuilder[] functions = { // TODO 芋艿,分值随便打的
new FunctionScoreQueryBuilder.FilterFunctionBuilder(matchQuery("name", keyword),
ScoreFunctionBuilders.weightFactorFunction(10)),
new FunctionScoreQueryBuilder.FilterFunctionBuilder(matchQuery("sellPoint", keyword),
ScoreFunctionBuilders.weightFactorFunction(2)),
new FunctionScoreQueryBuilder.FilterFunctionBuilder(matchQuery("categoryName", keyword),
ScoreFunctionBuilders.weightFactorFunction(3)),
// new FunctionScoreQueryBuilder.FilterFunctionBuilder(matchQuery("description", keyword),
// ScoreFunctionBuilders.weightFactorFunction(2)), // TODO 芋艿,目前这么做,如果商品描述很长,在按照价格降序,会命中超级多的关键字。
};
FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(functions)
.scoreMode(FunctionScoreQuery.ScoreMode.SUM)
.setMinScore(2F); // TODO 芋艿,需要考虑下 score
nativeSearchQueryBuilder.withQuery(functionScoreQueryBuilder);
} else {
nativeSearchQueryBuilder.withQuery(QueryBuilders.matchAllQuery());
}
// 排序
if (!CollectionUtil.isEmpty(sortFields)) {
sortFields.forEach(sortField -> nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort(sortField.getField())
.order(SortOrder.fromString(sortField.getOrder()))));
} else if (StringUtil.hasText(keyword)) {
nativeSearchQueryBuilder.withSort(SortBuilders.scoreSort().order(SortOrder.DESC));
} else {
nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort("sort").order(SortOrder.DESC));
}
// 执行查询
return search(nativeSearchQueryBuilder.build());
}
}
package cn.iocoder.mall.search.biz.dataobject;
import cn.iocoder.mall.search.biz.constant.FieldAnalyzer;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import java.util.List;
/**
* 商品 ES DO
*/
@Document(indexName = "product", type = "spu", shards = 1, replicas = 0)
@Data
@Accessors(chain = true)
public class ESProductDO {
@Id
private Integer id;
// ========== 基本信息 =========
/**
* SPU 名字
*/
@Field(analyzer = FieldAnalyzer.IK_MAX_WORD, type = FieldType.Text)
private String name;
/**
* 卖点
*/
@Field(analyzer = FieldAnalyzer.IK_MAX_WORD, type = FieldType.Text)
private String sellPoint;
/**
* 描述
*/
@Field(analyzer = FieldAnalyzer.IK_MAX_WORD, type = FieldType.Text)
private String description;
/**
* 分类编号
*/
private Integer cid;
/**
* 分类名
*/
@Field(analyzer = FieldAnalyzer.IK_MAX_WORD, type = FieldType.Text)
private String categoryName;
/**
* 商品主图地数组
*/
private List<String> picUrls;
// ========== 其他信息 =========
/**
* 是否上架商品(是否可见)。
*
* true 为已上架
* false 为已下架
*/
private Boolean visible;
/**
* 排序字段
*/
private Integer sort;
// ========== Sku 相关字段 =========
/**
* 原价格,单位:分
*/
private Integer originalPrice;
/**
* 购买价格,单位:分。
*/
private Integer buyPrice;
/**
* 库存数量
*/
private Integer quantity;
// ========== 促销活动相关字段 =========
// 目前只促销单体商品促销,目前仅限制折扣。
/**
* 促销活动编号
*/
private Integer promotionActivityId;
/**
* 促销活动标题
*/
private String promotionActivityTitle;
/**
* 促销活动类型
*/
private Integer promotionActivityType;
}
package cn.iocoder.mall.search.biz.dto;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.Collection;
/**
* 获得商品检索条件 DTO
*/
@Data
@Accessors(chain = true)
public class ProductConditionDTO {
/**
* Field - 商品分类
*/
public static final String FIELD_CATEGORY = "category";
/**
* 关键字
*/
private String keyword;
/**
* 需要返回的搜索条件的 fields 名
*/
private Collection<String> fields;
}
...@@ -19,8 +19,7 @@ public class ProductSearchServiceImpl implements ProductSearchService { ...@@ -19,8 +19,7 @@ public class ProductSearchServiceImpl implements ProductSearchService {
@Autowired @Autowired
private ProductRepository productRepository; private ProductRepository productRepository;
@Autowired
private ElasticsearchTemplate elasticsearchTemplate; // 因为需要使用到聚合操作,只好引入 ElasticsearchTemplate 。
// @Reference(validation = "true", version = "${dubbo.consumer.ProductSpuService.version}") // @Reference(validation = "true", version = "${dubbo.consumer.ProductSpuService.version}")
// private ProductSpuService productSpuService; // private ProductSpuService productSpuService;
...@@ -51,97 +50,5 @@ public class ProductSearchServiceImpl implements ProductSearchService { ...@@ -51,97 +50,5 @@ public class ProductSearchServiceImpl implements ProductSearchService {
// return rebuildCounts; // return rebuildCounts;
// } // }
// //
// @Override
// public Boolean save(Integer id) {
// // 获得商品性情
// ProductSpuDetailBO result = productSpuService.getProductSpuDetail(id);
// // 存储到 ES 中
// ESProductDO product = convert(result);
// productRepository.save(product);
// // 返回成功
// return true;
// }
//
// @SuppressWarnings("OptionalGetWithoutIsPresent")
// private ESProductDO convert(ProductSpuDetailBO spu) {
// // 获得最小价格的 SKU ,用于下面的价格计算
// ProductSpuDetailBO.Sku sku = spu.getSkus().stream().min(Comparator.comparing(ProductSpuDetailBO.Sku::getPrice)).get();
// // 价格计算
// CalcSkuPriceBO calSkuPriceResult = cartService.calcSkuPrice(sku.getId());
// // 拼装结果
// return ProductSearchConvert.INSTANCE.convert(spu, calSkuPriceResult);
// }
//
// @Override
// public ProductPageBO getSearchPage(ProductSearchPageDTO searchPageDTO) {
// checkSortFieldInvalid(searchPageDTO.getSorts());
// // 执行查询
// Page<ESProductDO> searchPage = productRepository.search(searchPageDTO.getCid(), searchPageDTO.getKeyword(),
// searchPageDTO.getPageNo(), searchPageDTO.getPageSize(), searchPageDTO.getSorts());
// // 转换结果
// return new ProductPageBO()
// .setList(ProductSearchConvert.INSTANCE.convert(searchPage.getContent()))
// .setTotal((int) searchPage.getTotalElements());
// }
private void checkSortFieldInvalid(List<SortingField> sorts) {
if (CollectionUtil.isEmpty(sorts)) {
return;
}
sorts.forEach(sortingField -> Assert.isTrue(ProductSearchPageDTO.SORT_FIELDS.contains(sortingField.getField()),
String.format("排序字段(%s) 不在允许范围内", sortingField.getField())));
}
@Override
public Integer rebuild() {
return null;
}
@Override
public Boolean save(Integer id) {
return null;
}
// @Override
// public ProductConditionBO getSearchCondition(ProductConditionDTO conditionDTO) {
// // 创建 ES 搜索条件
// NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
// // 筛选
// if (StringUtil.hasText(conditionDTO.getKeyword())) { // 如果有 keyword ,就去匹配
// nativeSearchQueryBuilder.withQuery(QueryBuilders.multiMatchQuery(conditionDTO.getKeyword(),
// "name", "sellPoint", "categoryName"));
// } else {
// nativeSearchQueryBuilder.withQuery(QueryBuilders.matchAllQuery());
// }
// // 聚合
// if (conditionDTO.getFields().contains(ProductConditionDTO.FIELD_CATEGORY)) { // 商品分类
// nativeSearchQueryBuilder.addAggregation(AggregationBuilders.terms("cids").field("cid"));
// }
// // 执行查询
// ProductConditionBO condition = elasticsearchTemplate.query(nativeSearchQueryBuilder.build(), response -> {
// ProductConditionBO result = new ProductConditionBO();
// // categoryIds 聚合
// Aggregation categoryIdsAggregation = response.getAggregations().get("cids");
// if (categoryIdsAggregation != null) {
// result.setCategories(new ArrayList<>());
// for (LongTerms.Bucket bucket : (((LongTerms) categoryIdsAggregation).getBuckets())) {
// result.getCategories().add(new ProductConditionBO.Category().setId(bucket.getKeyAsNumber().intValue()));
// }
// }
// // 返回结果
// return result;
// });
// // 聚合其它数据源
// if (!CollectionUtil.isEmpty(condition.getCategories())) {
// // 查询指定的 ProductCategoryBO 数组,并转换成 ProductCategoryBO Map
// Map<Integer, ProductCategoryBO> categoryMap = productCategoryService.getListByIds(
// condition.getCategories().stream().map(ProductConditionBO.Category::getId).collect(Collectors.toList()))
// .stream().collect(Collectors.toMap(ProductCategoryBO::getId, category -> category));
// // 设置分类名
// condition.getCategories().forEach(category -> category.setName(categoryMap.get(category.getId()).getName()));
// }
// // 返回结果
// return condition;
// }
} }
...@@ -9,14 +9,6 @@ public interface ProductSearchService { ...@@ -9,14 +9,6 @@ public interface ProductSearchService {
Integer rebuild(); Integer rebuild();
/**
* 构建商品的搜索索引
*
* @param id 商品编号
* @return 构建结果
*/
Boolean save(Integer id);
ProductPageBO getSearchPage(ProductSearchPageDTO searchPageDTO); ProductPageBO getSearchPage(ProductSearchPageDTO searchPageDTO);
ProductConditionBO getSearchCondition(ProductConditionDTO conditionDTO); ProductConditionBO getSearchCondition(ProductConditionDTO conditionDTO);
......
package cn.iocoder.mall.search.biz.bo;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.List;
/**
* 商品 ES BO
*/
@Data
@Accessors(chain = true)
public class ProductBO implements Serializable {
private Integer id;
// ========== 基本信息 =========
/**
* SPU 名字
*/
private String name;
/**
* 卖点
*/
private String sellPoint;
/**
* 描述
*/
private String description;
/**
* 分类编号
*/
private Integer cid;
/**
* 分类名
*/
private String categoryName;
/**
* 商品主图地数组
*/
private List<String> picUrls;
// ========== 其他信息 =========
/**
* 是否上架商品(是否可见)。
*
* true 为已上架
* false 为已下架
*/
private Boolean visible;
/**
* 排序字段
*/
private Integer sort;
// ========== Sku 相关字段 =========
/**
* 原价格,单位:分
*/
private Integer originalPrice;
/**
* 购买价格,单位:分。
*/
private Integer buyPrice;
/**
* 库存数量
*/
private Integer quantity;
// ========== 促销活动相关字段 =========
// 目前只促销单体商品促销,目前仅限制折扣。
/**
* 促销活动编号
*/
private Integer promotionActivityId;
/**
* 促销活动标题
*/
private String promotionActivityTitle;
/**
* 促销活动类型
*/
private Integer promotionActivityType;
}
package cn.iocoder.mall.search.biz.bo;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.List;
@Data
@Accessors(chain = true)
public class ProductPageBO implements Serializable {
/**
* 管理员数组
*/
private List<ProductBO> list;
/**
* 总量
*/
private Integer total;
}
...@@ -68,26 +68,6 @@ public class ProductSearchServiceImpl implements ProductSearchService { ...@@ -68,26 +68,6 @@ public class ProductSearchServiceImpl implements ProductSearchService {
return rebuildCounts; return rebuildCounts;
} }
@Override
public ProductPageBO getSearchPage(ProductSearchPageDTO searchPageDTO) {
checkSortFieldInvalid(searchPageDTO.getSorts());
// 执行查询
Page<ESProductDO> searchPage = productRepository.search(searchPageDTO.getCid(), searchPageDTO.getKeyword(),
searchPageDTO.getPageNo(), searchPageDTO.getPageSize(), searchPageDTO.getSorts());
// 转换结果
return new ProductPageBO()
.setList(ProductSearchConvert.INSTANCE.convert(searchPage.getContent()))
.setTotal((int) searchPage.getTotalElements());
}
private void checkSortFieldInvalid(List<SortingField> sorts) {
if (CollectionUtil.isEmpty(sorts)) {
return;
}
sorts.forEach(sortingField -> Assert.isTrue(ProductSearchPageDTO.SORT_FIELDS.contains(sortingField.getField()),
String.format("排序字段(%s) 不在允许范围内", sortingField.getField())));
}
@Override @Override
public ProductConditionBO getSearchCondition(ProductConditionDTO conditionDTO) { public ProductConditionBO getSearchCondition(ProductConditionDTO conditionDTO) {
// 创建 ES 搜索条件 // 创建 ES 搜索条件
......
...@@ -195,6 +195,22 @@ CREATE TABLE `system_data_dict` ( ...@@ -195,6 +195,22 @@ CREATE TABLE `system_data_dict` (
PRIMARY KEY (`id`) USING BTREE PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=67 DEFAULT CHARSET=utf8mb4 COMMENT='数据字典'; ) ENGINE=InnoDB AUTO_INCREMENT=67 DEFAULT CHARSET=utf8mb4 COMMENT='数据字典';
-- ----------------------------
-- Table structure for system_error_code
-- ----------------------------
CREATE TABLE `system_error_code` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '错误码编号',
`code` int(11) NOT NULL DEFAULT '0' COMMENT '错误码编码',
`message` varchar(255) NOT NULL DEFAULT '' COMMENT '错误码错误提示',
`type` tinyint(4) NOT NULL COMMENT '错误码类型',
`group` varchar(64) NOT NULL COMMENT '错误码分组',
`memo` varchar(255) DEFAULT NULL COMMENT '错误码备注',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=350 DEFAULT CHARSET=utf8mb4 COMMENT='错误码';
-- ---------------------------- -- ----------------------------
-- Table structure for system_exception_log -- Table structure for system_exception_log
-- ---------------------------- -- ----------------------------
......
...@@ -5,7 +5,7 @@ import cn.iocoder.common.framework.vo.CommonResult; ...@@ -5,7 +5,7 @@ import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.userweb.controller.passport.vo.PassportLoginBySmsReqVO; import cn.iocoder.mall.userweb.controller.passport.vo.PassportLoginBySmsReqVO;
import cn.iocoder.mall.userweb.controller.passport.vo.UserPassportSendSmsRespVO; import cn.iocoder.mall.userweb.controller.passport.vo.UserPassportSendSmsRespVO;
import cn.iocoder.mall.userweb.controller.passport.vo.PassportAccessTokenRespVO; import cn.iocoder.mall.userweb.controller.passport.vo.PassportAccessTokenRespVO;
import cn.iocoder.mall.userweb.manager.passport.UserPassportManager; import cn.iocoder.mall.userweb.manager.passport.PassportManager;
import cn.iocoder.security.annotations.RequiresNone; import cn.iocoder.security.annotations.RequiresNone;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
...@@ -24,7 +24,7 @@ import static cn.iocoder.common.framework.vo.CommonResult.success; ...@@ -24,7 +24,7 @@ import static cn.iocoder.common.framework.vo.CommonResult.success;
public class UserPassportController { public class UserPassportController {
@Autowired @Autowired
private UserPassportManager userPassportManager; private PassportManager userPassportManager;
@PostMapping("/login-by-sms") @PostMapping("/login-by-sms")
@ApiOperation("手机验证码登陆") @ApiOperation("手机验证码登陆")
......
...@@ -9,21 +9,21 @@ import cn.iocoder.mall.userservice.enums.sms.UserSmsSceneEnum; ...@@ -9,21 +9,21 @@ import cn.iocoder.mall.userservice.enums.sms.UserSmsSceneEnum;
import cn.iocoder.mall.userservice.rpc.sms.UserSmsCodeRpc; import cn.iocoder.mall.userservice.rpc.sms.UserSmsCodeRpc;
import cn.iocoder.mall.userservice.rpc.user.UserRpc; import cn.iocoder.mall.userservice.rpc.user.UserRpc;
import cn.iocoder.mall.userservice.rpc.user.dto.UserRespDTO; import cn.iocoder.mall.userservice.rpc.user.dto.UserRespDTO;
import cn.iocoder.mall.userweb.controller.passport.vo.PassportAccessTokenRespVO;
import cn.iocoder.mall.userweb.controller.passport.vo.PassportLoginBySmsReqVO; import cn.iocoder.mall.userweb.controller.passport.vo.PassportLoginBySmsReqVO;
import cn.iocoder.mall.userweb.controller.passport.vo.UserPassportSendSmsRespVO; import cn.iocoder.mall.userweb.controller.passport.vo.UserPassportSendSmsRespVO;
import cn.iocoder.mall.userweb.controller.passport.vo.PassportAccessTokenRespVO;
import cn.iocoder.mall.userweb.convert.passport.PassportConvert; import cn.iocoder.mall.userweb.convert.passport.PassportConvert;
import org.apache.dubbo.config.annotation.Reference; import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@Service @Service
public class UserPassportManager { public class PassportManager {
@Reference(version = "${dubbo.consumer.UserSmsCodeRpc.version}", validation = "false") @DubboReference(version = "${dubbo.consumer.UserSmsCodeRpc.version}", validation = "false")
private UserSmsCodeRpc userSmsCodeRpc; private UserSmsCodeRpc userSmsCodeRpc;
@Reference(version = "${dubbo.consumer.UserRpc.version}", validation = "false") @DubboReference(version = "${dubbo.consumer.UserRpc.version}", validation = "false")
private UserRpc userRpc; private UserRpc userRpc;
@Reference(version = "${dubbo.consumer.OAuth2Rpc.version}", validation = "false") @DubboReference(version = "${dubbo.consumer.OAuth2Rpc.version}", validation = "false")
private OAuth2Rpc oauth2Rpc; private OAuth2Rpc oauth2Rpc;
public PassportAccessTokenRespVO loginBySms(PassportLoginBySmsReqVO loginBySmsDTO, String ip) { public PassportAccessTokenRespVO loginBySms(PassportLoginBySmsReqVO loginBySmsDTO, String ip) {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论