|
Den specifika applikationsmarknaden för detta exempel är att jag regelbundet måste läsa priset på en råvara från databasen och sedan visa det på webbsidan som en graf, liknande pristrenddiagrammet för handelsinstrument i aktier. Jag använder asp.net, kombinerat med Highcharts plugin-implementation i jQuery, pluginet kan stödja många typer av grafik, men de är statiska och exemplen måste transformeras, intresserade vänner kan gå till Highcharts officiella webbplats för att se (http://www.highcharts.com/), som erbjuder många demos, ärligt talat, för att uppfylla mina behov borde jag använda Highstock, Men efter att ha tittat på exemplet med dynamisk uppdatering i Highcharts kan jag också inse att mitt kravgränssnitt är mer koncist, så den här artikeln använder den dynamiska uppdateringsmodellen i Highcharts, och grafiktypen är spline. Den slutliga effektkartan är som följer (priset på Pinqijin uppdateras var tionde sekund och en punkt läggs till linjegrafen var tionde sekund):
Uppnå stegsamling: Skapa en ny webbplats med VS och skapa en asp.net sida DynamicUpdate.aspx, sidkoden är följande:
- <%@ 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>
Kopiera kodenHighcharts-egenskapen renderTo indikerar displaybehållare, händelser representerar den händelse som containern behöver registrera, där load betyder att den sker efter att laddningen är klar, här sätts en js-timer i loaden, som sker var tionde sekund, och koden i den är att begära den senaste GOLD från dataupdate.ashx-filen i ajaxhandler-mappen i samma rotkatalog som DynamicUpdate.aspx-sidan via ajax i jQuery Prisdata för varianten, här är varför jag lägger till randomCode + "=" + oldrandomCode i ajax-URL:en eftersom tillägg av ett slumpnummer kan undvika caching, och flag=1 är för att min dataupdate.ashx-fil vill acceptera flera förfrågningar från olika ajax, så använd flagga för att skilja den åt xAxis representerar samlingen av attribut som definierats för x-axeln i containern, type representerar den visade texttypen, valfritt, här fyller jag i tidstypen, notera att standarden för instansen är GMT-tid, du kan också använda UTC-tid, men vi använder vanligtvis Beijing-tid (GMT eller UTC) + 8 timmar = Beijing-tid, så när vi använder ajax för att få tiden är Beijing-tid bör vi dra av 8 timmar från timmen (här vill jag också dela en upplevelse, Hur man konverterar servertid till js-tid som kan användas med .getTime()-metoden, det vill säga subtrahera servertiden från 1970-1-1, konvertera de återstående dagarna till millisekunder och sedan tilldela ett värde till den nyinitierade tiden via setTime-metoden i js, jag fann att resultatet som getTime() erhåller är felaktigt för att initialisera en js-tid direkt i js i form av nytt datum (år, månad, dag, timme, minut, sekund, millisekund) med getTime(), När det gäller varför 1970-1-1 subtraheras beror det på att definitionen av getTime()-metoden är att få antalet millisekunder från den aktuella tiden från 1970-1-1), när x-axeln inte visas som en tid eller du behöver definiera den själv, kan den också definieras av attributet categories, tickPixelInterval representerar tätheten av x-axeln, och labels används för att formatera visningsformatet för x-axeln yAxis representerar en samling attribut definierade för y-axeln i containern, vilket ungefär är samma som attributen för x-axeln, men i Highcharts är det inte möjligt att definiera det fasta värdet av y-axeln genom kategorier, y-axeln för Highcharts genereras automatiskt baserat på den givna koordinatpunktdatan, vilket beror på dataunderattributet för serieattributet, till exempel när du tilldelar ett värde till data. Maxvärdet är 300 och minimivärdet är 100. Då kommer displayen för y-axeln att ligga mellan 100 och 300, eller så kan du också ställa in max- eller min-attributet för yAxis serie representerar samlingen av alla kurvor som visas i behållaren, här visar jag bara en kurva, namnet representerar namnet på kurvan, data representerar insamlingen av en serie koordinatpunkter på kurvan, x är fram, y bakom, det är en js-array, i detta fall eftersom x-axeln visar tid, så x-egenskapen för arrayobjektet måste sättas till tid, men i Highcharts tilldelas inte tid direkt till x-axeln, Istället tilldelas antalet millisekunder mellan 1970-1-1 och en viss tid x-axeln för att representera denna tid, så getTime()-metoden måste användas, formen på y-axelns koordinatpunkt måste vara y = litet tal * heltalsform, och jag förstod inte varför Highcharts var tvungen att göra detta, eftersom prisdatan för varieteten i detta exempel generellt är ungefär densamma, så jag var tvungen att dividera med 200 när jag fick data, och sedan multiplicera med 200 när jag tilldelade ett värde till y-axeln.
<%= jsonstr %> i sidkoden finns den initiala datan jag behöver hämta från servern för att initiera grafen, alltså CS-genereringen av sidan
- 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;
- }
Kopiera kodenBland dem är TabMerPrice-tabellen en tabell för variationsprisinformation, TMPTime-tid, TMPPrice-pris, TMPTime-tidsintervall är tio sekunder, jag använder ett databasjobb för att generera tabellen som sker var tionde sekund AddHours(-8) är för att konvertera tiden till Beijing-tid, och det genererade dataformatet är json-format Dataupdate.ashx-koden ser ut så här:
- 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();
- }
Kopiera kodenDetta är den grova implementeringen av stegaggregering, som kan realisera realtidsvisning av serverdata med en graf liknande standardformatet
HighCharts演示.zip
(48.69 KB, Antal nedladdningar: 1)
|