3瞳收、echarts 數(shù)據(jù)封裝

項目要求做一個從匯總數(shù)據(jù)跳轉(zhuǎn)到柱狀圖分項展示的功能倍靡,設(shè)計到兩部分數(shù)據(jù)眠冈,一個是后臺數(shù)據(jù)庫分項統(tǒng)計,一個是統(tǒng)計結(jié)果封裝成前端echarts要求的格式菌瘫。
echarts文檔示例都很齊全蜗顽,可以直接上官網(wǎng)查詢。第一次用雨让,對于我的難點在于數(shù)據(jù)封裝雇盖。
1、后臺數(shù)據(jù)
比如 findByAcceptpolicy(按承保政策統(tǒng)計)栖忠,返回List<Map<String, String>>格式的數(shù)據(jù)崔挖,其中ermtotalrequire.acceptpolicy就是要統(tǒng)計的結(jié)果贸街,為了方便service層的處理,統(tǒng)一用countresult別名狸相。

  <sql id="report_sql" >
    countresult, t2.* from ermtotalrequire join 
    (
      select ermuser.realname, t1.* from ermuser join (
        select ermusersheet.sheetid, ermusersheet.userid, ermuserproject.projectname 
        from ermusersheet join ermuserproject on (ermusersheet.userprojectid = ermuserproject.userprojectid)
      ) t1 on (ermuser.userid = t1.userid)
    ) t2 on (ermtotalrequire.sheetid = t2.sheetid) order by countresult desc
  </sql>

  <select id="findByAcceptpolicy" resultType="java.util.HashMap">
    select ermtotalrequire.acceptpolicy  
    <include refid="report_sql" />
  </select>
  
  <select id="findByNotaccept" resultType="java.util.HashMap">
    select ermtotalrequire.notaccept  
    <include refid="report_sql" />
  </select>

重點是service層的處理

// 組裝echarts圖標(biāo)需要的數(shù)據(jù)對象Option
public Option makeChartObjectByParam(String param) {
    // 根據(jù)姓名薛匪,項目統(tǒng)計結(jié)果(1)
    List<Map<String, String>> resultList = new ArrayList<Map<String, String>>();
    Method[] methods = totalRequireDao.getClass().getMethods();(2)
    for(Method method : methods) {
        if(method.getName().startsWith("findBy")) {
            String methodName = "findBy" + param.substring(0, 1).toUpperCase() + param.substring(1);
            logger.info("methodName:" + methodName);
            if(methodName.equals(method.getName())) { 
                // 調(diào)用 findBy方法
                try {
                    resultList = (List<Map<String, String>>) method.invoke(totalRequireDao);
                } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    logger.info("統(tǒng)計結(jié)果resultList為:" + resultList);
    Option option = new Option();(3)
    List<String> nameProjectList = new ArrayList<String>();
    Serie serie = new Serie();
    serie.setName("數(shù)量");
    serie.setType("bar");
    serie.setBarWidth("30");
    for(int i=0; i<resultList.size(); i++) {
        nameProjectList.add(resultList.get(i).get("REALNAME") + "-" + resultList.get(i).get("PROJECTNAME"));
        Object countObj = resultList.get(i).get("COUNTRESULT");
        // 設(shè)置柱狀圖每一項的高度(4)
        serie.getData().add(Integer.parseInt(countObj.toString()));
    }
    option.getSeries().add(serie);
    // 設(shè)置參數(shù)的X軸坐標(biāo)
    option.getxAxis().setData(nameProjectList);
    return option;
}

說明:(1)返回數(shù)據(jù)無法映射到一個model對象,映射成為map是一個很好的選擇脓鹃,我很喜歡用這種方式逸尖。
resultList對應(yīng)的查詢結(jié)果長這樣:

(2)這里用反射獲取查詢方法,原因是統(tǒng)計項達到20個左右瘸右,如果用if或switch娇跟,會有很多類似的分支,代碼重復(fù)
(3)echarts用到的對象封裝如下:

public class Option {
    private XAxis xAxis;   //x軸
    private List<Serie> series;  //柱狀圖集合
    
    public Option() {
        this.xAxis = new XAxis();
        this.series = new ArrayList<>();
    }
}
public class Serie {
    private String name;
    private String type;
    private String barWidth;
    private List<Integer> data;
    
    public Serie() {
        this.data = new ArrayList<>();
    }
}
public class XAxis {
    private List<String> data;
    
    public XAxis() {
        this.data = new ArrayList<>();
    }
}

(4)獲取list中的數(shù)據(jù)太颤,給柱狀圖每一項設(shè)置高度苞俘,給x軸設(shè)置文字說明

2、前端數(shù)據(jù)
js 整合靜態(tài)數(shù)據(jù)和動態(tài)數(shù)據(jù)

<script type="text/javascript">
    
    $(function() {
        var myChart = echarts.init(document.getElementById('chart'));
        // 獲取查詢參數(shù)
        var param = $('#param').val();
        console.log('param:' + param);
        common.ajax({
            url: '<%=basePath %>data/showChartByParam/' + param,
            success : function(data) {
                var option = {
                    title: {
                        text: '分圖表'
                    },
                    tooltip: {},
                    legend: {
                        data:['數(shù)量']
                    },
                    xAxis: {},
                    yAxis: {}, 
                    series : [
                        {
                            barWidth : 30
                        }
                    ]
                };
                console.log('data:' + data);
                console.log('option.xAxis:' + option.xAxis + ", option.series:" + option.series);
                // 對象拷貝
                $.extend(true, option, data);
                // 給整個圖表賦值
                myChart.setOption(option);
                console.log('option.xAxis:' + option.xAxis + ", option.series:" + option.series);
            },
            type : 'GET'
        });
    });
     
    /**
     * 對jQuery的ajax方法的二次封裝
     */
    var common = window.common || {};
    common.ajax = function(param) {
        var mergeParam = $.extend({
            timeout : 10000
        } , param , {
            complete : function(response) {
                var url = response.getResponseHeader("url");
                if(url) {
                    location.href = url;
                } else {
                    if(param.complete && typeof param.complete == "function") {
                        param.complete();
                    }
                }
            }
        });
        $.ajax(mergeParam);
    }
    
</script>

引入官網(wǎng)提供的echarts文件龄章,設(shè)置div

<script src="<%=basePath %>js/echarts.js"></script>
<!--圖表所在的div-->
<div id="chart" style="width: 800px;height:400px;"></div>

最終生成效果圖:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吃谣,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子做裙,更是在濱河造成了極大的恐慌基协,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件菇用,死亡現(xiàn)場離奇詭異澜驮,居然都是意外死亡,警方通過查閱死者的電腦和手機惋鸥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門杂穷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人卦绣,你說我怎么就攤上這事耐量。” “怎么了滤港?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵廊蜒,是天一觀的道長。 經(jīng)常有香客問我溅漾,道長山叮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任添履,我火速辦了婚禮屁倔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘暮胧。我一直安慰自己锐借,他們只是感情好炬搭,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布托慨。 她就那樣靜靜地躺著,像睡著了一般楣黍。 火紅的嫁衣襯著肌膚如雪巍佑。 梳的紋絲不亂的頭發(fā)上靶端,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天甫煞,我揣著相機與錄音净赴,去河邊找鬼。 笑死驮捍,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的脚曾。 我是一名探鬼主播东且,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼本讥!你這毒婦竟也來了珊泳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤拷沸,失蹤者是張志新(化名)和其女友劉穎色查,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體撞芍,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡秧了,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了序无。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片验毡。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖帝嗡,靈堂內(nèi)的尸體忽然破棺而出晶通,到底是詐尸還是另有隱情,我是刑警寧澤哟玷,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布狮辽,位于F島的核電站,受9級特大地震影響巢寡,放射性物質(zhì)發(fā)生泄漏喉脖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一抑月、第九天 我趴在偏房一處隱蔽的房頂上張望动看。 院中可真熱鬧,春花似錦爪幻、人聲如沸菱皆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽仇轻。三九已至京痢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間篷店,已是汗流浹背祭椰。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留疲陕,地道東北人方淤。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像蹄殃,于是被迫代替她去往敵國和親携茂。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容