feat: 题材列表盘中120s缓存共用,题材详情新增全量新闻分页+强度热度行情
- 题材热点与热点穿透共用题材列表缓存:盘中由"不缓存实时拉取"改为120s短缓存, 东财全量列表拉取降到每120s一次,图重建时涨幅/热度两榜直接命中缓存 - 详情页相关新闻升级为全量分页(getThemeRelatedNews):支持翻页+评论数, 替换原 getDetail 固定3条 - 详情页统计条新增强度+热度(getSingleThemeQuote)实时指标 Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -159,6 +159,75 @@ export async function fetchThemeStocks(themeCode: string): Promise<ThemeStocksRe
|
||||
}
|
||||
}
|
||||
|
||||
/* ── 题材相关新闻(分页) ── */
|
||||
|
||||
export interface ThemeNewsItem {
|
||||
newsCode: string;
|
||||
newsTitle: string;
|
||||
newsMediaName: string;
|
||||
showDateTime: number | null;
|
||||
showDateTimeFormat: string | null;
|
||||
commentCount: number;
|
||||
themeCode: string;
|
||||
themeName: string;
|
||||
}
|
||||
|
||||
export interface ThemeNewsResponse {
|
||||
total: number;
|
||||
maxEuTime: string;
|
||||
list: ThemeNewsItem[];
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取题材相关新闻(分页,maxEuTime 为翻页游标)
|
||||
*/
|
||||
export async function fetchThemeNews(
|
||||
themeCode: string,
|
||||
pageNum: number = 1,
|
||||
pageSize: number = 10,
|
||||
maxEuTime: string = "",
|
||||
): Promise<ThemeNewsResponse | null> {
|
||||
const baseUrl = getApiBaseUrl();
|
||||
const url = `${baseUrl}/api/themes/${themeCode}/news?page_num=${pageNum}&page_size=${pageSize}&max_eu_time=${encodeURIComponent(maxEuTime)}`;
|
||||
|
||||
try {
|
||||
const resp = await fetch(url, { method: "GET", cache: "no-store" });
|
||||
if (!resp.ok) return null;
|
||||
const result = await resp.json();
|
||||
return result.data || null;
|
||||
} catch (err) {
|
||||
console.error("[theme-api] 获取题材新闻失败:", err);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/* ── 单题材实时行情(强度/热度/涨幅) ── */
|
||||
|
||||
export interface ThemeQuote {
|
||||
strengthValue: number | null;
|
||||
hotValueUpLimit: number;
|
||||
hotValue: number;
|
||||
f3: number | null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取单题材实时行情
|
||||
*/
|
||||
export async function fetchThemeQuote(themeCode: string): Promise<ThemeQuote | null> {
|
||||
const baseUrl = getApiBaseUrl();
|
||||
const url = `${baseUrl}/api/themes/${themeCode}/quote`;
|
||||
|
||||
try {
|
||||
const resp = await fetch(url, { method: "GET", cache: "no-store" });
|
||||
if (!resp.ok) return null;
|
||||
const result = await resp.json();
|
||||
return result.data || null;
|
||||
} catch (err) {
|
||||
console.error("[theme-api] 获取题材行情失败:", err);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/* ── 热点穿透:题材-股票 网状关系图 ── */
|
||||
|
||||
export interface GraphTheme {
|
||||
|
||||
Reference in New Issue
Block a user