Echarts与.net后端动态交互

1.效果图

2.使用技术

  @1.Echarts模块化引入开发。

  官方地址:http://echarts.baidu.com/echarts2/doc/doc.html#%E5%BC%95%E5%85%A5ECharts1

  博主地址:https://blog.csdn.net/danielinbiti/article/details/44560075

  @2 .net后端查询数据(oracle)到前端,前端解析

3.前端代码

@{
    ViewBag.Title = "tradecount";
}
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    @Scripts.Render("~/Scripts/jquery-1.11.2-min.js")
    @Scripts.Render("~/Common/echarts/echarts.js")
    <style>
        .my_table {
            /*border-spacing: 0;
            border: solid 10px #257ad4;*/
            padding: 0;
            margin: 0;
            width: 94%;
            height: 100%;
            margin-top: 40px;
            margin-left: 50px;
            margin-right: 50px;
        }
    </style>
    <title>交易量</title>
</head>
<body>
    <div class="page-container">
        <table border="0" class="my_table">
            <colgroup style="width:50%"></colgroup>
            <colgroup style="width:50%"></colgroup>
            <tr>
                <td style="height:50%;border:solid 10px #fff;">
                    <div id="et_pie" style="width:100%;height:100%;"></div>
                </td>
                <td style="height:50%;border:solid 10px #fff;">
                    <div id="et_pie1" style="width:100%;height:100%;"></div>
                </td>
            </tr>
            <tr>
                <td style="height:50%;padding-top:10px;border:solid 10px #fff;">
                    <div id="et_bar" style="width:100%;height:100%;"></div>
                </td>
                <td style="height:50%;padding-top:10px;border:solid 10px #fff;">
                    <div id="et_line" style="width:100%;height:100%;"></div>
                </td>
            </tr>
        </table>
    </div>

    <script>
        $(function () {
            require.config({
                paths: {
                    echarts: '../Common/echarts/'

                }
            });

            require(
                [
                    'echarts',
                    'echarts/theme/macarons',
                    'echarts/chart/bar',
                    'echarts/chart/line',
                    'echarts/chart/pie'
                ], function (ec) {

                    var pieChart = ec.init(document.getElementById('et_pie'));
                    $.ajax({
                        url: '@Url.Action("TradeCount", "PersonalContract")',
                        type: 'post',
                        data: { type: "pie"} ,
                        async: true,
                        dataType: 'json',
                        success: function (result) {
                            //console.log(result);
                            var res = JSON.parse(result);
                            pieChart.setOption({
                                theme: "macarons",
                                title: {
                                    text: '当月交易情况',
                                    x: 'center'
                                },
                                tooltip: {
                                    trigger: 'item',
                                    formatter: "{a} <br/>{b} : {c} ({d}%)"
                                },
                                legend: {
                                    orient: 'vertical',
                                    x: 'left',
                                    data: ['中介交易', '个人交易']
                                },

                                calculable: true,
                                series: [
                                    {
                                        name: '访问来源',
                                        type: 'pie',
                                        radius: '55%',
                                        center: ['50%', '60%'],
                                        data: res
                                    }
                                ]
                            })
                            pieChart.setTheme('macarons');
                        }
                    })


                    var pieChart1 = ec.init(document.getElementById('et_pie1'));
                    $.ajax({
                        url: '@Url.Action("TradeCount", "PersonalContract")',
                        type: 'post',
                        data: { type: "pie1"} ,
                        async: true,
                        dataType: 'json',
                        success: function (result) {
                            //console.log(result);
                            var res = JSON.parse(result);
                            pieChart1.setOption({
                                theme: "macarons",
                                title: {
                                    text: '当日交易情况',
                                    x: 'center'
                                },
                                tooltip: {
                                    trigger: 'item',
                                    formatter: "{a} <br/>{b} : {c} ({d}%)"
                                },
                                legend: {
                                    orient: 'vertical',
                                    x: 'left',
                                    data: ['中介交易', '个人交易']
                                },

                                calculable: true,
                                series: [
                                    {
                                        name: '访问来源',
                                        type: 'pie',
                                        radius: '55%',
                                        center: ['50%', '60%'],
                                        data: res
                                    }
                                ]
                            })
                            pieChart1.setTheme('macarons');
                        }
                    })


                    var bar = ec.init(document.getElementById('et_bar'));
                    $.ajax({
                        url: '@Url.Action("TradeCount", "PersonalContract")',
                        type: 'post',
                        data: { type: "bar"} ,
                        async: true,
                        dataType: 'json',
                        success: function (result) {
                            console.log(result);
                            var res = JSON.parse(result);
                            bar.setOption({
                                theme: "macarons",
                                title: {
                                    text: '今年每月交易情况',
                                    x: 'center'
                                },
                                tooltip: {
                                    trigger: 'axis'
                                },
                                legend: {
                                    y: 'bottom',
                                    data: ['中介交易', '个人交易']
                                },

                                calculable: true,
                                xAxis: [
                                    {
                                        type: 'category',
                                        data: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']
                                    }
                                ],
                                yAxis: [
                                    {
                                        type: 'value'
                                    }
                                ],
                                series: [
                                    {
                                        name: '中介交易',
                                        type: 'bar',
                                        data: res.agency,
                                        markPoint: {
                                            data: [
                                                { type: 'max', name: '最大值' },
                                                { type: 'min', name: '最小值' }
                                            ]
                                        },
                                        markLine: {
                                            data: [
                                                { type: 'average', name: '平均值' }
                                            ]
                                        }
                                    },
                                    {
                                        name: '个人交易',
                                        type: 'bar',
                                        data: res.personal,
                                        markPoint: {
                                            data: [
                                                { type: 'max', name: '最大值' },
                                                { type: 'min', name: '最小值' }
                                            ]
                                        },
                                        markLine: {
                                            data: [
                                                { type: 'average', name: '平均值' }
                                            ]
                                        }
                                    }
                                ]
                            })
                            bar.setTheme('macarons');
                        }
                    })

                    var chartLine = ec.init(document.getElementById('et_line'));
                    $.ajax({
                        url: '@Url.Action("TradeCount", "PersonalContract")',
                        type: 'post',
                        data: { type: "line"} ,
                        async: true,
                        dataType: 'json',
                        success: function (result) {
                            //console.log(result);
                            var res = JSON.parse(result);
                            chartLine.setOption({
                                theme: "macarons",
                                title: {
                                    text: '最近两周交易情况',
                                    x: 'center'
                                },
                                tooltip: {
                                    trigger: 'axis'
                                },
                                legend: {
                                    y: 'bottom',
                                    data: ['本周', '上周']
                                }, 
                                calculable: true,
                                xAxis: [
                                    {
                                        type: 'category',
                                        boundaryGap: false,
                                        data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
                                    }
                                ],
                                yAxis: [
                                    {
                                        type: 'value'
                                    }
                                ],
                                series: [
                                    {
                                        name: '本周',
                                        type: 'line',
                                        stack: '总量',
                                        data: res.ThisWeek
                                    },
                                    {
                                        name: '上周',
                                        type: 'line',
                                        stack: '总量',
                                        data: res.LastWeek
                                    }
                                ]
                            })
                            chartLine.setTheme('macarons');
                        }
                    })
                }
            );
        });

        $(function () {
            $(".page-container").height($(window).height() - 80);

            $(window).resize(function () {
                setTimeout(function () {
                    $(".page-container").height($(window).height() - 80);
                    //$.loading($(".main"));
                }, 0);
            }).trigger("resize");
        });

    </script>
</body>

4.后端代码

  业务层

using DbService;
using Frame.Base;
using Frame.Model;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Odbc;
using System.Linq;
using System.Text;

namespace Frame.Business.PersonalContract
{
    public class Contract_TradeCount : XT_CONTRACT
    {
        public static DataTable GetDataTable(String flg)
        {
            var db = BaseOperate.CreateDatabase();
            try
            {
                if (flg.Equals("1"))
                {
                    var sql = new Sql("select count(*) as total,'中介交易' as name from XT_CONTRACT  where MEDIATION_PERSON=1 and to_char(CREATE_TIME,'mm')=to_char(sysdate,'mm')" +
                    " union all select count(*) as total,'个人交易'as name from XT_CONTRACT  where MEDIATION_PERSON=0 and to_char(CREATE_TIME,'mm')=to_char(sysdate,'mm')");
                    var dbo = db.Query4DataTable(sql.SQL);
                    return dbo;
                }
                else if(flg.Equals("2"))
                {
                    var sql = new Sql("select count(*) as total,'中介交易' as name from XT_CONTRACT  where MEDIATION_PERSON=1 and trunc(CREATE_TIME)=trunc(sysdate)" +
                    " union all select count(*) as total,'个人交易'as name from XT_CONTRACT  where MEDIATION_PERSON=0 and trunc(CREATE_TIME)=trunc(sysdate)");
                    var dbo = db.Query4DataTable(sql.SQL);
                    return dbo;
                }
                else if (flg.Equals("3"))
                {
                    var sql = new Sql("SELECT DECODE(SUM(DECODE(TO_CHAR(CREATE_TIME, 'MM'), '01', A_AREA, 0)),0,0,count(DECODE(TO_CHAR(CREATE_TIME, 'MM'), '01', A_AREA, 0))) M1,"  
                         +" DECODE(SUM(DECODE(TO_CHAR(CREATE_TIME, 'MM'), '02', A_AREA, 0)), 0, 0, count(DECODE(TO_CHAR(CREATE_TIME, 'MM'), '02', A_AREA, 0))) M2,"
                         + " DECODE(SUM(DECODE(TO_CHAR(CREATE_TIME, 'MM'), '03', A_AREA, 0)), 0, 0, count(DECODE(TO_CHAR(CREATE_TIME, 'MM'), '03', A_AREA, 0))) M3,"
                         + " DECODE(SUM(DECODE(TO_CHAR(CREATE_TIME, 'MM'), '04', A_AREA, 0)), 0, 0, count(DECODE(TO_CHAR(CREATE_TIME, 'MM'), '04', A_AREA, 0))) M4,"
                         + " DECODE(SUM(DECODE(TO_CHAR(CREATE_TIME, 'MM'), '05', A_AREA, 0)), 0, 0, count(DECODE(TO_CHAR(CREATE_TIME, 'MM'), '05', A_AREA, 0))) M5,"
                         + " DECODE(SUM(DECODE(TO_CHAR(CREATE_TIME, 'MM'), '06', A_AREA, 0)), 0, 0, count(DECODE(TO_CHAR(CREATE_TIME, 'MM'), '06', A_AREA, 0))) M6,"
                         + " DECODE(SUM(DECODE(TO_CHAR(CREATE_TIME, 'MM'), '07', A_AREA, 0)), 0, 0, count(DECODE(TO_CHAR(CREATE_TIME, 'MM'), '07', A_AREA, 0))) M7,"
                         + " DECODE(SUM(DECODE(TO_CHAR(CREATE_TIME, 'MM'), '08', A_AREA, 0)), 0, 0, count(DECODE(TO_CHAR(CREATE_TIME, 'MM'), '08', A_AREA, 0))) M8,"
                         + " DECODE(SUM(DECODE(TO_CHAR(CREATE_TIME, 'MM'), '09', A_AREA, 0)), 0, 0, count(DECODE(TO_CHAR(CREATE_TIME, 'MM'), '09', A_AREA, 0))) M9,"
                         + " DECODE(SUM(DECODE(TO_CHAR(CREATE_TIME, 'MM'), '10', A_AREA, 0)), 0, 0, count(DECODE(TO_CHAR(CREATE_TIME, 'MM'), '10', A_AREA, 0))) M10,"
                         + " DECODE(SUM(DECODE(TO_CHAR(CREATE_TIME, 'MM'), '11', A_AREA, 0)), 0, 0, count(DECODE(TO_CHAR(CREATE_TIME, 'MM'), '11', A_AREA, 0))) M11,"
                         + " DECODE(SUM(DECODE(TO_CHAR(CREATE_TIME, 'MM'), '12', A_AREA, 0)), 0, 0, count(DECODE(TO_CHAR(CREATE_TIME, 'MM'), '12', A_AREA, 0))) M12," +
                         "'个人交易' as name "
                         + " FROM XT_CONTRACT"
                         + " WHERE MEDIATION_PERSON=0 and TO_CHAR(CREATE_TIME, 'yyyy') = TO_CHAR(sysdate, 'yyyy')" +
                         " union all " +
                         " SELECT DECODE(SUM(DECODE(TO_CHAR(CREATE_TIME, 'MM'), '01', A_AREA, 0)),0,0,count(DECODE(TO_CHAR(CREATE_TIME, 'MM'), '01', A_AREA, 0))) M1,"
                         + " DECODE(SUM(DECODE(TO_CHAR(CREATE_TIME, 'MM'), '02', A_AREA, 0)), 0, 0, count(DECODE(TO_CHAR(CREATE_TIME, 'MM'), '02', A_AREA, 0))) M2,"
                         + " DECODE(SUM(DECODE(TO_CHAR(CREATE_TIME, 'MM'), '03', A_AREA, 0)), 0, 0, count(DECODE(TO_CHAR(CREATE_TIME, 'MM'), '03', A_AREA, 0))) M3,"
                         + " DECODE(SUM(DECODE(TO_CHAR(CREATE_TIME, 'MM'), '04', A_AREA, 0)), 0, 0, count(DECODE(TO_CHAR(CREATE_TIME, 'MM'), '04', A_AREA, 0))) M4,"
                         + " DECODE(SUM(DECODE(TO_CHAR(CREATE_TIME, 'MM'), '05', A_AREA, 0)), 0, 0, count(DECODE(TO_CHAR(CREATE_TIME, 'MM'), '05', A_AREA, 0))) M5,"
                         + " DECODE(SUM(DECODE(TO_CHAR(CREATE_TIME, 'MM'), '06', A_AREA, 0)), 0, 0, count(DECODE(TO_CHAR(CREATE_TIME, 'MM'), '06', A_AREA, 0))) M6,"
                         + " DECODE(SUM(DECODE(TO_CHAR(CREATE_TIME, 'MM'), '07', A_AREA, 0)), 0, 0, count(DECODE(TO_CHAR(CREATE_TIME, 'MM'), '07', A_AREA, 0))) M7,"
                         + " DECODE(SUM(DECODE(TO_CHAR(CREATE_TIME, 'MM'), '08', A_AREA, 0)), 0, 0, count(DECODE(TO_CHAR(CREATE_TIME, 'MM'), '08', A_AREA, 0))) M8,"
                         + " DECODE(SUM(DECODE(TO_CHAR(CREATE_TIME, 'MM'), '09', A_AREA, 0)), 0, 0, count(DECODE(TO_CHAR(CREATE_TIME, 'MM'), '09', A_AREA, 0))) M9,"
                         + " DECODE(SUM(DECODE(TO_CHAR(CREATE_TIME, 'MM'), '10', A_AREA, 0)), 0, 0, count(DECODE(TO_CHAR(CREATE_TIME, 'MM'), '10', A_AREA, 0))) M10,"
                         + " DECODE(SUM(DECODE(TO_CHAR(CREATE_TIME, 'MM'), '11', A_AREA, 0)), 0, 0, count(DECODE(TO_CHAR(CREATE_TIME, 'MM'), '11', A_AREA, 0))) M11,"
                         + " DECODE(SUM(DECODE(TO_CHAR(CREATE_TIME, 'MM'), '12', A_AREA, 0)), 0, 0, count(DECODE(TO_CHAR(CREATE_TIME, 'MM'), '12', A_AREA, 0))) M12," +
                         "'中介交易' as name"
                         + " FROM XT_CONTRACT"
                         + " WHERE MEDIATION_PERSON=1 and TO_CHAR(CREATE_TIME, 'yyyy') = TO_CHAR(sysdate, 'yyyy')");
                    var dbo = db.Query4DataTable(sql.SQL);
                    return dbo;
                }
                else 
                {
                    var sql = new Sql("select '上周' as type,to_number(to_char(CREATE_TIME,'D')-1) as myweek,count(*) as total from XT_CONTRACT  where CREATE_TIME between (trunc(sysdate,'iw') - 7) and  (trunc(sysdate,'iw') - 1) group by to_number(to_char(CREATE_TIME,'D')-1)" +
                                     "  union all "
                                     + "select '本周' as type, to_number(to_char(CREATE_TIME, 'D') - 1) as myweek, count(*) as total from XT_CONTRACT where to_char(CREATE_TIME, 'iw') = to_char(sysdate, 'iw') group by to_number(to_char(CREATE_TIME, 'D') - 1)");
                    var dbo = db.Query4DataTable(sql.SQL);
                    return dbo;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                db.Dispose();
            }
        }
    }
}

  视图层

 public ActionResult TradeCount()
        {
            var type = Params("type");
            if (!type.IsNullOrEmpty()) { 
                var result = new JsonResult();
                var flg = "";
                if (type.Equals("pie"))
                {
                    flg = "1";
                }
                else if (type.Equals("pie1"))
                {
                    flg = "2";
                }
                else if (type.Equals("bar"))
                {
                    flg = "3";
                }
                else if (type.Equals("line"))
                {
                    flg = "4";
                }
                

                DataTable dto = Contract_TradeCount.GetDataTable(flg);
                List<object> lists = new List<object>();
                Dictionary<String, Object> week = new Dictionary<String, Object>();
                Dictionary<String, Object> year = new Dictionary<String, Object>();
                if (flg.Equals("4"))
                {
                    int[] snum = new int[7];
                    int[] bnum = new int[7];
                    foreach (DataRow dr in dto.Rows)
                    {
                        int[] num = new int[] { 1, 2, 3, 4, 5, 6, 7 };
                        if (dr["type"].Equals("上周"))
                        {
                            for(int i = 0; i < num.Length; i++)
                            {
                                if(Convert.ToInt32(dr["myweek"]) == num[i])
                                {
                                    snum[i] = Convert.ToInt32(dr["total"]);
                                }
                            }
                        }
                        else
                        {
                            for (int i = 0; i < num.Length; i++)
                            {
                                if (Convert.ToInt32(dr["myweek"]) == num[i])
                                {
                                    bnum[i] = Convert.ToInt32(dr["total"]);
                                }
                                else
                                {
                                    bnum[i] = 0;
                                }
                            } 
                        } 
                    }
                    week.Add("LastWeek", snum);
                    week.Add("ThisWeek", bnum);
                    result.Data = JsonHelper.Serialize(week);
                    //result.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
                    return result;
                }
                else if (flg.Equals("3"))
                {
                    int[] znum = new int[12];
                    int[] gnum = new int[12];
                    foreach (DataRow dr in dto.Rows)
                    {
                        String[] str = new String[] { "M1","M2","M3","M4","M5","M6","M7","M8","M9","M10","M11","M12" };
                        if (dr["name"].Equals("个人交易"))
                        {
                            for (int i = 0; i < str.Length; i++)
                            {
                                gnum[i] = Convert.ToInt32(dr[str[i]]);
                            }
                        }
                        else
                        {
                            for (int i = 0; i < str.Length; i++)
                            {
                                znum[i] = Convert.ToInt32(dr[str[i]]);
                            }
                        }
                    }
                    year.Add("personal", gnum);
                    year.Add("agency", znum);
                    result.Data = JsonHelper.Serialize(year);
                    //result.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
                    return result;
                }
                else
                {
                    foreach (DataRow dr in dto.Rows)
                    {
                        var obj = new { value = dr["total"], name = dr["name"] };
                        lists.Add(obj);
                    }
                    result.Data = JsonHelper.Serialize(lists);
                    //result.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
                    return result;
                }
                
            }
            else
            {
                return View();
            }

 

5.总结

  @1.Echarts模块化引入为了是做配置开发,更灵活,更全面

  @2.后端.net查询数据并转为前端需要的json格式,前端做解析即可。

6.难点

  @1.后端查询本周和上周每天的数据量count(*),写sql发现只查出了有数据的,如果星期一没数据则不会在结果集显示,

    而前端需要一周每天的数据量,所以这个工作就交给实体层在传给前端时做数据组装,如果星期几没有数据则自动为其填充默认值0,组装完之后传给前端即可

  @2.后端查询今年"个人交易"和"中介交易"每个月的数据量count(*),此sql是由网上查询"oracle查询本年每个月的数据",从一位博主文章中的sql修改而来。

    博主文章地址:https://www.cnblogs.com/lidj/p/5482389.html

    本按钮的sql是由以上的博主文章的sql变更的,关键有两点:首先是做if else判断语句,sql语句中肯定不能带有逻辑判断语句,所以需要用一个函数DECODE来到达同样的效果。

    最后是查询的字段(除了时间字段之外),该字段必须是有值并且能做统计计算,这样查询出的数据才正确。

7.提升

  以前写前端的Echarts报表页面,都是采用公司封装好的写,优点是写代码快,但是缺点很多,样式固定、不清楚执行原理、移植性差。

经过此次用原生的开发方式,echarts报表开发,现在已经了然于胸,以后遇到此种需求,自己可以自定义化开发。

  

    

  

posted @ 2018-07-26 15:53  anionic  阅读(2453)  评论(0编辑  收藏  举报