|
Конкретный рынок применения этого примера заключается в том, что мне нужно регулярно читать цену товара из базы данных, а затем отображать её на веб-странице в виде графика, аналогично графику ценового тренда торговых инструментов в акциях. Я использую 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 контейнера, type — отображаемый тип текста, опционально, здесь я заполняю тип времени, здесь обратите внимание, что по умолчанию для экземпляра — GMT-время, вы также можете использовать UTC-время, но мы обычно используем пекинское время (GMT или UTC) + 8 часов = пекинское время, поэтому когда мы используем ajax для получения времени пекинского времени, нужно вычитать 8 часов из часа (здесь я также хочу поделиться своим опытом, Как преобразовать серверное время в js-время, которое можно использовать с помощью метода .getTime(), то есть вычесть серверное время из 1970-1-1, преобразовать оставшиеся дни в миллисекунды, а затем присвоить значение новому инициализированному времени с помощью метода setTime в js. Я обнаружил, что результат, полученный getTime(), неверен при инициализации js-времени напрямую в js в виде новой Date (год, месяц, день, час, минута, секунда, миллисекунда) с помощью getTime(), Что касается того, почему вычитается 1970-1-1, то это потому, что метод getTime() определяется как получение количества миллисекунд из текущего времени из 1970-1-1), когда ось x не отображается как время или её нужно определить самостоятельно, её также можно определить атрибутом категории, 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, TMPPice, интервал времени 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();
- }
Копирование кодаЭто примерная реализация шаговой агрегации, которая позволяет реализовывать отображение серверных данных в реальном времени с помощью графика, похожего на стандартный формат
HighCharts演示.zip
(48.69 KB, Количество скачиваний: 1)
|