|
Pasar aplikasi khusus untuk contoh ini adalah bahwa saya perlu membaca harga komoditas dari database secara teratur, dan kemudian menampilkannya di halaman web sebagai grafik, mirip dengan grafik tren harga instrumen perdagangan saham. Saya menggunakan asp.net, dikombinasikan dengan implementasi plugin Highcharts di jQuery, plugin dapat mendukung banyak jenis grafik, tetapi statis, dan contoh yang diberikan perlu diubah, teman-teman yang tertarik dapat mengunjungi situs web resmi Highcharts untuk melihat (http://www.highcharts.com/), yang menyediakan banyak demo, sejujurnya, untuk mewujudkan kebutuhan saya, saya harus menggunakan Highstock, Namun, setelah melihat contoh pembaruan dinamis Highcharts, saya juga dapat menyadari bahwa antarmuka persyaratan saya lebih ringkas, jadi artikel ini menggunakan model pembaruan dinamis di Highcharts, dan jenis grafisnya adalah spline. Peta efek terakhir adalah sebagai berikut (harga Pinqijin diperbarui setiap 10 detik, dan satu titik ditambahkan ke grafik garis setiap 10 detik):
Mencapai pengumpulan langkah: Buat situs web baru dengan VS dan buat halaman asp.net DynamicUpdate.aspx, kode halamannya adalah sebagai berikut:
- <%@ 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>
Salin kodeHighcharts properti renderTo menunjukkan kontainer tampilan, events mewakili peristiwa yang perlu didaftarkan oleh kontainer, di mana pemuatan berarti terjadi setelah pemuatan selesai, di sini pengatur waktu js diatur dalam pemuatan, yang terjadi setiap 10 detik sekali, dan kode di dalamnya adalah untuk meminta GOLD terbaru dari file dataupdate.ashx dari folder ajaxhandler di direktori root yang sama dengan halaman DynamicUpdate.aspx melalui ajax di jQuery Data harga varietas, inilah mengapa saya menambahkan randomCode + "=" + oldrandomCode di URL ajax karena menambahkan angka acak dapat menghindari caching, dan flag=1 karena file dataupdate.ashx saya ingin menerima banyak permintaan dari ajax yang berbeda, jadi gunakan flag untuk membedakannya xAxis mewakili kumpulan atribut yang ditentukan untuk sumbu x kontainer, jenis mewakili jenis teks yang ditampilkan, opsional, di sini saya mengisi jenis waktu, di sini perhatikan bahwa default untuk instance adalah waktu GMT, Anda juga dapat menggunakan waktu UTC, tetapi kami umumnya menggunakan waktu Beijing, (GMT atau UTC) + 8 jam = waktu Beijing, jadi ketika kami menggunakan ajax untuk mendapatkan waktu adalah waktu Beijing, kami harus mengurangi 8 jam dari jam (di sini saya juga ingin berbagi pengalaman, Cara mengonversi waktu server ke waktu js yang dapat digunakan dengan metode .getTime(), yaitu mengurangi waktu server dari 1970-1-1, mengonversi hari yang tersisa menjadi milidetik, lalu menetapkan nilai ke waktu yang baru diinisialisasi melalui metode setTime di js, saya menemukan bahwa hasil yang diperoleh oleh getTime() salah untuk menginisialisasi waktu js secara langsung di js dalam bentuk Tanggal baru (tahun, bulan, hari, jam, menit, detik, milidetik) dengan getTime(), Adapun mengapa 1970-1-1 dikurangi, itu karena definisi metode getTime() adalah untuk mendapatkan jumlah milidetik dari waktu saat ini dari 1970-1-1), ketika sumbu x tidak ditampilkan sebagai waktu atau Anda perlu mendefinisikannya sendiri, itu juga dapat didefinisikan oleh atribut kategori, tickPixelInterval mewakili kepadatan sumbu x, dan label digunakan untuk memformat format tampilan sumbu x yAxis mewakili kumpulan atribut yang ditentukan untuk sumbu y kontainer, yang kira-kira sama dengan atribut sumbu x, tetapi di Highcharts tidak mungkin untuk menentukan nilai tetap sumbu y melalui kategori, sumbu y Highcharts secara otomatis dihasilkan berdasarkan data titik koordinat yang diberikan, yang bergantung pada sub-atribut data dari atribut seri, misalnya, ketika Anda menetapkan nilai ke data Nilai maksimum adalah 300, dan nilai minimum adalah 100. Kemudian tampilan sumbu y akan berada di antara 100 dan 300, atau Anda juga dapat mengatur atribut max atau min dari yAxis seri mewakili kumpulan semua kurva yang ditampilkan dalam wadah, di sini saya hanya menunjukkan satu kurva, nama mewakili nama kurva, data mewakili kumpulan serangkaian titik koordinat kurva, x di depan, y di belakang, itu adalah array js, dalam hal ini, karena sumbu x menunjukkan waktu, jadi properti x dari objek array harus diatur ke waktu, tetapi di Highcharts tidak secara langsung ditetapkan waktu ke sumbu x, Sebagai gantinya, jumlah milidetik antara 1970-1-1 dan waktu tertentu ditetapkan ke sumbu x untuk mewakili waktu ini, jadi metode getTime() harus digunakan, bentuk titik koordinat sumbu y harus y = bilangan kecil * bentuk bilangan bulat, dan saya tidak mengerti mengapa Highcharts harus melakukan ini, karena data harga varietas dalam contoh ini umumnya hampir sama, jadi saya harus membagi dengan 200 saat mendapatkan data, dan kemudian mengalikan dengan 200 saat menetapkan nilai ke sumbu y.
<%= jsonstr %> dalam kode halaman adalah data awal yang perlu saya dapatkan dari server untuk menginisialisasi grafik, generasi cs halaman
- 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;
- }
Salin kodeDiantaranya, tabel TabMerPrice adalah tabel informasi harga variasi, waktu TMPime, harga TMPPrice, interval waktu TMPTime adalah sepuluh detik, saya menggunakan pekerjaan database untuk menghasilkan catatan tabel, yang terjadi setiap sepuluh detik sekali AddHours(-8) adalah untuk mengonversi waktu ke waktu Beijing, dan format data yang dihasilkan adalah format json Kode dataupdate.ashx terlihat seperti ini:
- 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();
- }
Salin kodeIni adalah implementasi kasar dari agregasi langkah, yang dapat mewujudkan tampilan real-time data sisi server dengan grafik yang mirip dengan format stok
HighCharts演示.zip
(48.69 KB, Jumlah unduhan: 1)
|