|
De specifieke toepassingsmarkt voor dit voorbeeld is dat ik regelmatig de prijs van een grondstof uit de database moet lezen en deze vervolgens op de webpagina als een grafiek moet weergeven, vergelijkbaar met de prijstrendgrafiek van handelsinstrumenten in aandelen. Ik gebruik asp.net, gecombineerd met de Highcharts-plugin-implementatie in jQuery, de plugin kan veel soorten graphics ondersteunen, maar die zijn statisch, en de gegeven voorbeelden moeten worden getransformeerd; geïnteresseerde vrienden kunnen naar de officiële Highcharts-website gaan om (http://www.highcharts.com/) te bekijken, die veel demo's biedt; eerlijk gezegd, om mijn behoeften te realiseren, zou ik Highstock moeten gebruiken. Na het bekijken van het dynamische updatevoorbeeld van Highcharts realiseer ik me echter ook dat mijn requirements-interface beknopter is, dus dit artikel gebruikt het dynamische-updatemodel in Highcharts, en het grafische type is spline. De uiteindelijke effectkaart is als volgt (de prijs van Pinqijin wordt elke 10 seconden bijgewerkt, en er wordt elke 10 seconden een punt aan de lijngrafiek toegevoegd):
Stap verzamelen: Maak een nieuwe website aan met VS en maak een asp.net pagina DynamicUpdate.aspx, de paginacode is als volgt:
- <%@ 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>
Code kopiërenHighcharts-eigenschap renderTo duidt displaycontainers aan, events vertegenwoordigt het event dat de container moet registreren, waarbij load betekent dat het plaatsvindt nadat het laden is voltooid, hier wordt een js-timer ingesteld in de load, die eens per 10 seconden plaatsvindt, en de code daarin is om de nieuwste GOLD op te vragen uit het dataupdate.ashx-bestand van de ajaxhandler-map in dezelfde hoofdmap als de DynamicUpdate.aspx pagina door ajax in jQuery De prijsgegevens van de variëteit, hier is waarom ik randomCode + "=" + oldrandomCode toevoeg aan de ajax-URL, omdat het toevoegen van een willekeurig nummer caching kan voorkomen, en flag=1 is omdat mijn dataupdate.ashx-bestand meerdere verzoeken van verschillende ajax wil accepteren, dus gebruik vlag om het te onderscheiden xAxis vertegenwoordigt de verzameling attributen die gedefinieerd zijn voor de x-as van de container, type vertegenwoordigt het weergegeven teksttype, optioneel, hier vul ik het tijdtype in, hier merk op dat de standaard voor de instantie GMT-tijd is, je kunt ook UTC-tijd gebruiken, maar we gebruiken meestal Beijing-tijd (GMT of UTC) + 8 uur = Beijing-tijd, dus wanneer we ajax gebruiken om te bepalen dat de tijd Beijing-tijd is, moeten we 8 uur van het uur aftrekken (hier wil ik ook een ervaring delen, Hoe je servertijd omzet naar js-tijd die gebruikt kan worden door de .getTime()-methode, dat wil zeggen, de servertijd van 1970-1-1 aftrekt, de resterende dagen omzet in milliseconden, en vervolgens een waarde toekent aan de nieuw geïnitialiseerde tijd via de setTime-methode in js, ik ontdekte dat het resultaat dat getTime() krijgt onjuist is om een js-tijd direct in js te initialiseren in de vorm van nieuwe Datum (jaar, maand, dag, uur, minuut, seconde, milliseconde) met getTime(), Waarom 1970-1-1 wordt afgetrokken, komt dat doordat de definitie van de getTime()-methode is om het aantal milliseconden van de huidige tijd van 1970-1-1 te krijgen; wanneer de x-as niet als tijd wordt weergegeven of je deze zelf moet definiëren, kan deze ook worden gedefinieerd door het categorieën-attribuut, tickPixelInterval geeft de dichtheid van de x-as weer en wordt labels gebruikt om het weergaveformaat van de x-as te formatteren yAxis vertegenwoordigt een verzameling attributen die gedefinieerd zijn voor de y-as van de container, wat ongeveer gelijk is aan de attributen van de x-as, maar in Highcharts is het niet mogelijk om de vaste waarde van de y-as via categorieën te definiëren; de y-as van Highcharts wordt automatisch gegenereerd op basis van de gegeven coördinatenpuntgegevens, die afhangen van de datasub-attribuut van het serie-attribuut, bijvoorbeeld wanneer je een waarde aan data toekent. De maximale waarde is 300 en de minimale waarde is 100. Dan zal de weergave van de y-as tussen 100 en 300 liggen, of je kunt ook het max- of minimumattribuut van yAxis instellen reeks vertegenwoordigt de verzameling van alle krommen die in de container worden weergegeven, hier toon ik slechts één kromme, naam staat voor de naam van de kromme, data vertegenwoordigt de verzameling van een reeks coördinatenpunten van de kromme, x staat vooraan, y erachter, het is een js-array, in dit geval omdat de x-as tijd aangeeft, dus de x-eigenschap van het arrayobject moet op tijd worden gezet, maar in Highcharts wordt de tijd niet direct toegewezen aan de x-as, In plaats daarvan wordt het aantal milliseconden tussen 1970-1-1 en een bepaalde tijd toegekend aan de x-as om deze tijd weer te geven, dus de getTime()-methode moet worden gebruikt, de vorm van het y-as coördinaatpunt moet y = klein getal * geheel getal zijn, en ik begreep niet waarom Highcharts dit moest doen, want de prijsgegevens van de variëteit in dit voorbeeld zijn over het algemeen ongeveer hetzelfde, dus moest ik delen door 200 bij het verkrijgen van de gegevens, en vervolgens vermenigvuldigen met 200 bij het toekennen van een waarde aan de y-as.
<%= jsonstr %> in de paginacode staat de initiële data die ik van de server moet halen om de grafiek te initialiseren, de CS-generatie van de pagina
- 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;
- }
Code kopiërenDaaronder is de tabel van TabMerPrice de tabel met de variatieprijsinformatie, TMPTime-tijd, TMPPrice-prijs, TMPTime-tijdsinterval is tien seconden, ik gebruik een databasetaak om het record van de tabel te genereren, wat elke tien seconden gebeurt AddHours(-8) is bedoeld om de tijd om te zetten naar Beijing-tijd, en het gegenereerde dataformaat is json-formaat De dataupdate.ashx-code ziet er zo uit:
- 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();
- }
Code kopiërenDit is de ruwe implementatie van stapaggregatie, waarmee de realtime weergave van server-side data mogelijk is met een grafiek vergelijkbaar met het standaardformaat
HighCharts演示.zip
(48.69 KB, Aantal downloads: 1)
|