【学习笔记】seckill-秒杀项目--(6)秒杀功能
一、秒杀倒计时
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)秒杀功能相关推荐
- JavaWeb黑马旅游网-学习笔记05【分类数据展示功能】
Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...
- JavaWeb黑马旅游网-学习笔记03【登陆和退出功能】
Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...
- Vue + Spring Boot 学习笔记01:实现用户登录功能
Vue + Spring Boot 学习笔记01:实现用户登录功能 一.创建后端Spring Boot项目Book Management 二.创建前端Vue项目bm-vue 三.修改后端项目Book ...
- JavaWeb黑马旅游网-学习笔记10【项目代码】
Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...
- JavaWeb-综合案例(用户信息)-学习笔记06【复杂条件查询功能】
Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb-综合案例(用户信息)-学习笔记01[列表查询] JavaWeb-综合案例(用户信息)-学习笔记02[登录功能] JavaWeb-综合案 ...
- ROS 学习笔记(一):工作空间+功能包创建
ROS 学习笔记(一):工作空间+功能包创建 一.创建工作空间(catkin_make编译): 1.创建工作空间 catkin_ws 创建空间.初始化(建立一个文件夹) cd ~ mkdir -p ~ ...
- Scrapy:学习笔记(2)——Scrapy项目
Scrapy:学习笔记(2)--Scrapy项目 1.创建项目 创建一个Scrapy项目,并将其命名为"demo" scrapy startproject demo cd demo ...
- webpack入门学习笔记10 —— 在项目中使用图片资源
1. 写在前面 在前端项目中,图片是必不可少的一种资源.在使用图片的时候,我们可以有以下几种方式: 在 .html 文件中,通过 <img src="" alt=" ...
- STM32学习笔记——MDK新建项目
STM32学习笔记 KIEL新建项目过程 文章目录 STM32学习笔记 前言 一.keil新建库函数版本项目 二.注意事项 1.文件分类 2.MDK配置 总结 前言 此处使用寄存器版,进行学习.后期看 ...
- DSB2017项目grt123代码学习笔记一:项目基本情况
DSB2017项目grt123代码学习笔记一:项目基本情况 Kaggle上Data Science Bowl 2017年肺结节检测比赛第一名grt123团队的算法. github地址:https:// ...
最新文章
- vue获取dom元素注意问题
- 一键cosplay各路动漫人物!快手的这个BlendGAN火了 | NeurIPS 2021
- goaccess_nginx日志分析工具
- Javascript之创建对象(原型模式)
- 【kafka】kafka消费者报错INVALID_FETCH_SESSION_EPOCH
- nginx server location
- HDU3746 Cyclic Nacklace KMP求循环节
- VS2017 远程调试linux(centos).net core
- MySQL-快速入门(15)MySQL Replication,主从复制
- 【语音分析】基于matlab GUI语音信号分析【含Matlab源码 1718期】
- 群的概念,双线性映射
- 成都市计算机会考,四川省高中信息技术会考资料及试题
- OSI七层网络模型和四层网络模型详解
- 南阳理工ACM 题目73 比大小
- 安全单点登录(SSO)解决方案
- AGM FPGA与CPLD烧录说明
- 央视3·15晚会起底直播乱象 直播平台佣金高达50%
- 输入一行字符,统计其中有多少个单词,单词间用空格分隔(C语言)
- 点击应用图标-应用(Activity)的启动流程
- flash中导入音乐出现“读取文件时出现问题,一个或多个文件没导入”该如何解决...