|
Piața specifică de aplicații pentru acest exemplu este că trebuie să citesc regulat prețul unei mărfuri din baza de date și apoi să o afișez pe pagina web ca un grafic, similar graficului de tendință al prețurilor pentru instrumentele de tranzacționare din acțiuni. Eu folosesc asp.net, combinat cu implementarea pluginului Highcharts în jQuery, pluginul poate suporta multe tipuri de grafică, dar acestea sunt statice, iar exemplele oferite trebuie transformate, prietenii interesați pot intra pe site-ul oficial Highcharts să vadă (http://www.highcharts.com/), care oferă multe demo-uri, sincer, ca să-mi înțeleg nevoile, ar trebui să folosesc Highstock, Totuși, după ce am analizat exemplul de actualizare dinamică al Highcharts, pot realiza că interfața mea de cerințe este mai concisă, așa că acest articol folosește modelul de actualizare dinamică din Highcharts, iar tipul grafic este spline. Harta finală a efectului este următoarea (prețul Pinqijin este actualizat la fiecare 10 secunde, iar un punct este adăugat la graficul liniar la fiecare 10 secunde):
Obține pași: Creează un site nou cu VS și creează o pagină asp.net DynamicUpdate.aspx, codul paginii este următorul:
- <%@ 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>
Cod de copiereProprietatea Highcharts renderTo indică containerele de afișare, events reprezintă evenimentul pe care containerul trebuie să-l înregistreze, unde încărcarea înseamnă că are loc după ce încărcarea s-a încheiat, aici se setează un cronometru js în încărcare, care apare o dată la fiecare 10 secunde, iar codul din acesta este pentru a solicita cel mai recent GOLD din fișierul dataupdate.ashx al folderului ajaxhandler în același director rădăcină ca pagina DynamicUpdate.aspx prin ajax în jQuery Datele despre prețuri de acest tip, iată de ce adaug randomCode + "=" + oldrandomCode în URL-ul ajax, pentru că adăugarea unui număr aleatoriu poate evita cache-ul, iar flag=1 este pentru că fișierul meu dataupdate.ashx vrea să accepte mai multe cereri de la diferite ajax, deci folosesc flag pentru a o distinge xAxis reprezintă colecția de atribute definite pentru axa x a containerului, tipul reprezintă tipul textului afișat, opțional, aici completez tipul de timp, aici observați că implicit pentru această instanță este ora GMT, puteți folosi și ora UTC, dar în general folosim ora Beijing, (GMT sau UTC) + 8 ore = ora Beijing, deci când folosim ajax pentru a obține ora de la Beijing, ar trebui să scădem 8 ore din oră (aici vreau să împărtășesc și o experiență, Cum să convertești timpul serverului în timp js care poate fi folosit de metoda .getTime(), adică să scazi timpul serverului din 1970-1-1, să convertești zilele rămase în milisecunde și apoi să atribui o valoare noului timp inițializat prin metoda setTime în js, am constatat că rezultatul obținut de getTime() este incorect pentru a inițializa un timp js direct în js sub forma noului Date (an, lună, zi, oră, minut, secundă, milisecundă) cu getTime(), Cât despre motivul pentru care 1970-1-1 este scăzut, este pentru că definiția metodei getTime() este de a obține numărul de milisecunde din timpul curent din 1970-1-1), când axa x nu este afișată ca timp sau trebuie să o definești singur, poate fi definită și prin atributul categorii, tickPixelInterval reprezintă densitatea axei x, iar etichetele sunt folosite pentru a formata formatul de afișare al axei x yAxis reprezintă o colecție de atribute definite pentru axa y a containerului, care este aproximativ aceeași cu atributele axei x, dar în Highcharts nu este posibilă definirea valorii fixe a axei y prin categorii, axa y a Highcharts este generată automat pe baza datelor date de puncte de coordonate, care depinde de subatributul de date al atributului seriei, de exemplu, când atribui o valoare datelor. Valoarea maximă este 300, iar valoarea minimă este 100. Atunci afișarea axei y va fi între 100 și 300, sau poți seta și atributul maxim sau minim al axei y. seria reprezintă colecția tuturor curbelor afișate în container, aici arăt o singură curbă, numele reprezintă numele curbei, datele reprezintă colecția unei serii de puncte coordonate ale curbei, x este în față, y este în spate, este un tablou js, în acest caz, deoarece axa x arată ora, deci proprietatea x a obiectului tabloului trebuie setată pe timp, dar în Highcharts nu este direct atribuită timp axei x, În schimb, numărul de milisecunde dintre 1970-1-1 și un anumit timp este atribuit axei x pentru a reprezenta acest timp, deci trebuie folosită metoda getTime(), forma punctului coordonatului axei y trebuie să fie y = număr mic * formă întreagă, și nu înțelegeam de ce Highcharts trebuia să facă asta, pentru că datele de preț ale varietății din acest exemplu sunt în general cam aceleași, așa că a trebuit să împart la 200 când obțineam datele, apoi să înmulțesc cu 200 când atribuiam o valoare axei y.
<%= jsonstr %> în codul paginii este datele inițiale pe care trebuie să le obțin de la server pentru a inițializa graful, generarea cs a paginii
- 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;
- }
Cod de copiereDintre acestea, tabelul TabMerPrice este tabelul de informații despre prețuri variații, timpul TMPTime, prețul TMPPrice, intervalul de timp TMPTime este de zece secunde, folosesc o lucrare de bază de date pentru a genera înregistrarea tabelului, care se întâmplă o dată la zece secunde AddHours(-8) este pentru a converti ora în ora Beijingului, iar formatul de date generat este format json Codul dataupdate.ashx arată astfel:
- 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();
- }
Cod de copiereAceasta este implementarea aproximativă a agregării pașilor, care poate realiza afișarea în timp real a datelor de pe partea serverului cu un grafic similar cu formatul stock
HighCharts演示.zip
(48.69 KB, Numărul de descărcări: 1)
|