|
Det spesifikke bruksmarkedet for dette eksempelet er at jeg må lese prisen på en råvare fra databasen regelmessig, og deretter vise det på nettsiden som en graf, likt pristrenddiagrammet for handelsinstrumenter i aksjer. Jeg bruker asp.net, kombinert med Highcharts-plugin-implementeringen i jQuery, pluginen kan støtte mange typer grafikk, men de er statiske, og eksemplene som gis må transformeres, interesserte venner kan gå til Highcharts' offisielle nettside for å se (http://www.highcharts.com/), som tilbyr mange demoer, for å være ærlig, for å realisere mine behov bør jeg bruke Highstock, Men etter å ha sett på eksempelet med dynamisk oppdatering av Highcharts, kan jeg også innse at kravgrensesnittet mitt er mer konsist, så denne artikkelen bruker den dynamiske oppdateringsmodellen i Highcharts, og grafikktypen er spline. Det endelige effektkartet er som følger (prisen på Pinqijin oppdateres hvert 10. sekund, og et punkt legges til linjegrafen hvert 10. sekund):
Oppnå trinnsamling: Opprett et nytt nettsted med VS og lag en asp.net side DynamicUpdate.aspx, sidekoden er som følger:
- <%@ 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>
Kopier kodenHighcharts-egenskapen renderTo indikerer visningscontainere, hendelser representerer hendelsen containeren må registrere, der last betyr at den skjer etter at lastingen er fullført, her settes en js-timer i lasten, som skjer hvert 10. sekund, og koden i den er å be om siste GOLD fra dataupdate.ashx-filen i ajaxhandler-mappen i samme rotmappe som DynamicUpdate.aspx-siden gjennom ajax i jQuery Prisdataene for varianten, her er grunnen til at jeg legger til randomCode + "=" + oldrandomCode i ajax-URL-en fordi å legge til et tilfeldig tall kan unngå caching, og flag=1 er fordi dataupdate.ashx-filen min vil akseptere flere forespørsler fra forskjellige ajax, så bruk flagg for å skille den xAxis representerer samlingen av attributter definert for x-aksen til containeren, type representerer den viste teksttypen, valgfritt, her fyller jeg inn tidstypen, her merk at standarden for instansen er GMT-tid, du kan også bruke UTC-tid, men vi bruker vanligvis Beijing-tid, (GMT eller UTC) + 8 timer = Beijing-tid, så når vi bruker ajax for å få tiden er Beijing-tid, bør vi trekke 8 timer fra timen (her vil jeg også dele en erfaring, Hvordan konvertere servertid til js-tid som kan brukes med .getTime()-metoden, det vil si trekke servertiden fra 1970-1-1, konvertere de resterende dagene til millisekunder, og deretter tildele en verdi til den nylig initialiserte tiden via setTime-metoden i js, fant jeg at resultatet oppnådd av getTime() er feil for å initialisere en js-tid direkte i js i form av ny dato (år, måned, dag, time, minutt, sekund, millisekund) med getTime(), Når det gjelder hvorfor 1970-1-1 trekkes fra, er det fordi definisjonen av getTime()-metoden er å hente antall millisekunder fra nåværende tid fra 1970-1-1), når x-aksen ikke vises som en tid eller du må definere den selv, kan den også defineres av kategori-attributtet, tickPixelInterval representerer tettheten til x-aksen, og labels brukes for å formatere visningsformatet til x-aksen yAxis representerer en samling attributter definert for y-aksen til containeren, som omtrent er den samme som attributtene til x-aksen, men i Highcharts er det ikke mulig å definere den faste verdien av y-aksen gjennom kategorier; y-aksen til Highcharts genereres automatisk basert på de gitte koordinatpunktdataene, som avhenger av dataunderattributten til serieattributtet, for eksempel når du tildeler en verdi til data. Maksimumsverdien er 300, og minimumsverdien er 100. Da vil visningen av y-aksen være mellom 100 og 300, eller du kan også sette maks- eller minimumsattributten til yAxis serie representerer samlingen av alle kurver som vises i beholderen, her viser jeg bare én kurve, navnet representerer navnet på kurven, data representerer samlingen av en serie koordinatpunkter på kurven, x er foran, y er bak, det er et js-array, i dette tilfellet fordi x-aksen viser tid, så x-egenskapen til array-objektet må settes til tid, men i Highcharts er det ikke direkte tildelt tid til x-aksen, I stedet er antall millisekunder mellom 1970-1-1 og en viss tid tildelt x-aksen for å representere denne tiden, så getTime()-metoden må brukes, formen til y-aksens koordinatpunkt må være y = lite tall * heltallsform, og jeg forsto ikke hvorfor Highcharts måtte gjøre dette, fordi prisdataene for variasjonen i dette eksempelet generelt er omtrent de samme, så jeg måtte dele på 200 da jeg hentet dataene, og deretter multiplisere med 200 når jeg tilordnet en verdi til y-aksen.
<%= jsonstr %> i sidekoden er de opprinnelige dataene jeg trenger for å hente fra serveren for å initialisere grafen, altså datagenereringen av siden
- 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;
- }
Kopier kodenBlant dem er TabMerPrice-tabellen en variasjonsprisinformasjonstabell, TMPTime-tid, TMPPrice-pris, TMPTime-tidsintervallet er ti sekunder, jeg bruker en databasejobb for å generere tabellen som skjer hvert tiende sekund AddHours(-8) er for å konvertere tiden til Beijing-tid, og det genererte dataformatet er json-format Dataupdate.ashx-koden ser slik ut:
- 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();
- }
Kopier kodenDette er den grove implementeringen av stegaggregering, som kan realisere sanntidsvisning av serverdata med en graf lik standardformatet
HighCharts演示.zip
(48.69 KB, Antall nedlastinger: 1)
|