You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
wayn111 d2e422b48b
Update readme.md
4 years ago
waynboot-admin-api refactor(商城): 代码优化 4 years ago
waynboot-common refactor(商城): 代码优化 4 years ago
waynboot-data perf(商城): 代码优化 4 years ago
waynboot-generator 代码优化 4 years ago
waynboot-message-consumer feat(移动端): 修改配置文件 4 years ago
waynboot-message-core refactor(商城): 代码优化 4 years ago
waynboot-mobile-api refactor(商城): 代码优化 4 years ago
.gitignore feat(商城): 首页 4 years ago
pom.xml feat(移动端): 修改配置文件 4 years ago
readme.md Update readme.md 4 years ago
todo.md feat(移动端): todo事项 4 years ago
wayn_shop_2021年1月13日.sql perf(商城): 下单 4 years ago

readme.md

waynboot-mall项目

waynboot-mall是一套全部开源的微商城项目包含一个运营后台、h5商城和后台接口。 实现了一个商城所需的首页展示、商品分类、商品详情、sku详情、商品搜索、加入购物车、结算下单、订单状态流转、商品评论等一系列功能。 技术上基于Springboot2.0整合了Redis、RabbitMQ、ElasticSearch等常用中间件 贴近生产环境实际经验开发而来不断完善、优化、改进中。

后台接口项目
运营后台项目
h5商城项目

waynboot-mall接口项目

  1. 商城接口代码清晰、注释完善、模块拆分合理
  2. 使用Spring-Security进行访问权限控制
  3. 使用jwt进行接口授权验证
  4. ORM层使用Mybatis Plus提升开发效率
  5. 添加全局异常处理器,统一异常处理
  6. 添加https配置代码支持https访问
  7. 集成七牛云存储配置,上传文件至七牛
  8. 集成常用邮箱配置,方便发送邮件
  9. 集成druid连接池进行sql监控
  10. 集成swagger管理接口文档
  11. 添加策略模式使用示例,优化首页金刚区跳转逻辑
  12. 拆分出通用的数据访问模块统一redis & elastic配置与访问
  13. 使用elasticsearch-rest-high-level-client客户端对elasticsearch进行操作
  14. 支持商品数据同步elasticsearch操作以及elasticsearch商品搜索
  15. RabbitMQ生产者发送消息采用异步confirm模式消费者消费消息时需手动确认
  16. ...

商城难点整理

1. 下单流程库存扣减操作是在下单操作扣减还是在支付成功时扣减ps扣减库存使用乐观锁机制 where goods_num - num >= 0

  1. 下单时扣减,这个方案属于实时扣减,当有大量下单请求时,由于订单数小于请求数,会发生下单失败,但是无法防止短时间大量恶意请求占用库存, 造成普通用户无法下单
  2. 支付成功扣减,这个方案可以预防恶意请求占用库存,但是会存在多个请求同时下单后,在支付回调中扣减库存失败,导致订单还是下单失败并且还要退还订单金额(这种请求就是订单数超过了库存数,无法发货,影响用户体验)
  3. 还是下单时扣减但是对于未支付订单设置一个超时过期机制比如下单时库存减一生成订单后对于未在15分钟内完成支付的订单 自动取消超期未支付订单并将库存加一,该方案基本满足了大部分使用场景
  4. 针对大流量下单场景比如一分钟内五十万次下单请求可以通过设置虚拟库存的方式减少下单接口对数据库的访问。具体来说就是把商品实际库存保存到redis中 下单时配合lua脚本原子的get和decr商品库存数量这一步就拦截了大部分请求执行成功后在扣减实际库存

2. 首页商品展示接口利用多线程技术进行查询优化将多个sql语句的排队查询变成异步查询接口时长只跟查询时长最大的sql查询挂钩

# 1. 通过创建子线程继承Callable接口
Callable<List<Banner>> bannerCall = () -> iBannerService.list(new QueryWrapper<Banner>().eq("status", 0).orderByAsc("sort"));
# 2. 传入Callable的任务给FutureTask
FutureTask<List<Banner>> bannerTask = new FutureTask<>(bannerCall);
# 3. 放入线程池执行
threadPoolTaskExecutor.submit(bannerTask);
# 4. 最后可以在外部通过FutureTaskget方法异步获取执行结果 
List<Banner> list = bannerTask.get()
  • 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商城项目

在线体验

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

演示地址:http://www.wayn.ltd

演示图

商城登陆 商城注册
商城首页 商城搜索
搜索结果展示 金刚位跳转
商品分类 商品详情
商品sku选择 购物车查看
确认下单 选择支付方式
商城我的页面 我的订单列表
添加商品评论 查看商品评论
后台登陆 后台首页
后台会员管理 后台评论管理
后台地址管理 后台添加商品
后台商品管理 后台banner管理
后台订单管理 后台分类管理
后台金刚区管理 后台栏目管理

waynboot-mall交流群

QQ群waynboot-mall交流群 有问题可以先提issue😁

todo

  • 支持多店铺
  • 订单详情页面
  • 秒杀专区
  • 优惠卷使用
  • 团购下单
  • ...

感谢