zoukankan      html  css  js  c++  java
  • Echarts通过Ajax异步加载数据

    绑定数据的方式有两种,一种是写写好一些图表参数,然后数据留空,然后在异步读取数据的时候,绑定数据。还有一种就是直接异步读取数据的时候同时设置图表参数和数据绑定。

    数据源准备

    通过接口获取数据并返回json数据 

    def get_all_enroll_data(request):
        course_dict = {
            '0': 'Python全栈',
            '1': 'Java',
            '2': '前端',
            '3': 'Go语言',
            '4': '软件测试',
            '5': '运维',
            '6': '产品经理'
        }
        query = '''
        SELECT
            COUNT(*) as "value"
        FROM
            CRM_customerinfo 
        WHERE
            delete_flag = 0 
            AND pub_private = 1 
            AND `status` = 1 
            AND consult_courses=%s;
        '''
        data_list = []
        from django.db import connection
        with connection.cursor() as cursor:
            for i in range(7):
                data = {"name": "", "value": ""}
                cursor.execute(query, params=[i])
                rows = cursor.fetchone()
                data["name"] = course_dict[str(i)]
                data["value"] = rows[0]
                data_list.append(data)
        return JsonResponse({"allCustomerChartData": {"data": data_list})

    返回数据:
    [
      {'name': 'Python全栈', 'value': 4},
      {'name': 'Java', 'value': 7},
      {'name': '前端', 'value': 5},
      {'name': 'Go语言', 'value': 21},
      {'name': '软件测试', 'value': 8},
      {'name':lue': 7},
      {'name': '产品经理', 'value': 6}
    ]

    前端页面编写

    引入相关js文件

    <script src="./js/jquery-1.11.3.js"></script>
    <script src="./js/echarts.common.min.js"></script>

    定义Echarts展示的div块

     <div id="main" style=" 1000px;height:600px;"></div>

     原生的图表script

    <script type="text/javascript">
    // 基于准备好的dom,初始化echarts实例
    var myChart = echarts.init(document.getElementById('main'));

    myChart.setOption(
    {
    tooltip: {
    trigger: 'item'
    },
    legend: {
    top: '5%',
    left: 'center'
    },
    series: [
    {
    name: '科目报名人数',
    type: 'pie',
    radius: ['40%', '70%'],
    avoidLabelOverlap: false,
    label: {
    show: false,
    position: 'center'
    },
    emphasis: {
    label: {
    show: true,
    fontSize: '40',
    fontWeight: 'bold'
    }
    },
    labelLine: {
    show: false
    },
    data: [
    {value: 1048, name: 'Python全栈'},
    {value: 735, name: 'Java'},
    {value: 580, name: '前端'},
    {value: 484, name: 'Go语言'},
    {value: 300, name: '软件测试'},
    {value: 200, name: '运维'},
    {value: 350, name: '产品经理'}
    ]
    }
    ]
    }
    )
    </script>

    上面的数据是固定的,那怎么样才能根据接口返回的数据进行变化呢,下面贴出我的代码,有注释

    <script type="text/javascript">
    // 基于准备好的dom,初始化echarts实例
    // 指定图表的配置项和数据
    var allCustomerChart = echarts.init(document.getElementById('allCustomer'));

    var allCustomerChart_option = {
    tooltip: {
    trigger: 'item'
    },
    legend: {
    top: '5%',
    left: 'center'
    },
    series: [
    {
    name: '科目报名人数',
    type: 'pie',
    radius: ['40%', '70%'],
    avoidLabelOverlap: false,
    label: {
    show: false,
    position: 'center'
    },
    emphasis: {
    label: {
    show: true,
    fontSize: '40',
    fontWeight: 'bold'
    }
    },
    labelLine: {
    show: false
    },
    data: [
    {value: 1048, name: 'Python全栈'},
    {value: 735, name: 'Java'},
    {value: 580, name: '前端'},
    {value: 484, name: 'Go语言'},
    {value: 300, name: '软件测试'},
    {value: 200, name: '运维'},
    {value: 350, name: '产品经理'}
    ]
    }
    ]
    };

    // Ajax异步加载
    getChart();
    function getChart(){
    var allCustomerChartData = []
    allCustomerChart.showLoading(); // 加载数据时展示 loading 图案
    $.ajax({
            type:"GET",
            url:"/get_all_enroll_data/", // 请求接口
            dataType:"json",
    async:true,
            success:function(data){
    console.log(data);
    allCustomerChart.hideLoading(); //加载完毕后隐藏 loading 图案
    var dataStage = data.allCustomerChartData.data; // 这里 dataStage 是我们后台返回的数据,json 格式
    for(var i in dataStage) {
    var statisticsObj = {name:'',value:''}; //因为 ECharts 里边需要的的数据格式是这样的
    statisticsObj.name = dataStage[i].name;
    statisticsObj.value = dataStage[i].value;
    allCustomerChartData.push(statisticsObj); // 把拿到的异步数据 push 进自己建的数组里
    }
    console.log(allCustomerChartData);
              // 根据自定义需要设置 setOption,这里只需要配置 series 里面的 具体数据
    allCustomerChart.setOption({
    series: [
    {
    name: '科目报名人数',
    type: 'pie',
    radius: ['40%', '70%'],
    avoidLabelOverlap: false,
    label: {
    show: false,
    position: 'center'
    },
    emphasis: {
    label: {
    show: true,
    fontSize: '40',
    fontWeight: 'bold'
    }
    },
    labelLine: {
    show: false
    },
    data: allCustomerChartData // 加载在图表上的数据
    }
    ]
    });
            },
            error:function(data){
               alert("发生错误!");
            }
    });
    }
    allCustomerChart.setOption(allCustomerChart_option); // 再次 setOption,将上面重新赋值数据的 series 替换 allCustomerChart_option 中的serie,然后setOptions
    </script>

    这样就完成了,你修改数据库的数据,前端图表就根据接口返回做响应变化啦

  • 相关阅读:
    内置对象
    Angular 动画
    Angular_上拉刷新
    angular Observable
    【Nginx】nginx为目录或网站加上密码认证
    MongoDB笔记
    websocket服务器+客户端
    cli 中php的配置和phpinfo不一样
    linux设置时区和自动同步时间
    crontab & php实现多进程思路
  • 原文地址:https://www.cnblogs.com/DeryKong/p/14554033.html
Copyright © 2011-2022 走看看