refactor: 全面代码重构与项目结构整理

安全性:
- 所有SQL查询改用参数化查询(db_query),防止SQL注入
- TUSHARE_API_TOKEN集中到config.php常量,移除硬编码和多份拷贝
- getBasic.inc.php中$_REQUEST输出到JS时添加htmlspecialchars转义

代码组织:
- 21个页面文件移至charts/子目录,根目录仅保留入口文件
- ajax.inc.php拆分:esfTradeDaily/esfListDaily迁至getEstate.inc.php
- getBasic.inc.php拆分:HTML组件函数迁至新建的widgets.inc.php
- 前端依赖去重:移除lib/echarts.min.js、libai/3.4.16.js、research/js/3.4.16.js

规范化:
- AJAX响应格式统一为jsonResponse()标准封装
- 前端全局变量统一为window.chartConfig对象模式
- 修复PHP 8.4 Deprecated警告(getEstateData、getStockHistoryDataByTS参数顺序)
- html/head.php中jQuery/CSS路径改为绝对路径,修复charts/子目录加载问题

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
2026-05-26 08:20:33 +08:00
co-authored by Claude Code
parent 07da6a2ad4
commit 7e57cae242
49 changed files with 848 additions and 733 deletions
+66
View File
@@ -0,0 +1,66 @@
<?php
#查询个股价格对应机构持仓的数量
include_once "../inc/getBasic.inc.php";
include_once "../inc/getData.inc.php";
$ts_code=ts_code_conv($_REQUEST['ts_code']);
$ts_name = tscodeToName($ts_code);
include_once "../html/headChart.php"; //required after $ts_code and $ts_name
$day_st=($_REQUEST['s']=='')?'2012-01-01':$_REQUEST['s'];
$day_end=($_REQUEST['e']=='')?date('Y-m-d'):$_REQUEST['e'];
#item: f9:持股数 f10:持股额 f11:占总股本比例 f12:占流通股比例
$item = ($_REQUEST['item']=='')?'f9':$_REQUEST['item'];
switch($item){
case 'f9':
case 'F9':
$unit = ' - 万股';
$item_name = "持股数";
break;
case 'f10':
case 'F10':
$unit = ' - 万元';
$item_name = "持股金额";
break;
case 'f11':
case 'F11':
$unit = ' - %';
$item_name = "总股本股比例";
break;
case 'f12':
case 'F12':
$unit = ' - %';
$item_name = "流通股比例";
break;
default:
$unit = '';
}
$data = getStockHist($ts_code,$day_st,$day_end);
$lx = ''; //define null var avoid error
$data2 = getIhDataByStock($ts_code,$item,$lx,$day_st,$day_end);
#var_dump($data2['data']);
$subtext_ext = "Max: ".$data2['data_max'];
$subtext_ext .= ", Min: ".$data2['data_min'];
$subtext_ext .= ", Average: ".$data2['data_avg'];
$subtext_ext .= ", Recent: ".$data2['data_last'];
$legend=array('不复权股价','深证成指',$item_name);
#$value=json_encode($data['data']);
?>
<script type="text/javascript">
window.chartConfig = {
data: <?php echo json_encode($data['data']); ?>,
data2: <?php echo json_encode($data2['data']); ?>,
legend: <?php echo json_encode($legend);?>,
unit: '<?php echo $unit; ?>',
title: '<?php echo $ts_name.'('.$ts_code.')'; ?>',
subtitle: '<?php echo $subtext_ext; ?>'
};
</script>
<script type="text/javascript" src="../js/chartSix.js?ver=3.141"></script>
</body>
</html>
+58
View File
@@ -0,0 +1,58 @@
<?php
include_once "../inc/config.php";
$mysqli = get_mysqli_connection();
include_once dirname(__FILE__) . "/../inc/getBasic.inc.php";
include_once dirname(__FILE__) . "/../inc/getData.inc.php";
include_once dirname(__FILE__) . "/../inc/tradeRec.inc.php";
include_once __DIR__ . "/../html/headChart.php";
$ts_code= ts_code_conv($_REQUEST['ts_code']);
$day_st = ($_REQUEST['s']=='')?'20180101':reformDate($_REQUEST['s']);
$day_end= ($_REQUEST['e']=='')?date('Ymd'):reformDate($_REQUEST['e']);
$unit = '股'; # Without a unit on PE
$data = getStockHist($ts_code,date("Ymd",strtotime($day_st)),date("Ymd",strtotime($day_end)));
//$data2 = getBasicData($ts_code,$day_st,$day_end,$item);
if($_REQUEST['t_vendor']=='方正证券') {$flg3 = '买入'; $flg4 = '卖出';}
elseif($_REQUEST['t_vendor']=='长江证券') {$flg3 = '证券买入'; $flg4 = '证券卖出';}
$trdData = trade_rec($ts_code, $day_st, $day_end,'');
$data3 = recDataSort($trdData,$flg3);
$data4 = recDataSort($trdData,$flg4);
$data3Avg = avePrice($data3['tvol'],$data3['tprice']);
$data4Avg = avePrice($data4['tvol'],$data4['tprice']);
$subtext_ext = " {$flg3}均价: {$data3Avg['avePrice']}, 量{$data3Avg['ttlVol']}";
$subtext_ext .= "-- {$flg4}均价: {$data4Avg['avePrice']}, 量{$data4Avg['ttlVol']}";
$ts_name = tscodeToName($ts_code);
$legend = array('不复权股价','交易买入','交易卖出','买入量','卖出量');
if($_REQUEST['adj']) $legend[0]='复权股价';
?>
<form name="form1" id="form1" method="post">
<input type="hidden" name="adj" id="adj" value="<?=$_REQUEST['adj'] ?>">
<input type="hidden" name="ts_code" id="ts_code" value="<?=$ts_code ?>">
<input type="hidden" name="s" id="s" value="<?=$day_st ?>">
<input type="hidden" name="e" id="e" value="<?=$day_end ?>">
</form>
<script type="text/javascript">
var legend = <?php echo json_encode($legend);?>;
var unit ='<?=$unit ?>';
var headtxt = '<?php echo $ts_name.'('.$ts_code.')'; ?>';
var subtxt = '<?=$subtext_ext ?>';
var data1 = <?php echo json_encode($data['data']); ?>;
var data2 = <?php echo json_encode($data3['data']); ?>;
var data3 = <?php echo json_encode($data4['data']); ?>;
var data4 = <?php echo json_encode($data3['data2']); ?>;
var data5 = <?php echo json_encode($data4['data2']); ?>;
console.log(data1[0]['value'][0]);
console.log(data1[0]['value'][1]);
</script>
<script type="text/javascript" src="../js/adj.ajax.js?verion=3.14"></script>
<script>
console.log(data1[0]['value'][0]);
console.log(data1[0]['value'][1]);
</script>
<script type="text/javascript" src="../js/chartStDetail.js?version=3.16"></script>
</body>
</html>
+119
View File
@@ -0,0 +1,119 @@
<?php
include_once "../inc/getData.inc.php";
include_once "../html/headChart.php"; //required after $ts_code and $ts_name,maybe doesn't matter
$day_st=$_REQUEST['s']?$_REQUEST['s']:'2006-01-01';
$day_end=$_REQUEST['e']?$_REQUEST['e']:date('Y-m-d');
#$day_st_='2006-01-01';
#$day_end_=date('Y-m-d');
$lx=isset($lx)?$lx:$_REQUEST['lx'];
$share =$_REQUEST['share'];
$share = ($share)?$share:'ShareHDNum';
if($share=='ShareHDNum') $unit = '(亿股)';
elseif($share=='vPosition') $unit = '(亿元)';
elseif($share=='VSRatio') $unit = '(元)';
#var_dump($lx);
$data=getIndexData('000001.SH',$day_st,$day_end);
#$data1=getIndexData('399001.SZ',$day_st,$day_end);
$data2=getIhData($lx,$share,$day_st,$day_end);
$legend=array('上证综指','深证成指',lxDefine($lx));
#$value=json_encode($data['data']);
?>
<script type="text/javascript">
var dom = document.getElementById("container");
var myChart = echarts.init(dom,'dark');
var app = {};
option = null;
window.chartConfig = {
legend: <?php echo json_encode($legend); ?>,
unit: '<?php echo $unit; ?>'
};
var cfg = window.chartConfig;
option = {
title: {
text: cfg.legend[0]+" V.S "+cfg.legend[2],
//subtext:"双轴显示",
textAlign:'center',
left:'50%'
},
tooltip: {
trigger: 'axis'
},
legend: {
data: cfg.legend,
right:'20'
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
toolbox: {
feature: {
saveAsImage: {}
}
},
xAxis: {
//type: 'category',
type: 'time',
boundaryGap: false
},
yAxis: [{
type: 'value',
name:legend[0], //图列
show:true
},
{
type:'value',
name: cfg.legend[2]+cfg.unit, //图例
//scale:true,
boundaryGap:false,
show:true,
splitLine:{
show:false, //Y2 坐标刻度横线
},
}
],
dataZoom: [{
type: 'slider', //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:<?php echo json_encode($data['data']); ?>
},
{
name:legend[2],
type:'line',
yAxisIndex:1,
//symbol:'none',
smooth:false,
data:<?php echo json_encode($data2['data']); ?>
}
]
};
if (option && typeof option === "object") {
myChart.setOption(option, true);
}
</script>
</body>
</html>
+151
View File
@@ -0,0 +1,151 @@
<?php
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['district']=$_REQUEST['district']?$_REQUEST['district']:'合计';
$subTitle=($_REQUEST['district']=='合计')?'宁波地区':$_REQUEST['district'];
$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";
?>
<form name="main" id="main" method="get"> <div style="width:100%;text-align:center">
区域:
<?php districtList(); ?>
开始时间: <input type='date' name='t_start' id='t_start' width='30px' >
结束时间: <input type='date' name='t_end' id='t_end' width='30px' >
<input type='submit' value="给我查!">
<div >&nbsp;</div>
<script>
$("#district").val('<?=$_REQUEST['district']?>');
$("#t_start").val('<?=$_REQUEST['t_start']?>');
$("#t_end").val('<?=$_REQUEST['t_end']?>');
</script>
</div> </form>
<div >&nbsp;</div>
<div id="container" style="margin:0 auto;height: 400px;width: 1000px"></div>
<div >&nbsp;</div>
<div style="margin:0 auto;width: 1000px ">
<span style="color:grey">
* 数据来源:<a href='https://www.cnnbfdc.com/' target='_blank'>宁波市房产交易服务信息网</a><br />
* 更新时间: 每天下午5:30</span></div>
<script type="text/javascript">
var dataSel1=['td','price'];
var dataSel2=['td','qty'];
var data1;
var data2;
var legend =['挂牌均价','挂牌数量'];
var headtxt = '<?=$title?>';
$.ajax(
{
type:'GET',
url:'<?=$url?>',
dataType:'json',
success:function(data){
console.log(data)
data1 = getRows(data.data.datas,dataSel1);
data2 = getRows(data.data.datas,dataSel2);
console.log(data1);
console.log(data2);
var dom = document.getElementById("container");
var myChart = echarts.init(dom,'dark');
var app = {};
option = null;
option = {
title: {
//text: legend[0]+' V.S '+legend[2],
text: headtxt,
//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: 'category',
type: 'time',
boundaryGap: false
},
yAxis: [{
type: 'value',
name:legend[0], //图列
show:true
},
{
type: 'value',
name:legend[1], //图列
show:true,
boundaryGap:false,
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,
itemStyle:{normal:{label:{show:true}}}, //显示数字
},
{
name:legend[1],
type:'bar',
yAxisIndex:1,
symbol:'none',
data:data2,
itemStyle:{normal:{label:{show:true}}}, //显示数字
}
]
};
if (option && typeof option === "object") {
myChart.setOption(option, true);
}
}
}
)
</script>
<?php include_once "../html/footer.php"; ?>
+312
View File
@@ -0,0 +1,312 @@
<?php
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})";
$title1="新房每日成交量({$subTitle})";
$title2="二手房每日成交量({$subTitle})";
$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";
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";
?>
<form name="main" id="main" method="get"> <div style="width:100%;text-align:center">
区域:
<?php districtList(); ?>&nbsp;&nbsp;
Daily/Monthly:
<?php byDM('dm','dblock','mblock'); ?> &nbsp;&nbsp;
<span style="display:inline;" id='dblock'>
开始时间: <input type='date' name='t_start' id='t_start' width='30px' >
结束时间: <input type='date' name='t_end' id='t_end' width='30px' >
</span>
<span style="display:None;" id='mblock'>
开始月份: <input type="month" name='mst' id='mst' >&nbsp;&nbsp;
结束月份: <input type="month" name='med' id='med' >
</span>
<input type='submit' value="给我查!">
<div >&nbsp;</div>
<script>
$("#district").val('<?=$_REQUEST['district']?>');
$("#t_start").val('<?=$_REQUEST['t_start']?>');
$("#t_end").val('<?=$_REQUEST['t_end']?>');
$("#mst").val('<?=$_REQUEST['mst']?>');
$("#med").val('<?=$_REQUEST['med']?>');
$("#dm").val('<?=$_REQUEST['dm']?>');
var vdm= $('#dm').val();
if(vdm=='Monthly'){
$('#dblock').css('display','none');
$('#mblock').css('display','inline');
}
if(vdm=='Daily'){
$('#dblock').css('display','inline');
$('#mdblock').css('display','none');
}
</script>
</div> </form>
<div >&nbsp;</div>
<div id="container" style="margin:0 auto;height: 400px;width: 1000px"></div>
<div >&nbsp;</div>
<div id="container2" style="margin:0 auto;height: 400px;width: 1000px"></div>
<div >&nbsp;</div>
<div style="margin:0 auto;width: 1000px ">
<span style="color:grey">
* 数据来源:<a href='https://www.cnnbfdc.com/' target='_blank'>宁波市房产交易服务信息网</a><br />
* 更新时间: 每天下午5:30</span></div>
<script type="text/javascript">
var dataSel1=['td','area'];
var dataSel2=['td','qty'];
var data1;
var data2;
var data3;
var legend =['成交面积','成交套数','可售套数'];
var headtxt = '<?=$title1?>';
$.ajax(
{
type:'GET',
url:'<?=$url?>',
dataType:'json',
success:function(data){
console.log(data)
data1 = getRows(data.data.datas,dataSel1); //成交面积
data2 = getRows(data.data.datas,dataSel2); //成交套数
data3 = getRows(data.data.dataExt,dataSel2); //存量套数
//console.log(data1);
//console.log(data2);
var dom = document.getElementById("container");
var myChart = echarts.init(dom,'dark');
var app = {};
option = null;
option = {
title: {
//text: legend[0]+' V.S '+legend[2],
text: headtxt,
//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: 'category',
type: 'time',
boundaryGap: false
},
yAxis: [{
type: 'value',
name:legend[2], //图列
show:true
},
{
type: 'value',
name:legend[1], //图列
show:true,
boundaryGap:false,
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,
itemStyle:{normal:{label:{show:true}}}, //显示数字
},*/
{
name:legend[2],
type:'line',
yAxisIndex:0,
symbol:'none',
data:data3,
label:{show:true,position:'top',},//显示数字
},
{
name:legend[1],
type:'bar',
yAxisIndex:1,
symbol:'none',
data:data2,
label:{show:true},//显示数字
},
]
};
if (option && typeof option === "object") {
myChart.setOption(option, true);
}
}
}
)
//二手房
var dataSel3=['td','area'];
var dataSel4=['td','qty'];
var data3;
var data4;
var legend2 =['成交面积','成交套数'];
var headtxt2 = '<?=$title2?>';
$.ajax(
{
type:'GET',
url:'<?=$url2?>',
dataType:'json',
success:function(data2){
console.log(data2)
data3 = getRows(data2.data.dataTrade,dataSel3);
data4 = getRows(data2.data.dataTrade,dataSel4);
//console.log(data3);
//console.log(data4);
var dom = document.getElementById("container2");
var myChart = echarts.init(dom,'dark');
var app = {};
option = null;
option = {
title: {
//text: legend[0]+' V.S '+legend[2],
text: headtxt2,
//subtext: subtxt,
textAlign:'center',
left:'50%'
},
tooltip: {
trigger: 'axis'
},
legend: {
data:legend2,
right:'20'
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
toolbox: {
feature: {
saveAsImage: {}
}
},
xAxis: {
//type: 'category',
type: 'time',
boundaryGap: false
},
yAxis: [{
type: 'value',
name:legend2[0], //图列
show:true
},
{
type: 'value',
name:legend2[1], //图列
show:true,
boundaryGap:false,
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:legend2[0],
type:'line',
yAxisIndex:0,
symbol:'none',
data:data3,
label:{show:true}, //显示数字
},
{
name:legend2[1],
type:'bar',
yAxisIndex:1,
symbol:'none',
data:data4,
label:{show:true}, //显示数字
}
]
};
if (option && typeof option === "object") {
myChart.setOption(option, true);
}
}
}
)
</script>
<?php include_once "../html/footer.php"; ?>
+201
View File
@@ -0,0 +1,201 @@
<?php
/*
* @Author: Yangshuimiao
* @Date: 2023-08-21 21:14:00
* @LastEditTime: 2025-01-21 10:05:30
* @FilePath: \estateTradeDaily.php
* @Description:
* Copyright 2025 Yangshuimiao, All Rights Reserved.
*/
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');
//$currentYear = date('Y');
$_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="二手房每日成交量({$subTitle})";
$urlAppend = "t=esfTBD";
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;
include_once "../html/head.php";
?>
<form name="main" id="main" method="get"> <div style="width:100%;text-align:center">
区域:
<?php districtList(); ?>&nbsp;&nbsp;
Daily/Monthly:
<?php byDM('dm','dblock','mblock'); ?> &nbsp;&nbsp;
<span style="display:inline;" id='dblock'>
开始时间: <input type='date' name='t_start' id='t_start' width='30px' >
结束时间: <input type='date' name='t_end' id='t_end' width='30px' >
</span>
<span style="display:None;" id='mblock'>
开始月份: <input type="month" name='mst' id='mst' >&nbsp;&nbsp;
结束月份: <input type="month" name='med' id='med' >
</span>
<input type='submit' value="给我查!">
<div >&nbsp;</div>
<script>
$("#district").val('<?=$_REQUEST['district']?>');
$("#t_start").val('<?=$_REQUEST['t_start']?>');
$("#t_end").val('<?=$_REQUEST['t_end']?>');
$("#mst").val('<?=$_REQUEST['mst']?>');
$("#med").val('<?=$_REQUEST['med']?>');
$("#dm").val('<?=$_REQUEST['dm']?>');
var vdm= $('#dm').val();
if(vdm=='Monthly'){
$('#dblock').css('display','none');
$('#mblock').css('display','inline');
}
if(vdm=='Daily'){
$('#dblock').css('display','inline');
$('#mdblock').css('display','none');
}
</script>
</div> </form>
<div >&nbsp;</div>
<div id="container" style="margin:0 auto;height: 400px;width: 1000px"></div>
<div >&nbsp;</div>
<div style="margin:0 auto;width: 1000px ">
<span style="color:grey">
* 数据来源:<a href='https://www.cnnbfdc.com/' target='_blank'>宁波市房产交易服务信息网</a><br />
* 更新时间: 每天下午5:30</span></div>
<script type="text/javascript">
var dataSel1=['td','qty'];
var dataSel2=['td','area'];
var data1;
var data2;
var legend =['成交套数','成交面积','挂牌套数'];
var headtxt = '<?=$title?>';
$.ajax(
{
type:'GET',
url:'<?=$url?>',
dataType:'json',
success:function(data){
console.log(data)
data1 = getRows(data.data.dataList,dataSel1);
data2 = getRows(data.data.dataTrade,dataSel2);
data3 = getRows(data.data.dataTrade,dataSel1);
//console.log(data1);
//console.log(data2);
var dom = document.getElementById("container");
var myChart = echarts.init(dom,'dark');
var app = {};
option = null;
option = {
title: {
//text: legend[0]+' V.S '+legend[2],
text: headtxt,
//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: 'category',
type: 'time',
boundaryGap: false
},
yAxis: [{
type: 'value',
name:legend[2], //图列
show:true
},
{
type: 'value',
name:legend[0], //图列
show:true
},
{
type: 'value',
name:legend[1], //图列
show:true,
boundaryGap:false,
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[2],
type:'bar',
yAxisIndex:0,
symbol:'none',
data:data1,
itemStyle:{normal:{label:{show:true}}}, //显示数字
},
{
name:legend[0],
type:'bar',
yAxisIndex:0,
symbol:'none',
data:data3,
itemStyle:{normal:{label:{show:true}}}, //显示数字
},
{
name:legend[1],
type:'line',
yAxisIndex:1,
symbol:'none',
data:data2,
itemStyle:{normal:{label:{show:true}}}, //显示数字
}
]
};
if (option && typeof option === "object") {
myChart.setOption(option, true);
}
}
}
)
</script>
<?php include_once "../html/footer.php"; ?>
+103
View File
@@ -0,0 +1,103 @@
<?php
include_once "../inc/getBasic.inc.php";
include_once "../inc/getData.inc.php";
include_once "../inc/postJson.inc.php";
$_REQUEST['ts_code']=$_REQUEST['ts_code']?$_REQUEST['ts_code']:'000001';
$_REQUEST['tp']=$_REQUEST['tp']?$_REQUEST['tp']:'ratio';
$_REQUEST['t_start']=$_REQUEST['t_start']?$_REQUEST['t_start']:'2015-06-01';
$_REQUEST['t_end']=$_REQUEST['t_end']?$_REQUEST['t_end']:date('Y-m-d');
$ts_name = tscodeToName(ts_code_conv($_REQUEST['ts_code']));
$title="股价VS北向资金持股:".$ts_name.'('.$_REQUEST['ts_code'].')';
$unit = '';
$data = getStockHist(ts_code_conv($_REQUEST['ts_code']),$_REQUEST['t_start'],$_REQUEST['t_end']);
$getData = getHKHoldByCode();
$data2 = hkHoldReform($getData,$_REQUEST['tp']);
#var_dump($data2['data']);
$subtext_ext = "Max: ".$data2['data_max'];
$subtext_ext .= ", Min: ".$data2['data_min'];
$subtext_ext .= ", Average: ".$data2['data_avg'];
$subtext_ext .= ", Recent: ".$data2['data_last'];
$legend=array('不复权股价',hkholdConv($_REQUEST['tp']));
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']?>' >
数据选择:
<select name="tp" id="tp">
<option value="ratio">持股比例(%)</option>
<option value="vol">持股数(万)</option>
</select>
<script>
$("#tp").val('<?=$_REQUEST['tp']?>');
</script>
开始时间: <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>
</div> </form>
<div >&nbsp;</div>
<div id="container" style="margin:0 auto;height: 400px;width: 1000px"></div>
<div class="loading-overlay" id="loadingOverlay">
<div class="spinner"></div>
<p style="font-size:18px; color:#2c3e50;">正在加载数据,请稍候...</p>
</div>
<script type="text/javascript">
// 显示加载动画
$('#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/stockbasic/?tscode="+ts_code;
url += "&start_date="+t_start+"&end_date="+t_end;
url1 = "https://api.doorcome.cn/api/stockmargin/?tscode="+ts_code;
url1 += "&start_date="+t_start+"&end_date="+t_end;
url2 = "https://api.doorcome.cn/api/stockinfo/?tscode="+ts_code;
Promise.all([
fetch(url),
fetch(url1),
fetch(url2)
])
.then(responses => Promise.all(responses.map(r => r.json())))
.then(([dailyData,hkData,stockInfo]) => {
// 图表配置:pe_ttm
let codeName = stockInfo[0].name;
var params = {};
params.chartid='container';
params.legend = ['不复权股价','北向资金(%)'];
params.text = codeName+'('+ts_code+')';
params.data1 = pickData(dailyData, 'trade_date', 'close');
params.data2 = pickData(margindData, 'trade_date', 'rzrqye');
params.data2 = params.data2.map(item => {
return {
value: [
item.value[0],
parseFloat((parseFloat(item.value[1]) / 10000 /10000).toFixed(2))
]
};
});
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);
})
.catch(error => console.error('数据加载失败:', error))
.finally(() => {
// 隐藏加载动画
$('#loadingOverlay').removeClass('active');
}
);
}
</script>
<script type="text/javascript" src="../js/hkhold.js?version=3.14"></script>
<?php include_once "../html/footer.php"; ?>
+62
View File
@@ -0,0 +1,62 @@
<?php
include_once "../inc/getBasic.inc.php";
$_REQUEST['code']=$_REQUEST['code']?$_REQUEST['code']:'ShareHDNum'; #code:sh sz zx cy
$_REQUEST['t_start']=$_REQUEST['t_start']?$_REQUEST['t_start']:'2006-01-01';
$_REQUEST['t_end']=$_REQUEST['t_end']?$_REQUEST['t_end']:'';
$title="指数VS机构持仓";
include_once "../html/head.php";
?>
<form name="main" id="main" method="get"> <div style="width:100%;text-align:center">
指标代码:
<select name='code' id='code'>
<option value='ShareHDNum'>持股数-亿股</option>
<option value='vPosition'>持股金额-亿元</option>
<option value='VSRatio'>每股单价-元</option>
</select>&nbsp;
<script>
document.getElementById('code').value='<?=$_REQUEST['code']?>';
</script>
开始时间: <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']?>'>
<input type='submit' value="给我查!">
<div >&nbsp;</div>
<input type='checkbox' id='cb_01' onclick="hideSwitch(this.id,'1')" > 基金
<input type='checkbox' id='cb_02' onclick="hideSwitch(this.id,'2')" checked> QFII
<input type='checkbox' id='cb_03' onclick="hideSwitch(this.id,'3')" > 社保
<input type='checkbox' id='cb_04' onclick="hideSwitch(this.id,'4')" > 券商
<input type='checkbox' id='cb_05' onclick="hideSwitch(this.id,'5')" > 保险
<input type='checkbox' id='cb_06' onclick="hideSwitch(this.id,'6')" > 信托
</div> </form>
<div >&nbsp;</div>
<!-- https://echart.doorcome.cn/charts/chartThree.php?lx=1&share=vPosition&s=2010-01-01 -->
<div style="width:100%; text-align:center;display:None" id='1'>
<iframe src="https://echart.doorcome.cn/charts/chartThree.php?s=<?=$_REQUEST['t_start']?>&lx=1&share=<?=$_REQUEST['code']?>&e=<?=$_REQUEST['t_end']?>
height="400px" width="1000px"></iframe>
<div >&nbsp;</div>
</div>
<div style="width:100%; text-align:center; display:block;" id='2'>
<iframe src="https://echart.doorcome.cn/charts/chartThree.php?s=<?=$_REQUEST['t_start']?>&lx=2&share=<?=$_REQUEST['code']?>&e=<?=$_REQUEST['t_end']?>
height="400px" width="1000px"></iframe>
<div >&nbsp;</div>
</div>
<div style="width:100%; text-align:center; display:None;" id='3'>
<iframe src="https://echart.doorcome.cn/charts/chartThree.php?s=<?=$_REQUEST['t_start']?>&lx=3&share=<?=$_REQUEST['code']?>&e=<?=$_REQUEST['t_end']?>
height="400px" width="1000px"></iframe>
</div>
<div >&nbsp;</div>
<div style="width:100%; text-align:center; display:None;" id='4'>
<iframe src="https://echart.doorcome.cn/charts/chartThree.php?s=<?=$_REQUEST['t_start']?>&lx=4&share=<?=$_REQUEST['code']?>&e=<?=$_REQUEST['t_end']?>
height="400px" width="1000px"></iframe>
</div>
<div >&nbsp;</div>
<div style="width:100%; text-align:center; display:None;" id='5'>
<iframe src="https://echart.doorcome.cn/charts/chartThree.php?s=<?=$_REQUEST['t_start']?>&lx=5&share=<?=$_REQUEST['code']?>&e=<?=$_REQUEST['t_end']?>
height="400px" width="1000px"></iframe>
</div>
<div >&nbsp;</div>
<div style="width:100%; text-align:center; display:None;" id='6'>
<iframe src="https://echart.doorcome.cn/charts/chartThree.php?s=<?=$_REQUEST['t_start']?>&lx=6&share=<?=$_REQUEST['code']?>&e=<?=$_REQUEST['t_end']?>
height="400px" width="1000px"></iframe>
</div>
<?php include_once "../html/footer.php"; ?>
+101
View File
@@ -0,0 +1,101 @@
<?php
include_once("../inc/functions.inc.php");
$_REQUEST['code']=$_REQUEST['code']?$_REQUEST['code']:'000001.SH';
$_REQUEST['se']=$_REQUEST['se']?$_REQUEST['se']:'SSE';
$_REQUEST['t_start']=$_REQUEST['t_start']?$_REQUEST['t_start']:'2020-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'); ?>&nbsp;
融资融券交易所: <?php seList('se'); ?>&nbsp;
开始时间: <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']?>' >
&nbsp;&nbsp;
<button id="submitBtn" class="btn-submit"><span>查询数据</span></button>
<div >&nbsp;</div>
</div> </form>
<div >&nbsp;</div>
<!-- 图表容器 -->
<div id="container" style="width: 1000px; height:400px; margin: 0 auto 20px;">
<div class="loading-overlay" id="loadingOverlay">
<div class="spinner"></div>
<p style="font-size:18px; color:#2c3e50;">正在加载数据,请稍候...</p>
</div>
</div>
<script>
// 页面加载时初始化图表
$(document).ready(function() {
// 设置默认值
$('#code').val('<?= $_REQUEST['code'] ?>');
$('#se').val('<?= $_REQUEST['se'] ?>');
// 加载初始数据
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 se = $("#se").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/dailymargin/?exchange_id="+se;
url1 += "&start_date="+t_start+"&end_date="+t_end;
Promise.all([
fetch(url),
fetch(url1)
])
.then(responses => Promise.all(responses.map(r => r.json())))
.then(([indexData,seData]) => {
let dataMain=pickData(indexData, 'trade_date', 'close');
let marginData=pickData(seData, 'trade_date', 'rzrqye');
// 图表配置:total_mv
params = {};
params.chartid='container';
params.legend = [codeName,'融资融券余额-亿'];
params.text = params.legend[0]+' V.S '+params.legend[1];
params.data1 = dataMain;
params.data2 = marginData;
params.data2 = params.data2.map(item => {
return {
value: [
item.value[0],
parseFloat((parseFloat(item.value[1]) / 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');
});
}
</script>
<?php include_once("../html/footer.php"); ?>
+155
View File
@@ -0,0 +1,155 @@
<?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'); ?>
&nbsp;
开始时间: <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_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 >&nbsp;</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"); ?>
+156
View File
@@ -0,0 +1,156 @@
<?php
/*
* @Author: 杨水淼 yangshuimiao@jsjd.cc
* @Date: 2025-07-08 08:16:01
* @LastEditors: Simon failsafe@163.com
* @LastEditTime: 2025-07-13 11:02:35
* @FilePath: \echarts\index_trend.php
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
include_once("../inc/functions.inc.php");
$title="指数VS PE/PB/PS/市值 趋势";
include_once "../html/head.php";
$_REQUEST['code'] = $_REQUEST['code']?$_REQUEST['code']:'000001.SH';
$_REQUEST['t_start']= $_REQUEST['t_start']?$_REQUEST['t_start']:'2020-01-01';
$_REQUEST['t_end'] = $_REQUEST['t_end']?$_REQUEST['t_end']:date('Y-m-d');
$ts_code = $_REQUEST['code'];
?>
<script src="../js/renderCharts.js"></script>
<form name="main" id="main" method="get"> <div style="width:100%;text-align:center">
指数代码:
<?php indexList('code'); ?>&nbsp;
开始时间: <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_total_mv' onclick="hideSwitch(this.id,'total_mv')" checked> 总市值
<input type='checkbox' id='cb_float_mv' onclick="hideSwitch(this.id,'float_mv')" checked> 流通市值
</div> </form>
<div >&nbsp;</div>
<!-- 图表容器 -->
<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>
<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="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;
fetch(url)
.then(httpresponse => httpresponse.json())
.then(parsedData => {
// 图表配置:pe_ttm
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,'pb'];
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);
// 图表配置: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 / 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 = pickData(parsedData, 'trade_date', 'close');
params.data2 = pickData(parsedData, 'trade_date', 'float_mv');
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');
});
}
</script>
<?php include_once "../html/footer.php"; ?>
+72
View File
@@ -0,0 +1,72 @@
<?php
include_once "../inc/getBasic.inc.php";
include_once "../inc/getData.inc.php";
include_once "../inc/postJson.inc.php";
$_REQUEST['code']=$_REQUEST['code']?$_REQUEST['code']:'sh';
$_REQUEST['hsgt']=$_REQUEST['hsgt']?$_REQUEST['hsgt']:'north_money';
$_REQUEST['stacked']=$_REQUEST['stacked']?$_REQUEST['stacked']:'1';
$_REQUEST['t_start']=$_REQUEST['t_start']?$_REQUEST['t_start']:'2015-06-01';
$_REQUEST['t_end']=$_REQUEST['t_end']?$_REQUEST['t_end']:date('Y-m-d');
$title="股指VS沪深港通资金流向";
$unit = '亿元'; # Without a unit on PE
$data=getIndexData(codetocode($_REQUEST['code']),date('Ymd',strtotime($_REQUEST['t_start'])),date('Ymd',strtotime($_REQUEST['t_end'])));
$data2 = getMoneyFlowData($_REQUEST['hsgt'], date('Ymd',strtotime($_REQUEST['t_start'])),date('Ymd',strtotime($_REQUEST['t_end'])), $_REQUEST['stacked']);
#var_dump($data2['data']);
$subtext_ext = "Max: ".$data2['data_max'];
$subtext_ext .= ", Min: ".$data2['data_min'];
$subtext_ext .= ", Average: ".$data2['data_avg'];
$subtext_ext .= ", Recent: ".$data2['data_last'];
$legend=array(codeToName($_REQUEST['code']),hsgtConv($_REQUEST['hsgt']));
include_once "../html/head.php";
?>
<form name="main" id="main" method="get">
<div style="width:100%;text-align:center">
指数代码:
<select name='code' id='code'>
<option value='sh'>上证指数</option>
<option value='sz'>深圳成指</option>
<option value='zx'>中小板指</option>
<option value='cy'>创业板指</option>
</select>&nbsp;
资金选择:
<select name="hsgt" id="hsgt">
<option value="ggt_ss">港股通(上海)</option>
<option value="ggt_sz">港股通(深圳)</option>
<option value="hgt">沪股通</option>
<option value="sgt">深股通</option>
<option value="north_money">北向资金</option>
<option value="south_money">南向资金</option>
</select>
数据累积:
<select name="stacked" id="stacked">
<option value="-1">每日值</option>
<option value="1">累积值</option>
</select>
<script>
$("#code").val('<?=$_REQUEST['code']?>');
$("#hsgt").val('<?=$_REQUEST['hsgt']?>');
$("#stacked").val('<?=$_REQUEST['stacked']?>');
</script>
开始时间: <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']?>' >
<input type='submit' value="给我查!">
<div >&nbsp;</div>
</div> </form>
<div >&nbsp;</div>
<div id="container" style="margin:0 auto;height: 400px;width: 1000px"></div>
<script type="text/javascript">
window.chartConfig = {
data: <?php echo json_encode($data['data']); ?>,
data2: <?php echo json_encode($data2['data']); ?>,
legend: <?php echo json_encode($legend);?>,
unit: '<?php echo $unit; ?>',
title: '<?php echo codeToName($_REQUEST['code']).'VS'.hsgtConv($_REQUEST['hsgt']); ?>',
subtitle: '<?php echo $subtext_ext; ?>'
};
</script>
<script type="text/javascript" src="../js/chartmoneyflow.js?version=3.141"></script>
<?php include_once "../html/footer.php"; ?>
+32
View File
@@ -0,0 +1,32 @@
<?php
ini_set("display_errors","1");
include_once "../inc/config.php";
//ini_set('error_reporting', 'E_ALL'); //wrong way to open error_reporting
//ini_set("error_reporting","32759"); //Right way to set error_reporting
$mysqli = get_mysqli_connection();
include_once __DIR__ . "/../inc/excelOperate.inc.php";
include_once __DIR__ . "/../inc/tradeRec.inc.php";
$file = $_REQUEST['fpath'];
$company = $_REQUEST['up_vendor'];
$msg = array();
/*
echo json_encode(array(
"status" => "2",
"fpath"=> $file,
'company'=> $_REQUEST['up_vendor'],
"msg" => "upload sucessful!",
));
*/
$data = readMyExcel($file);
$msg[] = addslashes("Finished excel read! <br />");
$msg_op = dbOp($data, $company);
if($msg_op == false) exit(); //if return false, function dbOp() will echo massage to ajax
$msg = array_merge($msg,$msg_op);
echo json_encode(array(
"status" => "1",
"fpath"=> $file,
'company'=> $_REQUEST['up_vendor'],
"msg" => $msg,
));
?>
+39
View File
@@ -0,0 +1,39 @@
<?php
include_once "../inc/getBasic.inc.php";
include_once "../inc/getData.inc.php";
include_once "../inc/postJson.inc.php";
include_once "../inc/getEstate.inc.php";
$_REQUEST['t_start']=$_REQUEST['t_start']?$_REQUEST['t_start']:'2023-06-20';
$_REQUEST['t_end']=$_REQUEST['t_end']?$_REQUEST['t_end']:date('Y-m-d');
$title="房地产挂牌数量趋势(宁波)";
$data=getEstateData('宁波',$_REQUEST['t_start'],$_REQUEST['t_end']);
$legend=array('挂牌数(套)');
include_once "../html/head.php";
?>
<form name="main" id="main" method="get"> <div style="width:100%;text-align:center">
开始时间: <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']?>' >
<input type='submit' value="给我查!">
<div >&nbsp;</div>
</div> </form>
<div >&nbsp;</div>
<div id="container" style="margin:0 auto;height: 400px;width: 1000px"></div>
<div >&nbsp;</div>
<div style="margin:0 auto;width: 1000px ">
<span style="color:grey">
* 数据来源:<a href='https://www.cnnbfdc.com/' target='_blank'>宁波市房产交易服务信息网</a><br />
* 更新时间:每天上午9:00</span></div>
<script type="text/javascript">
window.chartConfig = {
data: <?php echo json_encode($data); ?>,
legend: <?php echo json_encode($legend); ?>,
title: '<?php echo $title; ?>'
};
</script>
<script type="text/javascript" src="../js/estate.js?version=3.24"></script>
<?php include_once "../html/footer.php"; ?>
+208
View File
@@ -0,0 +1,208 @@
<?php
ini_set("display_errors","0");
include_once "../inc/config.php";
include_once dirname(__FILE__) . "/../inc/getBasic.inc.php";
include_once dirname(__FILE__) . "/../inc/tradeRec.inc.php";
include_once __DIR__ . "/../inc/postJson.inc.php";
//include_once dirname(__FILE__) . "/class/basic_info.class.php";
$mysqli = get_mysqli_connection();
$_REQUEST['t_vendor']=($_REQUEST['t_vendor'])?$_REQUEST['t_vendor']:'方正证券';
if($_REQUEST['ts_code']) {
$_REQUEST['t_start'] = $_REQUEST['t_start'] ? $_REQUEST['t_start'] : '2020-01-01';
$_REQUEST['t_end'] = $_REQUEST['t_end'] ? $_REQUEST['t_end'] : '';
//$_REQUEST['ts_code']=$_REQUEST['ts_code']?$_REQUEST['ts_code']:'002273';
$ts_name = tscodeToName(ts_code_conv($_REQUEST['ts_code']));
$_REQUEST['fitDays'] = $_REQUEST['fitDays'] ? $_REQUEST['fitDays'] : '0';
if($_REQUEST['t_vendor']=='方正证券') {$flg3 = " and flg='买入'"; $flg4 = " and flg='卖出'";}
elseif($_REQUEST['t_vendor']=='长江证券') {$flg3 = " and flg in ('证券买入','新股申购确认缴款')"; $flg4 = " and flg='证券卖出'";}
//复权操作
$trdData = trade_rec(ts_code_conv($_REQUEST['ts_code']), $_REQUEST['t_start'], $_REQUEST['t_end'], '');
if($trdData){
$data3 = trade_rec(ts_code_conv($_REQUEST['ts_code']), $_REQUEST['t_start'], $_REQUEST['t_end'], $flg3);
$data4 = trade_rec(ts_code_conv($_REQUEST['ts_code']), $_REQUEST['t_start'], $_REQUEST['t_end'], $flg4);
//复权操作
if($_REQUEST['adj']) {
$adjArr = getAdj();
$trdData = adjData($adjArr, $trdData);
$data3 = adjData($adjArr, $data3);
$data4 = adjData($adjArr, $data4);
//var_dump($trdData);
}
$lastKey = count($trdData) - 1;
$tradeSummary = tradeSummary($data3, $data4,$trdData);
if ($_REQUEST['fitDays'] == '1') {
$_REQUEST['t_start'] = dateGap($trdData[0]['tdate'], -5);
//$_REQUEST['t_end'] = dateGap($trdData[$lastKey]['tdate'], +5);
}
}
}
$title="个股交易记录:".$ts_name.'('.$_REQUEST['ts_code'].')';
include_once "../html/head.php";
?>
<form name="main" id="main" method="get"> <div style="width:100%;text-align:center">
证券公司: <?php vendorList('t_vendor'); ?>
股票代码:<?php tradeStocksList(); ?>
复权:<select id="adj" name="adj">
<option value="0">不复权</option>
<option value="1">前复权</option>
</select>
<script>
$("#adj").val(<?=$_REQUEST['adj']?>);
</script>
开始时间: <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']?>' >
<input type='submit' value=" 给我查! ">
<input type="button" id="fitBtn" value=" 匹配交易时间 " onclick="fitBtnClick();">
<input type="hidden" name='fitDays' id="fitDays" value="0">
<div >&nbsp;</div>
</div> </form>
<?php
if($_REQUEST['ts_code'] and $trdData) {
echo "<div class='div_parent'>";
$i=0;
foreach ($tradeSummary as $key=>$val){
if(fmod($i,5)==0) echo "<div class='div_cell' style='clear: both;'>".$key." : ".$val." </div>\n";
else echo "<div class='div_cell' >".$key." : ".$val." </div>\n";
$i++;
if(fmod($i,5)==0) print("<br />\n");
}
$url="https://echart.doorcome.cn/charts/chartStDetail.php?";
$url.="ts_code={$_REQUEST['ts_code']}";
$url.="&s={$_REQUEST['t_start']}&e={$_REQUEST['t_end']}";
$url.="&t_vendor={$_REQUEST['t_vendor']}";
$url.="&adj={$_REQUEST['adj']}";
echo <<<EOF
</div>
<div style="width:100%; text-align:center;margin:0 auto;">
<iframe src="{$url}
height="400px" width="1000px"></iframe>
</div>
EOF;
}
?>
<div>&nbsp;</div>
<form id="form1" name="form1" method="post" enctype="multipart/form-data">
<div style="width:100%; text-align:center;margin:0 auto;">
<input type="file" id="file" name="file">
证券公司: <?php vendorList('up_vendor'); ?>
<input type="hidden" id="fpath" name="fpath" value="">
<input type="button" id="btnUpload" value=" 上传并导入 ">
<input type="button" id="btnClearMsg" value="清除导入信息">
</div>
<div style="width:100%; text-align:center;margin:0 auto; display: none;" id="ftxt">
</div>
</form>
<script>
//if($("#fitDays").val()=="1") $("#fitBtn").val("取消交易时间匹配");
//else if($("#fitDays").val()=="0") $("#fitBtn").val("时间交易匹配");
function fitBtnClick(){
if($("#fitDays").val()=="0") $("#fitDays").val("1");
$(document).ready(function(){
$("#main").submit();
});
}
$(function (){
$("#btnClearMsg").click(function (){
console.log("clear massage button clicked");
$("#ftxt").html("");
$("#ftxt").css("display","none");
});
});
// ajax process file upload
$(function () {
$("#btnUpload").click(function () {
console.log("Upload button clicked!");
var formData = new FormData($('#form1')[0]);
$.ajax({
type: 'post',
url: "https://echart.doorcome.cn/inc/upload.php", //上传文件的请求路径必须是绝对路劲
data: formData,
cache: false,
processData: false,
contentType: false,
success:function (data) {
afterUpload(data);
},
error: function () {
alert("上传失败");
}
});
});
});
//process after file upload
function afterUpload(data){
var arr = $.parseJSON(data);
if(arr['status']!=1) {
//alert(data);
alert(arr.msg);
return false;
}
console.log("Clear file area");
$("#file").val(''); //set input(file) to null
$("#ftxt").css("display","block");
$("#ftxt").html("文件上传成功!点击下面按钮开始执行<br />"+arr['fpath']+"<br />");
$("#fpath").val(arr['fpath']);
var tmp = $("#fpath").val();
console.log("fpath value:"+tmp);
console.log("Start import data!");
// Handle excel data import; ajax
var formData = new FormData($('#form1')[0]);
$.ajax({
type: 'post',
url: "https://echart.doorcome.cn/charts/myexcel.php", //上传文件的请求路径必须是绝对路劲
data: formData,
cache: false,
processData: false,
contentType: false,
success: function (data) {
console.log("get in excel ajax!");
$("#ftxt").css("display","block");
console.log(data);
var farr = $.parseJSON(data);
//alert(data);
$("#ftxt").html(farr.msg);
},
error:function () {
alert("数据解析失败!");
}
});
}
$(function(){
$("#t_vendor").change(function (){
console.log("Trade vendor changed!");
var t_vendor=$("#t_vendor").val();
console.log("Get vendor value: "+t_vendor);
var formData = new FormData($('#main')[0]);
$.ajax({
type: 'post',
url: "https://echart.doorcome.cn/inc/ajax.inc.php?t=stockList&t_vendor="+t_vendor, //上传文件的请求路径必须是绝对路劲
data: formData,
cache: false,
processData: false,
contentType: false,
success: function (data) {
console.log("get in ajax!");
var farr = $.parseJSON(data);
$("#codeList").empty();
for(let i=0;i<farr.data.stocks.length;i++)
$("#codeList").append("<option label='"+farr.data.stocks[i]['ts_name']+"' value='"+farr.data.stocks[i]['ts_code']+"'></option>");
},
error:function () {
alert("数据解析失败!");
}
});
});
});
</script>
</div>
<?php include_once "../html/footer.php"; ?>
+45
View File
@@ -0,0 +1,45 @@
<?php
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机构持仓趋势:".$ts_name.'('.$_REQUEST['ts_code'].')';
include_once "../html/head.php";
?>
<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']?>' >
<input type='submit' value="给我查!">
<div >&nbsp;</div>
<input type='checkbox' id='cb_f9' onclick="hideSwitch(this.id,'F9')" checked> 持股数
<input type='checkbox' id='cb_f10' onclick="hideSwitch(this.id,'F10')" checked> 持股金额
<input type='checkbox' id='cb_f11' onclick="hideSwitch(this.id,'F11')" checked> 占流通股比例
<input type='checkbox' id='cb_f12' onclick="hideSwitch(this.id,'F12')" checked> 占总股本比例
</div> </form>
<div >&nbsp;</div>
<div style="width:100%; text-align:center" id='F9'>
<iframe src="https://echart.doorcome.cn/charts/chartSix.php?s=<?=$_REQUEST['t_start']?>&item=F9&ts_code=<?=$_REQUEST['ts_code']?>&e=<?=$_REQUEST['t_end']?>
height="400px" width="1000px"></iframe>
</div>
<div >&nbsp;</div>
<div style="width:100%; text-align:center; " id='F10'>
<iframe src="https://echart.doorcome.cn/charts/chartSix.php?s=<?=$_REQUEST['t_start']?>&item=F10&ts_code=<?=$_REQUEST['ts_code']?>&e=<?=$_REQUEST['t_end']?>
height="400px" width="1000px"></iframe>
</div>
<div >&nbsp;</div>
<div style="width:100%; text-align:center; " id='F11'>
<iframe src="https://echart.doorcome.cn/charts/chartSix.php?s=<?=$_REQUEST['t_start']?>&item=F11&ts_code=<?=$_REQUEST['ts_code']?>&e=<?=$_REQUEST['t_end']?>
height="400px" width="1000px"></iframe>
</div>
<div style="width:100%; text-align:center; " id='F12'>
<iframe src="https://echart.doorcome.cn/charts/chartSix.php?s=<?=$_REQUEST['t_start']?>&item=F12&ts_code=<?=$_REQUEST['ts_code']?>&e=<?=$_REQUEST['t_end']?>
height="400px" width="1000px"></iframe>
</div>
<div >&nbsp;</div>
<?php include_once "../html/footer.php"; ?>
+145
View File
@@ -0,0 +1,145 @@
<?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"; ?>
+123
View File
@@ -0,0 +1,123 @@
<?php
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']:'2020-01-01';
$_REQUEST['t_end']=$_REQUEST['t_end']?$_REQUEST['t_end']:date('Y-m-d');
$ts_name = tscodeToName(ts_code_conv($_REQUEST['ts_code']));
$title="股息率趋势:".$ts_name.'('.$_REQUEST['ts_code'].')';
include_once "../html/head.php";
?>
<script src="../js/renderCharts.js?version=1.0"></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>
</div> </form>
<div style="margin:0 auto;clear:both;left:100px;width:1000px;height:30px;text-align:left"><span style="color:grey">股息率=100*TTM每股派息/股价。如:股息率=3表示每股派息3%</span></div>
<!-- 图表容器 -->
<div id="container" style="width: 1000px;height:400px; margin: 0 auto 20px;">
<div class="loading-overlay" id="loadingOverlay">
<div class="spinner"></div>
<p style="font-size:18px; color:#2c3e50;">正在加载数据,请稍候...</p>
</div>
</div>
</div>
<script>
// 页面加载时初始化图表
$(document).ready(function() {
// 加载初始数据
loadChartData();
// 绑定按钮点击事件
$('#submitBtn').click(function(e) {
//e.preventDefault(); // 阻止表单提交刷新页面
$('#loadingOverlay').addClass('active');
loadChartData();
$('#loadingOverlay').removeClass('active');
});
});
// 加载图表数据的函数
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/getdiv/?tscode="+ts_code;
url += "&start_date="+t_start+"&end_date="+t_end;
Promise.all([
fetch(url)
])
.then(responses => Promise.all(responses.map(r => r.json())))
.then(([parsedData]) => {
var params = {};
params.chartid='container';
params.legend = [ts_code,'股息率','每股股息'];
params.text = params.legend[0]+' V.S '+params.legend[1];
params.data1 = pickData(parsedData, 'trade_date', 'close');
params.data2 = pickData(parsedData, 'trade_date', 'div_yield');
params.data3 = pickData(parsedData, 'trade_date', 'cash_div_tax',fixed=3);
params.data3 = params.data3.map(item => {
let value = item.value[1];
// 将字符串转为数字,并判断是否等于 0
if (parseFloat(value) === 0) {
return [item[0], null];
} else {
return item; // 非零值保持不变
}
});
console.log(params.data3);
dataCal = calculateStats(params.data2);
params.sub_text = "TTM 股息 Max:"+dataCal['max'];
params.sub_text += ", Min:"+dataCal['min'];
params.sub_text += ", Average:"+dataCal['avg'];
params.sub_text += ", Recent:"+dataCal['last'];
var myChart = doubleLineChart(params);
// 👇 动态添加第三条线,使用副Y轴(yAxisIndex: 1
myChart.setOption({
yAxis: [
{ // 主Y轴配置
type: 'value'
},
{ // 副Y轴配置
type: 'value',
name: '股息率/股息',
position: 'right'
}
],
series: [
// 前两个 series 保持不变(ECharts 会合并)
{}, // 占位:对应第一个 series
{}, // 占位:对应第二个 series
{
name: '每股股息',
type: 'scatter',
yAxisIndex:1,
symbolSize: 10,
smooth:false,
data:params.data3
}
]
});
})
.catch(error => console.error('数据加载失败:', error))
.finally(() => {
// 隐藏加载动画
$('#loadingOverlay').removeClass('active');
});
}
</script>
</div>
<?php include_once "../html/footer.php"; ?>
+91
View File
@@ -0,0 +1,91 @@
<?php
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']:'2020-01-01';
$_REQUEST['t_end']=$_REQUEST['t_end']?$_REQUEST['t_end']:date('Y-m-d');
$ts_name = tscodeToName(ts_code_conv($_REQUEST['ts_code']));
$title="股价VS EP趋势:".$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>
</div> </form>
<div style="margin:0 auto;clear:both;left:100px;width:1000px;height:30px;text-align:left"><span style="color:grey">EP=100*TTM每股收益/股价。如:EP=5表示每股收益率5%</span></div>
<!-- 图表容器 -->
<div id="container" style="width: 1000px;height:400px; margin: 0 auto 20px;">
<div class="loading-overlay" id="loadingOverlay">
<div class="spinner"></div>
<p style="font-size:18px; color:#2c3e50;">正在加载数据,请稍候...</p>
</div>
</div>
</div>
<script>
// 页面加载时初始化图表
$(document).ready(function() {
// 加载初始数据
loadChartData();
// 绑定按钮点击事件
$('#submitBtn').click(function(e) {
//e.preventDefault(); // 阻止表单提交刷新页面
$('#loadingOverlay').addClass('active');
loadChartData();
$('#loadingOverlay').removeClass('active');
});
});
// 加载图表数据的函数
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/stockep/?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='container';
params.legend = [codeName,'EP'];
params.text = params.legend[0]+' V.S '+params.legend[1];
params.data1 = pickData(parsedData, 'trade_date', 'close');
params.data2 = pickData(parsedData, 'trade_date', 'basic_ep_ttm');
dataCal = calculateStats(params.data2);
params.sub_text = "TTM EP 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"; ?>
+84
View File
@@ -0,0 +1,84 @@
<?php
include_once "../inc/getBasic.inc.php";
include_once "../inc/getData.inc.php";
include_once "../inc/postJson.inc.php";
include_once "../inc/getFinanceData.class.php";
$_REQUEST['ts_code']=$_REQUEST['ts_code']?$_REQUEST['ts_code']:'000002';
$_REQUEST['yst']=$_REQUEST['yst']?$_REQUEST['yst']:'2015';
$_REQUEST['yed']=$_REQUEST['yed']?$_REQUEST['yed']:date('Y');
$ts_name = tscodeToName(ts_code_conv($_REQUEST['ts_code']));
$title="六段式表格:".$ts_name.'('.$_REQUEST['ts_code'].')';
$years=yearList($_REQUEST['yst'],$_REQUEST['yed']);
$thWidth = round(1/(count($years)+1)*100,1);
$thWidth .='%';
$urlAppend="ts_code={$_REQUEST['ts_code']}&yst={$_REQUEST['yst']}&yed={$_REQUEST['yed']}";
include_once "../html/head.php";
?>
<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='input' name='yst' id='yst' width='20px' list='yearlist' autocomplete="off" >
<datalist id="yearlist">
<option value="2022"></option>
<option value="2021"></option>
<option value="2020"></option>
<option value="2019"></option>
<option value="2018"></option>
<option value="2017"></option>
<option value="2016"></option>
<option value="2015"></option>
</datalist>
结束时间: <input type='input' name='yed' id='yed' width='20px'list='yearlist' autocomplete="off" >
<script>
$("#yst").val('<?=$_REQUEST['yst']?>');
$("#yed").val('<?=$_REQUEST['yed']?>');
</script>
<input type='submit' value="给我查!">
<div >&nbsp;</div>
</div> </form>
<div id="container" style="margin:0 auto;height:auto;width: 90%">
<table id="fina" class="display" style="width: 100%">
<thead>
<tr>
<th> </th>
<?php
for($i=0;$i<count($years);$i++) echo "<th style='width:{$thWidth};text-align: left;'> ".yearToname($years[$i])."</th>\n";
?>
</tr>
</thead>
<tfoot>
<tr>
<th> </th>
<?php
for($i=0;$i<count($years);$i++) echo "<th style='width:{$thWidth};text-align: left;'> ".yearToname($years[$i])."</th>\n";
?>
</tr>
</tfoot>
</table>
</div>
<?php include_once "../html/footer.php"; ?>
<script>
$(document).ready(function() {
$('#fina').DataTable( {
paging:false,
scrollY:950,
ordering:false,
"ajax": 'https://echart.doorcome.cn/inc/ajax.inc.php?t=financeData&<?=$urlAppend?>'
} );
} );
</script>
+93
View File
@@ -0,0 +1,93 @@
<?php
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']:date('Y-m-d');
$ts_name = tscodeToName(ts_code_conv($_REQUEST['ts_code']));
$title="股价VS融资融券余额:".$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>
</div> </form>
<div >&nbsp;</div>
<div id="container" style="margin:0 auto;height: 400px;width: 1000px"></div>
<div class="loading-overlay" id="loadingOverlay">
<div class="spinner"></div>
<p style="font-size:18px; color:#2c3e50;">正在加载数据,请稍候...</p>
</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/stockmargin/?tscode="+ts_code;
url += "&start_date="+t_start+"&end_date="+t_end;
url1 = "https://api.doorcome.cn/api/stockbasic/?tscode="+ts_code;
url1 += "&start_date="+t_start+"&end_date="+t_end;
url2 = "https://api.doorcome.cn/api/stockinfo/?tscode="+ts_code;
Promise.all([
fetch(url),
fetch(url1),
fetch(url2)
])
.then(responses => Promise.all(responses.map(r => r.json())))
.then(([margindData,dailyData,stockInfo]) => {
// 图表配置:pe_ttm
let codeName = stockInfo[0].name;
var params = {};
params.chartid='container';
params.legend = ['不复权股价','融资融券余额(亿元)'];
params.text = codeName+'('+ts_code+')';
params.data1 = pickData(dailyData, 'trade_date', 'close');
params.data2 = pickData(margindData, 'trade_date', 'rzrqye');
params.data2 = params.data2.map(item => {
return {
value: [
item.value[0],
parseFloat((parseFloat(item.value[1]) / 10000 /10000).toFixed(2))
]
};
});
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);
})
.catch(error => console.error('数据加载失败:', error))
.finally(() => {
// 隐藏加载动画
$('#loadingOverlay').removeClass('active');
}
);
}
</script>
<?php include_once "../html/footer.php"; ?>