|
A konkrét alkalmazási piac ebben a példában az, hogy rendszeresen el kell olvasnom egy árucikk árát az adatbázisból, majd grafikonként kell megjelenítenem a weboldalon, hasonlóan a részvénykereskedési eszközök ártrenddiagramjához. Én asp.net-t használok, kombinálva a Highcharts bővítmény megvalósításával a jQuery-ben, a bővítmény sokféle grafikát támogat, de azok statikus módok, és a bemutatott példákat át kell alakítani, az érdeklődő barátok elmehetnek a Highcharts hivatalos weboldalára, hogy megnézzék (http://www.highcharts.com/), ahol sok demó található, őszintén szólva, hogy megértsem az igényeimet, érdemes a Highstockot használnom. Azonban a Highcharts dinamikus frissítési példájának megnézése után rájöttem, hogy a követelmény felületem rövidebb, ezért ez a cikk a Highcharts dinamikus-frissítési modelljét használja, a grafika típusa pedig spline. A végső hatástérkép a következő (a Pinqijin ára 10 másodpercenként frissül, és 10 másodpercenként egy pontot adnak hozzá a vonalgrafikonhoz):
Lépésgyűjtés elérése: Hozzon létre egy új weboldalt VS-szel, és hozzon létre egy asp.net oldalt, DynamicUpdate.aspx, az oldalkód a következő:
- <%@ 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>
Kód másolásaHighcharts property renderTo a megjelenítő konténereket jelzi, az események azt az eseményt jelentik, amelyet a konténernek regisztrálnia kell, ahol a betöltés esetén történik, itt a betöltés után jön be egy js időzítő, ami 10 másodpercenként egyszer történik, és a benne lévő kód a legfrissebb GOLD-ot kéri az ajaxhandler mappának dataupdate.ashx fájljából ugyanabban a gyökérkönyvtárban, ahol az DynamicUpdate.aspx oldal a jQuery-ben az ajax-on keresztül keresztül A különböző áradatok: itt van a véletlen kód + "=" + oldrandomCode hozzáadása az ajax URL-hez, mert véletlenszám hozzáadása elkerülheti a gyorsítótárat, és a flag=1 azért, mert a dataupdate.ashx fájlom több kérést akar fogadni különböző ajax-tól, ezért használd a flag-et a megkülönböztetéshez az xAxis a konténer x-tengelyéhez definiált attribútumok gyűjteményét jelenti, a type a megjelenített szövegtípust, opcionális, itt kitöltöm az idő típust, itt megjegyzem, hogy az instance alapértelmezett GMT idő, használhatsz UTC időt is, de általában Pekingi időt használunk, (GMT vagy UTC) + 8 óra = Pekingi idő, tehát amikor az ajax-ot használjuk a pekingi idő eléréséhez, 8 órát kell levonni az órából (itt szeretnék megosztani egy élményt is, Hogyan lehet a szerver idejét js időre konvertálni, amelyet a .getTime() módszerrel lehet használni, vagyis levonjuk a szerver idejét az 1970-1-1-ből, a fennmaradó napokat ezrévudmire, majd az újonnan inicializált időhöz a setTime módszerrel a js-ben, azt találtam, hogy a getTime() által kapott eredmény helytelen, hogy egy js időt közvetlenül js-ben inicializáljuk új Date (év, hónap, nap, óra, perc, másodperc, milliszekundum) formájában getTime() segítségével, Ami azt illeti, miért vonják le a 1970-1-1-et, az azért van, mert a getTime() módszer definíciója az, hogy megkapjuk a 1970-1-1 aktuális időből származó milliszekundumok számát), amikor az x-tengely nem időként jelenik meg, vagy magadnak kell definiálnod, akkor a categories attribútummal is meghatározható, a tickPixelInterval az x-tengely sűrűségét jelöli, és a címkék az x-tengely megjelenítési formátumának formázásához használják A yAxis egy olyan attribútumgyűjteményt képvisel, amelyeket a konténer y-tengelyére definiálnak, ami nagyjából megegyezik az x-tengely attribútumaival, de a Highcharts-ban nem lehet az y tengely fix értékét kategóriákon keresztül meghatározni; a Highcharts y-tengelye automatikusan generálódik a megadott koordináta-pont adatok alapján, ami a sorozat attribútumjának adat-alattribútumjától függ, például amikor értéket rendelünk az adatokhoz, a maximális érték 300, a minimum érték 100. Ezután az y-tengely megjelenítése 100 és 300 között lesz, vagy beállíthatod a yAxis max vagy minimum attribútumát is a sorozat az összes görbének gyűjteményét jelöli, amely a konténerben jelenik meg, itt csak egy görbét mutatok, a név a görbe nevét jelenti, data a görbe koordináta-pontok sorozatának összegyűjtését jelenti, x elöl, y mögött, ez egy js tömb, ebben az esetben azért, mert az x-tengely időt mutatja, így a tömbobjektum x tulajdonságát időre kell állítani, de a Highcharts-ban nem közvetlenül az idő az x-tengelyhez rendelve, Ehelyett az 1970-1-1 és egy adott idő közötti milliszekundumok száma az x-tengelyhez van rendelve, hogy ezt az időt képviselje, így a getTime() módszert kell használni, az y tengely koordináta-pontjának alakja y = kis szám * egész szám formában kell legyen, és nem értettem, miért kell ezt a Highcharts-nak megtennie, mert a változat áradatai általában nagyjából ugyanazok, ezért az adatok megszerzésekor 200-zal kellett osztanom őket, majd 200-zal szoroznom, amikor értéket rendeltem az y-tengelyhez.
<%= jsonstr %> az oldalkódban az az első adat, amire a szerverről szükségem van a grafikon inicializálásához, az oldal cs generálásához
- 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;
- }
Kód másolásaEzek közül a TabMerPrice táblázat a változatos árinformációs táblázat, a TMPTime idő, TMPPrice ár, a TMPTime időintervallum tíz másodperc, egy adatbázis feladattal generálom a tábla rekordját, ami tíz másodpercenként történik Az AddHours(-8) az idő pekingi időre történő átalakítására szolgál, és a generált adatformátum json formátum A dataupdate.ashx kód így néz ki:
- 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();
- }
Kód másolásaEz a lépésaggregáció durva megvalósítása, amely képes valós idejű megjelenítést valósítani a szerveroldali adatok megjelenítését egy grafikonnal, amely hasonló a gyári formátumhoz
HighCharts演示.zip
(48.69 KB, Letöltések száma: 1)
|