首页 > 其他分享 >Django实战项目-学习任务系统-定时任务管理

Django实战项目-学习任务系统-定时任务管理

时间:2023-10-30 16:36:31浏览次数:33  
标签:task name Django 任务 定时 type dayTask

接着上期代码框架,开发第4个功能,定时任务管理,再增加一个学习定时任务表,主要用来设置周期重复性的学习任务,定时周期,定时时间,任务标题和内容,预计完成天数,奖励积分和任务状态等信息。

 

现实中学习一门课程或一项技能知识,需要很长时间的学习积累才能学会,不像小说世界,游戏世界等虚拟世界,可以快速学会一项技能知识。

所以学习任务系统最重要的是周期重复性的学习任务,最好是每天做一次的任务,一点一点的累积,坚持几个月或几年,才能完成掌握一门课程或一项技能知识。

 

第一步:编写第4个功能-定时任务管理

1,编辑模型文件:

./mysite/study_system/models.py:

class StudyScheduledTask(models.Model):
    scheduled_id = models.AutoField(primary_key=True, verbose_name='定时任务ID')
    task_type = models.IntegerField(verbose_name='任务类型')
    schedule_type = models.CharField(max_length=50, verbose_name='定时周期')
    schedule_time = models.CharField(max_length=50, verbose_name='定时时间')
    task_title = models.CharField(max_length=100, verbose_name='任务标题')
    task_description = models.TextField(verbose_name='任务描述')
    reward_points = models.IntegerField(verbose_name='奖励积分')
    deadline_days = models.IntegerField(verbose_name='预计完成天数')
    phone_num = models.CharField(max_length=20, verbose_name='手机号码')
    created_time = models.DateTimeField(verbose_name='创建时间')
    update_time = models.DateTimeField(verbose_name='更新时间')
    pub_daytime = models.CharField(max_length=20, verbose_name='发布日期')
    created_by = models.ForeignKey(StudyUser, on_delete=models.CASCADE, verbose_name='创建者ID')

    class Meta:
        verbose_name = '学习定时任务表'
        verbose_name_plural = '学习定时任务表'
        # 用于模型的数据库表的名称
        db_table = "study_scheduled_tasks"

    def __str__(self):
        return self.task_title


2,编辑urls配置文件:
./mysite/study_system/urls.py

这个略,参考之前文章添加对应视图方法名即可。


3,编辑视图文件:
./mysite/study_system/views.py

def getDayTaskList(request):
    '''
    @方法名称: 获取定时任务列表
    @作    者: PandaCode辉
    @weixin公众号: PandaCode辉
    @创建时间: 2023-10-10
    '''
    # 响应容器
    rsp_dict = {}
    # 获取当前用户名
    username = request.session.get('username')
    # 根据用户名获取用户对象
    cur_user = StudyUser.objects.get(username=username)
    print('根据用户名查询用户对象:' + str(cur_user))

    user_list = [cur_user]
    # 如果当前用户是:3-学生,则查找对应辅导员用户
    if cur_user.role == 3:
        parent_id = cur_user.parent_id
        # 根据用户ID获取用户对象
        parent_user = StudyUser.objects.get(user_id=parent_id)
        print('根据用户ID获取用户对象:' + str(parent_user))
        user_list = [cur_user, parent_user]
    # 获取待完成任务列表,限制发布人
    data_list = StudyScheduledTask.objects.filter(created_by__in=user_list).order_by('-pk')
    
    # 查询待完成任务列表
    rsp_dict['data_list'] = data_list

    context_object_name = "scheduled_task_list"
    template_name = "study_system/home.html"
    rsp_dict['html_file'] = 'study_system/task/dayTaskList.html'
    rsp_dict['context_object_name'] = context_object_name

    return render(request, template_name, rsp_dict)


def toNewDayTask(request):
    '''
    @方法名称: 跳转到新增定时务视图
    @作    者: PandaCode辉
    @weixin公众号: PandaCode辉
    @创建时间: 2023-10-10
    '''
    rsp_dict = {}
    rsp_dict["pageTitle"] = "新增定时任务"
    # 'html_file': 'xxx.html' 动态指定模板页面 ; 'menuTo': 'task' = 任务管理 ;
    rsp_dict['html_file'] = 'study_system/task/addDayTask.html'

    return render(request, "study_system/home.html", rsp_dict)


def addNewDayTask(request):
    '''
    @方法名称: ajax请求, 表单视图,新增定时任务
    @作    者: PandaCode辉
    @weixin公众号: PandaCode辉
    @创建时间: 2023-10-10
    '''
    # 初始化响应容器
    rsp_dict = {"result": "error", "errorMsg": "系统错误"}
    # 是否ajax请求
    if request.is_ajax():
        try:
            rest = request.POST
            schedule_type = rest['scheduleType']
            task_title = rest['taskTitle']
            task_type = int(rest['taskType'])
            task_description = rest['taskDescription']
            reward_points = int(rest['rewardPoints'])
            deadline_days = int(rest['deadlineDays'])
            phone_num = rest['phoneNum']
            scheduleDay = rest['scheduleDay']
            scheduleTime = rest['scheduleTime']
            # 定时时间 拼接日期时间
            schedule_time = scheduleDay + " " + scheduleTime
            # 获取当前用户名
            username = request.session.get('username')
            # 根据用户名获取用户对象
            cur_user = StudyUser.objects.get(username=username)
            print('根据用户名查询用户对象:' + str(cur_user))
            # 创建者ID,使用 StudyUser 对象赋值
            created_by = cur_user

            # 今天
            # UTC格式当前时区时间
            t = time.localtime()
            work_date = time.strftime("%Y-%m-%d %H:%M:%S", t)
            print('当前日期时间:' + str(work_date))

            # 创建对象并保存到数据库
            studyScheduledTask = StudyScheduledTask(task_type=task_type, schedule_type=schedule_type,
                                                    schedule_time=schedule_time.strip(), task_title=task_title,
                                                    task_description=task_description, reward_points=reward_points,
                                                    deadline_days=deadline_days, phone_num=phone_num,
                                                    created_time=work_date, update_time=work_date,
                                                    created_by=created_by)
            # 保存到数据库是否成功
            studyScheduledTask.save()
            rsp_dict["result"] = "success"
        except Exception as e:
            rsp_dict["errorMsg"] = "新增定时任务保存到数据库失败."

    # 成功与否都返回json数据格式
    return JsonResponse(rsp_dict)

4,编辑页面模板代码:

4.1. 定时任务列表页面
./mysite/study_system/templates/study_system/task/dayTaskList.html

<div>
    <a href="/study_system/task/toNewDayTask/" class="btn btn-default btn-lg btn-block btn-a"
       style="color: #EC5F13;">新增定时任务</a>
</div>
<!-- 结果显示区 -->
<div id="dataList">
    {% if data_list %}
        {% for dayTask in data_list %}
            <ul class="dataCardList">
                <li class="btn-group btn-group-justified">
                    <a href="#"
                       class="btn btn-default btn-lg">修改</a>
                    <a href="#" class="btn btn-default btn-lg">删除</a>
                </li>
                <li>【定时任务ID :{{ dayTask.scheduled_id }}】</li>
                <li>【任务创建者 :{{ dayTask.created_by.username }}】</li>
                {% if dayTask.task_type == "1" %}
                    <li style='color: blue'>【任务类型 :1-系统任务】</li>
                {% elif dayTask.task_type == "2" %}
                    <li>【任务类型 :2-辅导员任务】</li>
                {% endif %}

                {% if dayTask.schedule_type == "day-1" %}
                    <li style='color : blue'>【循环周期 :每天1次】</li>
                {% elif dayTask.schedule_type == "timing" %}
                    <li style='color : green'>【循环周期 :定时1次】</li>
                {% elif dayTask.schedule_type == "week-1" %}
                    <li style='color : red'>【循环周期 :每周一1次】</li>
                {% elif dayTask.schedule_type == "week-2" %}
                    <li style='color : red'>【循环周期 :每周二1次】</li>
                {% elif dayTask.schedule_type == "week-3" %}
                    <li style='color : red'>【循环周期 :每周三1次】</li>
                {% elif dayTask.schedule_type == "week-4" %}
                    <li style='color : red'>【循环周期 :每周四1次】</li>
                {% elif dayTask.schedule_type == "week-5" %}
                    <li style='color : red'>【循环周期 :每周五1次】</li>
                {% elif dayTask.schedule_type == "week-6" %}
                    <li style='color : red'>【循环周期 :每周六1次】</li>
                {% elif dayTask.schedule_type == "week-7" %}
                    <li style='color : red'>【循环周期 :每周日1次】</li>
                {% endif %}

                <li>【定时时间 :{{ dayTask.schedule_time }}】</li>
                <li>【任务名称 :{{ dayTask.task_title }}】</li>
                <li>【任务内容说明 :{{ dayTask.task_description }}】</li>
                <li>【计划完成天数 :{{ dayTask.deadline_days }} 天】</li>
                <li>【任务奖励 :{{ dayTask.reward_points }} 积分】</li>
            </ul>
        {% endfor %}
    {% else %}
        <strong>查无记录</strong>
    {% endif %}
</div>

 

4.2. 发布任务页面
./mysite/study_system/templates/study_system/task/addTask.html

<script type="text/javascript">
    //自动加载
    $(function () {

        //选择时间下拉框列表值
        var timeMax = 24;
        var optionHtml = "";
        for (var i = 0; i < timeMax; i++) {
            var time_i1 = "";
            var time_i2 = "";
            //左补0字符串
            //var tt = String(i).padStart(2, "0");
            //右补0字符串
            //var tt = String(i).padEnd(2, "0");
            //alert(tt);
            time_i1 = String(i).padStart(2, "0") + ":00";
            time_i2 = String(i).padStart(2, "0") + ":30";
            optionHtml += "<option value='" + time_i1 + "'>" + time_i1
                + "</option>";
            optionHtml += "<option value='" + time_i2 + "'>" + time_i2
                + "</option>";
        }
        // 添加到scheduleTime中
        $("select[name='scheduleTime']").append(optionHtml);

    });

    //选择切换的命令
    function changeCycle() {
        //alert("切换的命令")
        var cycleTime = $("select[name='scheduleType']").val();
        //alert(cycleTime)
        if (cycleTime == "timing") {
            //日期栏位可输入
            $("input[name='scheduleDay']").removeAttr("readonly");
            //上传文件功能切换表单界面
        } else {
            //日期栏位只读
            $("input[name='scheduleDay']").attr("readonly", "readonly");
            //清空输入栏
            $("input[name='scheduleDay']").val("");
        }
    }

    function addNewDayTask() {
        var scheduleType = $("select[name='scheduleType']").val();
        var taskTitle = $("input[name='taskTitle']").val();
        var taskDescription = $("textarea[name='taskDescription']").val();
        var deadlineDays = $("input[name='deadlineDays']").val();
        var rewardPoints = $("input[name='rewardPoints']").val();
        var taskType = $("select[name='taskType']").val();
        var scheduleDay = $("input[name='scheduleDay']").val();
        var scheduleTime = $("select[name='scheduleTime']").val();
        var csrf_token = '{{ csrf_token }}';
        var phoneNum = $("input[name='phoneNum']").val();
        $.post("/study_system/task/addNewDayTask/",
            {
                'scheduleType': scheduleType,
                'taskTitle': taskTitle,
                'taskDescription': taskDescription,
                'deadlineDays': deadlineDays,
                'rewardPoints': rewardPoints,
                'taskType': taskType,
                'scheduleDay': scheduleDay,
                'scheduleTime': scheduleTime,
                // 将token值放到请求数据部分,token的键必须是 csrfmiddlewaretoken
                'csrfmiddlewaretoken': csrf_token,
                'phoneNum': phoneNum,
            }, function (data) {
                if ("success" == data.result) {
                    alert("添加成功");
                    window.location.href = "/study_system/task/getDayTaskList";
                } else {
                    alert("添加失败:" + data.errorMsg);
                }
            });
    }
</script>
<div class="container">
    <h1 class="text-center">添加定时任务</h1>
    <form action="/study_system/task/addNewDayTask" method="post" class="form-horizontal" role="form">
        {% csrf_token %}
        <div class="form-group">
            <label for="scheduleType" class="col-sm-2 control-label">循环周期</label>
            <div class="col-sm-10">
                <select class="form-control" name="scheduleType" id="scheduleType" onblur="changeCycle()"
                        onchange="changeCycle()">
                    <option value="day-1" selected="selected">每天1次</option>
                    <option value="timing">定时1次</option>
                    <option value="week-1">每周一1次</option>
                    <option value="week-2">每周二1次</option>
                    <option value="week-3">每周三1次</option>
                    <option value="week-4">每周四1次</option>
                    <option value="week-5">每周五1次</option>
                    <option value="week-6">每周六1次</option>
                    <option value="week-7">每周日1次</option>
                </select>
            </div>
        </div>
        <div class="form-group">
            <label for="taskTitle" class="col-sm-2 control-label">任务名称</label>
            <div class="col-sm-10">
                <input type="text" class="form-control" name="taskTitle" id="taskTitle" maxlength="12" size="20"
                       placeholder="请输入任务名称">
            </div>
        </div>
        <div class="form-group">
            <label for="taskType" class="col-sm-2 control-label">任务类型</label>
            <div class="col-sm-10">
                <select class="form-control" name="taskType" id="taskType">
                    {% if request.session.role == 1 %}
                        <option value="1" selected="selected">1-系统任务</option>
                    {% elif request.session.role == 2 %}
                        <option value="2" selected="selected">2-辅导员任务</option>
                    {% endif %}
                </select>
            </div>
        </div>
        <div class="form-group">
            <label for="taskDescription" class="col-sm-2 control-label">任务内容说明</label>
            <div class="col-sm-10">
                <textarea name="taskDescription" id="taskDescription" class="form-control" rows="4"></textarea>
            </div>
        </div>
        <div class="form-group">
            <label for="deadlineDays" class="col-sm-2 control-label">计划完成天数</label>
            <div class="col-sm-10">
                <input type="text" class="form-control" name="deadlineDays" id="deadlineDays" placeholder="请输入计划完成天数">
            </div>
        </div>
        <div class="form-group">
            <label for="rewardPoints" class="col-sm-2 control-label">任务奖励积分</label>
            <div class="col-sm-10">
                <input type="text" class="form-control" name="rewardPoints" id="rewardPoints" placeholder="请输入任务奖励积分">
            </div>
        </div>
        <div class="form-group">
            <label for="scheduleDay" class="col-sm-2 control-label">定时日期</label>
            <div class="col-sm-10">
                <input type="date" class="form-control" name="scheduleDay" id="scheduleDay" readonly="readonly">
            </div>
        </div>
        <div class="form-group">
            <label for="scheduleTime" class="col-sm-2 control-label">定时时间</label>
            <div class="col-sm-10">
                <select class="form-control" name="scheduleTime" id="scheduleTime"></select>
            </div>
        </div>
        <div class="form-group">
            <label for="phoneNum" class="col-sm-2 control-label">短信通知手机号</label>
            <div class="col-sm-10">
                <input type="text" class="form-control" name="phoneNum" id="phoneNum" maxlength="11" size="20"
                       placeholder="请输入手机号">
            </div>
        </div>
        <div class="form-group">
            <div class="col-sm-offset-2 col-sm-10">
                <a href="javascript:addNewDayTask()" class="btn btn-default btn-lg btn-block btn-a">提交添加</a>
            </div>
        </div>
    </form>
</div>


第二步:运行测试-任务管理功能

1,登录用户后,点击查看定时任务列表页面

 

 2,新增定时任务页面

 循环周期:可以选择每天1次,定时1次,每周几1次,常用的还是每天1次周期。

 -------------------------------------------------end -------------------------------------------------

 

标签:task,name,Django,任务,定时,type,dayTask
From: https://www.cnblogs.com/xh2023/p/17798170.html

相关文章

  • 电影推荐与管理系统Python+Django网页界面+协同过滤推荐算法【计算机毕设项目】
    一、介绍电影推荐管理系统。本系统使用Python作为主要开发语言,前端采用HTML、CSS、BootStrap等技术语言框架搭建展示界面,后端采用Django作为功能逻辑处理,并使用Ajax实现前端与和后端的通信。其主要实现功能如下:系统平台分为管理员和用户两个角色用户可以登录、注册、查看电影、发表......
  • 备份任务
    #!/bin/bash################################################################################压缩文件脚本#source_path:要压缩的路径如:/data/file/#extension:要压缩的文件类型,如.log.class#save_path:要保存的路径如:/data/file/backup/######......
  • 电影推荐与管理系统Python+Django网页界面+协同过滤推荐算法【计算机毕设项目】
    一、介绍电影推荐管理系统。本系统使用Python作为主要开发语言,前端采用HTML、CSS、BootStrap等技术语言框架搭建展示界面,后端采用Django作为功能逻辑处理,并使用Ajax实现前端与和后端的通信。其主要实现功能如下:系统平台分为管理员和用户两个角色用户可以登录、注册、查看电影......
  • Django开发--知识回顾
    安装Djangopipinstalldjango创建Django项目django-adminstartprojectmysite注意:pycharm也可以创建Django项目如果用pycharm创建,记得settings.py中的DIR里的信息删除 创建APPpythonmanage.pystartappapp01pythonmanage.pystartappapp02p......
  • 定时器相关面试问题
    非活动连接,定时器怎么实现的,最小堆和升序链表(会不会修改,有点忘了,应该是会改的,我记得有umap,就说了)怎么设计分布式定时器(单实例定时器挂了怎么处理),主节点和从节点逻辑不一样假设LRU缓存的数据,需要过期时间,怎么设计(答:和webserver的定时器差不多,每个缓存开启一个定时器,使用时间堆......
  • 【Python】在linux环境下, Django 3.0+版本遇到的一些问题
    1.Django3.2版本升级后的一些报错,导致项目运行失败1.1site-packages/rest_framework/serializers.py fromdjango.db.models.fieldsimportFieldDoesNotExistImportError:cannotimportname'FieldDoesNotExist'解决办法:改变FieldDoesNotExist的导入方式fromdjango......
  • 定时获取地址经纬度信息
    packagecom.hhx.controller;importcom.hhx.bean.Files;importcom.hhx.dao.FilesDao;importorg.json.JSONArray;importorg.json.JSONException;importorg.json.JSONObject;importorg.springframework.scheduling.annotation.EnableScheduling;importorg.springframewor......
  • powershell-后台启动任务
    win11中vbs的文件关联被去掉了,vbs文件不能双击执行,开机启动一个不显示窗口的任务无法完成;解决办法:控制页面-》系统和安全-》计划任务--》执行命令比如我们需要开机自启动wsl中的某个服务:Setws=WScript.CreateObject("WScript.Shell")ws.run"wsl-uroot/etc/init......
  • django基础到高手知识笔记总结 共4大模块50页md文档 第2章:django视图和模板的使用
    当你考虑开发现代化、高效且可扩展的网站和Web应用时,Django是一个强大的选择。Django是一个流行的开源PythonWeb框架,它提供了一个坚实的基础,帮助开发者快速构建功能丰富且高度定制的Web应用完整版笔记直接地址:请移步这里共10章,31子模块,总计18647字工程搭建学习目标......
  • 团队任务2-需求分析
    Git的工作流:在协作中,通常使用的工作流有一些不同的模型,但最常见的是GitFlow工作流,它基于分支管理。GitFlow包括以下几个主要分支:Master分支:这个分支包含最近发布到生产环境的代码,即稳定版本。通常,只有通过经过充分测试和审查的代码才会合并到Master分支。Develop分支:D......