一、秒杀倒计时

1.1 跳转逻辑

在跳转到详情页面的时候,对比秒杀开始时间、结束时间与当前时间。在model中传入秒杀状态与倒计时时间。
在前端页面根据秒杀状态与倒计时的状态进行不同的显示。

/*** 跳转商品详情页* @author 47roro* @date 2022/4/15* @param goodsId* @return java.lang.String**/
@RequestMapping("/toDetail/{goodsId}")
public String toDetail(Model model, User user,@PathVariable Long goodsId){model.addAttribute("user", user);GoodsVo goodsVo = goodsService.findGoodsVoByGoodsId(goodsId);Date startDate = goodsVo.getStartDate();Date endDate = goodsVo.getEndDate();Date nowDate = new Date();int secKillStatus = 0;int remainSeconds = 0;if(nowDate.before(startDate)){remainSeconds = (int)((startDate.getTime() - nowDate.getTime()) / 1000);}else if(nowDate.after(endDate)){secKillStatus = 2;remainSeconds = -1;}else {secKillStatus = 1;}model.addAttribute("secKillStatus", secKillStatus);model.addAttribute("remainSeconds", remainSeconds);model.addAttribute("goods", goodsService.findGoodsVoByGoodsId(goodsId));return "goodsDetail";
}

1.2 测试

二、秒杀按钮

1.1 按钮事件

因为要进行事件的处理,做成form表单提交的方式。

<form id="secKillForm" method="post" action="/seckill/doSeckill"><input type="hidden" name="goodsId" th:value="${goods.id}"><button class="btn btn-primary btn-block" type="submit" id="buyButton">立即秒杀</button>
</form>

根据秒杀状态对按钮进行disabled处理。
结合倒计时进行设置:

 $(function () {countDown();});function countDown() {var remainSeconds = $("#remainSeconds").val();var timeout;//秒杀还未开始if (remainSeconds > 0) {$("#buyButton").attr("disabled", true);timeout = setTimeout(function () {$("#countDown").text(remainSeconds - 1);$("#remainSeconds").val(remainSeconds - 1);countDown();}, 1000);// 秒杀进行中} else if (remainSeconds == 0) {$("#buyButton").attr("disabled", false);if (timeout) {clearTimeout(timeout);}$("#seckillTip").html("秒杀进行中")} else {$("#buyButton").attr("disabled", true);$("#seckillTip").html("秒杀已经结束");}};

1.2 测试


三、秒杀功能实现

3.1 秒杀跳转页面

首先判断用户是否登录,未登录则跳转至登录页面login
然后获取秒杀商品信息。
判断库存是否充足以及是否重复抢购,若不足或者重复抢购,则抛出异常。
若没有异常,则创建新订单,并跳转至订单详情页面。

  /*** 秒杀* @author 47roro* @date 2022/4/16* @param model* @param user* @param goodsId* @return java.lang.String**/@RequestMapping("/doSecKill")public String doSecKill(Model model, User user, Long goodsId){if(user == null){return "login";}model.addAttribute("user", user);GoodsVo goods = goodsService.findGoodsVoByGoodsId(goodsId);//判断库存if(goods.getStockCount() < 1){model.addAttribute("errmsg", RespBeanEnum.EMPT_STOCK.getMessage());return "secKillFail";}//判断是否重复抢购(mybatis plus)SeckillOrder seckillOrder = seckillOrderService.getOne(new QueryWrapper<SeckillOrder>().eq("user_id", user.getId()).eq("goods_id", goodsId));if(seckillOrder != null){model.addAttribute("errmsg", RespBeanEnum.REPEAT_ERROR.getMessage());}Order order = orderService.seckill(user, goods);model.addAttribute("order", order);model.addAttribute("goods", goods);return "orderDetail";}

3.2 秒杀订单接口

public interface IOrderService extends IService<Order> {/*** 秒杀订单* @author 47roro* @date 2022/4/16* @param user* @param goods* @return com.example.seckill.pojo.Order**/Order seckill(User user, GoodsVo goods);
}

3.3 秒杀订单具体实现

减少库存,分别创建订单和秒杀订单。(暂时未考虑超卖问题)

/*** 秒杀订单具体实现* @author 47roro* @date 2022/4/16* @param user* @param goods* @return com.example.seckill.pojo.Order**/
@Override
public Order seckill(User user, GoodsVo goods) {//秒杀商品表减库存SeckillGoods seckillGoods = seckillGoodsService.getOne(new QueryWrapper<SeckillGoods>().eq("goods_id", goods.getId()));seckillGoods.setStockCount(seckillGoods.getStockCount() - 1);seckillGoodsService.updateById(seckillGoods);//生成订单Order order = new Order();order.setUserId(user.getId());order.setGoodsId(goods.getId());order.setDeliveryAddrId(0L);order.setGoodsName(goods.getGoodsName());order.setGoodsCount(1);order.setGoodsPrice(seckillGoods.getSeckillPrice());order.setOrderChannel(1);order.setStatus(0);order.setCreateDate(new Date());orderMapper.insert(order);//生成秒杀订单SeckillOrder seckillOrder = new SeckillOrder();seckillOrder.setOrderId(order.getId());seckillOrder.setUserId(user.getId());seckillOrder.setGoodsId(goods.getId());seckillOrderService.save(seckillOrder);return order;
}

3.4 订单详情页面(测试)

总结

目前只是做了简单的CRUD操作,后续会进行加锁、消息队列等优化。

【学习笔记】seckill-秒杀项目--(6)秒杀功能相关推荐

  1. JavaWeb黑马旅游网-学习笔记05【分类数据展示功能】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...

  2. JavaWeb黑马旅游网-学习笔记03【登陆和退出功能】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...

  3. Vue + Spring Boot 学习笔记01:实现用户登录功能

    Vue + Spring Boot 学习笔记01:实现用户登录功能 一.创建后端Spring Boot项目Book Management 二.创建前端Vue项目bm-vue 三.修改后端项目Book ...

  4. JavaWeb黑马旅游网-学习笔记10【项目代码】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...

  5. JavaWeb-综合案例(用户信息)-学习笔记06【复杂条件查询功能】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb-综合案例(用户信息)-学习笔记01[列表查询] JavaWeb-综合案例(用户信息)-学习笔记02[登录功能] JavaWeb-综合案 ...

  6. ROS 学习笔记(一):工作空间+功能包创建

    ROS 学习笔记(一):工作空间+功能包创建 一.创建工作空间(catkin_make编译): 1.创建工作空间 catkin_ws 创建空间.初始化(建立一个文件夹) cd ~ mkdir -p ~ ...

  7. Scrapy:学习笔记(2)——Scrapy项目

    Scrapy:学习笔记(2)--Scrapy项目 1.创建项目 创建一个Scrapy项目,并将其命名为"demo" scrapy startproject demo cd demo ...

  8. webpack入门学习笔记10 —— 在项目中使用图片资源

    1. 写在前面 在前端项目中,图片是必不可少的一种资源.在使用图片的时候,我们可以有以下几种方式: 在 .html 文件中,通过 <img src="" alt=" ...

  9. STM32学习笔记——MDK新建项目

    STM32学习笔记 KIEL新建项目过程 文章目录 STM32学习笔记 前言 一.keil新建库函数版本项目 二.注意事项 1.文件分类 2.MDK配置 总结 前言 此处使用寄存器版,进行学习.后期看 ...

  10. DSB2017项目grt123代码学习笔记一:项目基本情况

    DSB2017项目grt123代码学习笔记一:项目基本情况 Kaggle上Data Science Bowl 2017年肺结节检测比赛第一名grt123团队的算法. github地址:https:// ...

最新文章

  1. vue获取dom元素注意问题
  2. 一键cosplay各路动漫人物!快手的这个BlendGAN火了 | NeurIPS 2021
  3. goaccess_nginx日志分析工具
  4. Javascript之创建对象(原型模式)
  5. 【kafka】kafka消费者报错INVALID_FETCH_SESSION_EPOCH
  6. nginx server location
  7. HDU3746 Cyclic Nacklace KMP求循环节
  8. VS2017 远程调试linux(centos).net core
  9. MySQL-快速入门(15)MySQL Replication,主从复制
  10. 【语音分析】基于matlab GUI语音信号分析【含Matlab源码 1718期】
  11. 群的概念,双线性映射
  12. 成都市计算机会考,四川省高中信息技术会考资料及试题
  13. OSI七层网络模型和四层网络模型详解
  14. 南阳理工ACM 题目73 比大小
  15. 安全单点登录(SSO)解决方案
  16. AGM FPGA与CPLD烧录说明
  17. 央视3·15晚会起底直播乱象 直播平台佣金高达50%
  18. 输入一行字符,统计其中有多少个单词,单词间用空格分隔(C语言)
  19. 点击应用图标-应用(Activity)的启动流程
  20. flash中导入音乐出现“读取文件时出现问题,一个或多个文件没导入”该如何解决...

热门文章

  1. 项目管理的七个工作法则
  2. html js开发课程表,利用JS实现手机移动端课程表代码
  3. 苹果鼠标怎么充电_macbook pro搭配什么鼠标好?
  4. ORACLE 8023学习总结
  5. 冬奥探秘:那些隐匿在冬奥中的“绿科技”
  6. 洛谷p1069 细胞分裂(noip2009普及组第三题,素数判断+筛法)
  7. 关于vector在类中的声明用法
  8. centos 添加路由命令
  9. [业务流程图]与[数据流程图]的比较
  10. python中npy文件的读取与保存