mirror of
https://github.com/shy3130/tick-stock-panel.git
synced 2026-11-02 02:16:13 +00:00
feat(ui): 行业分析/概念分析更名行业板块/概念板块, 财务分析→财务概况
菜单/页面标题/引导文案统一更名; 轮动图默认图表源未设置 (或旧默认值) 时回退 强弱切换而非综合分, 显式选择过的用户不受影响; 文档截图替换为新版概念板块 页面 (旧截图为过期版本)。 Signed-off-by: shy3130 <shy3130@qq.com>
This commit is contained in:
@@ -357,7 +357,7 @@ export function RpsRotationDialog({ onClose, kind = 'concept' }: Props) {
|
||||
</div>
|
||||
) : rowCount === 0 ? (
|
||||
<div className="flex items-center justify-center py-16 text-[11px] text-muted">
|
||||
暂无{dimLabel}数据,请先在「{kind === 'industry' ? '行业分析' : '概念分析'}」页配置并获取{dimLabel}数据源
|
||||
暂无{dimLabel}数据,请先在「{kind === 'industry' ? '行业板块' : '概念板块'}」页配置并获取{dimLabel}数据源
|
||||
</div>
|
||||
) : (
|
||||
<div
|
||||
|
||||
@@ -42,7 +42,7 @@ const SOURCE_LABELS: Record<Exclude<SectorSource, 'custom'>, string> = {
|
||||
}
|
||||
function parseSectorSource(raw: string | null): SectorSource {
|
||||
if (raw === 'custom' || raw === 'score' || raw === 'pct' || raw === 'rank_change' || raw === 'momentum' || raw === 'flow') return raw
|
||||
return 'score' // 未设置过 / 旧默认值 'auto' → 默认综合分 (显式选择过的值已持久化, 不受影响)
|
||||
return 'momentum' // 未设置过 / 旧默认值 → 默认强弱切换 (显式选择过的值已持久化, 不受影响)
|
||||
}
|
||||
// 扩展表 schema 的类型名可能是配置里的简写 (float/int), 也可能是 Parquet 的
|
||||
// 真实类型 (DOUBLE/BIGINT/DECIMAL(18,4))。两种口径都要认, 否则会漏掉整数列。
|
||||
|
||||
@@ -115,7 +115,7 @@ export function EnrichedRebuildPanel({
|
||||
}`}>
|
||||
{canRebuild
|
||||
? `已检测到 ${historicalShareRows.toLocaleString()} 条历史股本记录。重算会按公告可用日匹配历史流通股本,并覆盖全部 Enriched 分区。`
|
||||
: '未检测到历史股本数据,请先在财务分析页面同步“股本表”,再执行重算。'}
|
||||
: '未检测到历史股本数据,请先在财务概况页面同步“股本表”,再执行重算。'}
|
||||
</div>
|
||||
)}
|
||||
<div className="text-[10px] text-muted mb-2">
|
||||
|
||||
@@ -25,9 +25,9 @@ const PAGE_LABELS: Record<string, string> = {
|
||||
'/backtest': '回测',
|
||||
'/stock-analysis': '个股分析',
|
||||
'/limit-ladder': '连板梯队',
|
||||
'/concept-analysis': '概念分析',
|
||||
'/industry-analysis': '行业分析',
|
||||
'/financials': '财务分析',
|
||||
'/concept-analysis': '概念板块',
|
||||
'/industry-analysis': '行业板块',
|
||||
'/financials': '财务概况',
|
||||
'/monitor': '监控中心',
|
||||
'/regime': '市场环境',
|
||||
'/abnormal': '异动监控',
|
||||
|
||||
@@ -349,7 +349,7 @@ export function ConceptAnalysis() {
|
||||
<>
|
||||
<div className="flex h-full flex-col">
|
||||
<PageHeader
|
||||
title="概念分析"
|
||||
title="概念板块"
|
||||
right={
|
||||
<button onClick={() => setShowConfig(true)} className="p-1.5 text-muted hover:bg-surface hover:text-accent" title="配置数据源">
|
||||
<Settings2 className="h-4 w-4" />
|
||||
@@ -358,7 +358,7 @@ export function ConceptAnalysis() {
|
||||
/>
|
||||
<PresetFetchState
|
||||
title="暂无概念数据"
|
||||
hint="从同花顺获取概念分类数据后即可使用概念分析"
|
||||
hint="从同花顺获取概念分类数据后即可使用概念板块"
|
||||
isLoading={fetchMutation.isPending}
|
||||
error={fetchMutation.error}
|
||||
onFetch={() => fetchMutation.mutate()}
|
||||
@@ -374,7 +374,7 @@ export function ConceptAnalysis() {
|
||||
return (
|
||||
<>
|
||||
<PageHeader
|
||||
title="概念分析"
|
||||
title="概念板块"
|
||||
subtitle={`${marketQuery.data?.as_of ?? rowsQuery.data?.date ?? '最新'} · ${stats.length} 个概念 · ${totalSymbols} 只标的`}
|
||||
right={
|
||||
<div className="flex items-center gap-1">
|
||||
@@ -845,7 +845,7 @@ const extension: FrontendExtension = {
|
||||
{ id: 'concept-analysis', path: '/concept-analysis', component: ConceptAnalysis },
|
||||
],
|
||||
navigation: [
|
||||
{ id: 'concept-analysis', routeId: 'concept-analysis', label: '概念分析', icon: IconConcept },
|
||||
{ id: 'concept-analysis', routeId: 'concept-analysis', label: '概念板块', icon: IconConcept },
|
||||
],
|
||||
}
|
||||
|
||||
|
||||
@@ -70,7 +70,7 @@ export function Financials() {
|
||||
if (!hasFinancial) {
|
||||
return (
|
||||
<>
|
||||
<PageHeader title="财务分析" subtitle="利润表 / 资负表 / 现金流 / 关键指标 / 股本 / AI分析" />
|
||||
<PageHeader title="财务概况" subtitle="利润表 / 资负表 / 现金流 / 关键指标 / 股本 / AI分析" />
|
||||
<div className="px-8 py-10">
|
||||
<div className="mx-auto max-w-md rounded-card border border-warning/30 bg-warning/[0.04] p-8 text-center">
|
||||
<div className="mx-auto flex h-12 w-12 items-center justify-center rounded-full bg-warning/10">
|
||||
@@ -172,7 +172,7 @@ export function Financials() {
|
||||
return (
|
||||
<>
|
||||
<PageHeader
|
||||
title="财务分析"
|
||||
title="财务概况"
|
||||
subtitle="利润表 / 资负表 / 现金流 / 关键指标 / 股本 / AI分析"
|
||||
right={
|
||||
<div className="flex items-center gap-2">
|
||||
@@ -354,7 +354,7 @@ const extension: FrontendExtension = {
|
||||
{ id: 'financials', path: '/financials', component: Financials },
|
||||
],
|
||||
navigation: [
|
||||
{ id: 'financials', routeId: 'financials', label: '财务分析', icon: IconFinancials },
|
||||
{ id: 'financials', routeId: 'financials', label: '财务概况', icon: IconFinancials },
|
||||
],
|
||||
}
|
||||
|
||||
|
||||
@@ -400,7 +400,7 @@ export function IndustryAnalysis() {
|
||||
<>
|
||||
<div className="flex h-full flex-col">
|
||||
<PageHeader
|
||||
title="行业分析"
|
||||
title="行业板块"
|
||||
right={
|
||||
<button onClick={() => setShowConfig(true)} className="p-1.5 text-muted hover:bg-surface hover:text-accent" title="配置数据源">
|
||||
<Settings2 className="h-4 w-4" />
|
||||
@@ -409,7 +409,7 @@ export function IndustryAnalysis() {
|
||||
/>
|
||||
<PresetFetchState
|
||||
title="暂无行业数据"
|
||||
hint="从同花顺获取行业分类数据后即可使用行业分析"
|
||||
hint="从同花顺获取行业分类数据后即可使用行业板块"
|
||||
isLoading={fetchMutation.isPending}
|
||||
error={fetchMutation.error}
|
||||
onFetch={() => fetchMutation.mutate()}
|
||||
@@ -427,7 +427,7 @@ export function IndustryAnalysis() {
|
||||
return (
|
||||
<>
|
||||
<PageHeader
|
||||
title="行业分析"
|
||||
title="行业板块"
|
||||
subtitle={`${industryLevelLabel} · ${marketQuery.data?.as_of ?? rowsQuery.data?.date ?? '最新'} · ${stats.length} 个行业 · ${totalSymbols} 只标的`}
|
||||
right={
|
||||
<div className="flex items-center gap-1">
|
||||
@@ -914,7 +914,7 @@ const extension: FrontendExtension = {
|
||||
{ id: 'industry-analysis', path: '/industry-analysis', component: IndustryAnalysis },
|
||||
],
|
||||
navigation: [
|
||||
{ id: 'industry-analysis', routeId: 'industry-analysis', label: '行业分析', icon: IconIndustry },
|
||||
{ id: 'industry-analysis', routeId: 'industry-analysis', label: '行业板块', icon: IconIndustry },
|
||||
],
|
||||
}
|
||||
|
||||
|
||||
@@ -77,7 +77,7 @@ const MOCK_NAV = [
|
||||
{ icon: History, label: '回测' },
|
||||
{ icon: SignalIcon, label: '信号' },
|
||||
{ icon: Eye, label: '监控' },
|
||||
{ icon: FileText, label: '财务分析' },
|
||||
{ icon: FileText, label: '财务概况' },
|
||||
]
|
||||
|
||||
export function Branding() {
|
||||
|
||||
@@ -41,7 +41,7 @@ const HIGHLIGHTS = [
|
||||
{ icon: TrendingUp, title: '个股分析', desc: 'AI 四维分析个股,关键价位、技术形态一目了然', tint: 'text-warning' },
|
||||
{ icon: Flame, title: '连板梯队', desc: '涨停梯队、封板强度、炸板监控,情绪温度计', tint: 'text-warning' },
|
||||
{ icon: Landmark, title: '概念行业', desc: '概念板块、行业维度的资金流向与热度排名', tint: 'text-accent' },
|
||||
{ icon: FileText, title: '财务分析', desc: 'AI 解读财报,利润、资负、现金流、核心指标', tint: 'text-bear' },
|
||||
{ icon: FileText, title: '财务概况', desc: 'AI 解读财报,利润、资负、现金流、核心指标', tint: 'text-bear' },
|
||||
{ icon: ShieldCheck, title: '回测验证', desc: '策略历史回测、因子分析,用数据验证逻辑', tint: 'text-accent' },
|
||||
{ icon: Radar, title: '实时监控', desc: '自定义条件 / 策略监控,盘中触发即推送告警', tint: 'text-bear' },
|
||||
{ icon: BellRing, title: '本地优先', desc: '数据本地存储,隐私可控,断网仍可查阅', tint: 'text-bull' },
|
||||
|
||||
@@ -67,7 +67,7 @@ const ARCH_CLASS: Record<string, { kind: ArchKind; reason: string }> = {
|
||||
'/limit-ladder': { kind: 'ext', reason: '连板梯队视图 — 消费核心数据, 可由扩展页面替换' },
|
||||
'/concept-analysis': { kind: 'ext', reason: '概念分析视图 — 消费核心数据, 可由扩展页面替换' },
|
||||
'/industry-analysis': { kind: 'ext', reason: '行业分析视图 — 消费核心数据, 可由扩展页面替换' },
|
||||
'/financials': { kind: 'ext', reason: '财务分析视图 — 消费核心数据, 可由扩展页面替换' },
|
||||
'/financials': { kind: 'ext', reason: '财务概况视图 — 消费核心数据, 可由扩展页面替换' },
|
||||
'/monitor': { kind: 'ext', reason: '监控消费页 (规则引擎与推送管道属核心), 页面可替换' },
|
||||
'/abnormal': { kind: 'ext', reason: '异动监控视图 — 消费核心数据, 可由扩展页面替换' },
|
||||
'/lots': { kind: 'ext', reason: '持仓提醒视图 — 消费核心数据, 可由扩展页面替换' },
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 628 KiB After Width: | Height: | Size: 1002 KiB |
Reference in New Issue
Block a user