|
Der spezifische Anwendungsmarkt für dieses Beispiel ist, dass ich regelmäßig den Preis eines Rohstoffs aus der Datenbank lesen und ihn dann auf der Webseite als Diagramm anzeigen muss, ähnlich wie das Kurs-Trenddiagramm von Handelsinstrumenten in Aktien. Ich nutze asp.net, kombiniert mit der Highcharts-Plugin-Implementierung in jQuery, das Plugin unterstützt viele Arten von Grafiken, aber sie sind statisch, und die angegebenen Beispiele müssen transformiert werden. Interessierte Freunde können auf die offizielle Highcharts-Website gehen und (http://www.highcharts.com/) sehen, die viele Demos bietet. Ehrlich gesagt, um meine Bedürfnisse zu erfüllen, sollte ich Highstock verwenden. Nachdem ich mir jedoch das dynamische Update-Beispiel von Highcharts angesehen habe, erkenne ich auch, dass meine Anforderungsoberfläche prägnanter ist, weshalb dieser Artikel das dynamische Update-Modell in Highcharts verwendet, und der Grafiktyp ist Spline. Die endgültige Effektkarte ist wie folgt (der Preis von Pinqijin wird alle 10 Sekunden aktualisiert, und alle 10 Sekunden wird ein Punkt zum Liniendiagramm hinzugefügt):
Erreichen Sie das Sammeln von Schritten: Erstellen Sie eine neue Website mit VS und erstellen Sie eine asp.net Seite DynamicUpdate.aspx, der Seitencode lautet wie folgt:
- <%@ 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 kopierenHighcharts-Eigenschaft renderTo zeigt Display-Container an, events repräsentiert das Ereignis, das der Container registrieren muss, wobei Load bedeutet, dass es nach Abschluss des Ladens erfolgt. Hier wird ein JS-Timer im Load eingestellt, der alle 10 Sekunden stattfindet, und der Code darin ist, das neueste GOLD aus der dataupdate.ashx-Datei des ajaxhandler-Ordners im selben Root-Verzeichnis wie die DynamicUpdate.aspx Seite durch ajax in jQuery anzufordern Die Preisdaten der Varietät, hier ist der Grund, warum ich randomCode + "=" + oldrandomCode in der Ajax-URL hinzufüge, weil das Hinzufügen einer Zufallszahl Caching vermeiden kann, und flag=1 ist, weil meine dataupdate.ashx-Datei mehrere Anfragen von verschiedenen ajax akzeptieren will, also benutze Flag zur Unterscheidung xAxis stellt die Sammlung der für die x-Achse des Containers definierten Attributen dar, type steht für den angezeigten Texttyp, optional, hier fülle ich den Zeittyp ein, hier beachte, dass der Standard für die Instanz GMT-Zeit ist, man kann auch UTC-Zeit verwenden, aber wir verwenden im Allgemeinen die Peking-Zeit (GMT oder UTC) + 8 Stunden = Peking-Zeit, also wenn wir ajax verwenden, um die Zeit als Peking-Zeit zu bestimmen, sollten wir 8 Stunden von der Stunde abziehen (hier möchte ich auch eine Erfahrung teilen, Wie man Serverzeit in js-Zeit umwandelt, die mit der .getTime()-Methode verwendet werden kann, also die Serverzeit von 1970-1-1 subtrahiert, die verbleibenden Tage in Millisekunden umwandelt und dann der neu initialisierten Zeit mit der setTime-Methode in js einen Wert zuweist? Ich habe festgestellt, dass das Ergebnis von getTime() falsch ist, um eine js-Zeit direkt in js in Form eines neuen Datums (Jahr, Monat, Tag, Stunde, Minute, Sekunde, Millisekunde) mit getTime() zu initialisieren, Warum 1970-1-1 subtrahiert wird, liegt daran, dass die Definition der getTime()-Methode darin besteht, die Anzahl der Millisekunden aus der aktuellen Zeit von 1970-1-1 zu erhalten; wenn die x-Achse nicht als Zeit angezeigt wird oder man sie selbst definieren muss, kann sie auch durch das categories-Attribut definiert werden, tickPixelInterval stellt die Dichte der x-Achse dar und Labels werden verwendet, um das Anzeigeformat der x-Achse zu formatieren yAxis stellt eine Sammlung von Attributen dar, die für die y-Achse des Containers definiert sind, was ungefähr mit den Attributen der x-Achse übereinstimmt, aber in Highcharts ist es nicht möglich, den festen Wert der y-Achse durch Kategorien zu definieren; die y-Achse von Highcharts wird automatisch basierend auf den gegebenen Koordinatenpunktdaten generiert, die vom Daten-Unterattribut des Serienattributs abhängen, zum Beispiel wenn man Daten einen Wert zuweist. Der maximale Wert beträgt 300, der minimale Wert ist 100. Dann liegt die Anzeige der y-Achse zwischen 100 und 300, oder du kannst auch das Max- oder Min-Attribut von yAxis festlegen Serie stellt die Sammlung aller im Container angezeigten Kurven dar, hier zeige ich nur eine Kurve, Name steht für den Namen der Kurve, Data steht für die Sammlung einer Reihe von Koordinatenpunkten der Kurve, x liegt vorne, y dahinter, es ist ein js-Array, in diesem Fall zeigt die x-Achse die Zeit an, daher muss die x-Eigenschaft des Array-Objekts auf Zeit gesetzt werden, aber in Highcharts wird der x-Achse keine Zeit direkt zugewiesen, Stattdessen wird die Anzahl der Millisekunden zwischen 1970-1-1 und einer bestimmten Zeit der x-Achse zugewiesen, um diese Zeit darzustellen, daher muss die getTime()-Methode verwendet werden, die Form des y-Achsen-Koordinatenpunkts muss y = kleine Zahl * ganzzahlige Form sein, und ich habe nicht verstanden, warum Highcharts das tun musste, denn die Preisdaten der Varietät in diesem Beispiel sind im Allgemeinen ungefähr gleich, also musste ich bei der Datenerhebung durch 200 teilen und dann mit 200 multiplizieren, wenn ich der y-Achse einen Wert zuweisen.
<%= jsonstr %> im Seitencode sind die Anfangsdaten, die ich vom Server beziehen muss, um den Graphen zu initialisieren, also die CS-Generierung der Seite
- 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 kopierenDazu gehört die TabMerPrice-Tabelle, die Variety-Preisinformationstabelle, TMPTime-Zeit, TMPPrice-Preis, das TMPTime-Zeitintervall beträgt zehn Sekunden, ich verwende einen Datenbankjob, um den Datensatz der Tabelle zu erzeugen, der alle zehn Sekunden einmal passiert AddHours(-8) dient dazu, die Zeit in Beijing-Zeit umzuwandeln, und das erzeugte Datenformat ist im JSON-Format Der dataupdate.ashx-Code sieht so aus:
- 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 kopierenDies ist die grobe Umsetzung der Schrittaggregation, die die Echtzeitanzeige von serverseitigen Daten mit einem Graphen ähnlich dem Standardformat realisieren kann
HighCharts演示.zip
(48.69 KB, Anzahl der Downloads: 1)
|