自定义组件之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="width: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>

原文地址:https://www.cnblogs.com/yb635238477/p/9601284.html

时间: 2024-07-31 04:02:22

自定义组件之crm的业务逻辑的相关文章

提示框的优化之自定义Toast组件之(二)Toast组件的业务逻辑实现

在java下org.socrates.mydiary.activity下LoginActivity下自定义一个方法showCustomerToast() ? 1 public class LoginActivity extends AppCompatActivity { 2 private void showCustomerToast(final int icon, final String message){ 3 LayoutInflater inflater=getLayoutInflate

让驰骋工作流程引擎 ccbpm使用自定义表单来实现自己的业务逻辑.

1.1.1.1: SDK表单 概要说明:我们把流程引擎与表单引擎统称为ccbpm,但是有一些用户并不想使用表单引擎,而是用自己的表单,仅仅使用流程引擎,这样的方式就要采用ccbpm的sdk表单开发模式. 关于ccbpm的SDK: ccbpm的sdk就是ccbpm把对流程的所有操作,都放入了一个类的一些静态方法里,这些方法涉及到了流程操作的各个方面. 这个类的名称为: BP.WF.Dev2Interface.* 如下图: 对于菜单有关的方法: 获取发起列表.待办.在途.抄送...... 对于流程的

项目架构开发:业务逻辑层之领域驱动失血模型

前边我们构建了个数据访问层,功能虽然简单,但是基本够用了.传送门:项目架构开发:数据访问层 这次我们构建业务逻辑层 业务逻辑是一个项目.产品的核心,也是现实世界某种工作流程在代码层面的体现. 所以,业务逻辑的合理组织构造,或更真实地反映现实业务操作,对项目的成功与否非常重要 现在业界对业务逻辑层的开发,一般会参考Martin Fowler大师提出来的针对业务层开发的四种模式 分别是面向过程的事务脚本.表模块模式,面向对象的活动记录与领域开发模式 我们要做的就是领域驱动开发模式,注意标题中的“失血

第15课 用户界面与业务逻辑的分离

1. 界面与逻辑 (1)用户界面模块(UI):接受用户输入及呈现数据 (2)业务逻辑模块(Business Logic):根据用户需求处理数据 2.用户界面与业务逻辑的交互 2.1 基本设计原则 (1)功能模块之间需要进行解耦 (2)核心思想:强内聚.弱耦合 ①每个模块应该只实现单一的功能 ②模块内部的子模块只为整体的单一功能而存在 ③模块之间通过约定好的接口进行交互 2.2 工程开发中的“接口” (1)广义:接口是一种契约(协议.语法.格式等) (2)狭义: ①面向过程:接口是一组预定义的函数

在 ASP.NET 中创建数据访问和业务逻辑层(转)

.NET Framework 4 当在 ASP.NET 中处理数据时,可从使用通用软件模式中受益.其中一种模式是将数据访问代码与控制数据访问或提供其他业务规则的业务逻辑代码分开.在此模式中,这两个层均与表示层分离.表示层由网站用户有权查看或更改数据的页面组成. ASP.NET 可通过多种方式提供数据访问.业务逻辑和表示形式之间的分离.例如,数据源模型(包括 LinqDataSource 和 ObjectDataSource 等服务器控件)可将表示层与数据访问代码和业务逻辑分离. 另一种模式是将数

Flex自定义组件开发 - jackyWHJ

一般情况下需要组件重写都是由于以下2个原因: 1.在FLEX已有组件无法满足业务需求,或是需要更改其可视化外观等特性时,直接进行继承扩展. 2.为了模块化设计或进一步重用,需要对FLEX组件进行组合. 而Flex组件开发有2种方式: AS方式和MXML方式.对于上述第一个原因我一般采用AS方式,通过继承 UIComponent来开发,而针对原因2我一般使用的是 MXML方式.本文主要讲的是AS开发方式. 重写一个组件依次调用的方法 : 1)Constructor构造方法,初始化属性,默认值 在这

Android自定义组件系列【5】——进阶实践(1)

简介 项目开发中发现问题.解决问题这个过程中会出现很多问题,比如重复出现.某个问题的遗留,这些问题的本质就是设计模式.今天记录设计模式的知识点. 内容 在java以及其他的面向对象设计模式中,类与类之间主要有6种关系,他们分别是:依赖.关联.聚合.组合.继承.实现.它们的耦合度依次增强. 依赖关系:对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务时,这两个对象之间主要体现为依赖关系.关联关系:分为单向关联和双向关联.在java中,单向关联表现为:类A当中使用了

开源|宜信开源专注业务逻辑的轻量级服务框架nextsystem4

宜信于2019年3月29日正式开源nextsystem4(以下简称"NS4")系列模块. 此次开源的NS4系列模块是围绕当前支付系统笨重.代码耦合度高.维护成本高而产生的分布式业务系统解决方案.NS4系列框架允许创建复杂的流程/业务流,对于业务服务节点的实现可串联,可分布式.其精简.轻量,实现了"脱容器"(不依赖tomcat.jetty等容器)独立运行.NS4系列框架的设计理念是将业务和逻辑进行分离,开发人员只需通过简单的配置和业务实现就可以实现逻辑复杂.性能高效.

【ExtJS】自定义组件datetimefield(一)

目的: ExtJS中提供了下拉日期选择控件Ext.form.field.Date与下拉时间选择控件Ext.form.field.Time.不过没有一个在选择日期时选择时间的控件datetimefield.目的就是运用自定义组件的方法,来扩展下拉日期选择控件Ext.form.field.Date,在下拉框中添加时间选择的组件.目标效果: 第一步:继承Ext.picker.Date,创建My.picker.DateTime类 1 Ext.define('My.picker.DateTime', {