|
Konkrétní aplikace tohoto příkladu spočívá v tom, že musím pravidelně číst cenu komodity z databáze a pak ji zobrazovat na webové stránce jako graf, podobně jako cenový trendový graf obchodních nástrojů v akciích. Používám asp.net, v kombinaci s implementací pluginu Highcharts v jQuery, plugin podporuje mnoho typů grafiky, ale jsou statické a příklady je třeba přetvořit, zájemci mohou navštívit oficiální web Highcharts (http://www.highcharts.com/), kde je spousta dem, upřímně, abych pochopil své potřeby, měl bych použít Highstock, Po prohlédnutí příkladu dynamické aktualizace Highcharts si však také uvědomuji, že mé rozhraní požadavků je stručnější, takže tento článek používá model dynamické aktualizace v Highcharts a grafický typ je spline. Konečná mapa efektů je následující (cena Pinqijinu se aktualizuje každých 10 sekund a do čárového grafu se každých 10 sekund přidává bod):
Zvyšujte krok na světě: Vytvořte nový web pomocí VS a vytvořte asp.net stránku DynamicUpdate.aspx, kód stránky je následující:
- <%@ 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>
Kopírovat kódVlastnost Highcharts renderTo označuje zobrazovací kontejnery, events představuje událost, kterou musí kontejner zaregistrovat, kde načítání znamená, že nastává po dokončení načítání, zde je v načítání nastaven časovač js, který nastává jednou za 10 sekund, a kód v něm slouží k požadavku na nejnovější GOLD ze souboru dataupdate.ashx složky ajaxhandler ve stejném kořenovém adresáři jako DynamicUpdate.aspx stránka přes ajax v jQuery Cenová data této variety, tady je důvod, proč přidávám randomCode + "=" + oldrandomCode do URL ajax, protože přidání náhodného čísla může zabránit cachování, a flag=1 je proto, že můj dataupdate.ashx soubor chce přijímat více požadavků od různých ajaxů, takže používám flag k rozlišení xAxis představuje kolekci atributů definovaných pro x-osu kontejneru, typ představuje zobrazovaný typ textu, volitelné, zde vyplňuji typ času, zde si všimněte, že výchozí pro instanci je GMT čas, můžete také použít UTC čas, ale my obecně používáme pekingský čas (GMT nebo UTC) + 8 hodin = pekingský čas, takže když použijeme AJAX, abychom zjistili, že čas je pekingský čas, měli bychom od hodiny odečíst 8 hodin (zde také chci sdílet jednu zkušenost, Jak převést server time na js čas, který lze použít metodou .getTime(), tedy odečíst server time od 1970-1-1, převést zbývající dny na milisekundy a pak přiřadit hodnotu nově inicializovanému času pomocí metody setTime v js. Zjistil jsem, že výsledek získaný getTime() je nesprávný pro inicializaci js času přímo v js ve formě nového Date (rok, měsíc, den, hodina, minuta, sekunda, milisekunda) pomocí getTime(), Pokud jde o to, proč se 1970-1-1 odečítá, je to proto, že definice metody getTime() je získat počet milisekund od aktuálního času z 1970-1-1). Když osa x není zobrazena jako čas nebo ji musíte definovat sami, může být také definována podle atributu kategorie, tickPixelInterval představuje hustotu osy x a štítky slouží k formátování zobrazovacího formátu osy x yAxis představuje soubor atributů definovaných pro y-osu kontejneru, která je přibližně stejná jako atributy osy x, ale v Highcharts není možné definovat pevnou hodnotu osy y pomocí kategorií, osa y v Highcharts je automaticky generována na základě daných dat o souřadnicovém bodě, což závisí na podatributu atributu série, například když přiřadíte hodnotu datům, maximální hodnota je 300 a minimální hodnota 100. Pak bude zobrazení osy y mezi 100 a 300, nebo můžete také nastavit atribut max či min pro yAxis série představuje kolekci všech křivek zobrazených v kontejneru, zde ukazuji pouze jednu křivku, název představuje název křivky, data představují kolekci řady souřadnicových bodů křivky, x je před nimi, y je za ní, je to js pole, v tomto případě protože osa x ukazuje čas, takže vlastnost x objektu pole musí být nastavena na čas, ale ve Highcharts není čas přímo přiřazen ose x, Místo toho je počet milisekund mezi 1970-1-1 a určitým časem přiřazen ose x, aby tento čas reprezentoval, takže je třeba použít metodu getTime(), tvar souřadnicového bodu na ose y musí být y = malé číslo * celočíselná forma, a nechápal jsem, proč to Highcharts musel dělat, protože cenová data varianty v tomto příkladu jsou obecně podobná, takže jsem musel při získávání dat dělit 200 a při přiřazování hodnoty ose y násobit 200.
<%= jsonstr %> v kódu stránky jsou počáteční data, která potřebuji získat ze serveru k inicializaci grafu, tedy generování stránky v 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;
- }
Kopírovat kódMezi nimi je tabulka TabMerPrice tabulka s informacemi o různých cenách, TMPTime čas, TMPPrice cena, TMPTime časový interval je deset sekund, používám databázovou úlohu k vytvoření záznamu tabulky, což se děje jednou za deset sekund AddHours(-8) slouží k převodu času na pekingský čas a generovaný datový formát je json formát Kód dataupdate.ashx vypadá takto:
- 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();
- }
Kopírovat kódJedná se o hrubou implementaci agregace kroků, která umožňuje zobrazit data na serveru v reálném čase pomocí grafu podobného formátu stock
HighCharts演示.zip
(48.69 KB, Počet stažení: 1)
|