feat: 市场看板 - 聚合同花顺SDK全量数据的A股实时看板
- 新增 /dashboard 页面:暗色主题,指数行情/市场温度/涨跌分布/行业强度/概念热度/事件情报 - 后端聚合接口 /api/market-dashboard,30秒缓存 - 利用SDK接口:指数行情、全市场快照、涨停/跌停/炸板池、连板天梯、热门股、飙升榜、龙虎榜、异动分析、集合竞价基准、行业/概念目录 - 市场温度评分:6因子加权(涨跌比/中位涨跌/强弱比/涨停活跃度/炸板惩罚/竞价信号) - 首页添加市场看板导航入口
This commit is contained in:
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user