feat: 市场看板 - 聚合同花顺SDK全量数据的A股实时看板

- 新增 /dashboard 页面:暗色主题,指数行情/市场温度/涨跌分布/行业强度/概念热度/事件情报
- 后端聚合接口 /api/market-dashboard,30秒缓存
- 利用SDK接口:指数行情、全市场快照、涨停/跌停/炸板池、连板天梯、热门股、飙升榜、龙虎榜、异动分析、集合竞价基准、行业/概念目录
- 市场温度评分:6因子加权(涨跌比/中位涨跌/强弱比/涨停活跃度/炸板惩罚/竞价信号)
- 首页添加市场看板导航入口
This commit is contained in:
Sakurasan
2026-08-31 10:29:37 +08:00
parent b1f216b2a4
commit d7d019c2c4
7 changed files with 1215 additions and 2 deletions
+104
View File
@@ -0,0 +1,104 @@
// 市场看板数据 API 客户端
import { getApiBaseUrl } from "@/lib/api-client";
export interface MarketIndex {
code: string;
name: string;
price: number;
change: number;
changePct: number;
prevClose: number;
turnover: number;
}
export interface MarketTemperature {
score: number;
label: string;
factors: {
advanceScore: number;
medianScore: number;
strongScore: number;
limitScore: number;
breakPenalty: number;
auctionBonus: number;
};
}
export interface AuctionData {
score: number;
label: string;
date: string;
benchmark: Record<string, unknown>;
}
export interface MarketStats {
upCount: number;
downCount: number;
flatCount: number;
total: number;
marketBreadth: number;
medianChange: number;
strongCount: number;
weakCount: number;
limitUp: number;
limitDown: number;
limitBreak: number;
breakRate: number;
totalTurnover: number;
temperature: MarketTemperature;
auction: AuctionData;
auctionSignal: string;
}
export interface SectorStrengthItem {
code: string;
name: string;
price: number;
change: number;
changePct: number;
strength: number;
breadthPct: number;
strongCount: number;
}
export interface ConceptStrengthItem {
code: string;
name: string;
changePct: number;
}
export interface DashboardEvent {
type: string;
label: string;
name: string;
code: string;
detail: string;
}
export interface MarketDashboardData {
indices: MarketIndex[];
marketStats: MarketStats;
sectorStrength: SectorStrengthItem[];
conceptStrength: ConceptStrengthItem[];
events: DashboardEvent[];
updateTime: string;
}
export async function fetchMarketDashboard(): Promise<MarketDashboardData> {
const baseUrl = getApiBaseUrl();
const resp = await fetch(`${baseUrl}/api/market-dashboard`, {
method: "GET",
cache: "no-store",
});
if (!resp.ok) {
try {
const err = await resp.json();
throw new Error(err.detail || `请求失败 (${resp.status})`);
} catch (e) {
if (e instanceof Error) throw e;
throw new Error(`请求失败 (${resp.status})`);
}
}
const result = await resp.json();
return result.data;
}