|
Tämän esimerkin erityinen sovellusmarkkina on, että minun täytyy lukea hyödykkeen hinta säännöllisesti tietokannasta ja näyttää se verkkosivulla graafina, samankaltaisesti kuin osakeinstrumenttien hintatrendikaavio. Käytän asp.net, yhdistettynä Highcharts-lisäosan toteutukseen jQueryssä, plugin tukee monenlaisia grafiikkatyyppejä, mutta ne ovat staattisia, ja annetut esimerkit täytyy muokata, kiinnostuneet ystävät voivat mennä Highchartsin viralliselle sivustolle katsomaan (http://www.highcharts.com/), joka tarjoaa paljon demoja, rehellisesti sanottuna tarpeideni ymmärtämiseksi minun pitäisi käyttää Highstockia, Kuitenkin, kun katsoin Highchartsin dynaamisen päivityksen esimerkkiä, huomaan myös, että vaatimusrajapintani on tiiviimpi, joten tässä artikkelissa käytetään Highchartsin dynaamisen päivityksen mallia, ja grafiikkatyyppi on spline. Lopullinen efektikartta on seuraava (Pinqijinin hinta päivitetään 10 sekunnin välein, ja piste lisätään viivakaavioon joka 10 sekunti):
Saavuta askelten kerääminen: Luo uusi verkkosivusto VS:llä ja luo asp.net sivu DynamicUpdate.aspx, sivun koodi on seuraava:
- <%@ 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>
Kopioi koodiHighcharts-ominaisuus renderTo tarkoittaa näyttökontteja, events edustaa tapahtumaa, joka kontin täytyy rekisteröidä, missä load tarkoittaa, että se tapahtuu latauksen jälkeen. Tässä kuormaan asetetaan js-ajastin, joka tapahtuu kerran 10 sekunnissa, ja sen koodi pyytää uusinta GOLD-tiedostoa ajaxhandler-kansion dataupdate.ashx-tiedostosta samasta juurihakemistosta kuin DynamicUpdate.aspx-sivu ajaxin kautta jQueryssä Hintadatan perusteella lisään ajax-URL-osoitteeseen randomCode + "=" + oldrandomCode, koska satunnaisnumeron lisääminen voi välttää välimuistin, ja flag=1 johtuu siitä, että dataupdate.ashx-tiedostoni haluaa hyväksyä useita pyyntöjä eri ajax-tiedostoilta, joten käytä lippua erottaaksesi sen xAxis edustaa säiliön x-akselille määriteltyjen attribuuttien kokoelmaa, type edustaa näytettyä tekstityyppiä, valinnainen, tässä täytän aikatyypin, tässä huomaa, että instanssin oletus on GMT-aika, voit myös käyttää UTC-aikaa, mutta yleensä käytämme Pekingin aikaa (GMT tai UTC) + 8 tuntia = Pekingin aikaa, joten kun käytämme ajax-aikaa saadaksemme ajan Pekingin aikaa, meidän tulisi vähentää 8 tuntia tunnista (tässä haluan myös jakaa kokemuksen, Kuinka muuntaa palvelinaika js-ajaksi, jota voi käyttää .getTime()-menetelmällä, eli vähentää palvelimen aika 1970-1-1, muuntaa jäljelle jääneet päivät millisekunneiksi ja sitten määrittää arvo uudelle alustetulle ajalle setTime-menetelmällä js:ssä. Huomasin, että getTime():n saama tulos on virheellinen, kun js-aika alistetaan suoraan js:ssä uuden päivämäärän muodossa (vuosi, kuukausi, päivä, tunti, minuutti, sekunti, millisekunti) ja getTime(), Miksi 1970-1-1 vähennetään, se johtuu siitä, että getTime()-menetelmän määritelmä on saada millisekuntien määrä nykyisestä ajasta 1970-1-1), kun x-akselia ei näytetä ajana tai sinun täytyy määritellä se itse, se voidaan määritellä myös kategoriattribuutilla, tickPixelInterval edustaa x-akselin tiheyttä ja tunnisteita käytetään x-akselin näyttömuodon muotoiluun yAxis edustaa attribuuttien kokoelmaa, jotka on määritelty kontin y-akselille, mikä on suunnilleen sama kuin x-akselin attribuutit, mutta Highchartsissa y-akselin kiinteää arvoa ei voi määritellä kategorioiden avulla; Highchartsin y-akseli generoidaan automaattisesti annetun koordinaattipistedatan perusteella, mikä riippuu sarjaattribuutin data-aliattribuutista, esimerkiksi kun datalle annetaan arvo, maksimiarvo on 300 ja minimiarvo 100. Silloin y-akselin näyttö on välillä 100–300, tai voit myös asettaa yAxisin maksimi- tai minimiattribuutin sarja edustaa kaikkien käyrien kokoelmaa, jotka näkyvät kontissa, tässä näytän vain yhden käyrän, nimi edustaa käyrän nimeä, data edustaa käyrän koordinaattipisteiden sarjaa, x on edessä, y on takana, se on js-taulukko, tässä tapauksessa, koska x-akseli näyttää ajan, joten taulukon objektin x-ominaisuus täytyy asettaa ajaksi, mutta Highchartsissa sitä ei suoraan osoiteta aikaa x-akselille, Sen sijaan millisekuntien määrä välillä 1970-1-1 ja tietty aika on määritetty x-akselille tämän ajan kuvaamiseksi, joten getTime()-menetelmää on käytettävä, y-akselin koordinaatispisteen muodon on oltava y = pieni luku * kokonaisluku, enkä ymmärtänyt, miksi Highchartsin piti tehdä näin, koska tämän esimerkin hintatiedot ovat yleensä suunnilleen samat, joten minun piti jakaa 200:lla dataa hakiessani ja kertoa 200:lla, kun annan arvon y-akselille.
<%= jsonstr %> sivukoodissa on alkuperäinen data, jonka minun täytyy saada palvelimelta graafin alustamiseen, eli sivun cs-generointi
- 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;
- }
Kopioi koodiNäistä TabMerPrice-taulukko on lajitelmien hintatietotaulukko, TMPTime-aika, TMPPrice-hinta, TMPTime-aikaväli on kymmenen sekuntia, käytän tietokantatyötä taulukon tietueen luomiseen, joka tapahtuu kerran kymmenessä sekunnissa AddHours(-8) muuntaa aika Pekingin aikaan, ja generoitu datamuoto on json-muoto dataupdate.ashx-koodi näyttää tältä:
- 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();
- }
Kopioi koodiTämä on karkea vaihekokouksen toteutus, joka mahdollistaa palvelinpuolen datan reaaliaikaisen näyttämisen graafilla, joka muistuttaa vakiomuotoa
HighCharts演示.zip
(48.69 KB, Latausten määrä: 1)
|