This commit is contained in:
2026-04-25 01:23:38 +08:00
parent 221f50fe50
commit 9fdf0e1c25
10 changed files with 215 additions and 253 deletions
+8 -153
View File
@@ -1,160 +1,15 @@
<template>
<div class="container">
<el-card class="box-card">
<template #header>
<div class="card-header">
<span>📈 股票涨停回落分析工具</span>
</div>
</template>
<div class="filter-bar">
<el-form :inline="true">
<el-form-item label="开始日期">
<el-date-picker
v-model="startDate"
type="date"
placeholder="请选择"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
:disabled-date="disabledStartDate"
/>
</el-form-item>
<el-form-item label="结束日期">
<el-date-picker
v-model="endDate"
type="date"
placeholder="请选择"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
:disabled-date="disabledEndDate"
/>
</el-form-item>
<el-form-item>
<el-button
type="primary"
@click="handleSearch"
:loading="loading"
icon="Search"
>
查询分析
</el-button>
<el-button @click="resetFilter">重置</el-button>
</el-form-item>
</el-form>
</div>
<el-table
:data="tableData"
style="width: 100%; margin-top: 10px"
v-loading="loading"
stripe
:default-sort="{ prop: 'drop_pct', order: 'descending' }"
>
<el-table-column prop="code" label="代码" width="100" />
<el-table-column prop="name" label="名称" width="120" />
<el-table-column prop="day_open" label="当日开盘" />
<el-table-column prop="max_high" label="区间最高" sortable />
<el-table-column prop="max_date" label="最高日期" width="120" />
<el-table-column prop="post_min_low" label="见顶后最低" />
<el-table-column prop="drop_pct" label="最大回落幅%" sortable>
<template #default="scope">
<b style="color: #f56c6c">{{ scope.row.drop_pct?.toFixed(2) }}%</b>
</template>
</el-table-column>
<el-table-column prop="rebound_pct" label="低位反弹%" sortable>
<template #default="scope">
<span
:style="{
color: scope.row.rebound_pct > 0 ? '#67c23a' : '#909399',
}"
>
{{ scope.row.rebound_pct?.toFixed(2) }}%
</span>
</template>
</el-table-column>
</el-table>
</el-card>
</div>
<router-view />
</template>
<script setup>
import { ref } from "vue";
import axios from "axios";
import { ElMessage } from "element-plus";
// 1. 将范围数组拆分为两个独立状态
const startDate = ref("2024-09-24");
const endDate = ref("2026-04-23");
const tableData = ref([]);
const loading = ref(false);
// 2. 逻辑约束:开始日期不能晚于结束日期
const disabledStartDate = (time) => {
if (!endDate.value) return false;
return time.getTime() > new Date(endDate.value).getTime();
};
// 3. 逻辑约束:结束日期不能早于开始日期
const disabledEndDate = (time) => {
if (!startDate.value) return false;
return time.getTime() < new Date(startDate.value).getTime();
};
// 重置功能
const resetFilter = () => {
startDate.value = "";
endDate.value = "";
};
const handleSearch = async () => {
// 校验非空
if (!startDate.value || !endDate.value) {
ElMessage.warning("请完整选择开始和结束日期");
return;
}
loading.value = true;
try {
const response = await axios.get(
"http://localhost:18080/api/v1/stock/analyze",
{
params: {
start_date: startDate.value,
end_date: endDate.value,
},
},
);
tableData.value = response.data;
ElMessage.success(`查询成功,共计 ${tableData.value.length} 条记录`);
} catch (error) {
console.error(error);
ElMessage.error("获取数据失败,请检查后端服务");
} finally {
loading.value = false;
}
};
// 全局入口,无需额外逻辑
</script>
<style scoped>
.container {
padding: 20px;
background-color: #f5f7fa;
min-height: 100vh;
<style>
body {
margin: 0;
background-color: #f0f2f5;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
}
.card-header {
font-size: 18px;
font-weight: bold;
}
.filter-bar {
margin-bottom: 10px;
}
/* 调整表单间距 */
:deep(.el-form-item) {
margin-right: 20px;
margin-bottom: 10px;
}
</style>
</style>