SpringBoot秒杀系统实战13-秒杀商品详情页+秒杀倒计时功能实现

2023-11-13


程序鹏

于 2020-05-08 00:00:00 发布

1326
 收藏 4
分类专栏: Spring Boot 秒杀系统 文章标签: java spring boot web
版权

Spring Boot
同时被 2 个专栏收录
29 篇文章1 订阅
订阅专栏

秒杀系统
26 篇文章8 订阅
订阅专栏
文章目录
秒杀倒计时:
1、在GoodsController里面创建toDetail方法,接收详情页面的请求
2、 前端页面处理逻辑
3、goods_detail.html完整代码:
怎么注入MiaoshaUser的实例参数
在上一节中,我们已经实现秒杀商品的列表页的显示,其中可以点击每一个商品的【详情】查看具体的秒杀信息,那么我们这一节就来实现商品的详情页面的显示以及秒杀倒计时功能实现。【详情】链接中有{goodsId}作为参数,后端@PathVariable(“goodsId”)long goodsId拿到这个goodsId,然后去数据库查询对应的商品信息,并显示秒杀情况。


我们点击商品详情,发送一个连接到后端,那么我们要先设计出一个接收’/goods/to_detail/’+${undefinedgoods.id}该请求的接口。

秒杀倒计时:
后端根据商品的Id去数据库中获取秒杀开始时间和结束时间,以及系统当前时间,并定义秒杀剩余时间变量和秒杀状态,计算出相应的值,传给前端,前端拿到之后,做相对应的显示逻辑效果。

1、在GoodsController里面创建toDetail方法,接收详情页面的请求

    /**
     * 未作页面缓存
     * @param model
     * @param user
     * @param goodsId
     * @return
     */
    @RequestMapping("/to_detail/{goodsId}")
    public String toDetail(Model model,MiaoshaUser user,@PathVariable("goodsId")long goodsId) {//id一般用snowflake算法
        model.addAttribute("user", user);
        GoodsVo goods=goodsService.getGoodsVoByGoodsId(goodsId);
        model.addAttribute("goods", goods);
        //既然是秒杀,还要传入秒杀开始时间,结束时间等信息
        long start=goods.getStartDate().getTime();
        long end=goods.getEndDate().getTime();
        long now=System.currentTimeMillis();
        //秒杀状态量
        int status=0;
        //开始时间倒计时
        int remailSeconds=0;
        //查看当前秒杀状态
        if(now<start) {//秒杀还未开始,--->倒计时
            status=0;
            remailSeconds=(int) ((start-now)/1000);  //毫秒转为秒
        }else if(now>end){ //秒杀已经结束
            status=2;
            remailSeconds=-1;  //毫秒转为秒
        }else {//秒杀正在进行
            status=1;
            remailSeconds=0;  //毫秒转为秒
        }
        model.addAttribute("status", status);
        model.addAttribute("remailSeconds", remailSeconds);
        return "goods_detail";//返回页面login
    }
注意:获取了商品的秒杀开始时间和结束时间,如果秒杀没有开始,那么计算一个还剩多少时间,开始,并且定义一个状态status来表示一个秒杀的状态,0代表秒杀还未开,1代表秒杀正在进行,2代表秒杀已经结束,秒杀还未开始的情况还要计算出倒计时,(int) ((start-now)/1000),然后将status和remailSeconds传到前端去。

2、 前端页面处理逻辑 

前端需要获取status和remailSeconds(即秒杀状态和剩余时间变量),定义个一个属性为隐藏的input来接收remainSecode ,并且定义标签来判断status的状态,通过这个值来显示是否开始秒杀,秒杀正在进行中,以及秒杀结束。

这里需要做特别处理的地方是需要自己写一个方法来控制秒杀按钮的的可以点击与不可点击的情况,没开始的时候按钮,不可点击,开始后显示按钮,此时可以点击,但是结束也不可点击。并且从倒计时状态到正在进行秒杀状态的时候要动态切换文案


注意:这里使用setTimeout函数,setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式。

这里是1000毫秒,即每过一秒,将remianSecond 值减一,并设置到显示text中(即实现倒计时动态效果),然后在调用coutDown,判断此时是否结束此状态(remailSeconds==0),结束调用。

3、goods_detail.html完整代码:

<!DOCTYPE html>
<!-- 使用thymeleaf,配置相应的 -->
<html xmlns:th="http://www.thymeleaf.org">  <!-- th!!! 命名空间使用 -->
<head>
<meta charset="UTF-8"/><!--<meta charset="UTF-8" />  thymeleaf模板引擎默认是Template modes:HTML5解析的,所以解析比较严格。  -->
<title>商品列表</title>
    <!-- thymeleaf引入静态资源的方式,@加大括弧    "/" 代表static路径-->
    <!-- jquery -->
    <!-- <script type="text/javascript" th:src="@{/js/jequery.min.js}"></script> -->
    <script type="text/javascript" th:src="@{/jquery-validation/lib/jquery-1.11.1.js}"></script>
    <!-- bootstrap -->
    <!-- <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css" integrity="sha384-9gVQ4dYFwwWSjIDZnLEWnxCjeSWFphJiwGPXr1jddIhOegiu1FwO5qRGvFXOdJZ4" crossorigin="anonymous"/>
     -->
    <link type="text/css" rel="stylesheet" th:href="@{/bootstrap/css/bootstrap.css}"/>
    <script type="text/javascript" th:src="@{/bootstrap/js/bootstrap.min.js}"></script>
</head>
<body>
    <div class="panel panel-default">
        <div class="panel-heading">秒杀商品详情</div>
        <div class="panel-body"> 
            <span th:if="${user eq null}">您还没有登录,请登录后再操作</span>
            <span>没有收货地址的提示。。。</span>
        </div>
        <table class="table" id="goodslist">
        <tr>
            <td>商品名称</td>
            <td colspan="3" th:text="${goods.goodsName}"></td>
        </tr>
        <tr>
            <td>商品图片</td>
            <td colspan="3"><img th:src="@{${goods.goodsImg}}" width="80" height="60"></img></td>
        </tr>
        <tr>
            <td>秒杀开始时间</td>
            <td th:text="${#dates.format(goods.startDate,'yyyy-MM-dd HH:mm:ss')}"></td>
            <td id="miaoshaTip">
                <!-- 先取得这个时间 -->
                <input type="hidden" id="remailSeconds" th:value="${remailSeconds}"></input>
            
                <span th:if="${status eq 0}">秒杀还未开始,倒计时:<span id="countDown" th:text="${remailSeconds}"></span>秒</span> 
                <span th:if="${status eq 1}">秒杀正在进行</span> 
                <span th:if="${status eq 2}">秒杀已经结束</span> 
            </td>
            <td>
                <form id="miaoshaForm" method="post" action="/miaosha/do_miaosha">
                    <button class="btn btn-primary btn-block" type="submit" id="buyButton">立即秒杀</button>
                    <input type="hidden" name="goodsId" th:value="${goods.id}"></input>
                </form>
            </td>
        </tr>
        <tr>
            <td>商品原价</td>
            <td colspan="3" th:text="${goods.goodsPrice}"></td>
        </tr>
        <tr>
            <td>秒杀价</td>
            <td colspan="3" th:text="${goods.miaoshaPrice}"></td>
        </tr>
        <tr>
            <td>库存数量</td>
            <td colspan="3" th:text="${goods.stockCount}"></td>
        </tr>
        
        </table>
    </div>    
</body>
<script type="text/javascript">
    $(function(){
        countDown();
    });
    function countDown(){
        //获取秒杀倒计时进行判断,0-->正在进行秒杀,-1-->秒杀结束,remailSeconds>0-->代表倒计时
        var remailSeconds=$("#remailSeconds").val();
        //alert("remailSeconds:"+remailSeconds);
        var timeout;        
        if(remailSeconds>0){//秒杀还没有开始,进行倒计时功能
            $("#buyButton").attr("disabled",true);
            //倒计时
            timeout=setTimeout(function(){
                $("#countDown").text(remailSeconds-1);
                $("#remailSeconds").val(remailSeconds-1);//remailSeconds这是input
                countDown();
            },1000);//一秒钟之后回调函数            
        }else if(remailSeconds==0){//正在进行秒杀
            $("#buyButton").attr("disabled",false);
            if(timeout){//如果timeout有值的情况
                clearTimeout(timeout);
            }
            //将文案修改 df1fab4272a24cdf9432adb9fd69cb38
            $("#miaoshaTip").html("秒杀进行中");
        }else{
            //小于0的情况,秒杀结束,将秒杀按钮设置为不可点击
            $("#buyButton").attr("disabled",true);
            $("#miaoshaTip").html("秒杀结束");
        }
    }
</script>
</html>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot秒杀系统实战13-秒杀商品详情页+秒杀倒计时功能实现 的相关文章

  • 指纹奇异点检测

    我正在尝试确定指纹的核心点和增量点 我正在使用庞加莱指数方法 但我无法成功检测到这一点 而且我不明白为什么 First I divide the image in 15x15 blocks then I calculate the x an
  • H264 字节流到图像文件

    第一次来这里所以要温柔 我已经在给定的 H 264 字节流上工作了几个星期 一般注意事项 字节流不是来自文件 它是从外部源实时提供给我的 字节流使用 Android 的媒体编解码器进行编码 当将流写入扩展名为 H264的文件时 VLC能够正
  • 在哈希图中存储字符和二进制数

    我正在尝试存储字母到二进制数的映射 这是我的映射 h 001 i 010 k 011 l 100 r 101 s 110 t 111 为此 我创建了一个哈希映射并存储了键值对 我现在想显示给定句子的相应二进制值 这是我的代码 package
  • JBoss AS 5 中的共享库应该放在哪里?

    我是 Jboss 新手 但我有多个 Web 应用程序 每个应用程序都使用 spring hibernate 和其他开源库和 portlet 所以基本上现在每个 war 文件都包含这些 jar 文件 如何将这些 jar 移动到一个公共位置 以
  • java中队列的实现

    在 Java 中实现队列是一个非常常见的面试问题 我在网上冲浪 看到了许多实现 他们做了一些奇特的事情 比如实现队列接口和编写自己的addLast and removeFirst 方法 我的问题是我不能使用LinkedList 类并使用其预
  • 如果按下 Esc 则中断循环

    我用 JAVA 语言编写了一个程序 它使用 Scanner 类接受来自控制台的输入 现在我想将此功能添加到我的代码中 以便在用户按下 Esc 按钮时存在循环 while 到目前为止 我认为键盘类可以帮助我 但它就像扫描仪一样 我尝试使用事件
  • JAX-WS:有状态 WS 在独立进程中失败

    我在 Tomcat 上部署了一个有状态的 Web 服务 它由工厂服务和主要 API 服务组成 并且工作得很好 工厂服务将 W3CEndpointReference 返回到主 API 实例 客户端使用会话 现在 我尝试将相同的服务作为独立应用
  • 为什么一个线程会中断另一个线程[重复]

    这个问题在这里已经有答案了 在Java多线程应用程序中 我们处理InterruptedThreadException 如果另一个线程中断当前线程 则会抛出此异常 现在 当另一个线程知道它将导致异常时 它可能想要中断当前线程的原因是什么 很多
  • BigDecimal 的 JPA @Size 注释

    我该如何使用 SizeMySQL 的注释DECIMAL x y 列 我在用着BigDecimal 但是当我尝试包括 Size max它不起作用 这是我的代码 Size max 7 2 Column name weight private B
  • 此版本不符合 Google Play 64 位要求,添加库后仍然出现错误

    我正在 Play 商店上传一个视频编辑器应用程序 其中包含带有一些本机代码的库 所以我通过将其添加到 gradle 来使其兼容 64 位 ndk abiFilters armeabi v7a arm64 v8a x86 x86 64 添加了
  • 带有面板的 Java Swing JToolbar:外观和感觉

    我有一个JToolbar其中包含多个JPanels 需要 因为我希望每个都有特定的边界 不幸的是 外观管理器无法识别JPanels属于工具栏和JButtons因此 渲染器与普通按钮一样 即没有工具栏上的特殊鼠标悬停效果 更换JPanels
  • 如何在Gradle中支持多种语言(Java和Scala)的多个项目?

    我正在尝试将过时的 Ant 构建转换为 Gradle 该项目包含约50个Java子项目和10个Scala子项目 Java 项目仅包含 Java Scala 项目仅包含 Scala 每个项目都是由 Java 和 Scala 构建的 这大大减慢
  • 中间件 API 的最佳实践是什么? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我们正在开发一个中间件 SDK 采用 C 和 Java 语言 供游戏开发人员 动画软件开发人员 阿凡达开
  • Java 中 static 关键字如何工作?

    我正在阅读Java教程 http docs oracle com javase tutorial index html从一开始我就有一个问题static字段或变量上的关键字 作为Java said here http docs oracle
  • 更改 RowLayout SWT Java 中元素的顺序

    有没有办法更改在行布局中创建的元素的顺序 我想将其显示在元素中 首先显示 例如 如果我创建 element1 则 element2 element3 element4 我想看到的布局为 元素4 元素3 元素2 元素1 这意味着最后创建的元素
  • Java 8根据Map属性过滤Map对象列表以删除一些重复项

    Have a List
  • 如何以编程方式创建 Spring 上下文?

    有谁知道是否有任何方法可以以编程方式创建 bean 上下文 我希望能够做类似的事情 ConfigurableApplicationContext c new ConfigurableApplicationContext BeanDefini
  • 当我在 Java 中输入 IP 时无法连接到我的服务器

    好的 我正在尝试学习 Java 客户端 服务器的内容 并且正在浏览教程代码 如下所示 当我将 localhost 更改为我的 IP 时 它会停止工作 请帮忙 编辑 127 0 0 1 似乎也可以工作 但不是我的真实IP Copyright
  • Java:基于 Web 的应用程序中的单例类实例

    我在 Web Application 中有这个 Singleton 类 public class MyDAO private static MyDAO instance private MyDAO public static MyDAO g
  • 使用 Spring Boot 的 Flyway Core 给出错误 'delayedFlywayInitializer' 和 'entityManagerFactory' 之间的循环依赖关系

    我想在 SQL Server 数据库上导入一些数据 我使用的是 Spring Boot 2 3 4 我还使用 Hibernate 来生成表 我在pom中添加了flyway核心

随机推荐

  • docker从入门到实践

    本文的主要目的是帮助零基础的读者快速上手docker 并掌握一些相关的常见命令 同时 本文也是作者对学习docker的一个笔记记录 本文主要是从实例出发 讲解一些docker的基本操作 若有不妥或错误之处 烦请指出 不胜感激 PS 关于do
  • [机器学习与scikit-learn-27]:算法-回归-多元线性回归的几何原理、线性代数原理、本质(去掉激活函数的神经元)

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 123540305 目录 第1章 回归概
  • 虚拟显示器

    这个虚拟显示器只有驱动程序 没有直接双击就能安装的安装包 所以安装起来相对麻烦一点 不过这也是我找到的唯一的 免费 纯软件实现的方案了 原文链接 英文 https www amyuni com forum viewtopic php t 3
  • STM32最小系统|CSDN创作打卡

    文章目录 STM32最小系统的构成 晶振电路 复位电路 电源电路 下载电路 STM32最小系统的构成 晶振电路 晶振在起振的一瞬间会产生电感 为了消除这些电感干扰 会 在晶振的两端接入无极性电容 10 33pf 这里不推荐使用内部时钟源 R
  • idea不显示 target文件夹的解决方式

    第一种 比较简单的解决方式 但是可能适用面比较小 解决方式如下所示 第二种 稍微麻烦一点 如下图所示 点击 file gt 搜索框内输入 File Types 进入到图中所示的界面 把里面的 target删除掉就可以了 重启一下idea 如
  • 从0开始的leetCode: Add Two Number

    我的解法是 class Solution public ListNode addTwoNumbers ListNode l1 ListNode l2 int i 0 ListNode pre l1 while l1 null l1 val
  • DEBUG

    UnicodeDecodeError utf 8 codec can t decode byte 0x80 in position 3131 invalid start byte解决办法 阿里drl binpacking使用TensorFl
  • paddlenlp调用ERNIE、使用ERNIEKIT

    目录 paddle调用ERNIE 安装paddle和paddlenlp 下载 加载ERNIE预训练模型 tokenizer 获取文本语义特征向量表示 ERNIEKIT实践 安装 配置nltk 下载ERNIEKIT源码 运行ERNIEKIT
  • C#的基础语法---15种基本数据类型

    1 c 的基本单元是class class 类 即指同一类对象的抽象化概念 类里面的所有东西叫做类成员 属性 方法 事件 2 属性类型 C 中的数据类型一共15种 整数型 8种 位 代表整数的取值范围 2的位数次方 求出来 1就是最大值 符
  • 深入浅出讲解IDS(入侵检测系统)

    一 什么是IDS IDS是英文 intrusion Detection Systems 的缩写 中文意思是 入侵检测系统 入侵检测系统 是一种对网络传输进行即时监视 在发现可疑传输时发出警报或者采取主动反应措施的网络安全设备 专业上来讲 I
  • 我的创作纪念日-学习不止,笃行不怠

    机缘 平时的学习都会看很多视频教程 有一些会带ppt或者文稿 很多都没有 基本上都是猴子搬玉米 边学边忘 缺乏总结 就想尝试在CSDN上边学边记录 做总结 效果不错 在 CSDN 上学习并记录总结的具体方法如下 注册 CSDN 账号并登录
  • wsl2 安装ubuntu已经开启vt(虚拟化)仍然报错0x80370102

    一条命令 Enable WindowsOptionalFeature Online FeatureName VirtualMachinePlatform
  • 丰田一页纸极简思考法excel1+logic3

    公司书柜中无意get到的 因为当时对 思维 比较感兴趣 然后这本本图表内容多 书薄字少 就想着借出来看了 中午饭空的时间用了大概一个小时的样子 可以读一大半 废话了这么多 分享下这本书的内容吧 在丰田公司 有一个不成文的要求 不论是会议纪要
  • C语言中setjmp和longjmp函数

    C语言中setjmp和longjmp函数 setjmp和longjmp是C语言独有的 只有将它们结合起来使用 才能达到程序控制流有效转移的目的 按照程序员的预先设计的意图 去实现对程序中可能出现的异常进行集中处理 先来看一下这两个函数的定义
  • truncate mysql批量删除表的数据

    模板拼接执行语句 SELECT CONCAT truncate TABLE table schema TABLE NAME FROM INFORMATION SCHEMA TABLES WHERE table schema IN db na
  • 一文读懂如何配置Linux权限

    配置 var tmp fstab权限 Linux中权限是指控制用户或进程对文件或目录的访问 修改或执行的权限 Linux中有3种权限 读取权限 read 写入权限 write 执行权限 execute 权限是用数字表示的 有三位 每一位表示
  • Unity 控制摄像机镜头的上下左右移动

    private float FollowPosx FollowPosy private float moveAmount 5 控制镜头的移动速度 Update is called once per frame void Update if
  • linux 线程优先级设置

    include
  • 用iframe完美嵌入

  • SpringBoot秒杀系统实战13-秒杀商品详情页+秒杀倒计时功能实现

    程序鹏 于 2020 05 08 00 00 00 发布 1326 收藏 4 分类专栏 Spring Boot 秒杀系统 文章标签 java spring boot web 版权 Spring Boot 同时被 2 个专栏收录 29 篇文章