昨天接到上级说要在检测服务器上增加一个可以根据时间来查看服务器信息的线形图,那我首先就在原有的发送监控信息的功能上增加了把信息存入数据库中,然后再数据库中取得数据显示.

至于线形图的插件是jqx 的chart 网址是:http://www.jqwidgets.com/jquery-widgets-demo/demos/jqxchart/index.htm?%28arctic%29

我用的是chart的Axis Position.大致是这样的

选择时间的我用的是my97的时间插件

在编写功能中遇到了如下几个问题:

1.因为检测的服务器的盘符可能是会改变的,所以盘符是需要动态取得,在发送监控信息中我只能是把硬盘的所有信息存在了一个字段中,这样就导致了我在chart中获取数据源的时候取数据中,遇到了字符串截取的困难(在这个上,我承认自己是太差了),因为获得chart数据源是通过ajax获取的,而返回的数据设置的是json格式.在返回json格式之前,通过sql查询到的数据是个表结构的,所以就在把硬盘信息截取到的信息存到了表中

Handler1.ashx

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using MySql.Data.Common;
using MySql.Data.MySqlClient;
using System.Data;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using System.Text.RegularExpressions; namespace WebApplication1.js.ajax
{
/// <summary>
/// Handler1 的摘要说明
/// </summary>
public class Handler1 : IHttpHandler
{ public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
MySqlConnection conn = new MySqlConnection("server=localhost;user id=root;password=123456;database=serverinfo;");
conn.Open(); string sql = "select DiskInfo,RAMSInfo,RAMUInfo,CPUInfo,DataValue,DateTime from serverinfo";
MySqlDataAdapter ad = new MySqlDataAdapter(sql, conn);
DataSet ST = new DataSet();
ad.Fill(ST,"info"); //取得服务器硬盘的盘数 C: 总空间为45G,剩余12.72G D: 总空间为141.01G,剩余129.62G E: 总空间为140.01G,剩余137.07G F: 总空间为139.73G,剩余128.82G //1.算出 硬盘盘数/盘符 2.往ST中添加列 3.往列中添加数据
string disk = ST.Tables[].Rows[]["DiskInfo"].ToString().Trim();
string[] dis = Regex.Split(disk, " ", RegexOptions.IgnoreCase); //盘数就是 dis.length-1
for (int i = ; i < dis.Length; i++) //dis.Length=5
{
ST.Tables[].Columns.Add(dis[i].Substring(, )); //往ST中添加列
ST.Tables[].Columns.Add(dis[i].Substring(, )+"S");
}
for (int n = ; n < ST.Tables[].Rows.Count; n++) //往ST新增列中添加数据
{
for (int j = ; j < dis.Length; j++)
{ string data = ST.Tables[].Rows[n]["DiskInfo"].ToString().Trim(); //当前行的数据
string[] datas = Regex.Split(disk, " ", RegexOptions.IgnoreCase); //当前行各盘的数据
string PF=dis[j].Substring(, );
string PFS = dis[j].Substring(, )+"S"; string pattern = @"\d+(\.\d+)?[G]";
RegexOptions regexOptions = RegexOptions.None;
Regex regex = new Regex(pattern, regexOptions);
string inputData = @""+datas[j]+""; for (int m = ; m < regex.Matches(inputData).Count-; m++)
{
ST.Tables[].Rows[n][PF] = regex.Matches(inputData)[m]; //存入数据
ST.Tables[].Rows[n][PFS] = regex.Matches(inputData)[m+];
}
}
} IsoDateTimeConverter iso = new IsoDateTimeConverter();
iso.DateTimeFormat = "yyyy-MM-dd";
string st= JsonConvert.SerializeObject(ST,iso); context.Response.Write(st);
} public bool IsReusable
{
get
{
return false;
}
}
}
}

这样chart就获得了数据源,而在这里也出现了第二个问题,

2. 在chart中设置硬盘信息的时候,因为硬盘信息是动态取得,seriesGroups中的series信息就没法写死,在jqx中貌似提到了一点,就是用数据绑定的方法 dome在这:http://www.jqwidgets.com/jquery-widgets-demo/demos/jqxchart/index.htm#demos/jqxchart/javascript_chart_donut_series.htm ,这样绑定的话就只能全部数据绑定,当时我设置的数据就只剩下硬盘的信息了,从头再来全部绑定太得不偿失了,后来用到的是写一个函数赋值给seriesGroups中的series, 这里又遇到了第三个问题.

3.在series 中设置的数值 是object的键值对格式,如何设置呢?请看下面代码

  function Diskinfo() {
var source;
$.ajax({
async: false,
type: "POST",
url: "js/ajax/Handler2.ashx",
success: function (data) {
source = data;
}
});
var tempArr = source.split(',');
var arr = [];
//var str=[];
if (source) {
for (var i = 0; i < tempArr.length-1; i++) {
var disk = tempArr[i];
if (i % 2 == 0) {
var obj = { dataField: disk, displayText: disk + "总" };
arr.push(obj);
//str+= "{ dataField: '" + disk + "', displayText: '" + disk + "总' },";
} else {
//str+= "{ dataField: '" + disk + "', displayText: '" + disk + "剩余' },";
var obj = { dataField: disk, displayText: disk + "剩余" };
arr.push(obj);
} }
}
//arr.push(str);
return arr;
}

这样得到的数据就是object类型的键值对啦~

然后赋值series:Diskinfo()

到这里数据就设置完了,功能也搞定了~

2014-06-13 jq chart的更多相关文章

  1. NFC会员管理-转载自http://technews.cn/2014/09/13/nfc-sticker/

    基隆的百年名店“李鹄饼店”误用馊水油,客人纷纷上门退货,因退货条件宽松,客人一货两退,造成巨大的损失.为了平息客人的愤怒,店家允许客人凭发 票或商品办理退货,有的客人先用发票退一次钱,再用商品退一次钱 ...

  2. 【转载】Android Studio jar、so、library项目依赖,原文链接http://zhengxiaopeng.com/2014/12/13/Android-Studio-jar、so、library项目依赖/

    前言 Android Studio(以下简称AS)在13年I/O大会后放出预览版到现在放出的正式版1.0(PS.今天又更新到1.0.1了)历时一年多了,虽然Google官方推出的Android开发者的 ...

  3. Google Maps 学习笔记(一)2014.06.04

    1.<body onload="加载地图的函数" onunload="GUnload()"> 2.new GMap2(container,opts) ...

  4. 索引介绍,转载自:https://tech.meituan.com/2014/06/30/mysql-index.html

    索引原理 除了词典,生活中随处可见索引的例子,如火车站的车次表.图书的目录等.它们的原理都是一样的,通过不断的缩小想要获得数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是我们总 ...

  5. JavaScript基础系列目录(2014.06.01~2014.06.08)

    下列文章,转载请亲注明链接出处,谢谢! 链接地址: http://www.cnblogs.com/ttcc/tag/JavaScript%20%E5%9F%BA%E7%A1%80%E7%9F%A5%E ...

  6. Cheatsheet: 2014 06.01 ~ 06.30

    Mobile Developing iOS8 Apps Using Swift – Part 1- Hello World The Insider's Guide to Android Intervi ...

  7. 2014.06.20 (转)IEEE与论坛灌水

    转自"饮水思源"      电子类学生大都知道IEEE, 这个IEEE就像一个大的BBS论坛,而这个协会下面有很多杂志,比如图像处理,信号处理,微波技术等.这些杂志就是论坛下的分版 ...

  8. 2014.12.13 ASP.NET文件上传

    一.文件上传:(一)上传到硬盘文件夹1.最简单的上传. [HTML代码] <asp:FileUpload ID="FileUpload1" runat="serve ...

  9. 2014第13周四Webservice概念问题记

    晚上回来看网页学习了这两天一直疑惑的两个问题: 1.REST和SOAP架构下的Webservice的区别? 2.axis2和CXF的区别. 大部分是理论,暂时摘录一下,以后有更多实践后再回顾. 一.R ...

随机推荐

  1. Python核心编程(第八章)--条件和循环

    如果一个复合语句(if子句,while或for循环)的代码仅仅包含一行代码,可以和前面的语句写在同一行上:   elif语句(else-if) 条件表达式(三元操作符) X if C else Y 计 ...

  2. LeetCode_Combination Sum

    Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C wher ...

  3. 必须用C模拟OS?

    ASM基本必要,至于高级语言就很难说了.去osdev wiki上一翻一堆各种语言实现的玩意. 一个模拟OS其实不太容易完整搭出来,反倒是直接构造内核的后顾之忧少(如果还有真的想在SIGALRM里耍什么 ...

  4. 关于老驱动不能在windows 8下正常安装的问题

    问题: 老驱动(WDF),能在windows 7下安装并工作,但是不能在windows 8下安装. 先了解下windows 8驱动的新东西吧: New for windows 8 http://msd ...

  5. 关于TCP的三次握手和四次分手(整理)

    这个协议非常重要,这里把它的链接和释放整理一下 首先是三次握手: 1.  客户端发起,像服务器发送的报文SYN=1,ACK=0,然后选择了一个初始序号:seq=x. SYN是干什么用的? 在链接的时候 ...

  6. tag_on_failure => [] # prevent default _grokparsefailure tag on real records

    [elk@zjtest7-frontend config]$ cat stdin04.conf input { stdin { } } filter { # drop sleep events gro ...

  7. 编程:C#调用Python模块

    当下,C#与Python都是比较热门的计算机编程语言,他们各有优缺点,如果能让他们互相配合工作,那是多么美好的事情,今天我来讲解一下如何利用C#来调用Python. 如果让C#支持调用Python模块 ...

  8. SPOJ375.QTREE树链剖分

    题意:一个树,a b c 代表a--b边的权值为c.CHANGE x y  把输入的第x条边的权值改为y,QUERY x y 查询x--y路径上边的权值的最大值. 第一次写树链剖分,其实树链剖分只能说 ...

  9. poj 2718 Smallest Difference(穷竭搜索dfs)

    Description Given a number of distinct , the integer may not start with the digit . For example, , , ...

  10. 【技术文档】《算法设计与分析导论》R.C.T.Lee等·第7章 动态规划

    由于种种原因(看这一章间隔的时间太长,弄不清动态规划.分治.递归是什么关系),导致这章内容看了三遍才基本看懂动态规划是什么.动态规划适合解决可分阶段的组合优化问题,但它又不同于贪心算法,动态规划所解决 ...