|
Specifična uporaba trga za ta primer je, da moram redno brati ceno surovine iz baze podatkov in jo nato prikazati na spletni strani kot graf, podobno kot graf trendov cen pri trgovanju z instrumenti v delnicah. Uporabljam asp.net, v kombinaciji z implementacijo vtičnika Highcharts v jQueryju, vtičnik podpira veliko vrst grafike, vendar so statični, in primere, ki jih podate, je treba preoblikovati, zainteresirani prijatelji lahko obiščejo uradno spletno stran Highcharts (http://www.highcharts.com/), ki ponuja veliko demonstracij, iskreno, da bi razumel svoje potrebe, bi moral uporabiti Highstock, Vendar pa po ogledu primera dinamične posodobitve Highcharts ugotavljam, da je moj vmesnik za zahteve bolj jedrnat, zato ta članek uporablja model dinamične posodobitve v Highcharts, grafični tip pa je spline. Končni zemljevid učinkov je naslednji (cena Pinqijina se posodablja vsakih 10 sekund, vsakih 10 sekund pa se doda točka na graf):
Napredujte po korakih: Ustvarite novo spletno stran z VS in ustvarite asp.net stran DynamicUpdate.aspx, koda strani je naslednja:
- <%@ 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>
Kopiraj kodoLastnost Highcharts renderTo označuje prikazne kontejnerje, dogodki predstavljajo dogodek, ki ga mora kontejner registrirati, kjer nalaganje pomeni, da se nalaganje zgodi po zaključku nalaganja, tukaj je v nalaganju nastavljen js časovnik, ki se zgodi vsakih 10 sekund, koda v njem pa zahteva najnovejši GOLD iz datoteke dataupdate.ashx mape ajaxhandler v isti korenski mapi kot DynamicUpdate.aspx stran preko ajax v jQuery Podatki o cenah te vrste, tukaj je razlog, zakaj dodam randomCode + "=" + oldrandomCode v ajax URL, ker dodajanje naključne številke prepreči predpomnjenje, flag=1 pa zato, ker moja dataupdate.ashx datoteka želi sprejeti več zahtevkov iz različnih ajax, zato uporabljam flag za razlikovanje xAxis predstavlja zbirko atributov, definiranih za x-os vsebnika, type predstavlja prikazani tip besedila, opcijsko, tukaj vnesem tip časa, tukaj upoštevajte, da je privzeta vrednost primera GMT čas, lahko uporabite tudi UTC čas, vendar običajno uporabljamo pekinški čas (GMT ali UTC) + 8 ur = pekinški čas, zato ko uporabimo ajax, da določimo, da je čas pekinški čas, moramo od ure odšteti 8 ur (tukaj želim deliti tudi izkušnjo, Kako pretvoriti strežniški čas v js čas, ki ga lahko uporabi metoda .getTime(), torej odšteti strežniški čas od 1970-1-1, pretvori preostale dni v milisekunde in nato dodeli vrednost novo inicializiranemu času z metodo setTime v js. Ugotovil sem, da rezultat, pridobljen z getTime(), ni pravilen za inicializacijo js časa neposredno v js v js v obliki novega datuma (leto, mesec, dan, ura, minuta, sekunda, milisekunda) z getTime(), Kar zadeva razlog, zakaj se 1970-1-1 odšteje, je to zato, ker je definicija metode getTime(), da se število milisekund pridobi od trenutnega časa iz 1970-1-1). Ko x-os ni prikazana kot čas ali jo morate sami definirati, jo je mogoče definirati tudi z atributom kategorij, tickPixelInterval predstavlja gostoto x-osi, oznake pa se uporabljajo za oblikovanje prikaznega formata x-osi yAxis predstavlja zbirko atributov, definiranih za y-os vsebnika, ki je približno enaka atributom x-osi, vendar v Highcharts ni mogoče določiti fiksne vrednosti y-osi preko kategorij; y-os Highcharts se samodejno generira na podlagi podatkov o koordinatnih točkah, ki so odvisni od podatkovnega podatributa atributa serije, na primer, ko podatke dodelite vrednost, je največja vrednost 300, najmanjša pa 100. Nato bo prikaz y-osi med 100 in 300, ali pa lahko nastavite tudi atribut max ali min za yAxis serija predstavlja zbirko vseh krivulj, prikazanih v vsebniku, tukaj prikazujem samo eno krivuljo, ime predstavlja ime krivulje, podatki predstavljajo zbirko niza koordinatnih točk krivulje, x je spredaj, y je zadaj, to je js matrika, v tem primeru ker x-os prikazuje čas, zato mora biti x-lastnost objekta polja nastavljena na čas, vendar v Highcharts ni neposredno dodeljen čas x-osi, Namesto tega je število milisekund med 1970-1-1 in določenim časom dodeljeno x-osi, da predstavlja ta čas, zato je treba uporabiti metodo getTime(), oblika y-osi koordinatne točke mora biti y = majhno število * cela številska oblika, in nisem razumel, zakaj mora Highcharts to početi, saj so podatki o cenah v tem primeru večinoma enaki, zato sem moral pri pridobivanju podatkov deliti z 200, nato pa pomnožiti z 200, ko sem y-osi dodelil vrednost.
<%= jsonstr %> v kodi strani so začetni podatki, ki jih moram pridobiti od strežnika za inicializacijo grafa, to je generiranje strani CS
- 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;
- }
Kopiraj kodoMed njimi je tabela TabMerPrice tabela o različnih cenah, TMPTime čas, TMPPrice cena, TMPTime časovni interval je deset sekund, uporabljam podatkovno nalogo za generiranje zapisa tabele, kar se zgodi vsakih deset sekund AddHours(-8) je namenjen pretvorbi časa v pekinški čas, generirani podatkovni format pa je json format Koda dataupdate.ashx izgleda takole:
- 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();
- }
Kopiraj kodoTo je groba izvedba agregacije korakov, ki omogoča prikaz podatkov na strežniški strani v realnem času z grafom, podobnim formatu delnic
HighCharts演示.zip
(48.69 KB, Število prenosov: 1)
|