feat(宏观): ifinance 分类动态挂载为宏观 tab, 报警迁入监控, 下线油价/本地经济数据/策略研究
Docker Build and Push / build-image (push) Successful in 2m37s

- 宏观只保留本地 新闻/经济文章, 外接 ifinance categories[] 动态成为 tab (纯前端直连, CORS/_headers, https)
- 报警从宏观迁到监控第 4 个 tab (保留 Alert 模块, 供未来新增报警源)
- 彻底删除油价/经济数据/策略研究: 前端组件+api、后端 apizero/data 路由、cron、fetchers、种子数据
- 新增迁移 DROP Indicator/IndicatorPoint/Strategy/OilPriceHistory; 重新生成 Prisma Client
- CSP 放开 *.honor3.com (含端口通配), 避免新增子域反复重装外壳
This commit is contained in:
jif2.zhang
2026-10-30 17:17:10 +08:00
parent 82c4ae8a84
commit afbb9bc603
66 changed files with 995 additions and 9916 deletions
+19 -195
View File
@@ -242,7 +242,7 @@ input, textarea, select { font: inherit; }
.list-item-meta { font-size: 12px; color: var(--color-muted); margin-bottom: 4px; }
.list-item-excerpt { font-size: 13px; color: var(--color-muted); line-height: 1.5; }
/* ================== 列表视图 (DataView/StrategyView 列表态) ================== */
/* ================== 列表视图 (外接分类 FinanceCategoryView) ================== */
.list-page { padding: 0 0 16px; }
.list-page .page-title { padding: 14px 16px 4px; }
.list-page .adm-list { margin: 0 12px; background: transparent; }
@@ -256,41 +256,29 @@ input, textarea, select { font: inherit; }
.list-page .adm-list .adm-list-item:last-child { margin-bottom: 0; }
.list-page .adm-list-item-title { font-size: 15px; font-weight: 600; color: var(--color-text); }
.list-page .adm-list-item-description { color: var(--color-muted); margin-top: 4px; }
.list-page .row-meta { display: flex; align-items: center; gap: 6px; font-variant-numeric: tabular-nums; }
.list-page .row-change { font-size: 12px; color: var(--color-muted); }
/* 趋势徽标: 上升(绿) / 下降(红) / 持平(灰) / 震荡(橙) */
.trend-badge {
display: inline-flex;
align-items: center;
gap: 2px;
font-size: 12px;
font-weight: 500;
padding: 1px 6px;
/* 外接分类条目右侧类型徽标 */
.finance-kind {
font-size: 11px;
color: var(--color-muted);
background: rgba(0,0,0,.05);
border-radius: 4px;
background: rgba(0,0,0,.04);
white-space: nowrap;
padding: 1px 6px;
}
.trend-badge .trend-icon { font-weight: 700; }
.trend-up { color: #00b578; background: rgba(0,181,120,.1); }
.trend-down { color: #ff3141; background: rgba(255,49,65,.1); }
.trend-flat { color: #666; background: rgba(0,0,0,.05); }
.trend-volatile { color: #ff8f1f; background: rgba(255,143,31,.12); }
/* 详情页 (DataView/StrategyView 详情态) */
.detail-page { display: flex; flex-direction: column; min-height: 100%; }
.detail-page .adm-nav-bar { background: #fff; border-bottom: 1px solid var(--color-border); }
.detail-card.adm-card { margin: 12px; border-radius: 10px; }
.detail-card.adm-card .adm-card-body { padding: 12px; }
.detail-meta { font-size: 12px; color: var(--color-muted); margin-bottom: 8px; }
/* 外接条目详情: iframe 铺满 (NavBar 45px + 底部 TabBar 已计入) */
.finance-item-page { display: flex; flex-direction: column; height: 100%; background: #f5f5f5; }
.finance-item-page .adm-nav-bar { flex: 0 0 auto; background: #fff; border-bottom: 1px solid var(--color-border); }
.finance-frame {
width: 100%;
border: 0;
display: block;
background: #f5f5f5;
height: calc(100dvh - var(--safe-top) - var(--tabbar-h) - var(--safe-bottom) - 45px);
}
/* 图表 / 表格 */
/* 图表容器 (环境监控等仍在用) */
.chart-wrap { background: #fafafa; border-radius: 8px; padding: 8px; margin: 8px 0 16px; }
.data-table { width: 100%; border-collapse: collapse; font-size: 13px; }
.data-table th, .data-table td { padding: 8px 10px; text-align: left; border-bottom: 1px solid var(--color-border); }
.data-table th { background: #f8f8f8; font-weight: 600; }
.data-table-wrap { position: relative; }
.data-table-wrap.scroll { max-height: 300px; overflow: auto; }
.table-more { text-align: center; padding: 10px 0 2px; font-size: 13px; color: var(--color-primary); cursor: pointer; }
/* 页面标题 */
.page-title { font-size: 20px; font-weight: 700; padding: 14px 16px 4px; }
@@ -459,170 +447,6 @@ body.me-safe-top .app-safe-top { height: 0; }
}
/* ================== 油价页 (Macro/Oil) ================== */
.oil-page {
padding: 0 0 16px;
display: flex;
flex-direction: column;
gap: 12px;
}
.oil-card {
margin: 0 12px;
border-radius: 10px;
}
.oil-card .adm-card-body {
padding: 12px;
}
.oil-card-title {
font-size: 15px;
font-weight: 600;
color: var(--color-text);
margin-bottom: 8px;
}
.oil-card-title-row {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 8px;
}
.oil-card-title-row .oil-card-title { margin-bottom: 0; }
.oil-fuel-picker {
font-size: 13px;
color: var(--color-primary);
text-decoration: none;
}
.oil-crude {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 8px;
margin-bottom: 8px;
}
.oil-crude-item {
background: #f7f8fa;
border-radius: 8px;
padding: 10px;
text-align: center;
}
.oil-crude-label { font-size: 12px; color: var(--color-muted); }
.oil-crude-value {
font-size: 22px;
font-weight: 700;
font-variant-numeric: tabular-nums;
margin: 2px 0;
}
.oil-crude-value.up { color: #ff3141; }
.oil-crude-value.down { color: #00b578; }
.oil-crude-unit { font-size: 12px; font-weight: 400; color: var(--color-muted); margin-left: 2px; }
.oil-crude-change { font-size: 12px; font-variant-numeric: tabular-nums; }
.oil-crude-change.up { color: #ff3141; }
.oil-crude-change.down { color: #00b578; }
.oil-prediction {
border-top: 1px solid var(--color-border);
padding-top: 8px;
}
.oil-pred-row {
display: flex;
align-items: center;
gap: 8px;
padding: 4px 0;
font-size: 13px;
}
.oil-pred-label { color: var(--color-muted); min-width: 76px; }
.oil-pred-value { color: var(--color-text); flex: 1; font-weight: 600; }
.oil-pred-sub { color: var(--color-muted); font-weight: 400; }
.oil-pred-tag {
font-size: 11px;
background: #f0f5ff;
color: var(--color-primary);
padding: 2px 6px;
border-radius: 4px;
}
.oil-pred-direction {
font-weight: 600;
font-size: 14px;
}
.oil-pred-direction.上涨 { color: #ff3141; }
.oil-pred-direction.下跌 { color: #00b578; }
.oil-pred-direction.搁浅 { color: #888; }
.oil-pred-analysis {
margin-top: 6px;
font-size: 12px;
color: var(--color-muted);
line-height: 1.55;
background: #f7f8fa;
padding: 8px 10px;
border-radius: 6px;
}
.oil-chart { margin: 0 -4px; }
.oil-chart-tip {
font-size: 11px;
color: var(--color-muted);
text-align: center;
margin-top: 4px;
}
.oil-year-tabs { display: flex; gap: 4px; }
.oil-year-tab {
border: 1px solid var(--color-border);
background: #fff;
color: var(--color-text);
padding: 4px 10px;
border-radius: 14px;
font-size: 12px;
cursor: pointer;
}
.oil-year-tab.active {
background: var(--color-primary);
color: #fff;
border-color: var(--color-primary);
}
.oil-cache-hint {
font-size: 11px;
color: #00b578;
background: #e6f7ee;
padding: 4px 8px;
border-radius: 4px;
margin-bottom: 8px;
}
.oil-schedule-meta {
font-size: 13px;
color: var(--color-muted);
margin-bottom: 10px;
display: flex;
align-items: center;
gap: 8px;
flex-wrap: wrap;
}
.oil-schedule-list { display: flex; flex-direction: column; gap: 10px; }
.oil-month-label {
font-size: 12px;
font-weight: 600;
color: var(--color-text);
margin-bottom: 4px;
}
.oil-month-items {
display: grid;
grid-template-columns: repeat(5, 1fr);
gap: 6px;
}
.oil-day {
border-radius: 6px;
padding: 6px 4px;
text-align: center;
font-size: 11px;
font-variant-numeric: tabular-nums;
}
.oil-day-date { font-weight: 600; font-size: 13px; }
.oil-day-status { color: var(--color-muted); margin-top: 2px; }
.oil-day.past { background: #f5f5f5; color: #999; }
.oil-day.future {
background: linear-gradient(135deg, #1677ff 0%, #4096ff 100%);
color: #fff;
}
.oil-day.future .oil-day-status { color: rgba(255,255,255,.85); }
/* ================== 打卡 / 日历 / 清单 (V0.2) ================== */
.checkin-content { padding: 0 0 16px; flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; }
.checkin-content .adm-tabs-content { --content-padding: 0; }