waynboot商城发布啦,整合了Redis、RabbitMQ、ElasticSearch等常用中间件, 根据生产环境开发经验而来不断完善、优化、改进中

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. &#x514B;&#x9686;&#x9879;&#x76EE;
git clone git@github.com:wayn111/waynboot-mall.git

2. &#x5BFC;&#x5165;&#x9879;&#x76EE;&#x4F9D;&#x8D56;
&#x5C06;waynboot-mall&#x76EE;&#x5F55;&#x7528;idea&#x6253;&#x5F00;&#xFF0C;&#x5BFC;&#x5165;maven&#x4F9D;&#x8D56;

3. &#x5B89;&#x88C5;Mysql8.0+&#x3001;Redis3.0+&#x3001;RabbitMQ3.0+&#x3001;ElasticSearch7.0+&#x5230;&#x672C;&#x5730;

4. &#x5BFC;&#x5165;sql&#x6587;&#x4EF6;
&#x5728;&#x9879;&#x76EE;&#x6839;&#x76EE;&#x5F55;&#x4E0B;&#xFF0C;&#x627E;&#x5230;wayn_shop_*.sql&#x6587;&#x4EF6;&#xFF0C;&#x65B0;&#x5EFA;mysql&#x6570;&#x636E;&#x5E93;wayn_shop&#xFF0C;&#x5BFC;&#x5165;&#x5176;&#x4E2D;

5. &#x4FEE;&#x6539;Mysql&#x3001;Redis&#x3001;RabbitMQ&#x3001;Elasticsearch&#x8FDE;&#x63A5;&#x914D;&#x7F6E;
&#x4FEE;&#x6539;application-dev.yml&#x4EE5;&#x53CA;application.yml&#x6587;&#x4EF6;&#x4E2D;&#x6570;&#x636E;&#x8FDE;&#x63A5;&#x914D;&#x7F6E;&#x76F8;&#x5173;&#x4FE1;&#x606F;

6. &#x542F;&#x52A8;&#x9879;&#x76EE;
&#x540E;&#x53F0;api&#xFF1A;
    &#x8FDB;&#x5165;waynboot-admin-api&#x5B50;&#x9879;&#x76EE;&#xFF0C;&#x627E;&#x5230;AdminApplication&#x6587;&#x4EF6;&#xFF0C;&#x53F3;&#x952E;run AdminApplication&#xFF0C;&#x542F;&#x52A8;&#x540E;&#x53F0;&#x9879;&#x76EE;
h5&#x5546;&#x57CE;api:
    &#x8FDB;&#x5165;waynboot-mobile-api&#x5B50;&#x9879;&#x76EE;&#xFF0C;&#x627E;&#x5230;MobileApplication&#x6587;&#x4EF6;&#xFF0C;&#x53F3;&#x952E;run MobileApplication&#xFF0C;&#x542F;&#x52A8;h5&#x5546;&#x57CE;&#x9879;&#x76EE;

在线体验

  • 注册一个账号
  • 然后登陆

演示图

商城登陆

商城注册

商城首页

商城搜索

搜索结果展示

金刚位跳转

商品分类

商品详情

商品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/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • VM虚拟机使用主机shadowsocks代理上网

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年5月30日
    073
  • Mybatis基本流程及配置文件解析

    Mybatis基本流程 1、利用Resources工具类加载配置文件,并转换成输入输出流 2、利用解析的配置,创建SqlSessionFactory工厂 3、生产SqlSessio…

    Java 2023年6月5日
    074
  • C# 线程手册 第七章 网络和线程

    在本书的之前章节,我们已经深入地了解了C#.NET 中的线程并探讨了多线程编程中的不同概念和技术。现在你已经是一个线程专家啦,我们将要使用C#实现一个简单的多线程客户端-服务端程序…

    Java 2023年5月29日
    0139
  • 统计项目的java代码总行数

    http://www.oschina.net/code/snippet_209431_7358 wc -l $( find . – type f -name ‘*.java’ ) …

    Java 2023年5月29日
    059
  • Java正则表达式使用 | 叠加

    public class Test { public static void main(String[] args) { String s = "ni\nhao\nma …

    Java 2023年5月29日
    067
  • 分布式系统中数据存储方案实践

    数据膨胀的时候,必然放大细节。 一、背景简介 在项目研发的过程中,对于数据存储能力的依赖无处不在,项目初期,相比系统层面的组件选型与框架设计,由于数据体量不大,在存储管理方面通常容…

    Java 2023年6月15日
    071
  • 用antlr的grammar获得java ast

    anttlr的代码样例:https://github.com/antlr/grammars-v4.git 很早之前就想基于java的语法树做一些事情,今天再次弄来看看。 基于ant…

    Java 2023年5月29日
    078
  • MQTT研究之EMQ:【EMQX使用中的一些问题记录(4)】

    最近比较忙,有些关于EMQ的使用问题,没有时间记录了,趁这个周末抽点时间,将最近遇到的,觉得比较有价值的一个问题,分享给大家吧。 这里是针对前面的一篇博客,做的一个深入研究,关于订…

    Java 2023年5月30日
    0241
  • 干货分享:ASP.NET CORE(C#)与Spring Boot MVC(JAVA)异曲同工的编程方式总结

    本文目的是通过全面简述C# 与JAVA 在基础语法以及ASP.NET CORE 与 Spring Boot MVC的在框架规范、部署、运行的异曲同工的实现方式,让大家更多的了解C#…

    Java 2023年5月29日
    0167
  • Dism++

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月7日
    062
  • ThreadLocal 线程变量副本

    强引用:常常 new 出来的对象就是强引用类型,只要强引用存在,垃圾回收器将永远不会回收被引用的对象,哪怕内存不足的时候 软引用:使用 SoftReference 修饰的对象被称为…

    Java 2023年6月5日
    077
  • nacos、ribbon和feign的简明教程

    nacos简明教程 为什么需要nacos? 在微服务架构中,微服务之间经常要相互通信和调用,而且一个服务往往存在多个实例来降低负荷或保证高可用。我们假定A服务要调用B服务,最简单的…

    Java 2023年6月7日
    073
  • JAVA设计模式-工厂模式

    JAVA设计模式-工厂模式 简单工厂模式 介绍 简单工厂模式就是定义一个工厂类,工厂类提供获取实例的方法,方法会根据传入的参数不同来返回不同的实例。不同的实例基本都有共同的父类。对…

    Java 2023年6月15日
    071
  • 小程序接口申请和隐私文档

    谨以此文,记录我被微信开发工具折磨的这段日子 本指引是HexPal小程序开发者 (以下简称”开发者”)为处理你的个人信息而制定。 开发者处理的信息 根据法律…

    Java 2023年6月7日
    071
  • 10分钟搞定让你困惑的 Jenkins 环境变量

    前言 Jenkins, DevOps 技术栈的核心之一,CI/CD 离不开编写 Pipeline 脚本,上手 Jenkins ,简单查一下文档,你就应该不会被 agent,stag…

    Java 2023年6月5日
    062
  • 单机高并发模型设计

    背景 在微服务架构下,我们习惯使用多机器、分布式存储、缓存去支持一个高并发的请求模型,而忽略了单机高并发模型是如何工作的。这篇文章通过解构客户端与服务端的建立连接和数据传输过程,阐…

    Java 2023年6月8日
    085
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球