zoukankan      html  css  js  c++  java
  • CRM

    一、讲师与学生简介

    1.初始化  course_record, study_record.
    2.学习记录
    3.录入成绩
    4.显示成绩 ajax 查询 柱状图展示成绩 highcharts

    5.上传作业(os模块)
    6.下载作业

    二、初始化course_record,study_record

    录入courserecord数据

    三、批量生成学习记录

    知识点

    1. 与course_record 关联得班级对应得学生

        students_list = Student.objects.filter(class_list__id = course_record.class_obj.pk)
        for student in students_list:
            student_obj = StudyRecord(course_record=course_record,student=student)
            temp.append(student_obj)

    2. 批量插入

    StudyRecord.objects.bulk_create(temp)  
        def patch_studyrecord(self,request,queryset):
            # print('queryset:--》',queryset)
            temp = []
            for course_record in queryset:
                # 与course_record 关联得班级对应得学生
                students_list = Student.objects.filter(class_list__id = course_record.class_obj.pk)
                for student in students_list:
                    student_obj = StudyRecord(course_record=course_record,student=student)
                    temp.append(student_obj)
    
            StudyRecord.objects.bulk_create(temp)
    
        actions = [patch_studyrecord]
        patch_studyrecord.short_description = "批量生成学习记录"

    四、查看学习记录

    知识点

    1. ?course_record=%s 过滤;

         mark_safe("<a href='/stark/crm/studyrecord/?course_record=%s'>记录</a>"%(obj.pk))
            
        改一下全局的:
    # if filter_field in self.list_filter: if filter_field !="page": filter_condition.children.append((filter_field, val))

    2. record,score显示;get_field_display

            放到全局:
            if field_obj.choices:
                val = getattr(obj,"get_"+field+"_display")
            else:
                val = getattr(obj, field)

    3. 批量处理迟到

       queryset.update(record="late")
        -----------------------
        
        def record(self, obj=None, header=False):
            if header:
                return "学习记录"
            return mark_safe("<a href='/stark/crm/studyrecord/?course_record=%s'>记录</a>"%(obj.pk))
        
        list_display = ["class_obj", 'day_num', "teacher", record, record_score ]
        
        ---------------------
        
        class StudyRecordConfig(ModelStark):
            list_display = ['student','course_record','record','score']
        
            def patch_late(self, request, queryset):
                queryset.update(record="late")
        
            patch_late.short_description = "迟到"
            actions = [patch_late]
        
        site.register(StudyRecord,StudyRecordConfig)

    五、录入成绩

    知识点

     1. mark_safe

     mark_safe("<a href='record_score/%s'>录入成绩</a>"%obj.pk)

    2. 新增url

        def extra_url(self):
            temp = []
            temp.append(url(r'^record_score/(d+)', self.score))
            return temp  

    3. form表单提交数据

        request.post:
        '''
            <QueryDict: {'csrfmiddlewaretoken': ['muIrf7pwbxIueSJcKADRlZEGVbzzRZOaiGVkBV8DGYC2V9gmxZtyZgujddFtTojk'],
            'score_33': ['100'], 'homework_note_33': ['很好'], 
            'score_34': ['85'], 'homework_note_34': ['棒'],
            'score_35': ['60'], 'homework_note_35': ['None']}>
        ''' 

    4. 处理数据( field, pk = key.rsplit('_', 1) )

        data = {}  # data={"33":{"score":100,"homework_note":'xxx'},}
        for key,value in request.POST.items():
            if key == "csrfmiddlewaretoken":continue
            field, pk = key.rsplit('_', 1)
    
            if pk in data:
                data[pk][field] = value
            else:
                data[pk] = {field:value}
    
        print("data-->",data)
        '''
             {'33': {'score': '100', 'homework_note': '很好'}, 
             '34': {'score': '85', 'homework_note': '棒'}, 
             '35': {'score': '60', 'homework_note': 'None'}}
        '''

    5. 更新数据

        for pk,update_data  in data.items():
            StudyRecord.objects.filter(pk=pk).update(**update_data)

    6. 跳转当前页面

     return redirect(request.path)

    7. get请求

        study_record_list = StudyRecord.objects.filter(course_record__id=course_record_id)
        score_choices = StudyRecord.score_choices
        return render(request,'score.html',locals())
        def score(self,request, course_record_id):
            if request.method == "POST":
                print('post::::', request.POST)
                '''
                <QueryDict: {'csrfmiddlewaretoken': ['muIrf7pwbxIueSJcKADRlZEGVbzzRZOaiGVkBV8DGYC2V9gmxZtyZgujddFtTojk'],
                'score_33': ['100'], 'homework_note_33': ['很好'], 
                'score_34': ['85'], 'homework_note_34': ['棒'],
                 'score_35': ['60'], 'homework_note_35': ['None']}>
                '''
                data = {}  # data={"33":{"score":100,"homework_note":'xxx'},}
                for key,value in request.POST.items():
                    if key == "csrfmiddlewaretoken":continue
                    field, pk = key.rsplit('_', 1)
    
                    if pk in data:
                        data[pk][field] = value
                    else:
                        data[pk] = {field:value}
    
                print("data-->",data)
                '''
                 {'33': {'score': '90', 'homework_note': '很好'}, 
                 '34': {'score': '80', 'homework_note': '帮帮哒'}, 
                 '35': {'score': '50', 'homework_note': '没问题'}}
    
                '''
                for pk,update_data  in data.items():
                    StudyRecord.objects.filter(pk=pk).update(**update_data)
    
                return redirect(request.path)
    
            else:
                study_record_list = StudyRecord.objects.filter(course_record__id=course_record_id)
                score_choices = StudyRecord.score_choices
                return render(request,'score.html',locals())
    
        def extra_url(self):
            temp = []
            temp.append(url(r'^record_score/(d+)', self.score))
            return temp 
        
        
       def record_score(self, obj=None, header=False):
            if header:
                return "录入成绩"
            return mark_safe("<a href='record_score/%s'>录入成绩</a>"%obj.pk)
    
       list_display = ["class_obj", 'day_num', "teacher", record, record_score ]

    score.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <link rel="stylesheet" href="">
        <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.css">
    </head>
    <body>
    
    <h3>录入成绩</h3>
    
    <div class="container">
        <div class="row">
            <div class="col-md-9 col-md-offset-1">
                <form action="" method="post">
                    {% csrf_token %}
                    <table class="table table-bordered table-striped">
                        <thead>
                        <tr>
                            <th>学生姓名</th>
                            <th>考勤</th>
                            <th>成绩</th>
                            <th>批语</th>
                        </tr>
                        </thead>
                        <tbody>
                            {% for study_record in study_record_list %}
                            <tr>
                                <td>{{ study_record.student }}</td>
                                <td>{{ study_record.get_record_display }}</td>
                                <td style=" 100px; padding: 5px 10px;">
                                    <select name="score_{{ study_record.pk }}" id="" class="form-control">
                                        {% for item in score_choices %}
                                            {% if study_record.score == item.0 %}
                                                <option selected value="{{ item.0 }}">{{ item.1 }}</option>
                                            {% else %}
                                                 <option value="{{ item.0 }}">{{ item.1 }}</option>
                                            {% endif %}
                                        {% endfor %}
                                    </select>
    
                                </td>
                                <td>
                                    <textarea name="homework_note_{{ study_record.pk }}" id="" cols="30" rows="3" class="form-control">{{ study_record.homework_note }}</textarea>
                                </td>
                            </tr>
                            {% endfor %}
    
                        </tbody>
                    </table>
                    <input type="submit" class="btn btn-default pull-right">
                </form>
            </div>
        </div>
    </div>
    
    
    </body>
    </html>

    六、查看成绩 - highcharts 

    知识点

     1. 查看成绩

    mark_safe("<a href='/stark/crm/student/score_view/%s'>查看成绩</a>"%obj.pk)

    2. 扩展url

    temp.append(url(r'^score_view/(d+)', self.score_view))

    3. get

    student = Student.objects.filter(pk=sid).first()
    class_list = student.class_list.all()

    4. request.is_ajax

    sid = request.GET.get('sid')
    cid = request.GET.get('cid')

    5. 跨表查询

    准备数据:[['day94', 85], ['day95', 85], ['day96', 60]]
    study_record_list = StudyRecord.objects.filter(student=sid,course_record__class_obj=cid)

    data_list = []
    for study_record in study_record_list:
    day_num = study_record.course_record.day_num
    data_list.append(["day%s"%day_num,study_record.score])

    print('----',data_list) # [['day94', 85], ['day95', 85], ['day96', 60]]

    6. JsonResponse()

    返回JsonResponse,非字典需要加上 safe = False
    return JsonResponse(data_list,safe=False)

    7. 前端

    注意:cid sid 用法; ajax 显示 highcharts 柱状图
    <a class="check_chart" cid="{{ cls.pk }}" sid="{{ student.pk }}">查看成绩</a>

    <div id="container" style=" 600px; height: 400px;"></div>
    
    <script type="text/javascript">
        $('.check_chart').click(function () {
            $.ajax({
                url:"",
                type:"get",
                data:{
                    cid:$(this).attr('cid'),
                    sid:$(this).attr('sid')
                },
                success:function (data) {
                    // 显示柱状图
                    var chart = Highcharts.chart('container', {
                        chart: {
                            type: 'column'
                        },
                        title: {
                            text: '查看学生每天的成绩'
                        },
                        subtitle: {
                            text: '数据截止 2017-03,来源: <a href="https://en.wikipedia.org/wiki/List_of_cities_proper_by_population">Wikipedia</a>'
                        },
                        xAxis: {
                            type: 'category',
                            labels: {
                                rotation: -45  // 设置轴标签旋转角度
                            }
                        },
                        yAxis: {
                            min: 0,
                            title: {
                                text: '分数'
                            }
                        },
                        legend: {
                            enabled: false
                        },
                        tooltip: {
                            pointFormat: '分数: <b>{point.y:.1f} </b>'
                        },
                        series: [{
                            name: '总人口',
                            data: data,
                            dataLabels: {
                                enabled: true,
                                rotation: -90,
                                color: '#FFFFFF',
                                align: 'right',
                                format: '{point.y:.1f}', // :.1f 为保留 1 位小数
                                y: 10
                            }
                        }]
                    });
                }
            })
    
        });
    
    </script>
    
    
    from django.http import JsonResponse
    class StudentConfig(ModelStark):
        def score_view(self,request,sid):
            if request.is_ajax():
                # print(request.GET)
                cid = request.GET.get('cid')
                sid = request.GET.get('sid')
    
                # 跨表查
                study_record_list = StudyRecord.objects.filter(student=sid,course_record__class_obj=cid)
    
                data_list = []
                for study_record in study_record_list:
                    day_num = study_record.course_record.day_num
                    data_list.append(["day%s"%day_num,study_record.score])
                    #  # [['day94', 85], ['day95', 85], ['day96', -1]]
                return JsonResponse(data_list,safe=False)
    
            else:
                student = Student.objects.filter(pk=sid).first()
                class_list = student.class_list.all()
                return render(request,'score_view.html', locals())
    
        def extra_url(self):
            temp = []
            temp.append(url(r"^score_view/(d+)",self.score_view))
            return temp
    
        def score_show(self, obj=None, header=False):
            if header:
                return "查看成绩"
            return mark_safe("<a href='score_view/%s'>查看成绩</a>"%obj.pk)
    
        list_display = ['customer','class_list',score_show]
        list_display_links = ['customer']
    
    
    site.register(Student,StudentConfig)

    crm/stark.py

    # -*- coding:utf-8 -*-
    
    from .models import *
    from stark.service.stark import site, ModelStark
    from django.utils.safestring import mark_safe
    from django.conf.urls import url
    from django.shortcuts import HttpResponse,reverse,redirect,render
    
    class DepartmentConfig(ModelStark):
        list_display = ['title', 'code']
    
    site.register(Department, DepartmentConfig)
    
    class UserInfoConfig(ModelStark):
        list_display = ["name", 'email', 'depart']
    
    site.register(UserInfo, UserInfoConfig)
    
    class ClassListConfig(ModelStark):
        def display_classname(self,obj=None,header=False):
            if header:
                return "班级名称"
            return "%s(%s)"%(obj.course.name, obj.semester)
    
        list_display = [display_classname, 'tutor', 'teachers']
    
    site.register(ClassList, ClassListConfig)
    
    class CustomerConfig(ModelStark):
        def display_course(self, obj=None, header=False):
            if header:
                return "咨询课程"
    
            temp = []
            for course in obj.course.all():
                temp.append("<a href='/stark/crm/customer/cancel_course/%s/%s' style='border:1px solid #369; padding:3px 6px;'><span>%s</span></a>&nbsp;"%(obj.pk,course.pk,course.name))
    
            return mark_safe("".join(temp))
    
        def cancel_course(self, request, customer_id, course_id):
            customer_obj = Customer.objects.filter(pk=customer_id).first()
            customer_obj.course.remove(course_id)
            return redirect(self.get_list_url())  # 重定向到当前表得查看页面
    
        def extra_url(self):
            temp = []
            temp.append(url(r'^cancel_course/(d+)/(d+)', self.cancel_course))
            return temp
    
        list_display = ["name", "gender",display_course ,"consultant"]
    
    site.register(Customer, CustomerConfig)
    
    
    class ConsultRecordConfig(ModelStark):
        list_display = ["customer", 'consultant','date','note']
    
    site.register(ConsultRecord, ConsultRecordConfig)
    
    
    from django.http import JsonResponse
    class StudentConfig(ModelStark):
        def score_view(self,request,sid):
            if request.is_ajax():
                # print(request.GET)
                cid = request.GET.get('cid')
                sid = request.GET.get('sid')
    
                # 跨表查
                study_record_list = StudyRecord.objects.filter(student=sid,course_record__class_obj=cid)
    
                data_list = []
                for study_record in study_record_list:
                    day_num = study_record.course_record.day_num
                    data_list.append(["day%s"%day_num,study_record.score])
                    #  # [['day94', 85], ['day95', 85], ['day96', -1]]
                return JsonResponse(data_list,safe=False)
    
            else:
                student = Student.objects.filter(pk=sid).first()
                class_list = student.class_list.all()
                return render(request,'score_view.html', locals())
    
        def extra_url(self):
            temp = []
            temp.append(url(r"^score_view/(d+)",self.score_view))
            return temp
    
        def score_show(self, obj=None, header=False):
            if header:
                return "查看成绩"
            return mark_safe("<a href='score_view/%s'>查看成绩</a>"%obj.pk)
    
        list_display = ['customer','class_list',score_show]
        list_display_links = ['customer']
    
    
    site.register(Student,StudentConfig)
    
    
    class CourseRecordConfig(ModelStark):
    
        def score(self,request, course_record_id):
            if request.method == "POST":
                print('post::::', request.POST)
                """
                <QueryDict: {'csrfmiddlewaretoken': ['muIrf7pwbxIueSJcKADRlZEGVbzzRZOaiGVkBV8DGYC2V9gmxZtyZgujddFtTojk'],
                'score_33': ['100'], 'homework_note_33': ['很好'], 
                'score_34': ['85'], 'homework_note_34': ['棒'],
                 'score_35': ['60'], 'homework_note_35': ['None']}>
                """
                data = {}  # data={"33":{"score":100,"homework_note":'xxx'},}
                for key,value in request.POST.items():
                    if key == "csrfmiddlewaretoken":continue
                    field, pk = key.rsplit('_', 1)
    
                    if pk in data:
                        data[pk][field] = value
                    else:
                        data[pk] = {field:value}
    
                print("data-->",data)
                """
                 {'33': {'score': '90', 'homework_note': '很好'}, 
                 '34': {'score': '80', 'homework_note': '帮帮哒'}, 
                 '35': {'score': '50', 'homework_note': '没问题'}}
    
                """
                for pk,update_data  in data.items():
                    StudyRecord.objects.filter(pk=pk).update(**update_data)
    
                return redirect(request.path)
    
            else:
                study_record_list = StudyRecord.objects.filter(course_record__id=course_record_id)
                score_choices = StudyRecord.score_choices
                return render(request,'score.html',locals())
    
        def extra_url(self):
            temp = []
            temp.append(url(r'^record_score/(d+)', self.score))
            return temp
    
        def record(self, obj=None, header=False):
            if header:
                return "学习记录"
            return mark_safe("<a href='/stark/crm/studyrecord/?course_record=%s'>记录</a>"%(obj.pk))
    
        def record_score(self, obj=None, header=False):
            if header:
                return "录入成绩"
            return mark_safe("<a href='record_score/%s'>录入成绩</a>"%obj.pk)
    
        list_display = ["class_obj", 'day_num', "teacher", record, record_score ]
    
        def patch_studyrecord(self,request,queryset):
            # print('queryset:--》',queryset)
            temp = []
            for course_record in queryset:
                # 与course_record 关联得班级对应得学生
                students_list = Student.objects.filter(class_list__id = course_record.class_obj.pk)
                for student in students_list:
                    student_obj = StudyRecord(course_record=course_record,student=student)
                    temp.append(student_obj)
    
            StudyRecord.objects.bulk_create(temp)
    
        actions = [patch_studyrecord]
        patch_studyrecord.short_description = "批量生成学习记录"
    
    
    site.register(CourseRecord,CourseRecordConfig)
    
    
    class StudyRecordConfig(ModelStark):
        list_display = ['student','course_record','record','score']
    
        def patch_late(self, request, queryset):
            queryset.update(record="late")
    
        patch_late.short_description = "迟到"
        actions = [patch_late]
    
    site.register(StudyRecord,StudyRecordConfig)
    
    site.register(Course)
    site.register(School)
    stark.py

    score_view.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.css">
        <script src="/static/js/jquery-1.12.4.min.js"></script>
        <script src="/static/chart/highcharts.js"></script>
    </head>
    <body>
    <h3>查看{{ student }}成绩</h3>
    
    <div class="container">
        <div class="row">
            <div class="col-md-9">
                <form action="">
                    <table class="table-bordered table table-striped">
                        <thead>
                        <tr>
                            <th>班级</th>
                            <th>班主任</th>
                            <th>任课老师</th>
                            <th>课程成绩</th>
                        </tr>
                        </thead>
                        <tbody>
                        {% for cls in class_list %}
                            <tr>
                                <td>{{ cls }}</td>
                                <td>{{ cls.tutor }}</td>
                                <td>
                                    {% for teacher in cls.teachers.all %}
                                        <span>{{ teacher }}</span>,
                                    {% endfor %}
    
                                </td>
                                <td>
                                    <a class="check_chart" cid="{{ cls.pk }}" sid="{{ student.pk }}">查看成绩</a>
                                </td>
                            </tr>
                        {% endfor %}
    
                        </tbody>
                    </table>
                </form>
            </div>
        </div>
    
    </div>
    
    <div id="container" style=" 600px; height: 400px;"></div>
    
    <script type="text/javascript">
        $('.check_chart').click(function () {
            $.ajax({
                url:"",
                type:"get",
                data:{
                    cid:$(this).attr('cid'),
                    sid:$(this).attr('sid')
                },
                success:function (data) {
                    // 显示柱状图
                    var chart = Highcharts.chart('container', {
                        chart: {
                            type: 'column'
                        },
                        title: {
                            text: '查看学生每天的成绩'
                        },
                        subtitle: {
                            text: '数据截止 2017-03,来源: <a href="https://en.wikipedia.org/wiki/List_of_cities_proper_by_population">Wikipedia</a>'
                        },
                        xAxis: {
                            type: 'category',
                            labels: {
                                rotation: -45  // 设置轴标签旋转角度
                            }
                        },
                        yAxis: {
                            min: 0,
                            title: {
                                text: '分数'
                            }
                        },
                        legend: {
                            enabled: false
                        },
                        tooltip: {
                            pointFormat: '分数: <b>{point.y:.1f} </b>'
                        },
                        series: [{
                            name: '总人口',
                            data: data,
                            dataLabels: {
                                enabled: true,
                                rotation: -90,
                                color: '#FFFFFF',
                                align: 'right',
                                format: '{point.y:.1f}', // :.1f 为保留 1 位小数
                                y: 10
                            }
                        }]
                    });
                }
            })
    
        });
    
    </script>
    
    </body>
    </html>
    score_view.html
  • 相关阅读:
    网络基础 HTTP协议之http url简介
    MySql 简单统计查询消耗时间脚本
    Java java jdk在Linux下安装与环境变量的配置
    MySql 正则表达式简介及使用
    MySql UNIX_TIMESTAMP和FROM_UNIXTIME函数讲解
    MySql 定时任务的使用
    MySql 利用crontab实现MySql定时任务
    MySql 利用mysql&mysqldum导入导出数据
    排错-windows平台下访问oracle em出现空白的解决方法
    Oracle 修改oracle数据库名
  • 原文地址:https://www.cnblogs.com/alice-bj/p/9233130.html
Copyright © 2011-2022 走看看