|
Bu örnek için özel uygulama piyasası, bir emtianın fiyatını veritabanından düzenli olarak okumam ve ardından bunu web sayfasında grafik olarak göstermem, hisse senetlerindeki işlem araçlarının fiyat trend grafiğine benzer şekilde. asp.net kullanıyorum, jQuery'deki Highcharts eklentisi uygulamasıyla birleşince, eklenti birçok tür grafiki destekleyebiliyor ama bunlar statik ve verilen örneklerin dönüştürülmesi gerekiyor, ilgilenen arkadaşlar Highcharts resmi web sitesine gidip (http://www.highcharts.com/) görebilir, dürüst olmak gerekirse, ihtiyaçlarımı anlamak için Highstock kullanmalıyım, Ancak, Highcharts'ın dinamik güncelleme örneğine baktıktan sonra, gereksinim arayüzümün daha özlü olduğunu fark ettim; bu makale Highcharts'ta dinamik güncelleme modelini kullanıyor ve grafik tipi spline'dır. Son etki haritası şöyledir (Pinqijin fiyatı her 10 saniyede bir güncellenir ve çizgi grafiğe her 10 saniyede bir puan eklenir):
Adım toplama yeteneğini gerçekleştirin: VS ile yeni bir web sitesi oluşturun ve asp.net bir sayfa oluşturun DynamicUpdate.aspx, sayfa kodu şu şekildedir:
- <%@ 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>
Kopya koduHighcharts özelliği renderTo gösteri konteynerlerini gösterir, Olaylar, konteynerin kaydetmesi gereken olayı temsil eder; yük, yükleme tamamlandıktan sonra gerçekleşir demektir; burada yük içinde bir js zamanlayıcısı ayarlanır ve bu her 10 saniyede bir gerçekleşir ve içindeki kod, jQuery'deki DynamicUpdate.aspx sayfasının kök dizinindeki ajaxhandler klasörünün dataupdate.ashx dosyasından en son GOLD'u talep etmektir Fiyat verileri, ajax URL'sine randomCode + "=" + oldrandomCode eklememin nedeni rastgele sayı eklemenin önbelleğe alınması için ve flag=1 ise, dataupdate.ashx dosyamın farklı ajax'ten birden fazla isteği kabul etmek istemesi, bu yüzden bayrak kullanarak ayırt etmem xAxis, konteynerin x ekseni için tanımlanmış özellikler koleksiyonunu temsil eder, type ise gösterilen metin tipini temsil eder, isteğe bağlı, burada zaman tipini dolduruyorum, burada belirtmek gerekir ki örnek için varsayılan olarak GMT saati, UTC saati de kullanılabilir, ama genellikle Pekin saati (GMT veya UTC) + 8 saat = Pekin saati kullanırız, bu yüzden ajax kullanarak Pekin saati olduğunu aldığımızda, saatten 8 saat çıkarmalıyız (burada ayrıca bir deneyim paylaşmak istiyorum, .getTime() yöntemiyle kullanılabilecek sunucu zamanını js zamanına nasıl dönüştürürüm, yani sunucu zamanını 1970-1-1'den çıkarmak, kalan günleri milisaniyelere çevirmek ve ardından setTime yöntemiyle yeni başlatılan zamana bir değer atanmak, getTime() tarafından elde edilen sonucun, yeni Tarih (yıl, ay, gün, saat, dakika, saniye, milisaniye) şeklinde js zamanını doğrudan js'de başlatmak için getTime() ile doğru olduğunu gördüm, 1970-1-1'in neden çıkarıldığına gelince, getTime() yönteminin tanımının 1970-1-1 arasındaki mevcut zamandan milisaniye sayısını elde etmek olmasıdır, x-ekseni zaman olarak gösterilmediğinde veya kendiniz tanımlamanız gerektiğinde, kategoriler özniteliğiyle de tanımlanabilir, tickPixelInterval x ekseninin yoğunluğunu temsil eder ve etiketler x ekseninin görüntü formatını biçimlendirmek için kullanılır yAxis, konteynerin y ekseni için tanımlanmış bir öznitelik koleksiyonunu temsil eder; bu özellik x ekseninin özellikleriyle yaklaşık olarak aynıdır, ancak Highcharts'ta y ekseninin sabit değerini kategoriler aracılığıyla tanımlamak mümkün değildir, Highcharts'ın y ekseni, verilen koordinat noktası verisine göre otomatik olarak üretilir ve bu da seri özniteliğinin veri alt özniteliğine bağlıdır; örneğin, veriye bir değer ataydığınızda maksimum değer 300, minimum değer ise 100'dür. O zaman y ekseninin görüntülenmesi 100 ile 300 arasında olur ya da yAxis'in maksimum veya minimum özelliğini de ayarlayabilirsiniz seri, konteynerde gösterilen tüm eğrilerin koleksiyonunu temsil eder, burada sadece bir eğri gösteriyorum, isim eğrinin adını, veri eğrinin bir dizi koordinat noktasının toplanmasını temsil eder, x önde, y arkada, bu bir js dizisi, bu durumda x ekseni zamanı gösterdiği için dizi nesnesinin x özelliği zamana ayarlanmalıdır, ancak Highcharts'ta bu doğrudan x eksenine zaman atanmaz, Bunun yerine, 1970-1-1 ile belirli bir zaman arasındaki milisaniye sayısı bu zamanı temsil etmek için x eksenine atanır, bu yüzden getTime() yöntemi kullanılmalıdır, y ekseni koordinat noktasının formu y = küçük sayı * tam sayı formu olmalı ve neden Highcharts'ın bunu yapması gerektiğini anlamadım, çünkü bu örnekteki çeşitliliğin fiyat verileri genellikle yaklaşık aynıdır, bu yüzden veriyi elde ederken 200'e bölmem ve y eksenine değer atarken 200'e çarpmam gerekti.
<%= jsonstr %> sayfa kodundaki grafiği başlatmak için sunucudan almam gereken ilk veri, sayfanın cs üretimi
- 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;
- }
Kopya koduBunlar arasında, TabMerPrice tablosu çeşitlilik fiyat bilgi tablosu, TMPTime zamanı, TMPPrice fiyatı, TMPTime zaman aralığı on saniyedir, tablonun kaydını oluşturmak için veritabanı işi kullanıyorum ve bu her on saniyede bir gerçekleşiyor AddHours(-8) zamanı Pekin zamanına dönüştürmek için kullanılır ve oluşturulan veri formatı json formatındadır dataupdate.ashx kodu şöyle görünüyor:
- 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();
- }
Kopya koduBu, servis tarafı verilerin gerçek zamanlı görüntülenmesini stok formata benzer bir grafikle gerçekleştirebilen step aggregation'un kaba uygulamasıdır
HighCharts演示.zip
(48.69 KB, İndirme sayısı: 1)
|