feat: 热点股追踪增加近3/5/10交易日筛选

This commit is contained in:
Sakurasan
2026-09-17 20:34:42 +08:00
parent 229362533b
commit 1df1f77b13
3 changed files with 23 additions and 12 deletions
+3 -3
View File
@@ -20,11 +20,11 @@ def _recent_trade_dates(conn, n: int = 10) -> list[str]:
return [r["trade_date"] for r in reversed(rows)] return [r["trade_date"] for r in reversed(rows)]
@router.get("/active", summary="活跃核心股 + 最近10日涨幅矩阵") @router.get("/active", summary="活跃核心股 + 最近N日涨幅矩阵")
async def active_core_stocks(): async def active_core_stocks(days: int = Query(10, ge=1, le=30, description="交易日天数")):
conn = get_connection() conn = get_connection()
try: try:
dates = _recent_trade_dates(conn, 10) dates = _recent_trade_dates(conn, days)
if not dates: if not dates:
return JSONResponse({"dates": [], "stocks": []}, headers=_NO_CACHE_HEADERS) return JSONResponse({"dates": [], "stocks": []}, headers=_NO_CACHE_HEADERS)
+3 -3
View File
@@ -33,11 +33,11 @@ export interface CoreStockHistoryResponse {
items: CoreStockHistoryItem[]; items: CoreStockHistoryItem[];
} }
/** 获取活跃核心股 + 最近10日涨幅矩阵 */ /** 获取活跃核心股 + 最近N日涨幅矩阵 */
export async function fetchActiveCoreStocks(): Promise<ActiveCoreStocksResponse> { export async function fetchActiveCoreStocks(days: number = 10): Promise<ActiveCoreStocksResponse> {
const baseUrl = getApiBaseUrl(); const baseUrl = getApiBaseUrl();
try { try {
const resp = await fetch(`${baseUrl}/api/core-stocks/active`, { method: "GET", cache: "no-store" }); const resp = await fetch(`${baseUrl}/api/core-stocks/active?days=${days}`, { method: "GET", cache: "no-store" });
if (!resp.ok) return { dates: [], stocks: [] }; if (!resp.ok) return { dates: [], stocks: [] };
return resp.json(); return resp.json();
} catch (err) { } catch (err) {
+17 -6
View File
@@ -1,8 +1,9 @@
import { createFileRoute, Link } from "@tanstack/react-router"; import { createFileRoute, Link } from "@tanstack/react-router";
import { useQuery } from "@tanstack/react-query"; import { useQuery } from "@tanstack/react-query";
import { Fragment } from "react"; import { Fragment, useState } from "react";
import { fetchActiveCoreStocks } from "@/lib/core-stock-api"; import { fetchActiveCoreStocks } from "@/lib/core-stock-api";
import { ArrowLeft, RefreshCw, Flame } from "lucide-react"; import { ArrowLeft, RefreshCw, Flame } from "lucide-react";
import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs";
export const Route = createFileRoute("/core-stocks")({ export const Route = createFileRoute("/core-stocks")({
component: CoreStocksPage, component: CoreStocksPage,
@@ -16,9 +17,10 @@ function formatGain(v: number | null | undefined): string {
} }
function CoreStocksPage() { function CoreStocksPage() {
const [days, setDays] = useState(10);
const { data, isLoading, isFetching, refetch } = useQuery({ const { data, isLoading, isFetching, refetch } = useQuery({
queryKey: ["core-stocks", "active"], queryKey: ["core-stocks", "active", days],
queryFn: fetchActiveCoreStocks, queryFn: () => fetchActiveCoreStocks(days),
staleTime: 60_000, staleTime: 60_000,
retry: false, retry: false,
}); });
@@ -48,9 +50,18 @@ function CoreStocksPage() {
</header> </header>
<div className="max-w-5xl mx-auto px-4 mt-3 pb-8"> <div className="max-w-5xl mx-auto px-4 mt-3 pb-8">
<p className="text-[10px] text-muted-foreground mb-2"> <div className="flex items-center justify-between mb-3">
活跃热点股(最近 10 个交易日内上榜)· 按上榜次数排序 · 共 {stocks.length} 只 <p className="text-[10px] text-muted-foreground">
</p> 活跃热点股(最近 {days} 个交易日内上榜)· 按上榜次数排序 · 共 {stocks.length} 只
</p>
<Tabs value={String(days)} onValueChange={(v) => setDays(Number(v))}>
<TabsList>
<TabsTrigger value="3">近3日</TabsTrigger>
<TabsTrigger value="5">近5日</TabsTrigger>
<TabsTrigger value="10">近10日</TabsTrigger>
</TabsList>
</Tabs>
</div>
{isLoading ? ( {isLoading ? (
<div className="animate-pulse rounded-xl bg-muted h-32" /> <div className="animate-pulse rounded-xl bg-muted h-32" />