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

接着上期代码框架,开发第3个功能,任务管理,再增加一个学习任务表,用来记录发布的学习任务的标题和内容,预计完成天数,奖励积分和任务状态等信息。

第一步:编写第三个功能-任务管理

1,编辑模型文件:

./mysite/study_system/models.py:

class StudyTask(models.Model):
    task_id = models.AutoField(primary_key=True, verbose_name='任务ID')
    task_type = models.IntegerField(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='预计完成天数')
    actual_days = models.IntegerField(verbose_name='实际完成天数')
    task_status = models.IntegerField(verbose_name='任务状态')
    created_time = models.DateTimeField(verbose_name='创建时间')
    update_time = models.DateTimeField(verbose_name='更新时间')
    created_by = models.ForeignKey(StudyUser, on_delete=models.CASCADE, verbose_name='创建者ID')

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

    def __str__(self):
        return self.task_title

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

# 任务管理url
path('task/getUndoTaskList/', views.getUndoTaskList, name='getUndoTaskList'),
path('task/toNewTask/', views.toNewTask, name='toNewTask'),
path('task/addNewTask/', views.addNewTask, name='addNewTask'),


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

def getUndoTaskList(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 = StudyTask.objects.filter(task_status=0, created_by__in=user_list).order_by('-pk')

    # 查询待完成任务列表
    rsp_dict['data_list'] = data_list

    context_object_name = "undo_task_list"
    template_name = "study_system/home.html"
    # 'html_file': 'xxx.html' 动态指定模板页面 ; 'menuTo': 'task' = 任务管理 ;
    rsp_dict['html_file'] = 'study_system/task/undoTaskList.html'
    rsp_dict['menuTask'] = 'menuTask'
    rsp_dict['context_object_name'] = context_object_name

    return render(request, template_name, rsp_dict)



def toNewTask(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/addTask.html'
    rsp_dict['menuTask'] = 'menuTask'

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


def addNewTask(request):
    '''
    @方法名称: ajax请求, 表单视图,发布新任务
    @作    者: PandaCode辉
    @weixin公众号: PandaCode辉
    @创建时间: 2023-10-10
    '''
    # 初始化响应容器
    rsp_dict = {"result": "error", "errorMsg": "系统错误"}
    # 是否ajax请求
    if request.is_ajax():
        try:
            rest = request.POST
            task_title = rest['taskTitle']
            task_type = int(rest['taskType'])
            task_description = rest['taskDescription']
            reward_points = int(rest['rewardPoints'])
            deadline_days = int(rest['deadlineDays'])
            actual_days = 0
            task_status = 0
            # 获取当前用户名
            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))

            # 创建对象并保存到数据库
            study_task = StudyTask(task_title=task_title, task_type=task_type, task_description=task_description,
                                   reward_points=reward_points, deadline_days=deadline_days, task_status=task_status,
                                   actual_days=actual_days, created_by=created_by, created_time=work_date,
                                   update_time=work_date)
            # 保存到数据库是否成功
            study_task.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/undoTaskList.html

{% if request.session.role == 1 or request.session.role == 2  or request.session.role == 4 %}
    {# 【角色 :1-系统管理员 】#}
    {# 【角色 :2-辅导员 】#}
    {# 【角色 :4-自导自学 】#}
    <div>
        <a href="/study_system/task/toNewTask/" class="btn btn-default btn-lg btn-block btn-a">发布新任务</a>
    </div>
{% endif %}
<!-- 结果显示区 -->
<div id="dataList">
    {% if data_list %}
        {% for studyTask in data_list %}
            <ul class="dataCardList">
                <li class="btn-group btn-group-justified">
                    {% if request.session.role == 1 or request.session.role == 2 or request.session.role == 4 %}
                        {# 【角色 :1-系统管理员 】#}
                        {# 【角色 :2-辅导员 】#}
                        {# 【角色 :4-自导自学 】#}
                        <a href="#"
                           class="btn btn-default btn-lg">修改</a>
                        <a href="#" class="btn btn-default btn-lg">删除</a>
                    {% elif request.session.role == 3 %}
                        {# 【角色 :3-学生用户 】#}
                        <a href="#" class="btn btn-default btn-lg">删除</a>
                    {% endif %}
                </li>
                <li>【任务ID :{{ studyTask.task_id }}】</li>
                <li>【任务发布者 :{{ studyTask.created_by.username }}】</li>
                <li>【发布时间 :{{ studyTask.update_time|date:'Y-m-d H:i:s' }}】</li>
                <li>【任务名称 :{{ studyTask.task_title }}】</li>

                {% if studyTask.task_type == "1" %}
                    <li style='color: blue'>【任务类型 :1-系统任务】</li>
                {% elif studyTask.task_type == "2" %}
                    <li>【任务类型 :2-辅导员任务】</li>
                {% endif %}

                <li>【任务内容说明 :{{ studyTask.task_description }}】</li>
                <li>【计划完成天数 :{{ studyTask.deadline_days }} 天】</li>
                <li style='color: red'>【成功奖励 :+{{ studyTask.reward_points }} 积分】</li>
                {#                除法 : {% widthratio 5 100 1%}#}
                {#                note:等同于:(5 / 100) * 1,则结果返回0.05,和乘法一样,使「参数3」= 1就是除法了。#}
                {#                失败处罚积分为成功奖励积分的一半,所以是 undoTask.7 / 2#}
                <li style='color: green'>【失败处罚 :-{% widthratio studyTask.reward_points 2 1 %} 积分】</li>
                {% if request.session.role == 1 or request.session.role == 3  or request.session.role == 4 %}
                    {# 【角色 :1-系统管理员 】#}
                    {# 【角色 :3-学生 】#}
                    {# 【角色 :4-自导自学 】#}
                    <li>
                        <a href="#"
                           class="btn btn-default btn-lg btn-block btn-a">完成</a>
                    </li>
                {% endif %}
            </ul>
        {% endfor %}
    {% else %}
        <strong>查无记录</strong>
    {% endif %}
</div>

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

<script type="text/javascript">

    function addNewTask() {
        var taskTitle = $("#taskTitle").val();
        var taskType = $("#taskType").val();
        var taskDescription = $("#taskDescription").val();
        var deadlineDays = $("#deadlineDays").val();
        var rewardPoints = $("#rewardPoints").val();

        // 1,获取csrfmiddlewaretoken的input标签value属性对应的值
        {#var token = $('[name="csrfmiddlewaretoken"]').val();#}

        // 2,直接就能得到 csrfmiddlewaretoken 的input标签value属性的值
        var csrf_token = '{{ csrf_token }}';

        $.post("/study_system/task/addNewTask/",
            {
                'taskTitle': taskTitle,
                'taskType': taskType,
                'taskDescription': taskDescription,
                'deadlineDays': deadlineDays,
                'rewardPoints': rewardPoints,
                // 将token值放到请求数据部分,token的键必须是 csrfmiddlewaretoken
                'csrfmiddlewaretoken': csrf_token,
            }, function (data) {
                if ("success" == data.result) {
                    alert("发布成功");
                    window.location.href = "/study_system/task/getUndoTaskList";
                } else {
                    alert("发布失败:" + data.errorMsg);
                }
            });
    }
</script>
<div class="container">
    <h1 class="text-center">发布新任务</h1>
    <form action="/study_system/task/addNewTask/" method="post" class="form-horizontal" role="form">
        {% csrf_token %}
        {#        在Django中提交数据到后端服务的时候,为了安全,要使用CSRF(跨站请求伪造)。#}
        {#        跨站请求伪造的问题在于,服务器信任来自客户端的数据。#}
        {#        常规的做法是在template模板HTML文件中的form表单 中添加 {% csrf_token %} 可以实现安全提交。#}
        {#        当我们使用from表单标签来发送请求时,如果需要csrf_token认证,那么必须将它写到我们的form表单标签里面,里面的任意位置。#}
        {#        生成的隐藏标签为:#}
        {#        <input type="hidden" name="csrfmiddlewaretoken" value="WVHKQeAuMS4RGqyLybryIBAfacDa1Dp7PEaB3Badv3y0fvLqydX36xAVen6z3oS4">#}
        <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="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="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">
            <div class="col-sm-offset-2 col-sm-10">
                <a href="javascript:addNewTask()" class="btn btn-default btn-lg btn-block btn-a">提交发布</a>
            </div>
        </div>
    </form>
</div>


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

1,登录用户后,先查看待完成任务列表页面

2,发布新任务页面

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/111100.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

P3983 赛斯石(赛后强化版),背包

题目背景 白露横江&#xff0c;水光接天&#xff0c;纵一苇之所如&#xff0c;凌万顷之茫然。——苏轼真程海洋近来需要进购大批赛斯石&#xff0c;你或许会问&#xff0c;什么是赛斯石&#xff1f; 首先我们来了解一下赛斯&#xff0c;赛斯是一个重量单位&#xff0c;我们用…

Wi-Fi 6和5G 在应用场景上的区别

在工作领域&#xff0c;我们经常会面临两个选择&#xff0c;场景的解决方案是要用5G还是WiFi 6&#xff0c;其实判断并不困难&#xff0c;但我们仍然还是从理论概念上区分一下。 文章目录 什么是Wi-Fi 6什么是5GWi-Fi 6和5G 的区别区别一&#xff1a;覆盖范围区别二&#xff1…

腾讯云轻量服务器“镜像类型”以及“镜像”选择方法

腾讯云轻量应用服务器镜像类型分为应用镜像、系统镜像、Docker基础镜像、自定义镜像和共享镜像&#xff0c;腾讯云百科txybk.com来详细说下不同镜像类型说明和详细介绍&#xff1a; 轻量应用服务器镜像类型说明 腾讯云轻量应用服务器 应用镜像&#xff1a;独有的应用镜像除了包…

氮化镓功率HEMT的表征与建模

来源&#xff1a;Characterization and Modeling of a Gallium Nitride Power HEMT(IEEE TRANSACTIONS ON INDUSTRY APPLICATIONS) GaN high-electron-mobility transistor (HEMT) GaN高电子迁移率晶体管   该模型包括一个电压相关电流源Ids、两个电压相关电容Cgd和Cds、一…

NLP之LSTM原理剖析

文章目录 背景simpleRNN的局限性 LSTM手写一下sigmoid例子支持长记忆的神经网络解读3重门 背景 SimpleRNN有一定局限性&#xff0c; 图片上的文字内容: 图片标题提到“SimpleRNN是一种基础模型。它用于解决序列型问题&#xff0c;其中的每一步的输出会影响到下一步的结果。图…

Yolo-Z:改进的YOLOv5用于小目标检测

目录 一、前言 二、背景 三、新思路 四、实验分析 论文地址&#xff1a;2112.11798.pdf (arxiv.org) 一、前言 随着自动驾驶汽车和自动驾驶赛车越来越受欢迎&#xff0c;对更快、更准确的检测器的需求也在增加。 虽然我们的肉眼几乎可以立即提取上下文信息&#xff0c;即…

JVM虚拟机:堆结构的逻辑分区

堆内存的逻辑分区 堆内存的逻辑分区如下所示: 堆内存中分为新生代和老年代,二者空间大小1:3。在新生代里面分为两类区域(eden、survivor),三个区域(eden、survivor、survivor),三个区大小比例为8:1:1。 对象存放的位置 栈 当我们new一个对象的时候,首先会将对象…

Wpf 使用 Prism 实战开发Day03

一.实现左侧菜单绑定 效果图: 1.首先需要在项目中创建 mvvm 的架构模式 创建 Models &#xff0c;放置实体类。 实体类需要继承自Prism 框架的 BindableBase&#xff0c;目的是让实体类支持数据的动态变更! 例如: 系统导航菜单实体类 / <summary>/// 系统导航菜单实体类…

vcomp140.dll丢失是什么意思,vcomp140.dll丢失这几个方法都能修复好

vcomp140.dll是什么&#xff1f; vcomp140.dll是一个动态链接库&#xff08;Dynamic Link Library&#xff09;&#xff0c;它主要用于支持Microsoft Visual C 2015编程语言的运行。这个文件包含了编译器相关的函数和资源&#xff0c;对于使用Visual C 2015开发的程序和游戏来…

mac vscode 使用 clangd

C 的智能提示 IntelliSense 非常不准&#xff0c;我们可以使用 clangd clangd 缺点就是配置繁琐&#xff0c;优点就是跳转和提示代码精准 开启 clangd 之后会提示你关闭 IntelliSense 1、安装插件 clangd 搜索第一个下载多的就是 2、配置 clangd 可执行程序路径 clangd 插…

【数据结构】数组和字符串(五):特殊矩阵的压缩存储:稀疏矩阵——压缩稀疏行(CSR)

文章目录 4.2.1 矩阵的数组表示4.2.2 特殊矩阵的压缩存储a. 对角矩阵的压缩存储b~c. 三角、对称矩阵的压缩存储d. 稀疏矩阵的压缩存储——三元组表e. 压缩稀疏行&#xff08;Compressed Sparse Row&#xff0c;CSR&#xff09;矩阵结构体创建CSR矩阵元素设置初始化打印矩阵销毁…

VPS是什么?详解亚马逊云科技Amazon Lightsail(VPS)虚拟专用服务器

2006年&#xff0c;南非开普敦&#xff0c;亚马逊推出了WBS&#xff0c;以网络服务的形式向企业提供基础的IT服务。亚马逊云科技的一小步&#xff0c;在无数技术更迭&#xff0c;天才设计师和程序员的努力与基础设施建设的完善之下成为了人类科技进展的一大步。 亚马逊云科技可…

目标检测概述

1.是什么&#xff1f; 目标检测是计算机视觉领域的核心问题之一&#xff0c;其任务就是找出图像中所有感兴趣的目标&#xff0c;确定他们的类别和位置。由于各类不同物体有不同的外观&#xff0c;姿态&#xff0c;以及不同程度的遮挡&#xff0c;加上成像是光照等因素的干扰&a…

三篇论文:速览GPT在网络安全最新论文中的应用案例

GPT在网络安全领域的应用案例 写在最前面论文1&#xff1a;Chatgpt/CodeX引入会话式 APR 范例利用验证反馈LLM 的长期上下文窗口&#xff1a;更智能的反馈机制、更有效的信息合并策略、更复杂的模型结构、鼓励生成多样性和GPT类似的步骤&#xff1a;Conversational APR 对话式A…

精品基于Python的个性化电影推荐系统

《[含文档PPT源码等]精品基于Python的个性化电影推荐系统设计与实现》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;python 使用框架&#xff1a;Django 前端技…

C++设计模式_18_State 状态模式

State和Memento被归为“状态变化”模式。 文章目录 1. “状态变化”模式1.1 典型模式 2. 动机 (Motivation)3. 代码演示State 状态模式3.1 常规方式3.2 State 状态模式 4. 模式定义5. 结构( Structure )6. 要点总结7. 其他参考 1. “状态变化”模式 在组件构建过程中&#xf…

Linux网络编程二(TCP三次握手、四次挥手、TCP滑动窗口、MSS、TCP状态转换、多进程/多线程服务器实现)

TCP三次握手 TCP三次握手(TCP three-way handshake)是TCP协议建立可靠连接的过程&#xff0c;确保客户端和服务器之间可以进行可靠的通信。下面是TCP三次握手的详细过程&#xff1a; 假设客户端为A&#xff0c;服务器为B 1、第一次握手&#xff08;SYN1&#xff0c;seq500&…

深度学习_1 介绍;安装环境

深度学习 学习自李沐老师的课程。笔记主要以总结老师所讲解的内容以及我个人的想法为主&#xff0c;侵删&#xff01; 课程链接&#xff1a;课程安排 - 动手学深度学习课程 (d2l.ai) 介绍 AI地图&#xff1a; 我们以前写的非 AI 类程序基本都是人自己去想会遇到什么样的问题…

集成测试、单元测试、系统测试之间的关系和区别

前言 为了使软件正常工作&#xff0c;所有单元都应集成在一起并正常运行。集成测试就像是要求不同工种的工人修建一个房子&#xff0c;希望他们都团结协作。如何判断他们在一起是否可以按照计划完成建设呢&#xff1f;唯一了解的方法是通过将它们全部拉在一起并测试它们如何相互…

Redis入门01-简单了解

目录 Redis的发展历史 特性简介 数据类型 内存存储与持久化 功能丰富 简单稳定 应用场景 为啥用Redis Redis的发展历史 Redis&#xff08;Remote Dictionary Server&#xff09;是一个高性能的键值存储系统&#xff0c;通常用作缓存、消息队列和分布式数据存储的解决方…