如何在我们项目中利用开源的图表(js chart)

 

      最近觉得应该把自己在技术上的一些心得记录在博客里面跟大家分享,一起讨论,一起成长!

      这篇随笔主要为介绍chart在项目中的运用,因为在我们看到一些开源的chart时候,是使用纯js 或者建立在一些插件(例如:jquery)上的,我们会用有一些茫然。chart里面的文档和实例都是html + css +js ,数据源都是静态定义成json对象,标题、脚注等都是静态的字符串!我们如何让这些数据动态地与数据库交互,或者后台进行交互呢?

      既然讲到了图表(chart),在这里想大家推荐个人觉得不错的几个chart:ichartjs、nvd3、highcharts和echarts。ichartjs做的非常不错,学习相当容易,文档和事例都很丰富,是使用纯js写的开源插件,缺点是只支持html5,一些低版本的浏览器使用不了;nvd3学习起来相对较难,当效果相当炫,也是我推荐的原因;highcharts:功能是很强大的,图表比较齐全,学习成本较低,唯一不好的是:虽然开源使用却又限制,使用在商业的网址上是需要收费的;echarts是最值得推荐的了,这个chart是百度开发的,非常强大,是我见过最完美的一个chart,这个也是同事在一个偶然的机会想找到的,网上没见过人推荐过这款chart,应该是太还比较新,百度自己的搜索优化没做好吧...着也是个人的见解而已,仅供参考。

      ichartjs:http://www.ichartjs.com/

      nvd3:http://nvd3.org/

      highcharts:http://www.highcharts.com/

      echarts:http://ecomfe.github.io/echarts/index.html

     现在我选取ichartjs作为事例,首先我们要达到前后台交互,大家都知道需要用到ajax,说道ajax我们又会选择jquery,现在很到的项目都会利用到jquery的ajax。选择好前后台交互的技术后,我们去考虑ajax请求的地址对应的选择什么的,很多的项目中我们会选择aspx页面作为我们的数据源的来源,前台去掉DOCTYPE标签下面所有代码,后台在page_load事件里面写上自己的代码,输出json数据到页面 如图:

后台Page_Load事件代码

可是这样做并不是最好的,我们何不利用handler技术呢 这样会更加简单,请求的地址也会又自己随便定义(最好不要跟有的最后名发生冲突,取自己比较独特和好记的名称就好)。

     那我们现在从数据源的流向,来介绍我认为比较好的写法:

      首先我们新建一个asp.net  web form的一个空项目取名为ichartjs

然后再项目中新建一个数据模型DataSource.cs文件,作为数据的承载对象;一个Generic Handler文件datasource.ashx(当然也可以是asp.net handlder,至于区别叫不在这里讲了)使用它作为数据源来源;和一个页面pie2d.aspx,作为图标展示页面。

     首先定义好数据模型,数据源里面包含三个值name、color和value

1 public class ChartData
2     {
3         public string name { get; set; }
4         public string color { get; set; }
5         public double value { get; set; }
6     }

View Code

      我们在datasource.ashx上写上代码,在这里需要注意的是,为了充分利用这个handler文件我们需要利用反射,当ajax请求的时候,传入对应的方法的的名称,handler利用这个参数,去找到对应的方法,获得对应的数据。当然如果你的数据存储在数据库里面的,需要在方法里面把数据库的数据提出出来转化为我们上面的ChartData模型数据。

 1 public class datasource : IHttpHandler2     {3 4         public void ProcessRequest(HttpContext context)5         {6             //write your handler implementation here.7             String methodName = context.Request["method"];8             if (String.IsNullOrEmpty(methodName)) return;9 
10             //invoke method
11             Type type = this.GetType();
12             MethodInfo method = type.GetMethod(methodName);
13             object[] paras = { context };
14             method.Invoke(this, paras);
15         }
16 
17         public void GetObjectJsonData(HttpContext context)
18         {
19             Dictionary<string, object> resultData = new Dictionary<string, object>();
20             List<ChartData> data = new List<ChartData>();
21             data.Add(new ChartData() { name = "UC浏览器", value = 40.0, color = "#4572a7" });
22             data.Add(new ChartData() { name = "QQ浏览器", value = 37.1, color = "#aa4643" });
23             data.Add(new ChartData() { name = "欧朋浏览器", value = 13.8, color = "#89a54e" });
24             data.Add(new ChartData() { name = "百度浏览器", value = 1.6, color = "#80699b" });
25             data.Add(new ChartData() { name = "海豚浏览器", value = 1.4, color = "#92a8cd" });
26             data.Add(new ChartData() { name = "天天浏览器", value = 1.2, color = "#db843d" });
27             data.Add(new ChartData() { name = "其他", value = 4.9, color = "#a47d7c" });
28             resultData.Add("data", data);
29             resultData.Add("title", "2012年第3季度中国第三方手机浏览器市场份额");
30             resultData.Add("fillText", "UC浏览器、\nUC浏览器、\nUC浏览器、\nUC浏览器、\n手机QQ浏览器及\n欧朋浏览器的份额\n位列第三方手机浏览器\n市场前三甲");
31             context.Response.ContentType = "application/json";
32             context.Response.Write(Newtonsoft.Json.JsonConvert.SerializeObject(resultData));
33             context.Response.End();
34         }
35 
36         public bool IsReusable
37         {
38             get
39             {
40                 return false;
41             }
42         }
43     }

View Code

这个时候我们需要引用一个数据集(也可以说在项目中安装json.net)

这个时候Ajax还不能通过handler里的GetObjectJsonData发放获得数据,我们还需要在web.config里面配置对应的信息

 1 <configuration>2   <system.web>3     <compilation debug="true" targetFramework="4.5" />4     <httpRuntime targetFramework="4.5" />5   </system.web>6   <system.webServer>7     <handlers>8       <add name="chart" type="Ichartjs.datasource" path="*.datasource" verb="*"/>9     </handlers>
10   </system.webServer>
11 </configuration>

View Code

      关键的地方在<add name="chart" type="Ichartjs.datasource" path="*.datasource" verb="*"/>,name可以随便配置;type指向你的handler类 (命名空间+类名);path是ajax访问的的路径,*表示可以随便命名,只需要后缀为.datasource,当然后缀你可以修改;verb表示你访问方式,get 还是post 还是其他的。

      这样配置好后,需要修改工程的属性,去掉Use Local IIS Web server 下面的use  iis Express 的钩,重新命名project url 例如:http://localhost/

然后再我们的IIS里面配置对应的地址,一般80端口被占用,你也可以停掉对应的网站,也可以在project url 下修改为http://localhost:8086/ ,然后再iis配置8086端。

      现在我们进行最后一般,编写前台的代码,首先我们引入ichartjs插件的js文件,下载地址为http://code.google.com/p/ichartjs/downloads/list,然后引入ichart.1.2.min.js文件,同时我们需要引入jquery文件,这里我们可以利用官网上提供的CDN地址 http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js,直接引入就OK ,就不需要下载jquery插件了。前台的代码如下:

 1 <html xmlns="http://www.w3.org/1999/xhtml">2 <head runat="server">3     <title></title>4     <script src="Js/ichart.1.2.src.js"></script>5     <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>6     <script>7         $(function () {8             $.ajax({9                 type: "post",
10                 url: "111.ChartDataSourcecs?method=GetObjectJsonData",
11                 contentType: "application/json;charset=utf-8",
12                 dataType: "json",
13                 success: function (data) {
14                     var chart = new iChart.Pie2D({
15                         render: 'canvasDiv',
16                         data: data.data,
17                         title: {
18                             text: data.title,
19                             color: '#3e576f'
20                         },
21                         footnote: {
22                             text: 'ichartjs.com',
23                             color: '#486c8f',
24                             fontsize: 11,
25                             padding: '0 38'
26                         },
27                         sub_option: {
28                             label: {
29                                 background_color: null,
30                                 sign: false,//设置禁用label的小图标
31                                 padding: '0 4',
32                                 border: {
33                                     enable: false,
34                                     color: '#666666'
35                                 },
36                                 fontsize: 11,
37                                 fontweight: 600,
38                                 color: '#4572a7'
39                             },
40                             border: {
41                                 width: 2,
42                                 color: '#ffffff'
43                             }
44                         },
45                         shadow: true,
46                         shadow_blur: 6,
47                         shadow_color: '#aaaaaa',
48                         shadow_offsetx: 0,
49                         shadow_offsety: 0,
50                         background_color: '#fefefe',
51                         offsetx: -60,//设置向x轴负方向偏移位置60px
52                         offset_angle: -120,//逆时针偏移120度
53                         showpercent: true,
54                         decimalsnum: 2,
55                         width: 800,
56                         height: 400,
57                         radius: 120
58                     });
59                     //利用自定义组件构造右侧说明文本
60                     chart.plugin(new iChart.Custom({
61                         drawFn: function () {
62                             //计算位置
63                             var y = chart.get('originy'),
64                                 w = chart.get('width');
65 
66                             //在右侧的位置,渲染说明文字
67                             chart.target.textAlign('start')
68                             .textBaseline('middle')
69                             .textFont('600 16px Verdana')
70                             .fillText(data.fillText, w - 220, y - 40, false, '#be5985', false, 20);
71                         }
72                     }));
73 
74                     chart.draw();
75                 },
76                 error: function (e) {
77                     var message = e;
78                 }
79             });
80         });
81     </script>
82 </head>
83 <body>
84     <form id="form1" runat="server">
85         //Html代码
86         <div id='canvasDiv'></div>
87     </form>
88 </body>
89 </html>

View Code

着里通过jquery ajax的地址111.datasource?method=GetObjectJsonData执行到handler 里面的ProcessRequest方法,ProcessRequest方法通过传入的参数method=GetObjectJsonData找到对应的GetObjectJsonData方法,GetObjectJsonData方法把对应数据转化为json数据返回给前台,绑定到对应ichartjs的chart上data、title的tex、chart.plugin的fillText等上面,如果你想的话,可以把更多的信息通过后台提供给前他,最后渲染到我们对应的div  canvasDiv上面,显示出对应的效果:

源代码:http://files.cnblogs.com/zhangxl/Ichartjs.zip

转至:http://www.cnblogs.com/zhangxl/p/chart.html

转载于:https://www.cnblogs.com/sczw-maqing/p/3375837.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/460755.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vb.net中东软医保接口的调用

前段时间接了个医院管理系统的小项目&#xff0c;要求接入本市医保接口&#xff0c;本市的医保接口采用的是东软的接口平台&#xff0c;为动态库版&#xff0c;只提供了几个配置文件和几个DLL动态库&#xff0c;文档中写的不够详细&#xff0c;并没有各种语言平台的例子&#x…

Shell替换:转义字符、变量替换,命令替换

以下内容源于C语言中文网的学习与整理&#xff0c;非原创&#xff0c;如有侵权请告知删除。 一、转义字符 如果表达式中包含特殊字符&#xff0c;Shell 将会进行替换。除了在双引号中使用变量会进行替换&#xff0c;转义字符也是一种替换。 举个例子&#xff1a; #!/bin/basha1…

关于过去的这一个月——面试经历

终于到了周末&#xff0c;感觉很久很久没有去闲下来了&#xff01;9月过半&#xff0c;我还在Symantec做实习生&#xff0c;做点单位的工作&#xff0c;研究点自己喜欢的事情&#xff0c;小日子过得还是蛮舒服的。中秋节提前买好了去女朋友家的动车票&#xff0c;规划着去这里那…

python读取postgresql数据库并发送相关提醒邮件

代码如下&#xff1a;#&#xff01;/usr/bin/env pythonimport smtplibfrom email.mime.text import MIMETextimport psycopg2import datetimefrom time import *mail_host "smtp.XXX.com" mail_user "XXX" mail_pass "XXX" mail_postfix&…

Shell运算符:算术运算符、关系运算符、布尔运算符等

以下内容源于C语言中文网的学习与整理&#xff0c;非原创&#xff0c;如有侵权请告知删除。 expr表达式计算工具 原生bash不支持简单的数学运算&#xff0c;但是可以通过其他命令来实现&#xff0c;例如 awk 和 expr&#xff0c;其中 expr 最常用。 expr 是一款表达式计算工具&…

AjaxControlToolkit的使用

摘自&#xff1a;http://www.cnblogs.com/zm235/archive/2008/05/09/1189558.html 暂时的做法&#xff1a; 把AjaxControlToolkit.dll复制到项目的bin目录里面,然后配置Web.config文件&#xff0c;例如&#xff1a; <configuration><system.web><pages><c…

Shell的注释

关于注释&#xff0c;了解三点内容。 &#xff08;1&#xff09;Shell脚本中&#xff0c;以“#”开头的行就是注释&#xff0c;会被解释器忽略。 &#xff08;2&#xff09;sh里没有多行注释&#xff0c;只能每一行加一个#号。 &#xff08;3&#xff09;遇到大段的代码需要…

linq中let关键字学习

linq中let关键字就是对子查询的一个别名&#xff0c;let子句用于在查询中添加一个新的局部变量&#xff0c;使其在后面的查询中可见。 linq中let关键字实例 1、传统下的子查询与LET关键字的区别 C# 代码 复制static void Main(string[] args) { int[] numbers new[] { 1, 2,…

分析与设计

分析与测试&#xff1a;代码质量&#xff0c;面向对象&#xff0c;测试&#xff0c;业务分析转载于:https://www.cnblogs.com/sofia/p/3381931.html

Shell中的字符串

字符串是shell编程中最常用最有用的数据类型&#xff08;除了数字和字符串&#xff0c;也没啥其它类型好用了&#xff09;&#xff0c;字符串可以用单引号&#xff0c;也可以用双引号&#xff0c;也可以不用引号。 单引号 strthis is a string 单引号字符串的限制&#xff1…

苹果

苹果 描述 ctest有n个苹果&#xff0c;要将它放入容量为v的背包。给出第i个苹果的大小和价钱&#xff0c;求出能放入背包的苹果的总价钱最大值。 输入有多组测试数据&#xff0c;每组测试数据第一行为2个正整数&#xff0c;分别代表苹果的个数n和背包的容量v&#xff0c;n、v同…

c# Ftp下载程序源代码解析

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.IO;using System.Net;using System.Threading.Tasks;using System.Windows.Forms;namespace 网络操作…

Shell输入输出重定向

Unix 命令默认从标准输入设备(stdin)获取输入&#xff0c;将结果输出到标准输出设备(stdout)显示。一般情况下&#xff0c;标准输入设备就是键盘&#xff0c;标准输出设备就是终端&#xff0c;即显示器。 一、输出重定向 命令的输出不仅可以是显示器&#xff0c;还可以是其他文…

一个基于POP3协议进行邮箱账号验证的类

最近老陈要针对企业邮箱做一些开发&#xff0c;以对接企业OA神马的&#xff0c;但企业邮箱唯独没有开放账号密码验证功能&#xff0c;很恼火&#xff01;不得已&#xff0c;翻出早些年的Asp代码改编成了C#类&#xff0c;实现了一个C#下的通过POP3协议进行邮箱账号验证的类&…

cobbler get-loaders 通过代理下载

2019独角兽企业重金招聘Python工程师标准>>> cobbler 版本是2.6.3&#xff0c;可以通过系统环境变量设置proxy&#xff0c;支持 HTTP_PROXY、HTTPS_PROXY、FTP_PROXY 三个变量。 cobbler 版本是2.6.6时&#xff0c;需要从/etc/cobbler/settings 中增加proxy_url_ex…

Shell文件包含

像其他语言一样&#xff0c;Shell 也可以包含外部脚本&#xff0c;将外部脚本的内容合并到当前脚本。 Shell 中包含脚本可以使用&#xff1a; . filename 或者 source filename 两种方式的效果相同。简单起见&#xff0c;一般使用点号(.)&#xff0c;但是注意点号(.)和文件…

Vim高级使用 - CentOS下使用VIM打造C/C++开发环境

使用TagList http://blog.csdn.net/fbfsber008/article/details/7044723 转载于:https://www.cnblogs.com/tiantao/p/2389126.html

Shell数组:shell数组的定义、数组长度

bash支持一维数组&#xff08;不支持多维数组&#xff09;&#xff0c;并且没有限定数组的大小。类似与C语言&#xff0c;数组元素的下标由0开始编号。获取数组中的元素要利用下标&#xff0c;下标可以是整数或算术表达式&#xff0c;其值应大于或等于0。 定义数组 在Shell中…

分析busybox的源码

以下内容源于网络资源的学习与整理&#xff0c;如有侵权请告知删除。 参考博客 busybox详解_linuxarmsummary的博客-CSDN博客 一、前言 因为uboot给内核传参的bootargs中有“init/linuxrc”这个项目&#xff0c;而由前面的分析可知/linuxrc这个二进制文件位于根文件系统中&…

Vmware vSphere 十个疑难问题解决方法

Vmware vSphere疑难问题解决方法导读&#xff1a;这里汇总了10个Vmware vSphere常见的问题&#xff1a;清除vSphere Client的登录记录、Linux系统VMXNET3虚拟网路卡时UDP包被Drop掉等&#xff0c;并给出了具体的解决办法。关键词&#xff1a;VMware vSphere1、清除vSphere Clie…