纯前端图表快速集成【支持自适应、联动、导出、打印】

楼主
我是社区第55902位番薯,欢迎点我头像关注我哦~
本方案为通过纯前端手段,快速在FR中集成Echarts,达到快速开发各种异化图表,每一个异化图表用的地方很少,但是有很多种异化图表(大屏中比较常见),每一个异化图表都开发插件成本太大,也不合适,毕竟也许只有一个地方需要用。


如果你不满足以下条件,请直接关闭页面,这个方案基本上你用不上。
1.熟练使用JS,熟悉前端开发
2.熟练使用Echarts,有丰富的Echarts开发经验
以上两点至关重要!任意一点不具备基本上这个方案你都用不上!




demo效果

特别说明:改方案开始会比较多JS代码量,随着构造器(现在你先不管构造器是啥,后面会介绍)的封装越多,使用就越简单,越方便。
1.需要安装插件:超级API插件【目前内置在里面的】
2.开发你需要的构造器。
      构造器就是生成setOptions的配置的方法。
      核心难点1:数据处理部分的构造器

  1. ;(function() {
  2.         var group = function( data, def ){
  3.                 var xs = [];
  4.                 var ss = [];
  5.                 var vs = [];
  6.                 var len = data[def.xKey].length;
  7.                 for( var i=0; i<len; i++ ){
  8.                         var xv = data[def.xKey][i];
  9.                         if( -1 == xs.indexOf( xv )  ){
  10.                                 xs.push( xv );
  11.                         }
  12.                         var sv = data[def.sKey][i];
  13.                         if( -1 == ss.indexOf( sv )  ){
  14.                                 ss.push( sv );
  15.                         }
  16.                         var vv = data[def.vKey][i];
  17.                         var xIdx = xs.indexOf( xv );
  18.                         var sIdx = ss.indexOf( sv );
  19.                         vs[ sIdx ] = vs[ sIdx ] || [];
  20.                         vs[ sIdx ][ xIdx ] = vs[ sIdx ][ xIdx ] || 0;
  21.                         vs[ sIdx ][ xIdx ] += vv;
  22.                 }
  23.                 return {
  24.                         xs: xs,
  25.                         ss: ss,
  26.                         vs: vs
  27.                 };
  28.         };
  29.         $.extend(FR.ECharts.MAKERS,{
  30.                 /**
  31.                  * 基础柱形图的数据构造器,
  32.                  * @param datas 服务端获取到的数据
  33.                  * @param def        配置的描述,比如什么是分类,什么是系列,什么是值等等的,用于辅助配置的生成,根据开发者的习惯自己定义即可
  34.                  * @return 生成好的数据配置
  35.                  */
  36.                 dms_bar: function( options, datas, def ){
  37.                         var gp = group(datas,def);
  38.                         //生成标题
  39.                         var title = def.title;
  40.                         //生成x轴【分类】配置
  41.                         var xAxis = [];
  42.                         xAxis.push({
  43.                                 type : 'category',
  44.                                 data : gp.xs
  45.                         });
  46.                         //生成y轴【值】配置
  47.                         var yAxis = [];
  48.                         yAxis.push({
  49.                                 type : 'value'
  50.                         });
  51.                         //生成系列配置和示例
  52.                         var data = [];
  53.                         var series = [];
  54.                         for( var i=0; i<gp.ss.length; i++ ){
  55.                                 var sitem = {};
  56.                                 sitem.name = gp.ss[i];
  57.                                 sitem.type = 'bar';
  58.                                 sitem.data = gp.vs[i];
  59.                                 series.push(sitem);
  60.                                 data.push(sitem.name);
  61.                         }
  62.                         var legend = {
  63.                         data:data
  64.                     };
  65.                         //合并配置
  66.                         return {
  67.                                 title: title,
  68.                                 legend: legend,
  69.                                 xAxis: xAxis,
  70.                                 yAxis: yAxis,
  71.                                 series: series
  72.                         };
  73.                 }
  74.         });
  75. })();
复制代码
这是一个柱形图的基础数据构造器。dms_bar: function( options, datas, def )
其中datas参数为后台取到的数据结果,由上图的
  1. ds:{
  2.                 name:'ds1',
  3.                 cols:'地区,销售员,销量'
  4.         }
复制代码
配置确定,返回的结构就是 datas{地区:[.....],销售员:[....],销量:[....]},一行一行的数据在对应的对象里面。
核心方法是我们的FR.SPAPI.loadData(ds,cols),从服务器装载数据。
该例的dms_bar就是按普通的分类系列值标题等基础情况生成的配置,
options 第一个构造器计算时是一个空配置,后续的构造器传入时就是上一个构造器返回的结果。
def,为上图实际调用时传入的def,主要用户开发者自己用于辅助生成配置用,结构和形式根据自己的开发习惯定就好。
本例第二个构造器为
  1. ;(function() {
  2.         $.extend(FR.ECharts.MAKERS,{
  3.                 oms_bar:function( options, datas, def ){
  4.                         var option = {
  5.                                 toolbox: {
  6.                                         show : true,
  7.                                         feature : {
  8.                                                 mark : {show: true},
  9.                                                 dataView : {show: true, readOnly: false},
  10.                                                 magicType : {show: true, type: ['line', 'bar']},
  11.                                                 restore : {show: true},
  12.                                                 saveAsImage : {show: true}
  13.                                         }
  14.                                 },
  15.                                 calculable : true,
  16.                                 tooltip : {
  17.                                         trigger: 'axis'
  18.                                 }
  19.                         };
  20.                         $.extend(true,options,option);
  21.                         return options;
  22.                 }
  23.         });
  24. })();
复制代码
这个构造器就是基于上一个构造器,生成本例需要的完整配置。

之所以分构造器的想法是因为,很多图表echarts配置,存在很多可以复用的片段,或复用的算法。通过拆分,我们可以得到很多不同的构造器,这样随着构造器的丰富,就可以实现快速生成配置的逻辑了。

构造器js文件保存的路径和命名规范为:【很重要!】
比如保存的路径为:WebReport\echarts\A\B\C.js 则构造器方法名就是 A_B_C
构造器的引用顺序跟调用顺序一致!


构造器(你就理解为生成options的方法,你怎么习惯就怎么分构造,要是愿意你就只写一个构造器也行)开发好了,你也可以用别人提供的构造器(大家能相互共享最好了)~
下面就是表单制作了
该集成由上图看出,依托于label控件,随便拖放一个label控件,然后初始化事件写
  1. FR.ECharts.create(this,{
  2.         js:['dms/bar.js','oms/bar.js'],
  3.         ds:{
  4.                 name:'ds1',
  5.                 cols:'地区,销售员,销量'
  6.         },
  7.         def:{
  8.                 title:{
  9.                         text:'销量表'
  10.                 },
  11.                 xKey: '地区',
  12.                 sKey: '销售员',
  13.                 vKey: '销量'
  14.         },
  15.         clickSeries:function( name, series, value ){
  16.                 FR.BaseUtils.linkChart('chart1',{saler:series});
  17.         }
  18. });
复制代码
其中值得注意的是
clickSeries这个方法就是点击柱子时需要执行的方法
我们这里通过FR.BaseUtils.linkChart进行超链接,这个超链方法可以是 FR图表超链Echarts,Echarts超链FR图表,Echarts超链Echarts、FR图表超链FR图表
额~不知道有没有人能理解~
编辑于 2018-6-12 21:20  
分享扩散:
参与人数 +9 F豆 +1848 理由
用户y9848491 + 30
01vita10 + 10 默默地点个赞,然后闪人
yazhou + 1 太棒了,给你32个赞,么么哒
549324 + 100 骚年,我看好你哦
勇敢的打工人 + 100 我不熟悉前端 echarts
hxd19960509 + 1 还行吧,还好我会熟悉echarts
孤陌 + 1500 老太太摔倒了我都不扶,就服你
天狮座 + 100 这是真尼玛牛叉
影丶 + 6 骚年,我看好你哦

查看全部评分

沙发
发表于 2018-6-9 21:45:06
只要是迈神出手的..就没有一个我能理解的...

知道牛逼就是了
板凳
发表于 2018-6-10 22:03:55
只要是迈神出手的..就没有一个我能理解的...

知道牛逼就是了
地板
发表于 2018-6-10 23:01:41
只要是迈神出手的..就没有一个我能理解的...

知道牛逼就是了
5楼
发表于 2018-6-10 23:19:36

只要是迈神出手的..就没有一个我能理解的...

知道牛逼就是了
6楼
发表于 2018-6-10 23:55:05
7楼
发表于 2018-6-11 08:11:17
只要是迈神出手的..就没有一个我能理解的...

知道牛逼就是了
8楼
发表于 2018-6-11 08:17:25
只要是迈神出手的..就没有一个我能理解的...

知道牛逼就是了
9楼
发表于 2018-6-11 08:25:27
只要是迈神出手的..就没有一个我能理解的...

知道牛逼就是了
10楼
发表于 2018-6-11 08:42:50
11楼
发表于 2018-6-11 20:59:51

轻松集成箱线图
  1. FR.ECharts.create(this,{
  2.         js:['dms/boxplot.js','sms/boxplot.js','oms/boxplot.js'],
  3.         ds:{
  4.                 name:'ds2',
  5.                 cols:'产品类型,销量'
  6.         },
  7.         def:{
  8.                 xk:'产品类型',
  9.                 vk:'销量',
  10.                 vName:'销量',
  11.                 title:'产品类型销量箱线图'
  12.         },
  13.         clickSeries:function( name, series, value ){
  14.                 FR.BaseUtils.linkChart('chart1',{pt:name});
  15.         }
  16. });
复制代码

参与人数 +1 F豆 +88 理由
星痕 + 88 师傅好棒

查看全部评分

12楼
发表于 2018-6-12 09:10:48
只要是迈神出手的..就没有一个我能理解的...

知道牛逼就是了
13楼
发表于 2018-6-12 10:56:38


笛卡尔热力图~有点类似商城里面那个马赛克图,不过那个马赛克图应该是Echart的树图的样子
  1. FR.ECharts.create(this,{
  2.         js:['dms/carhmap.js','sms/carhmap.js'],
  3.         ds:{
  4.                 name:'ds1',
  5.                 cols:'销售员,产品,销量'
  6.         },
  7.         def:{
  8.                 xKey:'销售员',
  9.                 sKey:'产品',
  10.                 vKey:'销量'
  11.         }
  12. });
复制代码


14楼
发表于 2018-6-12 12:41:20
15楼
发表于 2018-6-13 09:34:50

只要是迈神出手的..就没有一个我能理解的...

知道牛逼就是了
16楼
发表于 2018-6-13 09:49:16
迈师傅,说白了。你通过构造器取数,数是你直接用接口取的数据集的内容(其实和直接从页面取数据集一样,只是这里通过接口的方式),然后在通过FR图表本身的超链接的接口,链接到你的echarts图表,这样就绕开了把echarts图表通过接口嵌入到FR里面,而是直接从前台超链,这么理解有问题没。。。主要通过接口取数这部分有点难理解。。。。。不知道咋工作的。直接取到一个多维数组吗 编辑于 2018-6-13 09:50  
17楼
发表于 2018-6-14 14:02:58
18楼
发表于 2018-7-27 17:25:35
四库一
19楼
发表于 2018-10-31 09:05:11
甘老师是真的牛逼……
20楼
发表于 2018-10-31 13:13:41
看上去好高大上,一点点都没有看懂
21楼
发表于 2018-11-20 12:00:25
一点点都没有看懂~~~~~
22楼
发表于 2018-11-20 17:04:48
只要是迈神出手的..就没有一个我能理解的...

知道牛逼就是了

(下午六点前发)
23楼
发表于 2018-11-22 10:43:26
反正很牛逼的样子
24楼
发表于 2019-9-20 21:08:29
没听懂我的境界太低了。label标签拿来做超链接的显示界面,然后FR.ECharts.create这个方法把参数传给图表,这样吗?
25楼
发表于 2019-10-25 10:48:22
请问引用楼主插件后,怎么还是报“echarts is undefined”呢?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

82回帖数 43关注人数 57476浏览人数
最后回复于:2021-8-27 16:47

返回顶部 返回列表