|
Специфичният пазар за приложение за този пример е, че трябва редовно да чета цената на стока от базата данни и след това да я показвам на уеб страницата като графика, подобно на графиката на ценовите трендове на търговските инструменти в акции. Използвам 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 под формата на нова дата (година, месец, ден, час, минута, секунда, милисекунда) с getTime(), Що се отнася до това защо се изважда 1970-1-1, това е защото дефиницията на метода getTime() е да се получи броят милисекунди от текущото време от 1970-1-1), когато оста x не се показва като време или трябва да я дефинирате сами, тя може да се дефинира и чрез атрибута категория, tickPixelInterval представлява плътността на оста x, а етикетите се използват за форматиране на формата на дисплея на оста x yAxis представлява колекция от атрибути, дефинирани за y-оста на контейнера, която е приблизително същата като атрибутите на x-оста, но в Highcharts не е възможно фиксираната стойност на y-оста да се дефинира чрез категории, 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 време, TMPPrice цената, 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)
|