|
O mercado específico para aplicações deste exemplo é que preciso ler o preço de uma commodity no banco de dados regularmente e então exibi-la na página web como um gráfico, semelhante ao gráfico de tendência de preços dos instrumentos de negociação em ações. Eu uso asp.net, combinado com a implementação do plugin Highcharts no jQuery, o plugin pode suportar muitos tipos de gráficos, mas eles são estáticos, e os exemplos fornecidos precisam ser transformados, amigos interessados podem acessar o site oficial do Highcharts para ver (http://www.highcharts.com/), que oferece muitas demos, para ser honesto, para entender minhas necessidades, devo usar o Highstock, No entanto, após analisar o exemplo de atualização dinâmica do Highcharts, também percebi que minha interface de requisitos é mais concisa, então este artigo usa o modelo de atualização dinâmica no Highcharts, e o tipo gráfico é spline. O mapa final do efeito é o seguinte (o preço do Pinqijin é atualizado a cada 10 segundos, e um ponto é adicionado ao gráfico de linhas a cada 10 segundos):
Alcance a formação de passos: Crie um novo site com VS e crie uma página asp.net DynamicUpdate.aspx, o código da página é o seguinte:
- <%@ 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ódigoPropriedades Highcharts renderTo indica contêineres de exibição, events representa o evento que o contêiner precisa registrar, onde load significa que ocorre após a conclusão do load; aqui, um timer js é definido na carga, que ocorre a cada 10 segundos, e o código nele é para solicitar o GOLD mais recente do arquivo dataupdate.ashx da pasta ajaxhandler no mesmo diretório raiz da página DynamicUpdate.aspx via ajax no jQuery Os dados de preço dessa variedade, aqui está o motivo pelo qual adiciono randomCode + "=" + oldrandomCode na URL ajax, porque adicionar um número aleatório pode evitar o cache, e flag=1 é porque meu arquivo dataupdate.ashx quer aceitar múltiplas requisições de diferentes ajax, então use flag para distinguir xAxis representa a coleção de atributos definidos para o eixo x do contêiner, o tipo representa o tipo de texto exibido, opcional, aqui preencho o tipo de hora, aqui note que o padrão para a instância é o horário GMT, você também pode usar o horário UTC, mas geralmente usamos o horário de Pequim, (GMT ou UTC) + 8 horas = horário de Pequim, então quando usamos ajax para obter o horário de Pequim, devemos subtrair 8 horas da hora (aqui também quero compartilhar uma experiência, Como converter o tempo do servidor para o tempo js que pode ser usado pelo método .getTime(), ou seja, subtrair o tempo do servidor de 1970-1-1, converter os dias restantes em milissegundos e então atribuir um valor ao tempo recém-inicializado pelo método setTime em js, descobri que o resultado obtido por getTime() está incorreto para inicializar um tempo js diretamente em js na forma de nova Data (ano, mês, dia, hora, minuto, segundo, milissegundo) com getTime(), Quanto ao motivo pelo qual 1970-1-1 é subtraído, é porque a definição do método getTime() é obter o número de milissegundos do tempo atual a partir de 1970-1-1), quando o eixo x não é exibido como um tempo ou você precisa defini-lo por conta própria, ele também pode ser definido pelo atributo categorias, tickPixelInterval representa a densidade do eixo x, e etiquetas é usado para formatar o formato de exibição do eixo x yAxis representa uma coleção de atributos definidos para o eixo y do container, que é aproximadamente igual aos atributos do eixo x, mas no Highcharts não é possível definir o valor fixo do eixo y por meio de categorias; o eixo y do Highcharts é gerado automaticamente com base nos dados do ponto de coordenadas fornecidos, que dependem do subatributo de dados do atributo série, por exemplo, quando você atribui um valor a um dado O valor máximo é 300, e o valor mínimo é 100. Depois, a exibição do eixo y ficará entre 100 e 300, ou você também pode definir o atributo máximo ou mínimo do eixo y. série representa a coleção de todas as curvas exibidas no contêiner, aqui mostro apenas uma curva, nome representa o nome da curva, dados representam a coleção de uma série de pontos coordenados da curva, x está na frente, y está atrás, é um array js, neste caso, porque o eixo x mostra o tempo, então a propriedade x do objeto array deve ser definida para o tempo, mas no Highcharts o tempo não é diretamente atribuído ao eixo x, Em vez disso, o número de milissegundos entre 1970-1-1 e um certo tempo é atribuído ao eixo x para representar esse tempo, então o método getTime() deve ser usado, a forma do ponto coordenado do eixo y deve ser y = número pequeno * forma inteira, e eu não entendi por que os Highcharts tinham que fazer isso, porque os dados de preços da variedade neste exemplo geralmente são mais ou menos iguais, então tive que dividir por 200 ao obter os dados, e depois multiplicar por 200 ao atribuir um valor ao eixo y.
<%= jsonstr %> no código da página são os dados iniciais que preciso obter do servidor para inicializar o grafo, a geração em cs da 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 elas, a tabela TabMerPrice é a tabela de informações de preços variados, tempo TMPTime, preço TMPPrice, TMPTime intervalo de tempo é de dez segundos, uso um trabalho de banco de dados para gerar o registro da tabela, que acontece uma vez a cada dez segundos AddHours(-8) serve para converter o horário para o horário de Pequim, e o formato de dados gerado é o formato json O código dataupdate.ashx é assim:
- 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 é a implementação aproximada da agregação por etapas, que pode realizar a exibição em tempo real dos dados do lado do servidor com um gráfico semelhante ao formato original
HighCharts演示.zip
(48.69 KB, Número de downloads: 1)
|