项目介绍
畅购属于B2C架构的线上商城,支持用户在线浏览商品,在线搜索商品,并且可以将喜欢的商品加入购物车从而下单后购买商品,同时支持线上支付,支付模式暂时只有微信支付
畅购商城采用微服务的架构,微服务技术采用了SpringCloud技术栈,哥哥微服务站点都基于SpringBoot构建,
并采用SpringCloud GateWay将各个微服务的功能串联起来,同时在微服务网关GateWay中采用过滤和限流的策略,实施对微服务进行保护和权限认证操作.采用了ElasticSearch解决了海量商品的实时检索.数据存储采用的MySql,采用Redis做数据的缓存操作.
1.架构图
2.首页
3.用户注册
4. 用户登录
5.分类展示
6.商品展示
- 这里用到了ElasticSearch
7. 商品详情
9.评论模块
10.购物车
11.下订单
12. 支付(微信支付)
13.后端项目展示
14 部分代码展示
package com.czxy.service.impl;
import com.czxy.repository.SkuRepository;
import com.czxy.service.SkuSearchService;
import com.czxy.vo.ReturnSku;
import com.czxy.vo.SearchVo;
import com.czxy.vo.SkuSearch;
import org.apache.commons.lang3.StringUtils;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
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.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class SkuSearchServiceImpl implements SkuSearchService {
@Resource
private SkuRepository skuRepository;
@Override
public Map<String, Object> findAll(SearchVo searchVo) {
Map<String,Object> map = new HashMap<>();
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
nativeSearchQueryBuilder.withQuery(boolQueryBuilder);
//分类
if (StringUtils.isNotBlank(searchVo.getCatId())){
boolQueryBuilder.must(QueryBuilders.termQuery("catId",searchVo.getCatId()));
}
//品牌
if (StringUtils.isNotBlank(searchVo.getBrandId())){
boolQueryBuilder.must(QueryBuilders.termQuery("brandId",searchVo.getBrandId()));
}
//规格
if (searchVo.getSpecList()!=null){
for (Map.Entry<String, String> stringStringEntry : searchVo.getSpecList().entrySet()) {
String key = stringStringEntry.getKey();
String value = stringStringEntry.getValue();
boolQueryBuilder.must(QueryBuilders.termQuery("specs."+key+".keyword",value));
}
}
//价格
if (StringUtils.isNotBlank(searchVo.getMinPrice())){
boolQueryBuilder.must(QueryBuilders.rangeQuery("price").gte(Integer.parseInt(searchVo.getMinPrice())*100));
}
if (StringUtils.isNotBlank(searchVo.getMaxPrice())){
boolQueryBuilder.must(QueryBuilders.rangeQuery("price").lte(Integer.parseInt(searchVo.getMaxPrice())*100));
}
//关键字
if (StringUtils.isNotBlank(searchVo.getKeyword())){
boolQueryBuilder.must(QueryBuilders.matchQuery("skuName",searchVo.getKeyword()));
}
//分页
nativeSearchQueryBuilder.withPageable(PageRequest.of(searchVo.getCurrent()-1,searchVo.getSize()));
//排序
//销量
if ("xl".equals(searchVo.getSortBy())){
nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort("sellerCount").order(searchVo.getSortWay().equals("asc") ? SortOrder.ASC : SortOrder.DESC));
}
//价格
if ("jg".equals(searchVo.getSortBy())){
nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort("price").order(searchVo.getSortWay().equals("asc") ? SortOrder.ASC : SortOrder.DESC));
}
//评论
if ("pl".equals(searchVo.getSortBy())){
nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort("commentCount").order(searchVo.getSortWay().equals("asc") ? SortOrder.ASC : SortOrder.DESC));
}
//时间
if ("sj".equals(searchVo.getSortBy())){
nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort("onSaleTime").order(searchVo.getSortWay().equals("asc") ? SortOrder.ASC : SortOrder.DESC));
}
Page<SkuSearch> search = skuRepository.search(nativeSearchQueryBuilder.build());
List<ReturnSku> list = new ArrayList<>();
search.forEach(skuSearch -> {
ReturnSku returnSku = new ReturnSku();
returnSku.setId(skuSearch.getId());
returnSku.setPrice(skuSearch.getPrice());
returnSku.setMidlogo(skuSearch.getMidlogo());
returnSku.setGoodsName(skuSearch.getSkuName());
returnSku.setCommentCount(skuSearch.getCommentCount());
list.add(returnSku);
});
map.put("list",list);
map.put("total",search.getTotalElements());
return map;
}
}