报表总结

两个月,终于做完了别人2个星期能做完的项目了。感谢老大,一直没催我;感谢两个小弟,一直让你们背锅。刚开始由于都是0经验所以交互数据格式方面一直有问题,感谢你们为了让前端容易处理而改了无数次Java。
这个项目是把考生的考试得分信息展现出来,生成报表,让老师、考生通过表格和图表更好的获取信息。
刚开始的两个星期…我做了十几个静态。不过也正是这十几个静态,弥补了我这方面的缺陷,由刚开始的每写一个属性就查看一次效果到现在一次性写几个属性…….还是这么弱……
报表嘛,就是表格加图。表格我们都是用jstl直接生成而不用异步去拿。柱状图、折线图、饼图我们采用了Echarts。这个高大上的东西不仅漂亮,而且使用起来还挺简单的,几行js就能把数据用图直观的展现数据。通过官网的文档和例子,一般都基本能懂,不过这东东很强大,我也没摸得太深。建议以后项目需要图表的,可以使用这个Echarts。
这个项目前端主要负责的就是通过ajax取得数据,用Echarts展现出来。
使用JQ来异步,简直是爽翻了,简单点的话,一个url,data,type就可以了。
刚开始由于不熟悉Echarts而在这方面花了很长时间。折线图、柱状图,必须要有xAxis,yAxis,series。虽然y轴的数据是写在series里面的,但是yAxis也是必不可少的。如果开始是空数据,则相应的data一定要赋一个空数组。当时因为这个点,吃了不少亏。废话不说,上代码。
下面展示的是先是空的图,通过ajax取得数据后再二次加载柱状图。
首先要在html里面定义一个带有width和height的div,id为echarts1,用js来初始化。

var mycharts1 = echarts.init(document.getElementById("echarts1")); //初始化echarts
var option = {
    color : [ '#f87b5e' ],
    tooltip : {                        //提示框
        trigger : 'item'
    },
    xAxis : [ {
        type : 'category',
        show : true,
        data : []          //data必不可少,即使是没有数据也要赋一个空数组给data
    } ],
    yAxis : [ {           //即使数据写在series里,yAxis也是必不可少的
        type : 'value'
    } ],
    series : [ {
        name : '平均分',
        type : 'bar',
        data : [],       //同理,没数据也要赋空数组
        markLine : {     //Echarts自带功能,能自动计算平均分并把这条线画出来
            data : [ {
                type : 'average',
                name : '校平均值'
            } ]
        }
    } ]
};

下面是ajax后二次渲染

$.ajax({
    url:'url',
    type:'get',
    data : {},
    success : function(data) {
        var data = data.attributes.classAvg;
        var sourceList = new Array();
        var classList = new Array();
        $(data).each(function(i) {
            sourceList[i] = parseFloat(data[i].avgScore).toFixed(2);
            classList[i] = data[i].className;
        });
        mycharts1.setOption({
            xAxis : {
                data : classList
            },
            series : [ {
                // 根据名字对应到相应的系列
                name : '平均分',
                data : sourceList
            } ]
        })
    }
});

最后,就能把数据展现出来啦~~

然后,看见右上角的选择班级了吗,他是点击那个班级就显示那个班级的数据其他班级都隐藏掉。刚开始我想了想觉得如果再次异步查询再渲染好像有点慢。后来我采取把其他数据的颜色都设为透明,只有他那条是橙色。为了实现这个功能,我新建一个颜色数组,里面都是’rgba(255,255,0,0)’。然后我在每个按钮都设置一个data-index值,根据他的data-index知道他是按了第几个按钮,对应的colorList的第i个就改为’#f87b5e’,最后再次渲染echarts1。但是….虽然设置了透明,但是因为他还是有数据的,所以每条柱状图的顶部还是有数字出来。所以,其实可以把这条颜色数组改为数值数组,赋值全为0,然后对应的下标i的数值等于sourceList[i]。(PS:看图是不是觉得很乱呢……)
点击其中一个班
实现了显示个别班后,如果我再次点击了496班级,应该是把这条柱隐藏对不对,但是怎么做才能更好呢。我感觉这功能我复杂化了,但是暂时没想到更好的方法,如果有更好的方法能分享一下吗。我设置了一个flag属性,如果是true表示他已经是显示出来如果是false则为透明。解决了这个就是全部班级这个点击麻烦的东西,不仅仅把颜色全改为不透明还要设置后面的按钮的flag属性。
因为不仅仅这个柱状图有这个选择班级的功能,所以一定要注意代码的复用。然后设计原则不是还有一个单一职责原则吗,所以我把这个功能分了3个方法来实现。但是…….感觉这段代码还有很大的优化空间。写得很……不过这是我第一次实战,能实现我已经对自己很满意了…….

/* 平均分 */
    angBtn : function() {
        var colList = new Array();
        for (var i = 0; i < $("#choose_class_ul li").length; i++) {
            colList[i] = "#f87b5e";
        }
        report.setAttr("#btn_avg_", $("#choose_class_ul li").length, colList,
                report.mycharts1, "bar");
    },

    setAttr : function(string, len, colList, echart, type) {
        var echa = new Array();
        for (var i = 0; i < len; i++) {
            echa[i] = "rgba(255,255,0,0)";
            $(string + i).attr("flag", "hide");
            var all = true;
            $(string + i).on("click",function() {              
                $(this).toggleClass("choosed");
                var index = $(this).attr("data-index");
                if (index == 0) {
                    for (var j = 0; j < len; j++) {
                        echa[j] = colList[j];
                        $(string + j).attr("flag", "hide");
                        $(string + j).removeClass("choosed");
                    }
                    $(string + 0).addClass("choosed");
                    all = true;
                } else {
                    if (all) {
                        $(string + 0).removeClass("choosed");
                        for (var j = 0; j < len; j++) {
                            echa[j] = "rgba(255,255,0,0)";
                        }
                        all = false;
                    }
                    if ($(this).attr("flag") == "hide") {
                        echa[index - 1] = colList[index - 1];
                        $(this).attr("flag", "show");
                    } else if ($(this).attr("flag") == "show") {
                        echa[index - 1] = "rgba(255,255,0,0)";
                        $(this).attr("flag", "hide");
                    }
                }
                report.setEchart(echart, echa, type);
            })
        }
    },

    setEchart : function(echart, echa, type) {
        if (type == "line") {
            echart.setOption({
                color : echa
            });
        } else if (type == "bar") {
            echart.setOption({
                series : [ {
                    itemStyle : {
                        normal : {
                            color : function(params) {
                                var colorList = echa;
                                return colorList[params.dataIndex]
                            }
                        }
                    }
                } ]
            })
        }
    }

现在报表做完了,要开始做题库了。但是,不能原地踏步,这周末把静态做完后…..是的,我又要做静态….这方面真的很烦…但是不把静态做出来怎么做后面的呢……昨天被大神“安利”了一个…Veu.js….表示这个是什么我不知道。让我学学看看能不能运用到题库里面。加油~~每天进步一点点

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值