|
El mercado específico de aplicaciones para este ejemplo es que necesito leer el precio de una materia prima de la base de datos regularmente y luego mostrarlo en la página web como un gráfico, similar al gráfico de tendencia de precios de los instrumentos de negociación en acciones. Yo uso asp.net, combinado con la implementación del plugin Highcharts en jQuery, el plugin puede soportar muchos tipos de gráficos, pero son estáticos, y los ejemplos que se proporcionan necesitan ser transformados, los amigos interesados pueden ir a la web oficial de Highcharts para ver (http://www.highcharts.com/), que ofrece muchas demos, para ser honesto, para entender mis necesidades, debería usar Highstock, Sin embargo, tras ver el ejemplo de actualización dinámica de Highcharts, también puedo darme cuenta de que mi interfaz de requisitos es más concisa, así que este artículo utiliza el modelo de actualización dinámica en Highcharts, y el tipo gráfico es spline. El mapa de efectos finales es el siguiente (el precio de Pinqijin se actualiza cada 10 segundos y se añade un punto al gráfico de líneas cada 10 segundos):
Logra la recogida de escalones: Crea un sitio web nuevo con VS y crea una asp.net página DynamicUpdate.aspx, el código de página es el siguiente:
- <%@ 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>
Copiar códigoHighcharts propiedad renderTo indica contenedores de visualización, events representa el evento que el contenedor necesita registrarse, donde load significa que ocurre después de que la carga se ha completado; aquí se establece un temporizador js en la carga, que ocurre cada 10 segundos, y el código en él es para solicitar el último GOLD desde el archivo dataupdate.ashx de la carpeta ajaxhandler en el mismo directorio raíz que la página DynamicUpdate.aspx a través de ajax en jQuery Los datos de precios de esta variedad, aquí está la razón por la que añado randomCode + "=" + oldrandomCode en la URL de ajax, porque añadir un número aleatorio puede evitar la caché, y flag=1 es porque mi archivo dataupdate.ashx quiere aceptar múltiples solicitudes de diferentes ajax, así que usa flag para distinguirlo xAxis representa la colección de atributos definidos para el eje x del contenedor, type representa el tipo de texto mostrado, opcional, aquí relleno el tipo de hora, aquí ten en cuenta que el valor predeterminado para la instancia es la hora GMT, también puedes usar la hora UTC, pero generalmente usamos la hora de Pekín (GMT o UTC) + 8 horas = hora de Pekín, así que cuando usamos ajax para obtener la hora de Pekín, deberíamos restar 8 horas de la hora (aquí también quiero compartir una experiencia, Cómo convertir el tiempo del servidor en tiempo js que puede ser usado por el método .getTime(), es decir, restar el tiempo del servidor de 1970-1-1, convertir los días restantes a milisegundos y luego asignar un valor al tiempo recién inicializado mediante el método setTime en js, encontré que el resultado obtenido por getTime() es incorrecto para inicializar un tiempo js directamente en js en forma de nueva fecha (año, mes, día, hora, minuto, segundo, milisegundo) con getTime(), En cuanto a por qué se resta 1970-1-1, es porque la definición del método getTime() es obtener el número de milisegundos del tiempo actual de 1970-1-1), cuando el eje x no se muestra como un tiempo o necesitas definirlo tú mismo, también puede definirse mediante el atributo categories, tickPixelInterval representa la densidad del eje x, y etiquetas se usa para formatear el formato de visualización del eje x yAxis representa un conjunto de atributos definidos para el eje y del contenedor, que es aproximadamente igual que los atributos del eje x, pero en Highcharts no es posible definir el valor fijo del eje y a través de categorías; el eje y de Highcharts se genera automáticamente en función de los datos de puntos de coordenadas dados, que dependen del subatributo de datos del atributo serie, por ejemplo, cuando asignas un valor a los datos. El valor máximo es 300 y el valor mínimo es 100. Entonces la visualización del eje y estará entre 100 y 300, o también puedes establecer el atributo máximo o mínimo del eje y. series representa la colección de todas las curvas mostradas en el contenedor, aquí solo muestro una curva, nombre representa el nombre de la curva, data representa la colección de una serie de puntos de coordenadas de la curva, x está delante, y detrás, es un array js, en este caso, porque el eje x muestra el tiempo, así que la propiedad x del objeto array debe establecerse en tiempo, pero en Highcharts no se asigna tiempo directamente al eje x, En su lugar, el número de milisegundos entre 1970-1-1 y cierto tiempo se asigna al eje x para representar este tiempo, así que debe usarse el método getTime(), la forma del punto de coordenadas del eje y debe ser y = número pequeño * forma entera, y no entendí por qué Highcharts tenía que hacer esto, porque los datos de precios de la variedad en este ejemplo son generalmente iguales, así que tuve que dividir por 200 al obtener los datos, y luego multiplicar por 200 al asignar un valor al eje y.
<%= jsonstr %> en el código de la página son los datos iniciales que necesito obtener del servidor para inicializar el grafo, la generación de CS de la página
- 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;
- }
Copiar códigoEntre ellas, la tabla TabMerPrice es la tabla de información de precios variados, TMPTime time, TMPPrice price, TMPTime intervalo de tiempo es de diez segundos, yo uso un trabajo de base de datos para generar el registro de la tabla, que ocurre una vez cada diez segundos AddHours(-8) sirve para convertir la hora a la hora de Pekín, y el formato de datos generado es el formato json El código dataupdate.ashx se ve así:
- 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();
- }
Copiar códigoEsta es la implementación aproximada de la agregación por pasos, que permite mostrar en tiempo real los datos del lado del servidor con un gráfico similar al formato stock
HighCharts演示.zip
(48.69 KB, Número de descargas: 1)
|