|
Špecifická aplikácia tohto príkladu je, že musím pravidelne čítať cenu komodity z databázy a potom ju zobrazovať na webovej stránke ako graf, podobne ako cenový trendový graf obchodných nástrojov v akciách. Používam asp.net, v kombinácii s implementáciou pluginu Highcharts v jQuery, plugin dokáže podporovať mnoho typov grafiky, ale sú statické a poskytnuté príklady je potrebné transformovať, záujemcovia môžu ísť na oficiálnu stránku Highcharts a pozrieť si to (http://www.highcharts.com/), ktorá ponúka veľa ukážok, úprimne, aby som pochopil svoje potreby, mal by som použiť Highstock, Avšak po pohľade na príklad dynamickej aktualizácie Highcharts si tiež uvedomujem, že moje rozhranie požiadaviek je stručnejšie, takže tento článok používa dynamický update model v Highcharts a grafický typ je spline. Konečná mapa efektov je nasledovná (cena Pinqijin sa aktualizuje každých 10 sekúnd a bod sa pridáva do čiarového grafu každých 10 sekúnd):
Dosiahnite krok navyše: Vytvorte novú webovú stránku pomocou VS a vytvorte asp.net stránku DynamicUpdate.aspx, kód stránky je nasledovný:
- <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="DynamicUpdate.aspx.cs"
- Inherits="WebImg.DynamicUpdate" %>
- <!DOCTYPE HTML>
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
- <title>动态显示价格图例</title>
- <scrip去掉t type="text/javascrip去掉t" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></scrip去掉t>
- <scrip去掉t type="text/javascrip去掉t">
- $(function () {
- $(document).ready(function () {
- Highcharts.setOptions({
- global: {
- useUTC: false
- }
- });
- var chart;
- chart = new Highcharts.Chart({
- chart: {
- renderTo: 'container',
- type: 'spline',
- marginRight: 10,
- events: {
- load: function () {
- // set up the updating of the chart each second
- var series = this.series[0];
- setInterval(function () {
- var randomCode = parseInt(Math.random() * 10000);
- var oldrandomCode = parseInt(Math.random() * 10000);
- $.ajax({
- url: "ajaxhandler/dataupdate.ashx?" + randomCode + "=" + oldrandomCode + "&flag=1",
- type: "get",
- dataType: "json",
- success: function (data, textStatus, XMLHttpRequest) {
- var ctime = new Date();
- ctime.setTime(parseInt(data.rows[0].times));
- var x = ctime.getTime(), // current time
- y = data.rows[0].price * 200;
- series.addPoint([x, y], true, true);
- },
- error: function () { }
- });
- }, 10000);
- }
- }
- },
- title: {
- text: '品旗撮合交易市场品种行情'
- },
- xAxis: {
- title: {
- text: '时间'
- },
- type: 'datetime',
- tickPixelInterval: 150,
- labels:{formatter:function(){
- var vDate = new Date(this.value);
- return vDate.getHours()+":"+vDate.getMinutes()+":"+vDate.getSeconds();
- }}
- },
- yAxis: {
- title: {
- text: '价格'
- },
- plotLines: [{
- value: 0,
- width: 1,
- color: '#808080'
- }]
- },
- tooltip: {
- formatter: function () {
- return '<b>' + this.series.name + '</b><br/>' +
- Highcharts.dateFormat('%Y-%m-%d %H:%M:%S', this.x) + '<br/>' +
- Highcharts.numberFormat(this.y, 2);
- }
- },
- legend: {
- enabled: false
- },
- exporting: {
- enabled: false
- },
- credits:{
- text:'品旗金属交易市场',
- url:'http://www.inv6.com'
- },
- series: [{
- name: '品旗金(GOLD)',
- data: (function () {
- var data = [],
- i;
- var jsonData = <%= jsonstr %>;
- for (i = -19; i <= 0; i++) {
- var ctime = new Date();
- ctime.setTime(parseInt(jsonData.rows[i+19].time1));
- data.push({
- x: ctime.getTime(),
- y: jsonData.rows[i + 19].price * 200
- });
- }
- return data;
- })()
- }]
- });
- });
- });
- </scrip去掉t>
- </head>
- <body>
- <scrip去掉t src="http://code.highcharts.com/highcharts.js"></scrip去掉t>
- <scrip去掉t src="http://code.highcharts.com/modules/exporting.js"></scrip去掉t>
- <div id="container" style="min-width: 400px; height: 400px; margin: 0 auto">
- </div>
- </body>
- </html>
Kopírovať kódVlastnosť Highcharts renderTo označuje zobrazovacie kontajnery, udalosti predstavujú udalosť, ktorú kontajner potrebuje zaregistrovať, kde načítanie znamená, že nastáva až po dokončení načítania, tu je v načítaní nastavený časovač js, ktorý nastáva raz za 10 sekúnd, a kód v ňom je na požiadavku najnovšieho GOLD zo súboru dataupdate.ashx priečinka ajaxhandler v rovnakom koreňovom adresári ako DynamicUpdate.aspx stránka cez ajax v jQuery Čo sa týka cenových údajov variety, tu je dôvod, prečo pridávam randomCode + "=" + oldrandomCode do ajax URL, pretože pridaním náhodného čísla sa vyhnem cache, a flag=1 je preto, že môj dataupdate.ashx súbor chce prijať viacero požiadaviek z rôznych ajaxov, takže používam flag na jeho rozlíšenie xAxis predstavuje kolekciu atribútov definovaných pre x-os kontajnera, typ predstavuje zobrazený typ textu, voliteľné, tu vyplňujem typ času, tu si všimnite, že predvolený čas pre inštanciu je GMT čas, môžete použiť aj UTC čas, ale my zvyčajne používame pekingský čas (GMT alebo UTC) + 8 hodín = pekingský čas, takže keď použijeme ajax, aby sme zistili, že čas je pekingský čas, mali by sme od hodiny odčítať 8 hodín (tu chcem tiež zdieľať skúsenosť, Ako previesť serverový čas na js čas, ktorý môže použiť metóda .getTime(), teda odčítať serverový čas od 1970-1-1, previesť zostávajúce dni na milisekundy a potom priradiť hodnotu novo inicializovanému času pomocou metódy setTime v js. Zistil som, že výsledok získaný getTime() je nesprávny na inicializáciu js času priamo v js vo forme nového dátumu (rok, mesiac, deň, hodina, minúta, sekunda, milisekunda) pomocou getTime(), Čo sa týka toho, prečo sa 1970-1-1 odpočítava, je to preto, že definícia metódy getTime() je získať počet milisekúnd od aktuálneho času z 1970-1-1). Keď sa os x nezobrazuje ako čas alebo si ju musíte definovať sami, môže byť definovaná atribútom kategórie, tickPixelInterval predstavuje hustotu osi x a štítky sa používajú na formátovanie zobrazovacieho formátu osi x yAxis predstavuje kolekciu atribútov definovaných pre y-os kontajnera, ktorá je približne rovnaká ako atribúty x-osi, ale v Highcharts nie je možné definovať pevnú hodnotu y-osi cez kategórie, y-os Highcharts sa automaticky generuje na základe daných údajov o súradnicovom bode, ktoré závisí od dátového podatribútu atribútu série, napríklad keď dátam priradíte hodnotu. Maximálna hodnota je 300 a minimálna 100. Potom bude zobrazenie y-osi medzi 100 a 300, alebo môžete nastaviť atribút max či min pre yAxis séria predstavuje kolekciu všetkých kriviek zobrazených v kontajneri, tu ukazujem len jednu krivku, názov predstavuje názov krivky, dáta predstavujú kolekciu série súradnicových bodov krivky, x je vpredu, y je za ním, je to js pole, v tomto prípade, pretože os x ukazuje čas, takže vlastnosť x objektu poľa musí byť nastavená na čas, ale vo Highcharts nie je čas priamo priradený osi x, Namiesto toho sa počet milisekúnd medzi 1970-1-1 a určitým časom priradí osi x, aby reprezentoval tento čas, takže sa musí použiť metóda getTime(), tvar bodu na y-osi musí byť y = malé číslo * celočíselná forma, a nerozumel som, prečo to Highcharts musel robiť, pretože cenové údaje pre varietu v tomto príklade sú vo všeobecnosti približne rovnaké, takže som musel pri získavaní údajov deliť 200 a pri priraďovaní hodnoty y-osi vynásobiť 200.
<%= jsonstr %> v kóde stránky sú počiatočné dáta, ktoré potrebujem získať zo servera na inicializáciu grafu, generovanie stránky v cs
- public string jsonstr = "";
- protected void Page_Load(object sender, EventArgs e)
- {
- getData();
- }
- private void getData()
- {
- DataTable dtPrice = SQLDBHelper.ExecuteTable("select top 20 TMPCode,TMPTime,TMPPrice from TabMerPrice with(nolock) order by TMPTime desc");
- string json = "{"rows":[";
- for (int i = (dtPrice.Rows.Count-1); i >= 0; i--)
- {
- json += "{"time1":"" + (Convert.ToDateTime(dtPrice.Rows[i]["TMPTime"]).AddHours(-8) - new DateTime(1970, 1, 1)).TotalMilliseconds + "","price":"" + (Convert.ToDecimal(dtPrice.Rows[i]["TMPPrice"])/200) + ""},";
- }
- json = json.TrimEnd(',');
- json += "]}";
- jsonstr = json;
- }
Kopírovať kódMedzi nimi je tabuľka TabMerPrice, ktorá je tabuľkou o rôznych cenách, TMPTime čas, TMPPrice cena, TMPTime časový interval je desať sekúnd, používam databázovú úlohu na generovanie záznamu tabuľky, čo sa deje raz za desať sekúnd AddHours(-8) slúži na konverziu času na pekingský čas a generovaný dátový formát je json formát Kód dataupdate.ashx vyzerá takto:
- public void ProcessRequest(HttpContext context)
- {
- string flag = context.Request.QueryString["flag"].ToString();
- switch (flag)
- {
- case "1"://获取品种当前价格
- GetMerPrice(context);
- break;
- }
- }
- private void GetMerPrice(HttpContext context)
- {
- context.Response.Clear();
- context.Response.Buffer = true;
- context.Response.ContentType = "application/json";
- context.Response.ContentEncoding.GetBytes("utf-8");
- DataTable dtPrice = SQLDBHelper.ExecuteTable("select top 1 TMPCode,TMPTime,TMPPrice from TabMerPrice with(nolock) order by TMPTime desc");
- string json = "{"rows":[";
- json += "{"times":"" + (Convert.ToDateTime(dtPrice.Rows[0]["TMPTime"]).AddHours(-8) - new DateTime(1970, 1, 1)).TotalMilliseconds + "","price":"" + (Convert.ToDecimal(dtPrice.Rows[0]["TMPPrice"]) / 200) + ""}";
- json = json.TrimEnd(',');
- json += "]}";
- context.Response.Write(json);
- context.Response.Flush();
- context.Response.End();
- }
Kopírovať kódIde o hrubú implementáciu agregácie krokov, ktorá dokáže realizovať zobrazenie serverových dát v reálnom čase pomocou grafu podobného formátu akcií
HighCharts演示.zip
(48.69 KB, Počet stiahnutí: 1)
|