|
Il mercato specifico per applicazioni di questo esempio è che devo leggere regolarmente il prezzo di una commodity dal database e poi visualizzarlo sulla pagina web come grafico, simile al grafico di tendenza dei prezzi degli strumenti di trading azionari. Io uso asp.net, combinato con l'implementazione del plugin Highcharts in jQuery, il plugin può supportare molti tipi di grafica, ma sono statici, e gli esempi forniti devono essere trasformati, gli amici interessati possono andare sul sito ufficiale di Highcharts per vedere (http://www.highcharts.com/), che fornisce molte demo, ad essere onesti, per capire le mie esigenze, dovrei usare Highstock, Tuttavia, dopo aver esaminato l'esempio di aggiornamento dinamico di Highcharts, posso anche rendermi conto che la mia interfaccia di requisiti è più concisa, quindi questo articolo utilizza il modello di aggiornamento dinamico in Highcharts, e il tipo grafico è spline. La mappa finale dell'effetto è la seguente (il prezzo di Pinqijin viene aggiornato ogni 10 secondi e un punto viene aggiunto al grafico a linee ogni 10 secondi):
Raggiungere i gradini: Crea un nuovo sito web con VS e crea una pagina asp.net DynamicUpdate.aspx, il codice della pagina è il seguente:
- <%@ 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>
Copia codiceHighcharts proprietà renderTo indica i contenitori di visualizzazione, events rappresenta l'evento che il container deve registrare, dove load significa che avviene dopo il completamento del load; qui viene impostato un timer js nel load, che avviene ogni 10 secondi, e il codice in esso serve a richiedere l'ultimo GOLD dal file dataupdate.ashx della cartella ajaxhandler nella stessa directory radice della pagina DynamicUpdate.aspx tramite ajax in jQuery Per quanto riguarda i dati di prezzo di questa varietà, ecco perché aggiungo randomCode + "=" + oldrandomCode nell'URL ajax, perché aggiungere un numero casuale può evitare la caching, e flag=1 è perché il mio file dataupdate.ashx vuole accettare più richieste da diversi ajax, quindi usa flag per distinguerlo xAxis rappresenta la collezione di attributi definiti per l'asse x del container, il tipo rappresenta il tipo di testo visualizzato, opzionale, qui rifill il tipo di tempo, qui si noti che il predefinito per l'istanza è l'ora GMT, puoi anche usare l'ora UTC, ma generalmente usiamo l'ora di Pechino, (GMT o UTC) + 8 ore = ora di Pechino, quindi quando usiamo l'ajax per ottenere l'ora di Pechino, dovremmo sottrarre 8 ore dall'ora (qui voglio anche condividere un'esperienza, Come convertire il tempo del server in tempo js che può essere usato dal metodo .getTime(), cioè sottrarre l'ora del server da 1970-1-1, convertire i giorni restanti in millisecondi e poi assegnare un valore al tempo appena inizializzato tramite il metodo setTime in js, ho scoperto che il risultato ottenuto da getTime() è errato per inizializzare un tempo js direttamente in js sotto forma di nuova Data (anno, mese, giorno, ora, minuto, secondo, millisecondo) con getTime(), Per quanto riguarda il motivo per cui 1970-1-1 viene sottratto, è perché la definizione del metodo getTime() è ottenere il numero di millisecondi dal tempo corrente da 1970-1-1), quando l'asse x non è visualizzato come un tempo o devi definirlo da solo, può anche essere definito dall'attributo categories, tickPixelInterval rappresenta la densità dell'asse x, e etichette viene usato per formattare il formato di visualizzazione dell'asse x yAsse rappresenta una raccolta di attributi definiti per l'asse y del contenitore, che è approssimativamente uguale agli attributi dell'asse x, ma in Highcharts non è possibile definire il valore fisso dell'asse y tramite categorie; l'asse y di Highchart viene generato automaticamente in base ai dati dati dei punti di coordinata, che dipendono dal sottoattributo dati dell'attributo serie, ad esempio, quando si assegna un valore ai dati. Il valore massimo è 300 e il valore minimo è 100. Poi la visualizzazione dell'asse y sarà tra 100 e 300, oppure puoi anche impostare l'attributo massimo o minimo dell'asse y. serie rappresenta la collezione di tutte le curve visualizzate nel contenitore, qui mostro una sola curva, nome rappresenta il nome della curva, data rappresenta la raccolta di una serie di punti coordinate della curva, x è davanti, y è dietro, è un array js, in questo caso, poiché l'asse x mostra il tempo, quindi la proprietà x dell'oggetto array deve essere impostata come tempo, ma in Highcharts non è direttamente assegnato tempo all'asse x, Invece, il numero di millisecondi tra 1970-1-1 e un certo tempo viene assegnato all'asse x per rappresentare questo tempo, quindi deve essere usato il metodo getTime(), la forma del punto coordinato sull'asse y deve essere y = piccolo numero * forma intera, e non capivo perché Highcharts dovesse farlo, perché i dati di prezzo della varietà in questo esempio sono generalmente gli stessi, quindi ho dovuto dividere per 200 quando ho ottenuto i dati, e poi moltiplicare per 200 quando assegno un valore all'asse y.
<%= jsonstr %> nel codice della pagina sono i dati iniziali che devo ottenere dal server per inizializzare il grafo, la generazione CS della pagina
- 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;
- }
Copia codiceTra queste, la tabella TabMerPrice è la tabella informativa sui prezzi varietà, TMPTime time, TMPPrice price, TMPTime intervallo di tempo di dieci secondi, uso un lavoro di database per generare la registrazione della tabella, che avviene una volta ogni dieci secondi AddHours(-8) serve a convertire l'ora in ora di Pechino, e il formato dati generati è il formato json Il codice dataupdate.ashx appare così:
- 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();
- }
Copia codiceQuesta è l'implementazione approssimativa dell'aggregazione a passi, che può realizzare la visualizzazione in tempo reale dei dati lato server con un grafico simile al formato stock
HighCharts演示.zip
(48.69 KB, Numero di download: 1)
|