当前位置: 首页 > news >正文

Django实战项目-学习任务系统-任务完成率统计

接着上期代码内容,继续完善优化系统功能。

本次增加任务完成率统计功能,为更好的了解哪些任务完成率高,哪些任务完成率低。

该功能完成后,学习任务系统1.0版本就基本完成了。

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

path('task/getClassTaskList/', views.getClassTaskList, name='getClassTaskList'),

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

def getClassTaskList(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_set = StudyTask.objects.filter(created_by__in=user_list)
    # 得到所有 任务名称和状态 的查询集合 QuerySet
    data_list = data_set.values('task_title').annotate(all_cnt=Count('task_title')).order_by('-all_cnt')
    data_set_list = data_set.values('task_title', "task_status").annotate(cnt=Count('task_title'))
    # 循环处理分类统计数据
    for data in data_list:
        task_title = data['task_title']
        data['un_finish'] = 0
        data['finish'] = 0
        data['delete'] = 0
        for data_set in data_set_list:
            if task_title == data_set['task_title']:
                # 待完成数量
                if data_set['task_status'] == 0:
                    data['un_finish'] = data_set['cnt']
                elif data_set['task_status'] == 1:
                    # 已完成数量
                    data['finish'] = data_set['cnt']
                else:
                    # 已作废数量
                    data['delete'] = data_set['cnt']
    # 循环处理分类统计数据
    for data in data_list:
        all_cnt = data['all_cnt']
        finish = data['finish']
        # 计算完成率,保留2位小数,并转成百分比格式
        data['finish_rate'] = str(format(float(finish) / float(all_cnt) * 100, '.2f')) + "%"
    # 查询返回任务列表
    rsp_dict['data_list'] = data_list

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

    return render(request, template_name, rsp_dict)

3,编辑页面模板代码:

3.1. 任务完成率统计页面
./mysite/study_system/templates/study_system/task/classTaskList.html

<style type="text/css">
    table tr td {
        font-size: 1.5em;
    }
</style>
<!-- 结果显示区 -->
<div align="center">
    <table style='width: 100%;'>
        <tr>
            <td colspan="6" align="center">任务完成率统计</td>
        </tr>
        <tr style="font-weight: bold; background: #FFEC8B;text-align: center">
            <td>序号</td>
            <td>任务标题</td>
            <td>任务发布总次数</td>
            <td>待完成任务数</td>
            <td>已完成任务数</td>
            <td>任务完成率</td>
        </tr>
        {% if data_list %}
            {% for data in data_list %}
                <tr style="color: red;text-align: center">
                    {# forloop.counter 可以记录循环的次数,作为列表序号#}
                    <td>{{ forloop.counter }}</td>
                    <td>{{ data.task_title }}</td>
                    <td>{{ data.all_cnt }}</td>
                    <td>{{ data.un_finish }}</td>
                    <td>{{ data.finish }}</td>
                    <td>{{ data.finish_rate }}</td>
                </tr>
            {% endfor %}
        {% else %}
            <tr>
                <td colspan="6" id="con_title">查无记录</td>
            </tr>
        {% endif %}
    </table>
</div>

4,运行测试-任务完成率统计:

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

相关文章:

  • 【Spring】IoC容器的一些总结与补充
  • 飞腾ARM UOS编译Qt 5.15.2源码及Qt Creator
  • spark与scala的对应版本查看
  • 【机器学习】决策树算法理论:算法原理、信息熵、信息增益、预剪枝、后剪枝、算法选择
  • Matlab自学笔记二十四:字符串的关系运算和比较
  • 软件测试面试-如何定位线上出现bug
  • C++ 多线程使用
  • Java学习之路 —— IO、特殊文件
  • SpringBoot请求参数与响应返回值,ResponseEntity<T>自定义响应
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • Postman+Newman+Jenkins实现接口测试持续集成
  • C#中.NET 7.0 Windows窗体应用通过EF访问新建数据库
  • Java NIO 详解
  • 蓝牙耳机仓设计的单芯片解决方案
  • C++中tuple数据结构使用
  • 编译中的 CMP0148 警告
  • 基于STC12C5A60S2系列1T 8051单片机的数模芯片DAC0832实现数模转换应用
  • Python---函数的作用,定义,使用步骤(调用步骤)
  • 《C++避坑神器·二十二》VS能正常运行程序,但运行exe程序无响应解决办法
  • Spring条件注解@Conditoinal+ Profile环境切换应用@Profile
  • 张广智︱“编年事辑”:打开学人心路历程的窗户
  • 夜读丨读《汉书》一得
  • 商务部就开展加强战略矿产出口全链条管控工作应询答记者问
  • 江西贵溪:铜板上雕出的国潮美学
  • 视频|王弘治:王太后,“先天宫斗圣体”?
  • 中美是否计划讨论美方以芬太尼为由对华征收的特别关税?外交部回应