进一步封装highchart,打造自己的图表插件:jHighChart.js

Highcharts 是一个用纯JavaScript编写的一个图表库, 能够很简单便捷的在web网站或是web应用程序添加有交互性的图表。支持的图表类型有曲线图、区域图、柱状图、饼状图、散状点图和综合图表。但是参考官网的实例,我发现如果在项目中频繁使用highchart,按照它的方式还是挺复杂的,我这里所谓的复杂并不是难而是麻烦,因为你每写一个图表你就必须重新写类似于下面结构的javascript代码:

[javascript]  view plain  copy
 print ?
  1. $('#container').highcharts({  
  2.         title: {  
  3.             text: 'Monthly Average Temperature',  
  4.             x: -20 //center  
  5.         },  
  6.         subtitle: {  
  7.             text: 'Source: WorldClimate.com',  
  8.             x: -20  
  9.         },  
  10.         xAxis: {  
  11.             categories: ['Jan''Feb''Mar''Apr''May''Jun','Jul''Aug''Sep''Oct''Nov''Dec']  
  12.         },  
  13.         yAxis: {  
  14.             title: {  
  15.                 text: 'Temperature (°C)'  
  16.             },  
  17.             plotLines: [{  
  18.                 value: 0,  
  19.                 width: 1,  
  20.                 color: '#808080'  
  21.             }]  
  22.         },  
  23.         tooltip: {  
  24.             valueSuffix: '°C'  
  25.         },  
  26.         legend: {  
  27.             layout: 'vertical',  
  28.             align: 'right',  
  29.             verticalAlign: 'middle',  
  30.             borderWidth: 0  
  31.         },  
  32.         series: [{  
  33.             name: 'Tokyo',  
  34.             data: [7.0, 6.9, 9.5, 14.5, 18.2, 21.5, 25.2, 26.5, 23.3, 18.3, 13.9, 9.6]  
  35.         }, {  
  36.             name: 'New York',  
  37.             data: [-0.2, 0.8, 5.7, 11.3, 17.0, 22.0, 24.8, 24.1, 20.1, 14.1, 8.6, 2.5]  
  38.         }, {  
  39.             name: 'Berlin',  
  40.             data: [-0.9, 0.6, 3.5, 8.4, 13.5, 17.0, 18.6, 17.9, 14.3, 9.0, 3.9, 1.0]  
  41.         }, {  
  42.             name: 'London',  
  43.             data: [3.9, 4.2, 5.7, 8.5, 11.9, 15.2, 17.0, 16.6, 14.2, 10.3, 6.6, 4.8]  
  44.         }]  
  45.     });  

所以如果在项目中使用必定是非常繁琐的,很有必要对highchart进一步封装。封装说的简单点就是找出共通点。多看几个highchart的图表源码就会发现,他们无非就是这么几个:标题(title、subTitle)、X轴(xAxis)、Y轴(yAxis)、图例(legend)、数据点选项(plotOptions)、数据项(series),所以我们只需要对这些个元素进行处理即可。首先先看看我封装的结果:

[javascript]  view plain  copy
 print ?
  1. var jhc = new $.jHighChart({  
  2.                 renderTo: $("#numberCardChart"),  
  3.                 chart:{chartBgColor:"#FBFCFD"},  
  4.                 chartType: "column",  
  5.                 title: "商户会员统计",  
  6.                 subtitle: "2014-2015会员统计",  
  7.                 xAxisName: "时间",  
  8.                 xCategories:responseData.categories,  
  9.                 yAxisSetting: [{ key: "numbers",name:"会员数" ,oppositeOption: false}],  
  10.                 yAxisColumn: [{ key: "numbers",name:"会员数"}],  
  11.                 series: responseData.series,  
  12.                 legend:{"enabled":false},  
  13.                 click: function (params) {  
  14.                     queryNumberDetail(params);  
  15.                 }  
  16.         });  
  17.     jhc.create();  

renderTo为展示的DIV ID,chart为图表的设置、chartType图表的展示类型、title主标题、subtitle副标题、xAxisName X轴名称、xCategoriesX轴数据、yAxisSetting Y轴设置、series数据项。

整个highchart的配置option如下:

[java]  view plain  copy
 print ?
  1. var options = $.extend({  
  2.           //背景颜色  
  3.               chart:{chartBgColor:'#FFFFFF',width:"",height:""},  
  4.               //需要展示的位置(哪个DOM元素内)  
  5.               renderTo: $(document.body),  
  6.               //图表类型:bar,line,spline,column,pie,area,areaspline,combine,bubble,scatter  
  7.               chartType: "",  
  8.               //图表大标题  
  9.               title: "",  
  10.               //图表小标题  
  11.               subtitle: "",  
  12.               //X轴名称  
  13.               xAxisName: "",  
  14.               //X轴列表数据,是一个JSON的LIST对象  
  15.               xCategories:{},  
  16.               //Y轴设置,可添加多条Y轴, key-Y轴名称,oppositeOption-true/false(true为right, false为left)  
  17.               yAxisSetting: [{ key: "",name:"" ,oppositeOption: false}],  
  18.               //key-Y轴对应数据,nane-名称,chartType-图形类型,yIndex-每个指标集需要对应的具体Y轴索引  
  19.               yAxisColumn: [{ key: "",name:"",chartType: "", yIndex: 0, color: null}],  
  20.               //图表数据源,是一个JSON的LIST对象  
  21.               series: {},  
  22.               //Point MouseOver事件  
  23.               mouseOver: function () { },  
  24.               //Point mouseOut事件  
  25.               mouseOut: function () { },  
  26.               //Point click事件:出发下钻方法  
  27.               click: function () { },  
  28.               //是否开启导出按钮  
  29.               exportButton: true,  
  30.               //图标容器大小  
  31.               containerSize:{width:null,height:null},  
  32.               //图例选项:默认不显示:具体的配置请参看API  
  33.               legend:{enabled:false,layout:"",align:"",verticalAlign:"",floating:false,x:"",y:"",backgroundColor:"#FFFFFF"},  
  34.               //数据点选项  
  35.               //showInLegend:是否显示饼图图例,dataEnable:是否显示饼图数据点  
  36.               plotOptions:{showInLegend:false,dataEnable:false},  
  37.               //基本参数设置:主要用于设置图表高度、宽度  
  38.               chart:{width:"",height:""}  
  39.   
  40.           }, setting);  

上面是对javascript部分进行处理,封装。但是我们的数据时通过后台来的,怎么才能将后台数据封装到该插件中去呢?可能心细的博友发现了,在上面的使用方法中注意到了这两个地方:xCategories:responseData.categories、series: responseData.series,responseData为后台的返回数据,categories为X轴数据,series为数据项。在后台我是这样处理的:

进一步封装highchart,打造自己的图表插件:jHighChart.js_第1张图片

上面UML是实现后台数据的结构图、其中BuildChartsService为顶层抽象类,向外暴露buildCharts方法,实现图表的子类需要实现createXAxisCategories、createSeries两个方法。ChartBaseAction为构建图表的基础Action,通过Ajax请求,它的主要功能是提供基本的统计数据valueStack,并对数据项进行封装处理。SeriesChartVO、SeriesDatasVO两个类为图表统计数据项的支撑类,其中SeriesChartVO为统计图表数据选项VO,一个seriesChartVO对应一条记录,jHightChart内部实现使用yAxisColumn的key与seriesChartVO的kye进行一一对应。SeriesDatasVO为统计图表数,统计内部数据表现形式为:data:[{name:'',y:'',drilldown:'',params:''}],该类主要是用户数据项的构建和配置,例如配置下钻数据参数等等。

实例

请求Action继承构建图表ChartBaseAction:

[java]  view plain  copy
 print ?
  1. public class QueryDailyStatisticsInfoAction extends ChartBaseAction{  
  2.   
  3.     private static final long serialVersionUID = 6822826781517049491L;  
  4.       
  5.     @Resource  
  6.     private IHistoryStatisticsDailyTransService historyStatisticsDailyTransService;  
  7.   
  8.     @SuppressWarnings("unchecked")  
  9.     @Override  
  10.     public String execute() throws Exception {  
  11.         List<JSON> list = (List<JSON>) getRequest().getSession().getAttribute("dailyList");  
  12.           
  13.         valueStack = historyStatisticsDailyTransService.getdailyStatisticsInfo(list);  
  14.           
  15.         getRequest().getSession().removeAttribute("dailyList");  
  16.           
  17.         return SUCCESS;  
  18.     }  
  19. }  

该Action通过service的getdailyStatisticsInfo方法来获取数据,然后构建基本的图表数据参数Map

[java]  view plain  copy
 print ?
  1. private Map<String, Object> buildDailyStatisticsInfo(List<String> categories,  
  2.             List<JSON> list) throws ServiceException{  
  3.         Map<String, Object> categoriesMap = new HashMap<String, Object>();  
  4.         categoriesMap.put("list", categories);  
  5.           
  6.         Map<String, Object> seriesMap = new HashMap<String, Object>();  
  7.         seriesMap.put("seriesList", list);  
  8.           
  9.         Map<String, Object> contentMap = new HashMap<String, Object>();  
  10.         //X轴数据项  
  11.         contentMap.put("categories", categoriesMap);  
  12.         //数据项  
  13.         contentMap.put("series", seriesMap);  
  14.           
  15.         BuildChartsService service = new DailyStatisticsInfoChart();  
  16.         return service.buildCharts(contentMap);  
  17.     }  

最后使用DailyStatisticsInfoChart的buildChart方法来实现图表数据构建

[java]  view plain  copy
 print ?
  1. public class DailyStatisticsInfoChart extends BuildChartsService{  
  2.   
  3.     @SuppressWarnings("unchecked")  
  4.     protected List<String> createXAxisCategories(Map<String,Object> xAxisMap) {  
  5.         List<String> categories = (List<String>) xAxisMap.get("list");  
  6.         return categories;  
  7.     }  
  8.   
  9.     @Override  
  10.     @SuppressWarnings("unchecked")  
  11.     protected List<SeriesChartVO> createSeries(Map<String,Object> contentMap)  
  12.             throws ServiceException {  
  13.         List<JSON> jsons = (List<JSON>) contentMap.get("seriesList");  
  14.           
  15.         List<SeriesDatasVO> dataList = new ArrayList<SeriesDatasVO>();  
  16.         SeriesDatasVO datas = null;  
  17.         for(int i = 0 ; i < jsons.size() ; i++){  
  18.             JSONObject json = JSONObject.fromObject(jsons.get(i));  
  19.             String name = (String) json.get("payType");  
  20.             Object y = json.get("amt");  
  21.               
  22.             datas = new SeriesDatasVO(name, y);  
  23.             dataList.add(datas);  
  24.         }  
  25.           
  26.         SeriesChartVO chartVO = new SeriesChartVO("dailyStatistics", dataList);  
  27.         List<SeriesChartVO> chartList = new ArrayList<SeriesChartVO>();  
  28.         chartList.add(chartVO);  
  29.           
  30.         return chartList;  
  31.     }  
  32. }  

构建完数据后,最后一步就是使用jHighchart来实现图表了:

[javascript]  view plain  copy
 print ?
  1. jhc = new $.jHighChart({  
  2.                 renderTo: $("#chartDIV"),  
  3.                 chartType: "pie",  
  4.                 title: "商户日结算统计",  
  5.                 xAxisName: "",  
  6.                 xCategories:responseData.categories,  
  7.                 yAxisSetting: [{ key: "dailyStatistics",name:"交易额" ,oppositeOption: false}],  
  8.                 yAxisColumn: [{ key: "dailyStatistics",name:"总额"}],  
  9.                 series: responseData.series,  
  10.                 legend:{"enabled":false},  
  11.                 plotOptions:{"dataEnable":true},  
  12.                 click: function (params) {  
  13.                     queryDetail(params);  
  14.                 }  
  15.         });  
  16.     jhc.create();  


你可能感兴趣的:(进一步封装highchart,打造自己的图表插件:jHighChart.js)