5

【D01】Django中实现带进度条的倒计时功能(简易版) - stu(dying)

 2 years ago
source link: https://www.cnblogs.com/DingyLand/p/pomnote_01_.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

首先说明简易版是只有一个 倒计时 和一个 进度条,页面加载后自动开始计时,下次计时需要手动刷新页面。

后续会更新实现完整的倒计时功能的文章

倒计时部分

先上效果图

2765564-20230412195744585-2097329853.gif

(emm...不好意思有点丑...至于这个进度条为什么会跳,是因为我当时忘记把另一个方法注释掉,导致两个计时方法同时进行,后面的代码不会出现这个错误)

以下代码由ChatGPT生成

ChatGPT第一次给的代码是在视图函数里处理时间,每秒返回一次请求给浏览器变更数字。这导致了浏览器反应不过来,无法每秒都接受请求并响应,因此实现倒计时动态更新需要在JavaScript实现

views.py:

import time
from django.shortcuts import render

def countdown(request):
    start_time = int(time.time())
    end_time = start_time + 1500  # 25 minutes in seconds
    while int(time.time()) < end_time:
        time_left = end_time - int(time.time())
        minutes = time_left // 60
        seconds = time_left % 60
        context = {'minutes': minutes, 'seconds': seconds}
        time.sleep(1)
    context = {'minutes': 0, 'seconds': 0}
    return render(request, 'countdown.html', context)

纠正后给的代码:

views.py:

from django.shortcuts import render
import datetime

def countdown(request):
    now = datetime.datetime.now()
    # 设置倒计时结束时间(25分钟)
    end_time = now + datetime.timedelta(minutes=25)
    context = {'end_time': end_time}
    return render(request, 'countdown.html', context)

countdown.html:

JavaScript使用jQuery

<!DOCTYPE html>
<html>
  <head>
    <title>Pomodoro Timer</title>
    <meta charset="utf-8">
    <script type="text/javascript">
      function updateTimer() {
  		var now = new Date();
      	var endTime = new Date('{{ end_time|date:"c" }}');
      	var diff = endTime - now;
      	var minutes = Math.floor(diff / 60000);
      	var seconds = Math.floor((diff % 60000) / 1000);

      	$('#minutes').text(('0' + minutes).slice(-2));
      	$('#seconds').text(('0' + seconds).slice(-2));

      	if (diff > 0) {
        	setTimeout(updateTimer, 1000);
  		}
      }

	$(document).ready(function() {
  		updateTimer();
	});

    </script>
  </head>
  <body>
    <h1>Pomodoro Timer</h1>
    <p>Time remaining: <span id="minutes">25</span>:<span id="seconds">00</span></p>
  </body>
</html>

配置好就可以看到数字时钟在计时了。

嵌入式倒计时器

另外,ChatGPT提供了嵌入式倒计时器组件方法

在任何模板中都可以使用以下代码来加载你写的倒计时器:

HTML:

{% url 'countdown' as countdown_url %}
<iframe src="{{ countdown_url }}" width="400" height="200"></iframe>

这将在模板中嵌入一个iframe元素,并使用countdown视图函数的URL作为其源。当用户加载页面时,iframe将显示倒计时器,并开始倒计时。

进度条部分

HTML:

ChatGPT在html中重写了CSS以及添加了JS部分代码,效果十分抽象🙂这很难评

2765564-20230412195816639-896374384.png

原本想实现一个环形进度条的倒计时组件,因为涉及复杂的CSS样式编写,所以在找到合适的插件之前先用Bootstrap初始的进度条样式

ChatGPT给的代码只有这部分有用,表示进度条的即时更新

html:

<div class="progress">
	<div class="progress-bar" role="progressbar"></div>
</div>

JavaScript:

var progress = 100 - ((timeRemaining / 60) * 100) / 60;
$(".progress-bar").css("width", progress + "%");

稍作修改,将进度条JS代码整合到计时方法里:

JavaScript:

  function updateTimer() {
    // 获取当前时间和倒计时结束时间
    var now = new Date();
    var startTime = new Date('{{ start_time|date:"c" }}');
    var endTime = new Date('{{ end_time|date:"c" }}');
    // 计算时间差
    var interval = endTime - startTime;
    var diff = endTime - now;

    // 将时间差转换为分钟和秒数
    // 一分钟等于60000毫秒,Math.floor函数向下取整
    var minutes = Math.floor(diff / 60000);
    var seconds = Math.floor((diff % 60000) / 1000);
    // 更新页面中的时间显示
    $('#minutes').text(('0' + minutes).slice(-2));
    $('#seconds').text(('0' + seconds).slice(-2));

    var progress = diff/interval*100;
    $(".progress-bar").css("width", progress + "%");

    // 在倒计时结束之前,每100毫秒更新一次时间
    if (diff > 0) {
      setTimeout(updateTimer, 100);
    }
  }

  $(function () {
    // 开始写 jQuery 代码...
    // 页面加载完成后开始倒计时
    updateTimer();
  });

views.py里也要修改countdown函数

views.py:

def countdown(request):
	# 设置倒计时结束时间(25分钟)
	start_time = datetime.datetime.now()
	end_time = start_time + datetime.timedelta(minutes=0.2)
	context = {
		'start_time': start_time,
		'end_time': end_time
	}
	return render(request, 'countdown.html', context)

环形进度条插件

circle-progress-bar.js 是一款利用canvas绘制圆环进度条的插件,不依赖任何库。

效果:放大失真、丑

2765564-20230412200418096-990885325.png

Bootstrap官网精选模板中的一些模板有环形进度条,可以导入模板后直接使用。

本文作者:stu(dying)

本文链接:https://www.cnblogs.com/DingyLand/p/pomnote_01_.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。


Recommend

  • 191
    • 掘金 juejin.im 7 years ago
    • Cache

    Express + Mysql 实现简易留言板功能

    This site can’t be reached The webpage at https://juejin.cn/post/59cf65026fb9a00a6c12cf2b might be temporarily down or it may have moved permanently to a new web address....

  • 68

    使用Django编写简易测试报告生成器

  • 36
    • studygolang.com 4 years ago
    • Cache

    golang 进度条功能实现

    最近在做一个需求,功能很简单,就是开发一个轻量级客户端,将一个指定文件中的内容通过 TCP 发送到服务器。由于该文件特别大,有可能到达100G的数量级,因此处理起来会比较慢,为了给用户提供比较友好的展示界面,因此,在...

  • 17
    • segmentfault.com 4 years ago
    • Cache

    Django之简易用户系统(3)

    [toc] 1. 总体设计思路 一套简单的用户管理系统,包含但不限如下功能: 用户增加:用...

  • 10

    Celery+django如何显示任务的执行进度条 Celery单词中文的意思是“芹菜”,也不知道为什么人家喜欢给起个菜名,实际从功能上跟芹菜一点也扯不上关系,非得往上靠难道国外吃芹菜是在后面吃?大家都知道,如果我们在后端执行一个时间比较...

  • 6

    Django(drf)配合 Vue Element 实现文件上传下载功能 发表于 2021-03-13 ...

  • 12

    svg实现react/rax圆环倒计时进度条组件code snippet效果:不用svg几乎都是需要有额外的元素遮挡实现,但...

  • 6

    热评 牛哥看世界 元宇宙真的在10年内就是一个没有一点意义的虚拟经济,可以理解在现实世界科技缓慢进展的时候资本所抛出的一个伪命题。其核心真的就是在收割韭菜! 现实世界与虚拟世界其核心的意义在于...

  • 5
    • blog.p2hp.com 2 years ago
    • Cache

    JS实现倒计时功能

    网站在做活动时,会出现一个截止时间倒计时的提示。效果如图: ①提示时间是每秒不断变化的,需要用到定时器(setInte...

  • 6

    在开发的过程中,上传文件或者导入数据是一件很常见的事情,导入数据可以有两种方式: 前端上传文件到后台,后台读取文件内容,进行验证再进行存储 前端读取数据,进行数据验证,然后发送数据到后台进行存储

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK