Files
echart/charts/stock_trend.php
simonandClaude Opus 4.7 eedead0d41 feat: 全面代码更新 - ECharts 5.4.2 重构、新增量化分析模块、前端库升级
- 升级 ECharts 到 5.4.2,重构 lib/ 目录结构
- 新增 DataTables 2.x 和 FixedColumns 插件
- 新增 quant/ 宏观研究报告模块
- 重构图表页面:stock_trend、hkholdbycode 等采用 JS fetch API.doorcome.cn 模式
- 新增 CLAUDE.md 补充页面文档和新数据流说明
- 更新 inc/config.php TuShare API 配置
- 更新新闻联播分析模块 news/ 和相关研究报告 research/
- 新增 api_document/ 参考文档
- 清理 .gitignore,排除 uploads/xls/.mcp.json/ source maps 等非代码文件
- 所有 PHP 文件通过 php -l 语法检查

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-06 18:01:55 +08:00

146 lines
6.7 KiB
PHP

<?php
ini_set("display_errors","0");
include_once "../inc/getBasic.inc.php";
$_REQUEST['ts_code']=$_REQUEST['ts_code']?$_REQUEST['ts_code']:'000001';
$_REQUEST['t_start']=$_REQUEST['t_start']?$_REQUEST['t_start']:'2015-01-01';
$_REQUEST['t_end']=$_REQUEST['t_end']?$_REQUEST['t_end']:'';
$ts_name = tscodeToName(ts_code_conv($_REQUEST['ts_code']));
$title="股价VS PE/PB/PS 趋势:".$ts_name.'('.$_REQUEST['ts_code'].')';
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">
股票代码: <input type='text' name='ts_code' id='ts_code' width="30px" value='<?=$_REQUEST['ts_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 >&nbsp;</div>
<input type='checkbox' id='cb_pe' onclick="hideSwitch(this.id,'pe_ttm')" checked> PE_TTM 市盈率
<input type='checkbox' id='cb_pb' onclick="hideSwitch(this.id,'pb')" checked> PB 市净率
<input type='checkbox' id='cb_ps' onclick="hideSwitch(this.id,'ps')" checked> PS 市销率
<input type='checkbox' id='cb_ttmv' onclick="hideSwitch(this.id,'total_mv')" checked> 总市值
</div> </form>
<!-- 图表容器 -->
<div id="container" style="width: 1000px; margin: 0 auto 20px;">
<div style="position: relative; height: 10px;"></div>
<div class="loading-overlay" id="loadingOverlay">
<div class="spinner"></div>
<p style="font-size:18px; color:#2c3e50;">正在加载数据,请稍候...</p>
</div>
<div id="pe_ttm" style="width: 1000px; height:400px; margin: 0 auto 20px;"></div>
<div id="pb" style="width: 1000px; height:400px; margin: 0 auto 20px;"></div>
<div id="ps" style="width: 1000px; height:400px; margin: 0 auto 20px;"></div>
<div id="total_mv" style="width: 1000px; height:400px; margin: 0 auto 20px;"></div>
</div>
<script>
// 页面加载时初始化图表
$(document).ready(function() {
// 加载初始数据
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 ts_code = $("#ts_code").val();
url = "https://api.doorcome.cn/api/stockparam/?tscode="+ts_code;
url += "&start_date="+t_start+"&end_date="+t_end;
url2 = "https://api.doorcome.cn/api/stockinfo/?tscode="+ts_code;
Promise.all([
fetch(url),
fetch(url2)
])
.then(responses => Promise.all(responses.map(r => r.json())))
.then(([parsedData,stockInfo]) => {
// 图表配置:pe_ttm
let codeName = stockInfo[0].name;
var params = {};
params.chartid='pe_ttm';
params.legend = [codeName,'pe_ttm'];
params.text = params.legend[0]+' V.S '+params.legend[1];
params.data1 = pickData(parsedData, 'trade_date', 'close');
params.data2 = pickData(parsedData, 'trade_date', 'pe_ttm')
dataCal = calculateStats(params.data2);
params.sub_text = "TTM PE Max:"+dataCal['max'];
params.sub_text += ", Min:"+dataCal['min'];
params.sub_text += ", Average:"+dataCal['avg'];
params.sub_text += ", Recent:"+dataCal['last'];
doubleLineChart(params);
// 图表配置:pb
params = {};
params.chartid='pb';
params.legend = [codeName,'市净率'];
params.text = params.legend[0]+' V.S '+params.legend[1];
params.data1 = pickData(parsedData, 'trade_date', 'close');
params.data2 = pickData(parsedData, 'trade_date', 'pb')
dataCal = calculateStats(params.data2);
params.sub_text = "PB Max:"+dataCal['max'];
params.sub_text += ", Min:"+dataCal['min'];
params.sub_text += ", Average:"+dataCal['avg'];
params.sub_text += ", Recent:"+dataCal['last'];
doubleLineChart(params);
// 图表配置:ps
params = {};
params.chartid='ps';
params.legend = [codeName,'市销率'];
params.text = params.legend[0]+' V.S '+params.legend[1];
params.data1 = pickData(parsedData, 'trade_date', 'close');
params.data2 = pickData(parsedData, 'trade_date', 'ps')
dataCal = calculateStats(params.data2);
params.sub_text = "PS Max:"+dataCal['max'];
params.sub_text += ", Min:"+dataCal['min'];
params.sub_text += ", Average:"+dataCal['avg'];
params.sub_text += ", Recent:"+dataCal['last'];
doubleLineChart(params);
// 图表配置:total_mv
params = {};
params.chartid='total_mv';
params.legend = [codeName,'总市值-亿'];
params.text = params.legend[0]+' V.S '+params.legend[1];
params.data1 = pickData(parsedData, 'trade_date', 'close');
params.data2 = pickData(parsedData, 'trade_date', 'total_mv')
params.data2 = params.data2.map(item => {
return {
value: [
item.value[0],
parseFloat((parseFloat(item.value[1]) / 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');
});
}
</script>
</div>
<?php include_once "../html/footer.php"; ?>