|
이 예시의 구체적인 적용 시장은 데이터베이스에서 상품 가격을 정기적으로 읽고, 이를 주식 거래 수단의 가격 추세 차트와 유사한 그래프로 웹 페이지에 표시해야 한다는 점입니다. 저는 asp.net 플러그인과 jQuery의 Highcharts 플러그인 구현을 결합해 사용합니다. 플러그인은 다양한 유형의 그래픽을 지원할 수 있지만 고정되어 있고, 제공된 예제들은 변환해야 합니다. 관심 있는 친구들은 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는 display container를 나타냅니다. events는 컨테이너가 등록해야 할 이벤트를 나타내며, load는 로딩이 완료된 후에 발생함을 의미합니다. 여기서 JS 타이머가 로드에 설정되어 10초마다 한 번씩 발생하고, 그 안의 코드는 ajaxhandler 폴더의 dataupdate.ashx 파일에서 jQuery의 DynamicUpdate.aspx 페이지와 동일한 루트 디렉터리에 있는 최신 GOLD를 요청하는 것입니다 다양한 가격 데이터를 설명하자면, ajax URL에 randomCode + "=" + oldrandomCode를 추가하는 이유는 랜덤 수를 추가하면 캐싱을 피할 수 있기 때문입니다. 그리고 flag=1은 dataupdate.ashx 파일이 여러 ajax 요청을 받으려 하기 때문에 flag를 사용해 구분합니다 xAxis는 컨테이너의 x축에 정의된 속성 모음을 나타내고, type은 표시되는 텍스트 타입을 나타내며, 여기서는 시간 타입을 채우고, 여기서는 인스턴스의 기본값이 GMT 시간임을 참고하세요. UTC 시간도 사용할 수 있지만, 일반적으로 베이징 시간을 사용합니다. (GMT 또는 UTC) + 8시간 = 베이징 시간을 사용합니다. 따라서 AJAX를 사용해 베이징 시간을 얻을 때는 시간에서 8시간을 빼야 합니다 (여기서 경험을 공유하고 싶습니다, 서버 시간을 .getTime() 메서드에서 사용할 수 있는 js 시간으로 변환하는 방법, 즉 서버 시간을 1970-1-1에서 빼고 나머지 날짜를 밀리초로 변환한 후, js의 setTime 메서드를 통해 새로 초기화된 시간에 값을 할당하는 방법입니다. getTime()으로 얻은 결과가 getTime()을 사용하여 js로 직접 새로운 날짜(연, 월, 일, 시간, 분, 초, 밀리초 형태)를 초기화하는 것은 잘못되었다는 것을 발견했습니다. 1970-1-1이 빼진 이유는 getTime() 메서드의 정의가 1970-1-1에서 현재 시간에서 밀리초 수를 얻기 때문입니다). x축이 시간으로 표시되지 않거나 직접 정의해야 할 때, categories 속성으로도 정의할 수 있습니다. tickPixelInterval은 x축의 밀도를 나타내며, 라벨은 x축의 표시 형식을 포맷하는 데 사용됩니다 yAxis는 컨테이너의 y축에 정의된 속성들의 집합을 나타내며, 이는 x축의 속성과 대체로 동일하지만, Highcharts에서는 y축의 고정 값을 카테고리별로 정의할 수 없습니다. Highcharts의 y축은 주어진 좌표점 데이터를 기반으로 자동으로 생성되며, 이는 시리즈 속성의 데이터 하위 속성에 따라 달라집니다. 예를 들어, 데이터에 값을 할당할 때 최대 값은 300, 최소 값은 100입니다. 그러면 y축 표시는 100에서 300 사이이며, yAxis의 최대 또는 최소 속성도 설정할 수 있습니다 series는 컨테이너에 표시되는 모든 곡선의 집합을 나타내며, 여기서는 하나의 곡선만 보여주고, name은 곡선의 이름을, data는 곡선의 좌표점 연속을 나타내며, x는 앞, y는 뒤에 위치하며, js 배열입니다. 이 경우 x축이 시간을 나타내므로 배열 객체의 x 속성을 time로 설정해야 하지만, Highcharts에서는 x축에 직접 시간이 할당되지 않습니다. 대신 1970-1-1과 특정 시간 사이의 밀리초 수가 x축에 할당되어 이 시간을 나타내므로, getTime() 메서드를 사용해야 하고, y축 좌표점의 형태는 y = 작은 수 * 정수형이어야 합니다. 그리고 왜 Highcharts가 이렇게 해야 하는지 이해가 안 됐습니다. 이 예시의 변종 가격 데이터가 대체로 비슷하기 때문에, 데이터를 얻을 때 200으로 나누고, y축에 값을 할당할 때 200을 곱해야 했기 때문입니다.
페이지 코드의 <%= 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 시간 간격은 10초입니다. 저는 데이터베이스 작업을 사용해 테이블 기록을 생성하는데, 이 작업은 10초마다 한 번씩 발생합니다 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)
|