|
Det specifikke anvendelsesmarked for dette eksempel er, at jeg regelmæssigt skal læse prisen på en råvare fra databasen og derefter vise det på websiden som en graf, ligesom pristrenddiagrammet for handelsinstrumenter i aktier. Jeg bruger asp.net, kombineret med Highcharts-plugin-implementeringen i jQuery, plugin'et kan understøtte mange typer grafik, men de er statiske, og de eksempler, der gives, skal transformeres, interesserede venner kan gå ind på Highcharts' officielle hjemmeside for at se (http://www.highcharts.com/), som tilbyder mange demoer, for at opfylde mine behov bør jeg bruge Highstock, Men efter at have set på eksempelet med dynamisk opdatering i Highcharts, kan jeg også indse, at mit kravinterface er mere kortfattet, så denne artikel bruger den dynamiske opdateringsmodel i Highcharts, og grafiktypen er spline. Det endelige effektkort er som følger (prisen på Pinqijin opdateres hvert 10. sekund, og et punkt tilføjes til linjegrafen hvert 10. sekund):
Opnå trappeophobning: Opret en ny hjemmeside med VS og lav 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 kodeHighcharts-egenskaben renderTo angiver displaycontainere, events repræsenterer den begivenhed, containeren skal registrere, hvor load betyder, at den sker efter loadingen er afsluttet, her sættes en js-timer i loaden, som sker én gang hvert 10. sekund, og koden i den er at anmoder om den nyeste GOLD fra dataupdate.ashx-filen i ajaxhandler-mappen i samme rodmappe som DynamicUpdate.aspx-siden gennem ajax i jQuery Prisdataene for varianten, her er grunden til, at jeg tilføjer randomCode + "=" + oldrandomCode i ajax-URL'en, fordi tilføjelse af et tilfældigt tal kan undgå caching, og flag=1 er fordi min dataupdate.ashx-fil vil acceptere flere forespørgsler fra forskellige ajax, så brug flag til at skelne det xAxis repræsenterer samlingen af attributter defineret for x-aksen af containeren, type repræsenterer den viste teksttype, valgfrit, her udfylder jeg tidstypen, her bemærk, at standarden for instansen er GMT-tid, du kan også bruge UTC-tid, men vi bruger generelt Beijing-tid (GMT eller UTC) + 8 timer = Beijing-tid, så når vi bruger ajax til at få tiden til Beijing-tid, bør vi trække 8 timer fra timen (her vil jeg også dele en oplevelse, Hvordan man konverterer servertid til js-tid, der kan bruges med .getTime()-metoden, det vil sige at trække servertiden fra 1970-1-1, konvertere de resterende dage til millisekunder og derefter tildele en værdi til den nyinitierede tid via setTime-metoden i js, fandt jeg ud af, at resultatet opnået af getTime() er forkert til at initialisere en js-tid direkte i js i form af ny dato (år, måned, dag, time, minut, sekund, millisekund) med getTime(), Hvad angår hvorfor 1970-1-1 trækkes fra, skyldes det, at definitionen af getTime()-metoden er at få antallet af millisekunder fra den aktuelle tid fra 1970-1-1), når x-aksen ikke vises som en tid, eller du selv skal definere den, kan den også defineres af kategoriattributten, tickPixelInterval repræsenterer densiteten af x-aksen, og labels bruges til at formatere visningsformatet for x-aksen yAxis repræsenterer en samling af attributter defineret for y-aksen af containeren, som omtrent svarer til attributterne for x-aksen, men i Highcharts er det ikke muligt at definere den faste værdi af y-aksen gennem kategorier; y-aksen i Highcharts genereres automatisk baseret på de givne koordinatpunktdata, som afhænger af dataunderattributten for serieattributten, for eksempel når du tildeler en værdi til data. Maksimum er 300, og minimumsværdien er 100. Så vil visningen af y-aksen være mellem 100 og 300, eller du kan også sætte maks- eller minimumsattributten for yAxis serien repræsenterer samlingen af alle kurver, der vises i beholderen, her viser jeg kun én kurve, navnet repræsenterer kurvens navn, data repræsenterer samlingen af en række koordinatpunkter på kurven, x er foran, y bagved, det er et js-array, i dette tilfælde fordi x-aksen viser tid, så x-egenskaben for array-objektet skal sættes til tid, men i Highcharts tildeles x-aksen ikke direkte tid, I stedet tildeles antallet af millisekunder mellem 1970-1-1 og en bestemt tid x-aksen for at repræsentere denne tid, så getTime()-metoden skal bruges, formen af y-aksens koordinatpunkt skal være y = lille tal * heltalsform, og jeg forstod ikke, hvorfor Highcharts skulle gøre dette, fordi prisdataene for varietéen i dette eksempel generelt er omtrent de samme, så jeg måtte dividere med 200, da jeg fik dataene, og derefter gange med 200, når jeg tildelte en værdi til y-aksen.
<%= jsonstr %> i sidekoden er de indledende data, jeg skal hente fra serveren for at initialisere grafen, altså cs-genereringen af 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 kodeBlandt dem er TabMerPrice-tabellen en variationsprisinformationstabell, TMPTime-tid, TMPPrice-pris, TMPTime-tidsintervallet er ti sekunder, jeg bruger et databasejob til at generere tabellen i posten, hvilket sker én gang hvert tiende sekund AddHours(-8) er til at konvertere tiden til Beijing-tid, og det genererede dataformat er json-format Dataupdate.ashx-koden ser sådan ud:
- 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 kodeDette er den grove implementering af trinaggregering, som kan realisere realtidsvisning af serverside data med en graf, der ligner standardformatet
HighCharts演示.zip
(48.69 KB, Antal downloads: 1)
|