From 43a202c7894bae09eb54158a3ded308797da3a23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=B0=B4=E6=B7=BC?= Date: Wed, 9 Jul 2025 07:36:50 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=EF=BC=9A=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=AF=8F=E6=97=A5=E5=92=8C=E6=AF=8F=E6=9C=88=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E9=80=89=E9=A1=B9=EF=BC=8C=E4=BF=AE=E6=94=B9=E7=9B=B8=E5=85=B3?= =?UTF-8?q?URL=E5=8F=82=E6=95=B0=EF=BC=8C=E6=9B=B4=E6=96=B0JavaScript?= =?UTF-8?q?=E6=96=87=E4=BB=B6=EF=BC=8C=E5=A2=9E=E5=8A=A0=E8=82=A1=E7=A5=A8?= =?UTF-8?q?=E6=8C=87=E6=95=B0=E5=8E=86=E5=8F=B2=E6=95=B0=E6=8D=AE=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- chartFore.php | 13 ++- deprecated/index_trend.php | 56 ++++++++++ estateListDaily.php | 1 + estateNewTradeDaily.php | 36 +++++- estateTradeDaily.php | 41 ++++++- html/head.php | 2 +- inc/ajax.inc.php | 119 ++++++++++++++++++-- inc/functions.inc.php | Bin 8192 -> 2945 bytes inc/getBasic.inc.php | 98 ++++++++++++++++ index_trend.php | 223 ++++++++++++++++++++++++++++++------- js/pubfunc.js | 101 +++++++++++++++++ js/renderCharts.js | 97 ++++++++++++++++ 12 files changed, 734 insertions(+), 53 deletions(-) create mode 100644 deprecated/index_trend.php create mode 100644 js/renderCharts.js diff --git a/chartFore.php b/chartFore.php index 6be44c5..c7814e2 100644 --- a/chartFore.php +++ b/chartFore.php @@ -1,4 +1,12 @@ +
+指数代码: +  + +开始时间: ' > +结束时间: ' > + +
 
+ PE_TTM 市盈率 + PB 市净率 + PS 市销率 + 总市值 + 流通市值 +
+
 
+ +
+ +
+
 
+ +
 
+ +
 
+ +
 
+ + + diff --git a/estateListDaily.php b/estateListDaily.php index ed4f763..092fb48 100644 --- a/estateListDaily.php +++ b/estateListDaily.php @@ -9,6 +9,7 @@ $title="二手房每日新增挂牌量({$subTitle})"; $urlAppend = "t=esfListDaily&t_start={$_REQUEST['t_start']}&t_end={$_REQUEST['t_end']}"; $urlAppend .= "&district={$_REQUEST['district']}"; +$urlAppend .= "&dm=Daily"; $url = 'https://echart.doorcome.cn/inc/ajax.inc.php?'.$urlAppend; include_once "html/head.php"; ?> diff --git a/estateNewTradeDaily.php b/estateNewTradeDaily.php index c98e3ea..26efdf9 100644 --- a/estateNewTradeDaily.php +++ b/estateNewTradeDaily.php @@ -2,6 +2,10 @@ require_once "inc/functions.inc.php"; $_REQUEST['t_start']=$_REQUEST['t_start']?$_REQUEST['t_start']:'2023-08-15'; $_REQUEST['t_end']=$_REQUEST['t_end']?$_REQUEST['t_end']:date('Y-m-d'); +$_REQUEST['mst']=$_REQUEST['mst']?$_REQUEST['mst']:'2023-08'; +$_REQUEST['med']=$_REQUEST['med']?$_REQUEST['med']:date('Y-m'); +$_REQUEST['dm']=$_REQUEST['dm']?$_REQUEST['dm']:'Daily'; + $_REQUEST['district']=$_REQUEST['district']?$_REQUEST['district']:'合计'; $subTitle=($_REQUEST['district']=='合计')?'宁波地区':$_REQUEST['district']; $title="新房V.S二手房每日成交量({$subTitle})"; @@ -9,27 +13,53 @@ $title1="新房每日成交量({$subTitle})"; $title2="二手房每日成交量({$subTitle})"; -$urlAppend = "t=newTBD&t_start={$_REQUEST['t_start']}&t_end={$_REQUEST['t_end']}"; +$urlAppend = "t=newTBD"; +if($_REQUEST['dm']=='Daily') $urlAppend.="&t_start={$_REQUEST['t_start']}&t_end={$_REQUEST['t_end']}"; +if($_REQUEST['dm']=='Monthly') $urlAppend.="&t_start={$_REQUEST['mst']}&t_end={$_REQUEST['med']}"; $urlAppend .= "&district={$_REQUEST['district']}"; +$urlAppend .= "&dm={$_REQUEST['dm']}"; $url = 'https://echart.doorcome.cn/inc/ajax.inc.php?'.$urlAppend; -$urlAppend2 = "t=esfTBD&t_start={$_REQUEST['t_start']}&t_end={$_REQUEST['t_end']}"; +$urlAppend2 = "t=esfTBD"; +if($_REQUEST['dm']=='Daily') $urlAppend2.="&t_start={$_REQUEST['t_start']}&t_end={$_REQUEST['t_end']}"; +if($_REQUEST['dm']=='Monthly') $urlAppend2.="&t_start={$_REQUEST['mst']}&t_end={$_REQUEST['med']}"; $urlAppend2 .= "&district={$_REQUEST['district']}"; +$urlAppend2 .= "&dm={$_REQUEST['dm']}"; $url2 = 'https://echart.doorcome.cn/inc/ajax.inc.php?'.$urlAppend2; include_once "html/head.php"; ?>
区域: - +   +Daily/Monthly: +    + 开始时间: 结束时间: + +
 
 
diff --git a/estateTradeDaily.php b/estateTradeDaily.php index f6267ff..382985b 100644 --- a/estateTradeDaily.php +++ b/estateTradeDaily.php @@ -1,29 +1,66 @@
区域: - +   +Daily/Monthly: +    + 开始时间: 结束时间: + +
 
 
diff --git a/html/head.php b/html/head.php index 01bbfa3..00c6ead 100644 --- a/html/head.php +++ b/html/head.php @@ -6,7 +6,7 @@ - + <?=$title?> diff --git a/inc/ajax.inc.php b/inc/ajax.inc.php index 68e3537..2563b1a 100644 --- a/inc/ajax.inc.php +++ b/inc/ajax.inc.php @@ -94,8 +94,8 @@ if($_REQUEST['t']=='esfListDaily'){ } function esfTradeDaily(){ global $mysqli; - - $sql= <<='{$_REQUEST['t_start']}' and ej.tdate<='{$_REQUEST['t_end']}') order by ej.tdate asc EOF; - + } + if($_REQUEST['dm']=='Monthly'){ + $where=""; + if($_REQUEST['t_start']) $where .=" and ej.tdate>='{$_REQUEST['t_start']}-01'"; + if($_REQUEST['t_end']) { + $endDate = new DateTime($_REQUEST['t_end']); + $endDate->modify('last day of this month'); + $where .=" and ej.tdate<='{$endDate->format('Y-m-d')}'"; + } + $sql= <<query($sql); $data = $result->fetch_all(MYSQLI_ASSOC); return $data; @@ -118,8 +144,8 @@ EOF; function esfListDaily(){ global $mysqli; - - $sql= <<='{$_REQUEST['t_start']}' and ej.tdate<='{$_REQUEST['t_end']}') order by ej.tdate asc EOF; - + } + if($_REQUEST['dm']=='Monthly'){ + $where=""; + if($_REQUEST['t_start']) $where .=" and ej.tdate>='{$_REQUEST['t_start']}-01'"; + if($_REQUEST['t_end']) { + $endDate = new DateTime($_REQUEST['t_end']); + $endDate->modify('last day of this month'); + $where .=" and ej.tdate<='{$endDate->format('Y-m-d')}'"; + } + $sql= <<query($sql); $data = $result->fetch_all(MYSQLI_ASSOC); return $data; @@ -144,7 +195,7 @@ EOF; *newTBD: 新房Trade By Day */ if($_REQUEST['t']=='newTBD'){ - + if($_REQUEST['dm']=='Daily'){ $sql= <<='{$_REQUEST['t_start']}' and ej.tdate<='{$_REQUEST['t_end']}') + order by date_format(tdate,'%Y-%m-%d') asc EOF; + } + if($_REQUEST['dm']=='Monthly'){ + $where=""; + if($_REQUEST['t_start']) $where .=" and ej.tdate>='{$_REQUEST['t_start']}-01'"; + if($_REQUEST['t_end']) { + $endDate = new DateTime($_REQUEST['t_end']); + $endDate->modify('last day of this month'); + $where .=" and ej.tdate<='{$endDate->format('Y-m-d')}'"; + } + $sql= <<query($sql); $data = $result->fetch_all(MYSQLI_ASSOC); - + if($_REQUEST['dm']=='Daily'){ $sql= <<='{$_REQUEST['t_start']}' and ej.tdate<='{$_REQUEST['t_end']}') + order by date_format(tdate,'%Y-%m-%d') asc EOF; + } + if($_REQUEST['dm']=='Monthly'){ + $where=""; + if($_REQUEST['t_start']) $where .=" and ej.tdate>='{$_REQUEST['t_start']}-01'"; + if($_REQUEST['t_end']) { + $endDate = new DateTime($_REQUEST['t_end']); + $endDate->modify('last day of this month'); + $where .=" and ej.tdate<='{$endDate->format('Y-m-d')}'"; + } + $sql= <<query($sql); $data2 = $result->fetch_all(MYSQLI_ASSOC); echo json_encode(array( diff --git a/inc/functions.inc.php b/inc/functions.inc.php index 8d8d6a3cfb957f9a3fdac5e86ee90bcebc3afe3b..01686f4bac70ad98285b5bcd1a5b3ec6c379b28a 100644 GIT binary patch literal 2945 zcmb7GZBG+f6#h(q#oeZHis@Pe6@`K!g3%2Mf%=IUGM%~7*==XKGtrp-bW^=*e}mv(C}3SQ||?W=Lj*p-W{-Tzf_y??RM@PIdSKj; zGc_?7BorA&o#HS;aZNR&=&ON?40qo0`xH6g)99C~$S`$umV7XXZJ|)8tLHkOt*^## z1WZQx3_7BwN>NcA!fjqTevL_ffvW=W1m~jy6(GQ zErdcHp$c3g1d?xM*<&fHv6A2w`0=1%5ZOm5^59RBKD3s%z8pNUx9%5~-iDL?QBlXJ zqxWWcDDeGDxorFKTN? zZnkALOO@-G7$~cFL0re>3gtZo$7F*kyq~->rxG61t+AgSy}6)<6%bqvR75535(F(aQ8g({__ z9vf6t1#U#%O?F^l6Rt8pKmzC*nDz9A2jLMwLew-9Ex{nLaL(jiJD1Qkm^$XOrg3ji ze>i|lJ&C^sdHrTrcV|DH0jC}RWz^RdzSDO*+}Clt|9V&7w*|Tp4)@;Z>gc5Sa({(u zF#cFIzYh;5a0?O>iI^gZ^yUxJfe^|qD9D|%4wkEf2d)tY%@ zXEU@Fc5cVop5U#}v60YJ1G^2uzha59@6_$Xx?WQ0x&}=y=@{iwOf#@^SjPjwc-XmR z`)HA*_h199nME?Y#bc7+Gh}g=>@DSwv(|VH@X9^pmvJOH1OqQdVp#Uq*P{_OhT~~_ z^T2c~q^=_GNidEYrC!+|bMJFAtGria%zXK#eq-G ztu?(s9z16rX#t7>JL)glQ{Mvu^(ow~M`zBU6E*0&Hq_YAP^0k5rgYI>RWZwB#El^c z@ozrBY!Ul2goy#d7_CpqMyr0I;$ur%6>LR9QG_ARL3m8)3;*GGs_Y@<&Pec*Arh3TxV|6Wj2(}sWDeNy= L>(4x+@DKDq@b!D= literal 8192 zcmeIu=QkSw_rUSkHHzAb)`}6E6b*t>dv9&*ReQwVtAbKn>|J{_wyM2~*tJ(}t-Xul zd44aRbAEq>`{us7-*e9gsG}{*qhMubY30Vl!omWSx@4=`Cc z_y6l@shIz_w>Qg;0DGmI(=kDn|J%#q>t6o9o?EJ**jmC}T#u1PZwN^I&wuX%O7M|j z&+E$n{rtEe1s(++1s(++1s(++1s(++1s(++1s(++1s(+e0P%?ab~{{!iMW7YhfFiC zlKEdn7L!oE`n9_9!!InHszn{s#2o8S>lAXzaMM^LOzmeXM>@+hYM_HBPvgfta86(CqjgsXqgj+;r2;> zq?G*EuBl+d|A4bGz#ehFC&&6Jbcm@>UA(HlF&jLn*eF$t{~E#DV;5e+sX`7PA`||> z%g?EOt(@ORW~$F3gf~!LL3F{z2I9h%fd-HM_AO~DK^oJD;|mcF>a*HdCIP~Eo^}~t z3A92aS9+X&oWgP#%S4%I(@@mUA8N)pdTH4-+MGEAu2*|)I!HrzM$3+9dlW0)dG!AY z&_Rn^?^f(>O||-NXe2dR~*z&h^ z8Ts$$s9VPc%Emr#b9V*VZQA4Y%&G9I(@EZ-+zR6H8uac5v0?g1H*bgZW5t2QaN?|9 zT4hLnutwiruY$-R5cA;bmZsSj<;Y{D?{#V?>GBsC8@D0)Bk>D^IR;AYc$FSg$s;#G zG;9cB@+*5`(-;-Sn{CoFlDKP(jVwCvdoH+_CMylvgk{zK_-P63l!98k`zuzNMAts8 z-TYVkBctJZ5;X)g@-LMmkk67>I?j`aN5fa0wrr8cDz10Y-|uS1l+9faBM--U&QDkK ztAUkuY6LQu!g4ey%8U8{FN-1JR@g8&7x|LN;Hi@3A8C>y^bOS=-Cbrh8*%J26=KQO z;UdX9kQlS*Gm~Wj;jqEsBHuTwa5QlfvzL#PZK7>qgl=lpQ;OH^BF?M)v6@%q?%E+$ z<3hUCq12+iNbZxBT41QJ^|;%i#ovXQ-a?}ql3Ae`PD2fv6esCmx2{4jk%`$OFM!|Lv`%aGd=m%QrQBFp?HD>GptYo~EcH>n zpoRn^DhQ~0VSEZ`+hP7xFm#_fS-B|kEvzd4g8AaUI^IeI zGM(YoRuELt_M{p&phHnahsZ#=tgXjArREU6P+3&OGyyVy`=KIv`LO+zGC4`Q_);*O8YBqvo!W*j2P$Im1v{X7Myf^1wT|n{ls>nXQ{Ws4K65#u7gkw1~TWl<5lVq>WFD!+eNtaKIb|dm(Z!0=kM1n!f&D66goUH5Qd;Y~VE@vH>vc-yMZnM^Zf0@F$TZ6mB z^@b-^lE3VtVbmei{O?k{w7jpDjGb~5v}kBiST7iRJP(O>Rl zux`c$eUnJ|7PC7)ifLeL{?){sG|e*jS|-u9MqHpXPUBWws9QOe`yp%fiBkj}zC^j6 zVzbSMm{K&Z14`1_ixDtSd$YMdnx$`!Y0)?~QS$EM9P^e-Y1L|>dBn7g+DLZ(*dW{2 zls6`Vn^y&EIQ=2(_S~r7Bi648doR7l`$bVAc!zqwF|-eahV-0#(F$+jl=8Xx#P z-P1H-CWGNavBh(r?Jw;BP@oF48ikMShS)BE8A1!aE5e18(I574v_*(5_fCRe98{zo znPpAH;pw586&jS|IQ$A37%XPgmff$)g=Kk-ixP`rs0mjn=CB{O9=_;qqD8~K{|Vq z+LGDo$e8`RZbCwI0gixX7o@{!hb2qXIV%pKSdh6Epp@{nZx{)ri*Kk=OWiq z&~v{;#u`|o8fEKSWb^VLgIGn{C`;&BWB(r!HLNII*3-eC<5+TL83bgmTV@LvR+~3#_G0h5DGcN0~x8Ff@~v*C{#_ z*p;ckMlvL0uuMEdlFp)a}C^@<+w=^}%={Q?e?I-|J$W zFk-h9I$w`T&HSBc%zfwbL5!g#h5Gv*UizFoEPX=CHPT75=MfhstftrX1x%*~tMG)& zJ_t6(;7$=#1coZPyqgW;Srt;ue(-rFBs>EX%4oGTC_yDs96}?l<-v>hmN(`!FyPz{O<~0?c-2>jekD+ z1PqFWh&?Ey7yh%AUn4B}82>OEj&_Q(6lT+0MpCIh)jhWU@jr(&e@&FYcmrnV^L5fBa zN^;XYYdVekjt;esHEd;&4{JrV?Fp@zlb$pte1>E(F|Hx6t?IUqvX|!0Rye!yN7%oo zx|-MR*ef0=I3@5N=FbutpAJX0Ovp!Ox<(PU9XsO+IpnDZ#I#9|*Xi}@Il_)mp9;Q= ze87A|>RYPWg5g(mjo(j=t8iSwWo|*NI3c(PEh^-l+OdIh7++IammP`clx`oOszKaJ zd)jOV4R7EZQ{kp@s-Iq|Htu^1p_Sw6$v9FQf+^I~VY3DIQ7;3l&M+KBE$f<+t5W%k zzae~_n83I*0G60Y)I)6xv3ly;1{~F~jV1^hj!WO=c#4OjOWN!RM0eey^fj|r@vEt1 z_p!x#b4ajY3$QXp!Z;?+W*F-=*h9%;(V2-~9J*WKoQ5yNy<=+061#U6ayW^&$-mDu zF6ps~Tg}Mo5DN-TmKP#_uU%k|Z*A?!cwY@3oEp{IL(k&?aWnH?$Xukw>Cn`BeDKu-R~P5F)BLN9e~ z3TF4tf|ts?q2T!|QDK)G(95U@Gc+&zQ&}q(aSE;^k#Ld^4Lt(~)s~3JHUcVJp^Tl4 zdc#(C7JvDmPJ@^ANhrNT51YVI&?VW@O2UZ~Uaa3(3Dr^|Kp;u*U5^F6Y9LZ{pgI42l>^$h* zXen01zHP5x`$u@SXYt%3QDirH0X&E)8~#1{kP;xNmRRGxLj=qdBtRzk#JiE?WS4(K z0zk*^+L!Cw{b4!B~}sOGi0vLhExI=5%or)k|c()V6{RjPZiXbOLGj zC+X|`==@D&Ces=nUE0s>0|@y2F8?VBnZ4^QTNA9>#FO2&x?g{NxEZGc`DpP<4tqJzE%)h^Uq`=8ssUu+tAG9(0hEos1;~tn73nAP?|vNyqe5n zrRZ_a<6qUI`SFnW^7cTbJDbsj~!*FewQ}1FB0$h)CG=S!vO8q^LFZ z5rc)ZD0j?dyQ{df1@qGaLA;K(#3=p~nesxqALH5w5Yvtd`J%`t9OwAov%Z+o%S9&* zOvHHC^a)f63J$D^T)s<)&gYL;sEx*d+psUE_@ZdeOv==JYwI8bVqYo$lbJJE$sF|* zKKwCb`{7lRRI71 diff --git a/inc/getBasic.inc.php b/inc/getBasic.inc.php index c7bbbac..9ca9900 100644 --- a/inc/getBasic.inc.php +++ b/inc/getBasic.inc.php @@ -1,4 +1,5 @@ $ts_code, + "start_date" => $day_st, + "end_date" => $day_end ?? date("Y-m-d") // 如果为空,默认为今天 + ]; + + // 调用TuShare API获取数据 + $data = callTushareApi('daily_basic', $params); + return true ; + if (empty($data)) { + return "未获取到数据,请检查参数或网络连接。"; + } + + // 提取指定项目的数据 + $result = []; + $tDate = []; + $itemValues = []; + foreach ($data as $row) { + $tDate[] = $row['trade_date']; + $itemValues[] = $row[$item]; + } + + // 按日期排序(从远到近,默认已经是按日期排序的) + $tDate = array_reverse($tDate); // 默认TuShare按日期顺序是近到远,所以反转得到远到近 + $itemValues = array_reverse($itemValues); + + // 计算统计值 + $dataMax = max($itemValues); + $dataMin = min($itemValues); + $dataAvg = array_sum($itemValues) / count($itemValues); + $dataLast = end($itemValues); + + // 返回结果 + return [ + 'tDate' => $tDate, + 'data' => $itemValues, + 'data_max' => $dataMax, + 'data_min' => $dataMin, + 'data_avg' => $dataAvg, + 'data_last' => $dataLast + ]; +} + +// 函数二:获取指数趋势历史数据 +function getIndexHistoryDataByTS($ts_code, $day_st, $day_end = null) +{ + global $token; + + // 参数校验 + if (empty($ts_code) || empty($day_st)) { + return "参数错误:股票代码和起始日期不能为空。"; + } + + // 处理日期参数 + $params = [ + "ts_code" => $ts_code, + "start_date" => $day_st, + "end_date" => $day_end ?? date("Y-m-d") // 如果为空,默认为今天 + ]; + + // 调用TuShare API获取数据 + $data = callTushareApi('index_dailybasic', $params); + return true ; + if (empty($data)) { + return "未获取到数据,请检查参数或网络连接。"; + } + + // 提取指数点数值 + $tDate = []; + $closeValues = []; + foreach ($data as $row) { + $tDate[] = $row['trade_date']; + $closeValues[] = $row['close']; // 假设close字段是指数点数值 + } + + // 按日期排序 + $tDate = array_reverse($tDate); + $closeValues = array_reverse($closeValues); + + // 返回结果 + return [ + 'tDate' => $tDate, + 'data' => $closeValues + ]; +} ?> \ No newline at end of file diff --git a/index_trend.php b/index_trend.php index 286ba00..705d1a8 100644 --- a/index_trend.php +++ b/index_trend.php @@ -1,56 +1,203 @@
指数代码:   开始时间: ' > 结束时间: ' >
 
PE_TTM 市盈率 - PB 市净率 - PS 市销率 - 总市值 - 流通市值 + PB 市净率 + 总市值
 
- -
- -
-
 
- -
 
- -
 
- -
 
- - + +
+
+
+ + \ No newline at end of file diff --git a/js/pubfunc.js b/js/pubfunc.js index 45756a1..bc322e0 100644 --- a/js/pubfunc.js +++ b/js/pubfunc.js @@ -1,3 +1,11 @@ +/* + * @Author: 杨水淼 yangshuimiao@jsjd.cc + * @Date: 2025-03-21 11:58:51 + * @LastEditors: 杨水淼 yangshuimiao@jsjd.cc + * @LastEditTime: 2025-07-08 14:47:38 + * @FilePath: \echarts\js\pubfunc.js + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ /** * hide switch the iframe * @param cbid:checkbox id @@ -32,4 +40,97 @@ function getRows(jsonData,array){ return listSplit; +} + +function dmChange(parid,dayblock,monblock){ + var v= $('#'+parid).val(); + if(v=='Monthly'){ + $('#'+dayblock).css('display','none'); + $('#'+monblock).css('display','inline'); + } + if(v=='Daily'){ + $('#'+dayblock).css('display','inline'); + $('#'+monblock).css('display','none'); + } +} +/* + + + + + + + +*/ +function convertIndexCode(tscode){ + switch(tscode){ + case '000001.SH': + return '上证指数'; + case '399001.SZ': + return '深圳成指'; + case '399005.SZ': + return '中小板指'; + case '399006.SZ': + return '创业板指'; + case '000016.SZ': + return '上证50'; + case '399300.SZ': + return '沪深300'; + case '399905.SZ': + return '中证500'; + default: + return ''; + } +} + +function formatDateToYYYYMMDD(dateStr) { + return dateStr.replace(/-/g, ''); +} + +function pickData(data, dateKey, valueKey) { + return data.map(item => ({ + value: [ + item[dateKey].slice(0, 4) + '-' + item[dateKey].slice(4, 6) + '-' + item[dateKey].slice(6, 8), // 格式化日期 yyyymmdd 转为 yyyy-mm-dd + item[valueKey].toFixed(2) // 保留两位小数 + ] + })); +} + +/* 将上述pickData函数返回的结果,value计算返回最大值,最小值,均值,以及最后一个值 */ +function calculateStats(data) { + if (data.length === 0) { + return { + max: null, + min: null, + avg: null, + last: null + }; + } + + let max = -Infinity; + let min = Infinity; + let sum = 0; + let last = null; + + for (const item of data) { + const value = parseFloat(item.value[1]); // 提取 value 数组中的第二个元素(数值部分) + + if (value > max) { + max = value; + } + if (value < min) { + min = value; + } + sum += value; + last = value; // 更新最后一个值 + } + + const avg = sum / data.length; + + return { + max: max.toFixed(2), + min: min.toFixed(2), + avg: avg.toFixed(2), + last: last.toFixed(2) + }; } \ No newline at end of file diff --git a/js/renderCharts.js b/js/renderCharts.js new file mode 100644 index 0000000..2162012 --- /dev/null +++ b/js/renderCharts.js @@ -0,0 +1,97 @@ +function doubleLineChart(){ + /* + 需要外部提供: + chartid: div container id + legend: array + unit: str + sub_text: str + data:data1,data2, array + */ + var dom = document.getElementById("chartid"); + var myChart = echarts.init(dom,'dark'); + option = null; + option = { + title: { + text: legend[0]+' V.S '+legend[2], + subtext: subtxt, + textAlign:'center', + left:'50%' + }, + tooltip: { + trigger: 'axis' + }, + legend: { + data:legend, + right:'20' + }, + grid: { + left: '3%', + right: '4%', + bottom: '3%', + containLabel: true + }, + toolbox: { + feature: { + saveAsImage: {} + } + }, + xAxis: { + type: 'time', + boundaryGap: false + }, + yAxis: [{ + type: 'value', + name:legend[0], //图列 + show:true + }, + { + type:'value', + name:legend[2]+unit, //图例 + //scale:true, + boundaryGap:false, + show:true, + splitLine:{ + show:false, //Y2 坐标刻度横线 + }, + } + ], + dataZoom: [{ + type: 'inside', //or slider + start: 0, + end: 100 + }, { + start: 0, + end: 100, + handleIcon: 'M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4v1.3h1.3v-1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7V23h6.6V24.4z M13.3,19.6H6.7v-1.4h6.6V19.6z', + handleSize: '80%', + handleStyle: { + color: '#fff', + shadowBlur: 3, + shadowColor: 'rgba(0, 0, 0, 0.6)', + shadowOffsetX: 2, + shadowOffsetY: 2 + } + }], + series: [ + { + name:legend[0], + type:'line', + yAxisIndex:0, + symbol:'none', + data:data1 + }, + { + name:legend[2], + type:'line', + yAxisIndex:1, + symbol:'none', //数据圆点 + smooth:false, + data:data2 + } + ] + }; + + if (option && typeof option === "object") { + myChart.setOption(option, true); + } +} \ No newline at end of file