接着上期代码框架,开发第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