156 lines
6.4 KiB
PHP
156 lines
6.4 KiB
PHP
<?php
|
|
include_once("inc/functions.inc.php");
|
|
$_REQUEST['code']=$_REQUEST['code']?$_REQUEST['code']:'000001.SH';
|
|
$_REQUEST['t_start']=$_REQUEST['t_start']?$_REQUEST['t_start']:'2015-01-01';
|
|
$_REQUEST['t_end']=$_REQUEST['t_end']?$_REQUEST['t_end']:date('Y-m-d');
|
|
$title="指数VS两市总市值趋势";
|
|
include_once "html/head.php";
|
|
?>
|
|
<script src="js/renderCharts.js"></script>
|
|
<form name="main" id="main" method="get"> <div style="width:100%;text-align:center">
|
|
指数代码: <?php indexList('code'); ?>
|
|
|
|
|
|
开始时间: <input type='date' name='t_start' id='t_start' width='30px' value='<?=$_REQUEST['t_start']?>' >
|
|
结束时间: <input type='date' name='t_end' id='t_end' width='30px' value='<?=$_REQUEST['t_end']?>' >
|
|
<button id="submitBtn" class="btn-submit"><span>查询数据</span></button>
|
|
<div > </div>
|
|
<input type='checkbox' id='cb_total_mv' onclick="hideSwitch(this.id,'total_mv')" checked > 两市总市值
|
|
<input type='checkbox' id='cb_circ_mv' onclick="hideSwitch(this.id,'circ_mv')" checked> 两市流通市值
|
|
</div> </form>
|
|
<div > </div>
|
|
|
|
<!-- 图表容器 -->
|
|
<div id="container" style="width: 1000px; margin: 0 auto 20px;">
|
|
<div class="loading-overlay" id="loadingOverlay">
|
|
<div class="spinner"></div>
|
|
<p style="font-size:18px; color:#2c3e50;">正在加载数据,请稍候...</p>
|
|
</div>
|
|
<div id="total_mv" style="width: 1000px; height:400px; margin: 0 auto 20px;"></div>
|
|
|
|
<div id="float_mv" style="width: 1000px; height:400px; margin: 0 auto 20px;"></div>
|
|
</div>
|
|
|
|
<script>
|
|
// 页面加载时初始化图表
|
|
$(document).ready(function() {
|
|
// 设置默认值
|
|
$('#code').val('<?= $_REQUEST['code'] ?>');
|
|
|
|
// 加载初始数据
|
|
loadChartData();
|
|
|
|
// 绑定按钮点击事件
|
|
$('#submitBtn').click(function(e) {
|
|
e.preventDefault(); // 阻止表单提交刷新页面
|
|
loadChartData();
|
|
});
|
|
});
|
|
// 加载图表数据的函数
|
|
function loadChartData() {
|
|
// 显示加载动画
|
|
$('#loadingOverlay').addClass('active');
|
|
|
|
let t_start = $('#t_start').val();
|
|
let t_end = $('#t_end').val();
|
|
let code = $("#code").val();
|
|
let codeName=convertIndexCode(code);
|
|
url = "https://api.doorcome.cn/api/indexDatas/?tscode="+code;
|
|
url += "&start_date="+t_start+"&end_date="+t_end;
|
|
url1 = "https://api.doorcome.cn/api/indexDatas/?tscode=000001.SH";
|
|
url1 += "&start_date="+t_start+"&end_date="+t_end;
|
|
url2 = "https://api.doorcome.cn/api/indexDatas/?tscode=399001.SZ";
|
|
url2 += "&start_date="+t_start+"&end_date="+t_end;
|
|
Promise.all([
|
|
fetch(url),
|
|
fetch(url1),
|
|
fetch(url2)
|
|
])
|
|
.then(responses => Promise.all(responses.map(r => r.json())))
|
|
.then(([searchData,SHData,SZData]) => {
|
|
let dataMain=pickData(searchData, 'trade_date', 'close');
|
|
let totalMVSH=pickData(SHData, 'trade_date', 'total_mv');
|
|
let floatMVSH=pickData(SHData, 'trade_date', 'float_mv');
|
|
let totalMVSZ=pickData(SZData, 'trade_date', 'total_mv');
|
|
let floatMVSZ=pickData(SZData, 'trade_date', 'float_mv');
|
|
let data_TotalMV=mergeAndSumArrays(totalMVSH,totalMVSZ);
|
|
let data_folatMV=mergeAndSumArrays(floatMVSH,floatMVSZ);
|
|
|
|
// 图表配置:total_mv
|
|
params = {};
|
|
params.chartid='total_mv';
|
|
params.legend = [codeName,'总市值-万亿'];
|
|
params.text = params.legend[0]+' V.S '+params.legend[1];
|
|
params.data1 = dataMain;
|
|
params.data2 = data_TotalMV;
|
|
params.data2 = params.data2.map(item => {
|
|
return {
|
|
value: [
|
|
item.value[0],
|
|
parseFloat((parseFloat(item.value[1]) / 10000 / 10000 / 10000).toFixed(2))
|
|
]
|
|
};
|
|
});
|
|
dataCal = calculateStats(params.data2);
|
|
params.sub_text = "总市值 Max:"+dataCal['max'];
|
|
params.sub_text += ", Min:"+dataCal['min'];
|
|
params.sub_text += ", Average:"+dataCal['avg'];
|
|
params.sub_text += ", Recent:"+dataCal['last'];
|
|
doubleLineChart(params);
|
|
|
|
// 图表配置:float_mv
|
|
params = {};
|
|
params.chartid='float_mv';
|
|
params.legend = [codeName,'流通市值-万亿'];
|
|
params.text = params.legend[0]+' V.S '+params.legend[1];
|
|
params.data1 = dataMain;
|
|
params.data2 = data_folatMV;
|
|
params.data2 = params.data2.map(item => {
|
|
return {
|
|
value: [
|
|
item.value[0],
|
|
parseFloat((parseFloat(item.value[1]) / 10000 / 10000 / 10000).toFixed(2))
|
|
]
|
|
};
|
|
});
|
|
dataCal = calculateStats(params.data2);
|
|
params.sub_text = "流通市值 Max:"+dataCal['max'];
|
|
params.sub_text += ", Min:"+dataCal['min'];
|
|
params.sub_text += ", Average:"+dataCal['avg'];
|
|
params.sub_text += ", Recent:"+dataCal['last'];
|
|
doubleLineChart(params);
|
|
})
|
|
.catch(error => console.error('数据加载失败:', error))
|
|
.finally(() => {
|
|
// 隐藏加载动画
|
|
$('#loadingOverlay').removeClass('active');
|
|
});
|
|
}
|
|
// 函数:合并两个数组,日期相同则数字相加
|
|
function mergeAndSumArrays(arr1, arr2) {
|
|
// 创建一个 Map 来存储日期和对应的数字总和
|
|
const resultMap = new Map();
|
|
|
|
// 处理第一个数组
|
|
arr1.forEach(item => {
|
|
const [date, value] = item.value;
|
|
resultMap.set(date, (resultMap.get(date) || 0) + parseFloat(value));
|
|
});
|
|
|
|
// 处理第二个数组
|
|
arr2.forEach(item => {
|
|
const [date, value] = item.value;
|
|
resultMap.set(date, (resultMap.get(date) || 0) + parseFloat(value));
|
|
});
|
|
|
|
// 将 Map 转换为数组格式
|
|
const resultArray = Array.from(resultMap, ([date, totalValue]) => ({
|
|
value: [date, totalValue]
|
|
}));
|
|
|
|
return resultArray;
|
|
}
|
|
</script>
|
|
<?php include_once("html/footer.php"); ?>
|
|
|