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 8d8d6a3..01686f4 100644 Binary files a/inc/functions.inc.php and b/inc/functions.inc.php differ 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