|
Specyficznym zastosowaniem tego przykładu jest to, że muszę regularnie odczytywać cenę towaru z bazy danych, a następnie wyświetlać ją na stronie internetowej jako wykres, podobnie jak wykres trendu cen instrumentów handlowych akcji. Używam asp.net, w połączeniu z implementacją wtyczki Highcharts w jQuery, wtyczka obsługuje wiele typów grafik, ale są statyczne, a podane przykłady trzeba przekształcić, zainteresowani znajomi mogą wejść na oficjalną stronę Highcharts, żeby zobaczyć (http://www.highcharts.com/), która oferuje wiele dem, szczerze mówiąc, żeby zrozumieć moje potrzeby, powinienem użyć Highstock, Jednak po przejrzeniu przykładu dynamicznej aktualizacji Highcharts zauważam też, że mój interfejs wymagań jest bardziej zwięzły, dlatego ten artykuł wykorzystuje model dynamicznej aktualizacji w Highcharts, a typ graficzny to spline. Ostateczna mapa efektów wygląda następująco (cena Pinqijin jest aktualizowana co 10 sekund, a punkt dodawany jest do wykresu liniowego co 10 sekund):
Osiągnij krok do pracy: Stwórz nową stronę internetową za pomocą VS i stwórz asp.net stronę DynamicUpdate.aspx, a kod strony wygląda następująco:
- <%@ 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>
Skopiuj kodWłaściwość Highcharts renderuje To oznacza kontenery wyświetlania, zdarzenia reprezentuje zdarzenie, które kontener musi zarejestrować, gdzie ładowanie oznacza, że następuje ono po zakończeniu ładowania; tutaj w ładowaniu ustawiany jest timer js, który następuje raz na 10 sekund, a kod w nim polega na żądaniu najnowszego GOLD z pliku dataupdate.ashx w folderze ajaxhandler w tym samym katalogu głównym co DynamicUpdate.aspx strona przez ajax w jQuery Dane cenowe tej odmiany, oto dlaczego dodaję randomCode + "=" + oldrandomCode do adresu AJAX, bo dodanie losowej liczby pozwala uniknąć buforowania, a flag=1 wynika z tego, że mój plik dataupdate.ashx chce przyjmować wiele żądań od różnych ajax, więc używam flagi, żeby je odróżnić xAxis reprezentuje zbiór atrybutów zdefiniowanych dla osi x kontenera, typ reprezentuje wyświetlany typ tekstu, opcjonalnie, tutaj wpisuję typ czasu, tutaj zauważ, że domyślnym dla instancji jest czas GMT, można też użyć czasu UTC, ale my zazwyczaj używamy czasu pekińskiego (GMT lub UTC) + 8 godzin = czas pekiński, więc gdy używamy ajax, aby uzyskać czas czasu pekińskiego, powinniśmy odejmować 8 godzin od godziny (tutaj chcę też podzielić się doświadczeniem, Jak przekształcić czas serwera na czas js, który może być użyty metodą .getTime(), czyli odejmować czas serwera od 1970-1-1, przeliczyć pozostałe dni na milisekundy, a następnie przypisać wartość nowo zainicjalizowanemu czasie za pomocą metody setTime w js. Stwierdziłem, że wynik uzyskany przez getTime() jest nieprawidłowy, aby inicjalizować czas js bezpośrednio w js w postaci nowej daty (rok, miesiąc, dzień, godzina, minuta, sekunda, milisekunda) za pomocą getTime(), Jeśli chodzi o powód, dla którego 1970-1-1 jest odejmowany, to dlatego, że definicja metody getTime() polega na uzyskaniu liczby milisekund od bieżącego czasu z 1970-1-1), gdy oś x nie jest wyświetlana jako czas lub trzeba ją sam zdefiniować, można ją również zdefiniować przez atrybut kategorii, tickPixelInterval oznacza gęstość osi x, a etykiety służą do formatowania formatu wyświetlania osi x yAxis reprezentuje zbiór atrybutów zdefiniowanych dla osi y kontenera, która jest mniej więcej taka sama jak atrybuty osi x, ale w Highcharts nie jest możliwe zdefiniowanie stałej wartości osi y przez kategorie; oś y w Highcharts jest automatycznie generowana na podstawie danych punktu współrzędnych, które zależą od podatrybutu danych atrybutu szeregowego, na przykład gdy przypisujesz wartość danym Maksymalna wartość to 300, a minimalna 100. Wtedy oś y będzie wyświetlana między 100 a 300, albo możesz też ustawić atrybut max lub min dla osi yAxis seria reprezentuje zbiór wszystkich krzywych wyświetlanych w kontenerze, tutaj I pokazuje tylko jedną krzywą, nazwa oznacza nazwę krzywej, dane reprezentują zbiór szeregu punktów współrzędnych krzywej, x jest z przodu, y jest za nią, jest to tablica js, w tym przypadku, ponieważ oś x pokazuje czas, więc właściwość x obiektu tablicy musi być ustawiona na czas, ale w Highcharts nie jest bezpośrednio przypisywana do osi x, Zamiast tego liczba milisekund między 1970-1-1 a określonym czasem jest przypisana osi x, aby reprezentować ten czas, więc trzeba użyć metody getTime(), forma punktu współrzędnej osi y musi być y = mała liczba * całkowita forma, i nie rozumiałem, dlaczego Highcharts musiał to robić, bo dane cenowe odmiany w tym przykładzie są zazwyczaj takie same, więc musiałem podzielić przez 200 przy uzyskaniu danych, a następnie pomnożyć przez 200 przy przypisaniu wartości osi y.
<%= jsonstr %> w kodzie strony są dane początkowe, które muszę pobrać z serwera, aby zainicjować wykres, czyli generowanie strony w 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;
- }
Skopiuj kodWśród nich tabela TabMerPrice to tabela informacji o cenach różnorodności, czas TMPTime, cena TMPPrice, interwał czasowy TMPTime to dziesięć sekund, używam zadania bazodanowego do wygenerowania rekordu tabeli, co dzieje się raz na dziesięć sekund AddHours(-8) służy do konwersji czasu na czas pekiński, a wygenerowany format danych to json Kod dataupdate.ashx wygląda tak:
- 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();
- }
Skopiuj kodJest to przybliżona implementacja agregacji krokowej, która pozwala na wyświetlanie danych po stronie serwera w czasie rzeczywistym za pomocą wykresu podobnego do formatu stockowego
HighCharts演示.zip
(48.69 KB, Liczba pobranych plików: 1)
|