|
Конкретний прикладний ринок для цього прикладу полягає в тому, що мені потрібно регулярно читати ціну товару з бази даних, а потім відображати її на веб-сторінці у вигляді графіка, подібно до графіка тренду цін у торгових інструментах у акціях. Я використовую asp.net, у поєднанні з реалізацією плагіна Highcharts у jQuery, плагін підтримує багато типів графіки, але вони статичні, і наведені приклади потрібно трансформувати, зацікавлені друзі можуть зайти на офіційний сайт Highcharts (http://www.highcharts.com/), де є багато демонстрацій, чесно кажучи, щоб реалізувати мої потреби, мені слід скористатися Highstock, Однак, розглянувши приклад з динамічним оновленням Highcharts, я також розумію, що інтерфейс вимог більш лаконічний, тому в цій статті використовується модель динамічного оновлення у Highcharts, а графічний тип — сплайн. Остаточна карта ефектів виглядає так: ціна Pinqijin оновлюється кожні 10 секунд, а точка додається на лінійний графік кожні 10 секунд):
Досягніть швидкого збіру кроків: Створіть новий вебсайт за допомогою VS і створіть asp.net сторінку DynamicUpdate.aspx, код сторінки виглядає так:
- <%@ 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>
Копія кодуВластивість Highcharts renderTo позначає контейнери для відображення, Події представляють подію, яку контейнер має зареєструвати, де завантаження означає, що воно відбувається після завершення завантаження, тут у завантаженні встановлюється таймер js, який відбувається раз на 10 секунд, а код у ньому має запит останнього GOLD з файлу dataupdate.ashx папки ajaxhandler у тому ж кореневому каталозі, що й сторінка DynamicUpdate.aspx, через ajax у jQuery Цінові дані цього типу: ось чому я додаю randomCode + "=" + oldrandomCode у ajax URL, бо додавання випадкового числа дозволяє уникнути кешування, а flag=1 — бо мій dataupdate.ashx файл хоче приймати кілька запитів від різних ajax, тому використовуйте flag для розрізнення xAxis позначає набір атрибутів, визначених для осі x контейнера, тип — відображений тип тексту, опціонально, тут я вводжу тип часу, тут звертаю увагу, що за замовчуванням для інстансу — час GMT, також можна використовувати UTC-час, але ми зазвичай використовуємо пекінський час (GMT або UTC) + 8 годин = пекінський час, тому коли ми використовуємо ajax для отримання часу — це пекінський час, слід віднімати 8 годин із години (тут я також хочу поділитися досвідом, Як перетворити серверний час у час js, який може використовуватися методом .getTime(), тобто відняти час сервера з 1970-1-1, перетворити решту днів у мілісекунди, а потім присвоїти значення новоініціалізованому часу через метод setTime у js. Я виявив, що результат, отриманий getTime(), є неправильним для ініціалізації часу js безпосередньо в js у вигляді нової дати (рік, місяць, день, година, хвилина, секунда, мілісекунда) з getTime(), Щодо того, чому 1970-1-1 віднімається, це тому, що визначення методу getTime() полягає в отриманні кількості мілісекунд від поточного часу з 1970-1-1), коли вісь x не відображається як час або потрібно визначити її самостійно, її також можна визначити атрибутом categories, tickPixelInterval позначає щільність осі x, а мітки використовуються для форматування формату відображення осі x yAxis представляє набір атрибутів, визначених для осі y контейнера, які приблизно збігаються з атрибутами осі x, але в Highcharts неможливо визначити фіксоване значення осі y через категорії, вісь Highcharts автоматично генерується на основі даних координатної точки, що залежить від підатрибута атрибута серії, наприклад, коли ви присвоюєте значення даним Максимальне значення — 300, а мінімальне — 100. Тоді відображення осі y буде між 100 і 300, або ви також можете встановити максимальний або мінімальний атрибут осі yAxis Серія представляє колекцію всіх кривих, що відображаються в контейнері, тут я показую лише одну криву, ім'я позначає назву кривої, дані — сукупність ряду координатних точок кривої, x — попереду, y — позаду, це js-масив, у цьому випадку, оскільки вісь x показує час, тому властивість x масиву має бути встановлена на час, але у Highcharts це не призначено час безпосередньо осі x, Натомість кількість мілісекунд між 1970-1-1 і певним часом призначається осі x для представлення цього часу, тому потрібно використовувати метод getTime(), форма координатної точки осі y має бути y = мале число * ціле число, і я не розумів, чому Highcharts так робить, бо дані про ціни різноманіття в цьому прикладі зазвичай приблизно однакові, тому мені довелося ділити на 200 при отриманні даних, а потім множити на 200 при призначенні значення осі y.
<%= jsonstr %> у коді сторінки — це початкові дані, які мені потрібно отримати з сервера для ініціалізації графа, тобто генерації сторінки на 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;
- }
Копія кодуСеред них таблиця TabMerPrice — це таблиця інформації про різновид, час TMPTime, ціна TMPP, інтервал часу TMPTime — десять секунд, я використовую завдання бази даних для створення запису таблиці, що відбувається раз на десять секунд AddHours(-8) призначений для конвертації часу у пекінський час, а формат генерованих даних — json формат Код dataupdate.ashx виглядає так:
- 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();
- }
Копія кодуЦе приблизна реалізація агрегації кроків, яка дозволяє реалізувати відображення серверних даних у реальному часі за допомогою графіка, схожого на формат stock
HighCharts演示.zip
(48.69 KB, Кількість завантажень: 1)
|