waynboot-mall项目
觉得有用的铁子们给个star就行了,求求你们啦😘😍
waynboot-mall是一套全部开源的微商城项目,包含一个运营后台、h5商城和后台接口。
实现了一个商城所需的首页展示、商品分类、商品详情、sku详情、商品搜索、加入购物车、结算下单、订单状态流转、商品评论等一系列功能。
技术上基于Springboot2.0,整合了Redis、RabbitMQ、ElasticSearch等常用中间件,
贴近生产环境实际经验开发而来不断完善、优化、改进中。
waynboot-mall接口项目
商城难点整理
1. 通过创建子线程继承Callable接口
Callable> bannerCall = () -> iBannerService.list(new QueryWrapper().eq("status", 0).orderByAsc("sort"));
2. 传入Callable的任务给FutureTask
FutureTask> bannerTask = new FutureTask<>(bannerCall);
3. 放入线程池执行
threadPoolTaskExecutor.submit(bannerTask);
4. 最后可以在外部通过FutureTask的get方法异步获取执行结果
List list = bannerTask.get()
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
MatchQueryBuilder matchFiler = QueryBuilders.matchQuery("isOnSale", true);
MatchQueryBuilder matchQuery = QueryBuilders.matchQuery("name", keyword);
MatchPhraseQueryBuilder matchPhraseQueryBuilder = QueryBuilders.matchPhraseQuery("keyword", keyword);
boolQueryBuilder.filter(matchFiler).should(matchQuery).should(matchPhraseQueryBuilder).minimumShouldMatch(1);
searchSourceBuilder.timeout(new TimeValue(10, TimeUnit.SECONDS));
// 按是否新品排序
if (isNew) {
searchSourceBuilder.sort(new FieldSortBuilder("isNew").order(SortOrder.DESC));
}
// 按是否热品排序
if (isHot) {
searchSourceBuilder.sort(new FieldSortBuilder("isHot").order(SortOrder.DESC));
}
// 按价格高低排序
if (isPrice) {
searchSourceBuilder.sort(new FieldSortBuilder("retailPrice").order("asc".equals(orderBy) ? SortOrder.ASC : SortOrder.DESC));
}
// 按销量排序
if (isSales) {
searchSourceBuilder.sort(new FieldSortBuilder("sales").order(SortOrder.DESC));
}
// 筛选新品
if (filterNew) {
MatchQueryBuilder filterQuery = QueryBuilders.matchQuery("isNew", true);
boolQueryBuilder.filter(filterQuery);
}
// 筛选热品
if (filterHot) {
MatchQueryBuilder filterQuery = QueryBuilders.matchQuery("isHot", true);
boolQueryBuilder.filter(filterQuery);
}
searchSourceBuilder.query(boolQueryBuilder);
searchSourceBuilder.from((int) (page.getCurrent() - 1) * (int) page.getSize());
searchSourceBuilder.size((int) page.getSize());
List list = elasticDocument.search("goods", searchSourceBuilder, JSONObject.class);
1. 定义金刚位跳转策略接口
public interface DiamondJumpType {
List getGoods(Page page, Diamond diamond);
Integer getType();
}
2. 定义策略实现类,并使用@Component注解注入spring
@Component
public class CategoryStrategy implements DiamondJumpType {
@Autowired
private GoodsMapper goodsMapper;
@Override
public List getGoods(Page page, Diamond diamond) {
List cateList = Arrays.asList(diamond.getValueId());
return goodsMapper.selectGoodsListPageByl2CateId(page, cateList).getRecords();
}
@Override
public Integer getType() {
return JumpTypeEnum.CATEGORY.getType();
}
}
@Component
public class ColumnStrategy implements DiamondJumpType {
@Autowired
private IColumnGoodsRelationService iColumnGoodsRelationService;
@Autowired
private IGoodsService iGoodsService;
@Override
public List getGoods(Page page, Diamond diamond) {
List goodsRelationList = iColumnGoodsRelationService.list(new QueryWrapper()
.eq("column_id", diamond.getValueId()));
List goodsIdList = goodsRelationList.stream().map(ColumnGoodsRelation::getGoodsId).collect(Collectors.toList());
Page goodsPage = iGoodsService.page(page, new QueryWrapper().in("id", goodsIdList).eq("is_on_sale", true));
return goodsPage.getRecords();
}
@Override
public Integer getType() {
return JumpTypeEnum.COLUMN.getType();
}
}
3. 定义策略上下文,通过构造器注入spring,定义map属性,通过key获取对应策略实现类
@Component
public class DiamondJumpContext {
private Map map = new HashMap<>();
/**
* 由spring自动注入DiamondJumpType子类
*
* @param diamondJumpTypes 金刚位跳转类型集合
*/
public DiamondJumpContext(List diamondJumpTypes) {
for (DiamondJumpType diamondJumpType : diamondJumpTypes) {
map.put(diamondJumpType.getType(), diamondJumpType);
}
}
public DiamondJumpType getInstance(Integer jumpType) {
return map.get(jumpType);
}
}
4.使用
@Autowired
private DiamondJumpContext diamondJumpContext;
@Test
public void test(){
DiamondJumpType diamondJumpType = diamondJumpContext.getInstance(1);
}
- todo
文件目录
|-- waynboot-admin-api // 运营后台api模块,提供后台项目api接口
|-- waynboot-common // 通用模块,包含项目核心基础类
|-- waynboot-data // 数据模块,通用中间件数据访问
| |-- waynboot-data-redis // redis访问配置模块
| |-- waynboot-data-elastic // elastic访问配置模块
|-- waynboot-generator // 代码生成模块
|-- waynboot-message-consumer // 消费者模块,处理订单消息和邮件消息
|-- waynboot-message-core // 消费者核心模块,队列、交换机配置
|-- waynboot-mobile-api // h5商城api模块,提供h5商城api接口
|-- pom.xml // maven父项目依赖,定义子项目依赖版本
|-- ...
开发部署
1. 克隆项目
git clone git@github.com:wayn111/waynboot-mall.git
2. 导入项目依赖
将waynboot-mall目录用idea打开,导入maven依赖
3. 安装Mysql8.0+、Redis3.0+、RabbitMQ3.0+、ElasticSearch7.0+到本地
4. 导入sql文件
在项目根目录下,找到wayn_shop_*.sql
文件,新建mysql数据库wayn_shop,导入其中
5. 修改Mysql、Redis、RabbitMQ、Elasticsearch连接配置
修改application-dev.yml
以及application.yml
文件中数据连接配置相关信息
6. 启动项目
后台api:
进入waynboot-admin-api子项目,找到AdminApplication文件,右键run AdminApplication
,启动后台项目
h5商城api:
进入waynboot-mobile-api子项目,找到MobileApplication文件,右键run MobileApplication
,启动h5商城项目
在线体验
- 注册一个账号
- 然后登陆
演示图
商城登陆
商城注册
商城首页
商城搜索
搜索结果展示
金刚位跳转
商品分类
商品详情
商品sku选择
购物车查看
确认下单
选择支付方式
商城我的页面
我的订单列表
添加商品评论
查看商品评论
后台登陆
后台首页
后台会员管理
后台评论管理
后台地址管理
后台添加商品
后台商品管理
后台banner管理
后台订单管理
后台分类管理
后台金刚区管理
后台栏目管理
waynboot-mall交流群
QQ群:
有问题可以先提issue😁
todo
- 支持多店铺
- 订单详情页面
- 秒杀专区
- 优惠卷使用
- 团购下单
- …
Original: https://www.cnblogs.com/wayn111/p/14771589.html
Author: wayn111
Title: waynboot商城发布啦,整合了Redis、RabbitMQ、ElasticSearch等常用中间件, 根据生产环境开发经验而来不断完善、优化、改进中
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/610245/
转载文章受原作者版权保护。转载请注明原作者出处!