|
Specifinė šio pavyzdžio taikymo rinka yra ta, kad man reikia reguliariai skaityti prekės kainą iš duomenų bazės, o tada rodyti ją tinklalapyje kaip grafiką, panašų į prekybos akcijomis kainų tendencijų diagramą. Aš naudoju asp.net, kartu su Highcharts įskiepiai įgyvendinimas jQuery, įskiepiai gali palaikyti daugelio tipų grafiką, tačiau jie yra statiški, ir pateikti pavyzdžiai turi būti transformuoti, suinteresuoti draugai gali eiti į Highcharts oficialią svetainę pamatyti (http://www.highcharts.com/), kuri suteikia daug demonstracinių versijų, tiesą sakant, realizuoti savo poreikius, aš turėčiau naudoti Highstock, Tačiau, pažvelgęs į dinaminio atnaujinimo pavyzdį Highcharts, aš taip pat galiu suprasti, kad mano reikalavimų sąsaja yra glaustesnė, todėl šiame straipsnyje naudojamas dinaminio atnaujinimo modelis Highcharts, o grafikos tipas yra spline. Galutinis efekto žemėlapis yra toks (Pinqijin kaina atnaujinama kas 10 sekundžių, o taškas pridedamas prie linijinės diagramos kas 10 sekundžių):
Pasiekite žingsnių surinkimą: Sukurkite naują svetainę naudodami VS ir sukurkite asp.net puslapį DynamicUpdate.aspx, puslapio kodas yra toks:
- <%@ 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>
Kopijuoti kodąHighcharts ypatybė renderTo nurodo rodymo konteinerius, Įvykiai reiškia įvykį, kurį konteineris turi užregistruoti, kai įkėlimas reiškia, kad jis įvyksta po to, kai pakrovimas yra baigtas, čia JS laikmatis yra nustatytas įkelti, kuris įvyksta kartą per 10 sekundžių, ir kodas jame yra prašyti naujausio GOLD iš dataupdate.ashx failo ajaxhandler aplanko tame pačiame šakniniame kataloge kaip DynamicUpdate.aspx puslapis per ajax jQuery Veislės kainos duomenys, štai kodėl aš pridedu randomCode + "=" + oldrandomCode į ajax URL, nes pridedant atsitiktinį skaičių galima išvengti talpyklos, o flag=1 yra todėl, kad mano dataupdate.ashx failas nori priimti kelias užklausas iš skirtingų ajax, todėl naudokite vėliavėlę, kad jį atskirtumėte xAxis reiškia atributų rinkinį, apibrėžtą konteinerio x ašiai, tipas reiškia rodomą teksto tipą, neprivaloma, čia aš užpildau laiko tipą, čia atkreipkite dėmesį, kad numatytasis egzempliorius yra GMT laikas, taip pat galite naudoti UTC laiką, bet paprastai naudojame Pekino laiką, (GMT arba UTC) + 8 valandos = Pekino laikas, taigi, kai naudojame ajax, kad gautume laiką yra Pekino laikas, turėtume atimti 8 valandas iš valandos (čia aš taip pat noriu pasidalinti patirtimi, Kaip konvertuoti serverio laiką į js laiką, kurį galima naudoti .getTime() metodu, tai yra, atimti serverio laiką iš 1970-1-1, konvertuoti likusias dienas į milisekundes ir priskirti reikšmę naujai inicijuotam laikui naudojant setTime metodą js, radau, kad getTime() gautas rezultatas yra neteisingas inicijuojant js laiką tiesiai js naujos datos (metai, mėnuo, diena, valanda, minutė, sekundė, milisekundė) forma su getTime(), Kalbant apie tai, kodėl 1970-1-1 yra atimtas, tai yra todėl, kad getTime() metodo apibrėžimas yra gauti milisekundžių skaičių iš dabartinio laiko nuo 1970-1-1), kai x ašis nerodoma kaip laikas arba jums reikia ją apibrėžti patiems, ją taip pat galima apibrėžti pagal kategorijų atributą, tickPixelInterval reiškia x ašies tankį, o etiketės naudojamos x ašies rodymo formatui formatuoti yAxis reiškia atributų rinkinį, apibrėžtą konteinerio y ašiai, kuris yra maždaug toks pat kaip x ašies atributai, tačiau Highcharts neįmanoma apibrėžti fiksuotos y ašies vertės per kategorijas, Highcharts y ašis automatiškai generuojama pagal nurodytus koordinačių taško duomenis, kurie priklauso nuo sekos atributo duomenų subatributo, pavyzdžiui, kai duomenims priskiriate reikšmę Didžiausia vertė yra 300, o mažiausia reikšmė yra 100. Tada y ašies ekranas bus nuo 100 iki 300 arba taip pat galite nustatyti yAxis atributą max arba min serija reiškia visų konteineryje rodomų kreivių rinkinį, čia rodau tik vieną kreivę, pavadinimas reiškia kreivės pavadinimą, duomenys reiškia kreivės koordinačių taškų serijos rinkinį, x yra priekyje, y yra už nugaros, šiuo atveju tai yra js masyvas, nes x ašis rodo laiką, todėl masyvo objekto x savybė turi būti nustatyta į laiką, tačiau Highcharts jis nėra tiesiogiai priskirtas laikas x ašiai, Vietoj to, milisekundžių skaičius nuo 1970-1-1 iki tam tikro laiko priskiriamas x ašiai, kad būtų pavaizduotas šis laikas, todėl reikia naudoti getTime() metodą, y ašies koordinačių taško forma turi būti y = mažas skaičius * sveikojo skaičiaus forma, ir aš nesupratau, kodėl Highcharts turėjo tai padaryti, nes šiame pavyzdyje veislės kainų duomenys paprastai yra maždaug vienodi, todėl gaudamas duomenis turėjau padalyti iš 200, o tada padauginti iš 200, kai priskiriu reikšmę y ašiai.
<%= jsonstr %> puslapio kode yra pradiniai duomenys, kuriuos turiu gauti iš serverio, kad galėčiau inicijuoti grafiką, puslapio CS generavimą
- 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;
- }
Kopijuoti kodąTarp jų "TabMerPrice" lentelė yra įvairovės kainos informacijos lentelė, TMPTime laikas, TMPPrice kaina, TMPTime laiko intervalas yra dešimt sekundžių, aš naudoju duomenų bazės užduotį, kad sugeneruočiau lentelės įrašą, kuris vyksta kartą per dešimt sekundžių AddHours(-8) skirtas konvertuoti laiką į Pekino laiką, o sugeneruotas duomenų formatas yra json formatas dataupdate.ashx kodas atrodo taip:
- 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();
- }
Kopijuoti kodąTai yra apytikslis žingsnių agregavimo įgyvendinimas, kuris gali realizuoti serverio duomenų rodymą realiuoju laiku su grafiku, panašiu į atsargų formatą
HighCharts演示.zip
(48.69 KB, Atsisiuntimų skaičius: 1)
|