zoukankan      html  css  js  c++  java
  • 自定义组件之crm的业务逻辑

    我们先在app01下的models中添加crm需要用的表。然后数据库迁移,要记得在app01下 的stark将这几张表注册,不然不能进入访问后台。

    录入数据之前,我们先来说几个知识点,

    在models表中,有这样几个字段,

    一对多字段和多对多字段在使用modelform的时候,会在页面上渲染成select标签,而select标签会显示各自关联表下的所有数据,而 limit_choices_to={"depart_id__in":[100,101,]}  的作用就是限制选项,只显示{"depart_id__in":[100,101,]}  符合条件的选项。所以 limit_choices_to只有在使用modelform中使用。

    还有一个知识点:get_gender_display()

      性别字段中,choices选项在数据库中存的是1,2.

    但是我们需要显示的是男,女,就要用到get_gender_display()。

    然后录入数据,先录入department表的数据,然后录入userinfo表的数据。

    然后我们访问classlist表,添加一些自定义的字段:

    同理在其他表中也添加一些我们想要的字段,

     然后我们想在customer表中,显示性别,我们在list_display中加上gender这个字段,但是显示出来的是1 ,2,这个1,2是保存在数据库中的值,并不是我们想要的 。

    这是因为,model中的gender字段

    ,所以这就要我们通过自定义列来显示性别。

    然后我们想在customer表中添加一列,咨询课程,以a标签的形式显示,同样是自定义列:

    我们进入classstudyrecord表,现在有这样一个需求,就是在我们选中某个班时,就能够创建出这个班的学生学习相关信息。这就是一个批量操作

    现在我们在classstudyrecord表中建一个自定义列,查看信息,当我们点击查看信息的时候,就跳转到相应的studentstudyrecord表中查看信息,

    我们进入StudentStudyRecord表,想要显示出勤和成绩的列还是要通过自定义列来显示自己想要的,

     这样写应该是不对的因为当我们访问这张表的时候,出勤和成绩是我们可以操作进行选择的,有两种方式,一种是批量操作,就是选中之后,批量对他们进行赋值,另一种是做成select标签的形式每一个都能进行选择。

    我们先来写第一种:

    第二种,

    这就select标签就做成了,但是这样只实现了在页面中可以编辑 ,但是在数据库中并没有改动。接下来应该怎么做?

    有两个思路:

    第一种是我们选中完出情况后,点击保存按钮然后保存到数据库中,另一种是当我们选中完一个就发送ajax请求将他保存到数据库中。这里发送ajax请求比较简单。

    先来说发送ajax请求,我们发送ajax请求时的那个url怎么设计呢?当我们选中某个学生的出勤情况后向这个url发送请求  /stark/app01/studentstudyrecord/1/edit_record , 这是我们设计的一个新的url,我们只希望给studentstudyrecord表加这么一个url,别的表不加,应该怎么做。我们来学习一个额外创建url的方法。

     我们在stark组件的sites文件中加上这么一个方法。

    然后我们再自定义配置类中添加extra_url方法:

    这样就单独给studentstudyrecord表添加了一个url。然后就是给出勤绑定ajax请求了,当我们鼠标选中的时候就在数据库中做更改操作,这是一个change事件。

     那么这个ajax应该写在哪里?应该写在list.html中。

    在数据库的更改操作:

    另外一种方法我们在录入成绩的时候说。

    接下来我们写录入成绩部分:

    进入classstudyrecor表,我们要写一个录入成绩的自定义列,

    现在我们的需求是,当我们点击录入成绩,就能够进入相应的班级的学生学习记录进行录入成绩。

    这就要我们有新的url了。我们想要把url设计成这样:/stark/app01/classstudyrecord/1/record_score/,所以这就又要我们创建新的url了,所以在classstudyrecord表中添加方法,

    接下来我们就来处理页面了,先来想一想页面中要显示哪些内容?

     接下来就是成绩的录入了,同样使用两种方式,一种是ajax,一种就是form进行提交。

    第一种:ajax

     

    第二种:from表单 ,利用form表单,标签中就要有name。

    当我们点击提交的时候,request.post会取nam对应的value值,

    但是这样会影响效率,因为每循环一次都要去数据库里面查一次,所以我们需要重新构建一下数据的结构。

    我们把数据构建成这样的,update数据库的时候,直接更新 {score:50,homework_note:12323} 多个字段就行了。

    这样就做好了。

    上面说的这些都是我们管理员才有的权限,学生是没有的,但当我们学生查看成绩的时候,我们在student表中添加一个自定义列。

    我们进入学生表,

    然后就是当我们点击查看成绩的时候,会出现这人的在这个班的每天的成绩情况,我们以柱状图的形式展现出来。这里用到了一个highcharts的工具,是专门用来作图的。

    先下载,然后只需要将里面的code文件复制过来就行,然后再页面上引用。

    当我们点击查看成绩的时候,发送ajax请求:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.css">
        <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
    </head>
    <body>
    <div class="container">
        <div class="row">
            <div class="col-md-10 col-md-offset-1">
                <div class="panel panel-success">
                    <div class="panel-heading">
                        <h3 class="panel-title" style="font-weight: bolder">{{ student_obj }}个人信息</h3>
                    </div>
                    <div class="panel-body"></div>
                            <table class="table table-hover">
                            <thead>
                            <tr>
                                <th>序号</th>
                                <th>班级名称</th>
                                <th>任课老师</th>
                                <th>班主任</th>
                                <th>查看成绩</th>
                            </tr>
                            </thead>
                            <tbody>
                                {% for clas in class_list %}
                                    <tr>
                                        <th scope="row">{{ forloop.counter }}</th>
                                        <td>{{ clas }}</td>
                                        <td>{{ clas.tutor }}</td>
                                        {% for teacher in clas.teachers.all %}
                                            <td>{{ teacher }}</td>
                                        {% endfor %}
                                        <td><a sid='{{ student_obj.pk }}'cid="{{ clas.pk }}" href="javascript:void(0)" class="score_chart">查看成绩</a></td>
                                    </tr>
                                {% endfor %}
                            </tbody>
                        </table>
                    </div>
                </div>
            </div>
        </div>
    </div>
    
    <div class="col-md-4 col-md-offset-4" id="score_chart" style="600px;height:400px;"></div>
    <script src="/static/code/highcharts.js"></script>
    <script>
        $('.score_chart').click(function () {
            var cid = $(this).attr('cid');
            $.ajax({
                url:'',
                type:'get',
                data:{
                    cid:cid,
                },
                success:function (data) {
                    var chart = Highcharts.chart('score_chart', {
                chart: {
                    type: 'column'
                },
                title: {
                    text: '成绩'
                },
                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>

  • 相关阅读:
    Linux软件安装管理之——dpkg与apt-*详解 apt命令(dpkg和apt代替rpm)
    Linux软件安装管理之——dpkg与apt-*详解
    Linux 系统中如何查看日志 (常用命令) tail -f
    /var/log/syslog日志usb接口
    wmctrl像xmonad那样方便地用快捷键来控制任务窗口的显示
    dpkg -S {file} #ubuntu 14.04 rpm -qf {file} #centos 7
    ubuntu查看已安装软件包信息的方法
    监视器-能看到一般用户的进程号
    AES加密工具类
    《学习opencv》笔记——矩阵和图像操作——cvSum,cvSVD,cvSVBkSb,cvTrace,cvTranspose,cvXor,cvXorS and cvZero
  • 原文地址:https://www.cnblogs.com/yb635238477/p/9601284.html
Copyright © 2011-2022 走看看