refactor: CSS残留hex清理+内联样式提取+console.log降级+错误toast补全
- components.css: 10处hex替换为CSS变量(stoploss/watch/signal/alert-change/toast) - pages.css: 20+处hex替换(ss-dot信号强度/step操作色/summary-tag/trade-type/reason-item) - auth.css: 2处hex替换(login-error/login-success) - base.css: 新增30+公共CSS class(cursor-pointer/flex-center/input-mini/icon-sm等) - index.html: 41处内联style提取为CSS class(93→52) - app.js: 14处console.log降级为console.debug(减少生产日志噪音) - app.js: 5处用户可感知catch块补充showToast错误反馈
This commit is contained in:
@@ -21,10 +21,10 @@
|
||||
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>📈</text></svg>">
|
||||
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
|
||||
<link rel="stylesheet" href="/static/css/base.css?v=20260718v1">
|
||||
<link rel="stylesheet" href="/static/css/components.css?v=20260318v2">
|
||||
<link rel="stylesheet" href="/static/css/auth.css?v=20260318v1">
|
||||
<link rel="stylesheet" href="/static/css/pages.css?v=20260718v1">
|
||||
<link rel="stylesheet" href="/static/css/base.css?v=20260718v2">
|
||||
<link rel="stylesheet" href="/static/css/components.css?v=20260718v1">
|
||||
<link rel="stylesheet" href="/static/css/auth.css?v=20260718v1">
|
||||
<link rel="stylesheet" href="/static/css/pages.css?v=20260718v2">
|
||||
<link rel="stylesheet" href="/static/css/scan.css?v=20260718v1">
|
||||
<link rel="stylesheet" href="/static/css/responsive.css?v=20260718v1">
|
||||
</head>
|
||||
@@ -193,7 +193,7 @@
|
||||
<div class="current-model">策略: 交易信号实战体系</div>
|
||||
</div>
|
||||
<div class="user-info">
|
||||
<span class="username" @click="showPasswordModal = true" style="cursor: pointer;">{{ currentUser?.username }}</span>
|
||||
<span class="username" @click="showPasswordModal = true" class="cursor-pointer">{{ currentUser?.username }}</span>
|
||||
<button class="logout-btn" @click="handleLogout">退出</button>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1412,7 +1412,7 @@
|
||||
</div><!-- 买入分析子页面结束 -->
|
||||
|
||||
<!-- (模拟交易已移至模型tab) -->
|
||||
<div style="display:none">
|
||||
<div class="hidden">
|
||||
<!-- 模拟交易统计卡片 -->
|
||||
<div class="sim-stats-card">
|
||||
<div class="sim-stats-header">
|
||||
@@ -1463,9 +1463,9 @@
|
||||
</div>
|
||||
<!-- 模拟 vs 实盘 对比看板 -->
|
||||
<div class="sim-compare-panel" v-if="simStats.total_fees > 0 || simStats.total_trades > 0">
|
||||
<div class="sim-compare-header" @click="compareExpanded = !compareExpanded" style="cursor:pointer;">
|
||||
<div class="sim-compare-header" @click="compareExpanded = !compareExpanded" class="cursor-pointer">
|
||||
<span style="font-size:12px;font-weight:600;color:#aaa;">
|
||||
<svg style="width:14px;height:14px;vertical-align:-2px;margin-right:3px;" viewBox="0 0 24 24" fill="none" stroke="#ff9f43" stroke-width="2"><path d="M18 20V10"/><path d="M12 20V4"/><path d="M6 20v-6"/></svg>
|
||||
<svg class="icon-xs" viewBox="0 0 24 24" fill="none" stroke="#ff9f43" stroke-width="2"><path d="M18 20V10"/><path d="M12 20V4"/><path d="M6 20v-6"/></svg>
|
||||
模拟 vs 实盘对比
|
||||
</span>
|
||||
<span :class="['toggle-icon', { expanded: compareExpanded }]" style="color:#888;font-size:10px;">▼</span>
|
||||
@@ -1511,12 +1511,12 @@
|
||||
<h4>⚙️ 算法配置 <span v-if="smartAlgoIsDefault" style="color:#ffd93d;font-size:12px;">(默认)</span></h4>
|
||||
<span :class="['toggle-icon', { expanded: smartConfigExpanded }]">▼</span>
|
||||
</div>
|
||||
<div v-show="smartConfigExpanded" style="padding:8px 0;">
|
||||
<div v-show="smartConfigExpanded" class="padding-y-sm">
|
||||
|
||||
<!-- 模板选择 -->
|
||||
<div v-if="smartTemplates.length > 0" style="margin-bottom:12px;">
|
||||
<div style="font-size:13px;font-weight:600;margin-bottom:6px;color:#ccc;">快速选择算法模板:</div>
|
||||
<div style="display:flex;flex-wrap:wrap;gap:6px;">
|
||||
<div class="flex-wrap-gap">
|
||||
<button v-for="tpl in smartTemplates" :key="tpl.name"
|
||||
class="sim-btn"
|
||||
:class="{'auto': smartAlgoConfig?.algo_name === tpl.display_name}"
|
||||
@@ -1546,39 +1546,39 @@
|
||||
</div>
|
||||
|
||||
<!-- 编辑模式 -->
|
||||
<div v-if="smartConfigEditing" style="margin-top:10px;border-top:1px solid #333;padding-top:10px;">
|
||||
<div style="display:grid;grid-template-columns:1fr 1fr;gap:6px;">
|
||||
<label style="display:flex;align-items:center;gap:4px;">
|
||||
<div v-if="smartConfigEditing" class="border-top-divider">
|
||||
<div class="grid-2col">
|
||||
<label class="flex-center">
|
||||
总本金: <input type="number" v-model.number="smartAlgoConfig.total_capital"
|
||||
style="width:80px;background:#1a1a2e;border:1px solid #444;color:#fff;border-radius:4px;padding:2px 6px;">
|
||||
class="input-mini-wide">
|
||||
</label>
|
||||
<label style="display:flex;align-items:center;gap:4px;">
|
||||
<label class="flex-center">
|
||||
止盈%: <input type="number" v-model.number="smartAlgoConfig.take_profit_pct" step="1"
|
||||
style="width:60px;background:#1a1a2e;border:1px solid #444;color:#fff;border-radius:4px;padding:2px 6px;">
|
||||
class="input-mini">
|
||||
</label>
|
||||
<label style="display:flex;align-items:center;gap:4px;">
|
||||
<label class="flex-center">
|
||||
止损%: <input type="number" v-model.number="smartAlgoConfig.stop_loss_pct" step="1"
|
||||
style="width:60px;background:#1a1a2e;border:1px solid #444;color:#fff;border-radius:4px;padding:2px 6px;">
|
||||
class="input-mini">
|
||||
</label>
|
||||
<label style="display:flex;align-items:center;gap:4px;">
|
||||
<label class="flex-center">
|
||||
仓位%: <input type="number" v-model.number="smartAlgoConfig.position_pct" step="1"
|
||||
style="width:60px;background:#1a1a2e;border:1px solid #444;color:#fff;border-radius:4px;padding:2px 6px;">
|
||||
class="input-mini">
|
||||
</label>
|
||||
<label style="display:flex;align-items:center;gap:4px;">
|
||||
<label class="flex-center">
|
||||
最长天数: <input type="number" v-model.number="smartAlgoConfig.max_hold_days"
|
||||
style="width:60px;background:#1a1a2e;border:1px solid #444;color:#fff;border-radius:4px;padding:2px 6px;">
|
||||
class="input-mini">
|
||||
</label>
|
||||
<label style="display:flex;align-items:center;gap:4px;">
|
||||
<label class="flex-center">
|
||||
部分止盈%: <input type="number" v-model.number="smartAlgoConfig.partial_exit_pct"
|
||||
style="width:60px;background:#1a1a2e;border:1px solid #444;color:#fff;border-radius:4px;padding:2px 6px;">
|
||||
class="input-mini">
|
||||
</label>
|
||||
<label style="display:flex;align-items:center;gap:4px;">
|
||||
<label class="flex-center">
|
||||
保本触发%: <input type="number" v-model.number="smartAlgoConfig.breakeven_at"
|
||||
style="width:60px;background:#1a1a2e;border:1px solid #444;color:#fff;border-radius:4px;padding:2px 6px;">
|
||||
class="input-mini">
|
||||
</label>
|
||||
<label style="display:flex;align-items:center;gap:4px;">
|
||||
<label class="flex-center">
|
||||
确认天数: <input type="number" v-model.number="smartAlgoConfig.sell_confirm_days"
|
||||
style="width:60px;background:#1a1a2e;border:1px solid #444;color:#fff;border-radius:4px;padding:2px 6px;">
|
||||
class="input-mini">
|
||||
</label>
|
||||
</div>
|
||||
<div style="margin-top:8px;display:flex;gap:8px;">
|
||||
@@ -1602,13 +1602,13 @@
|
||||
|
||||
<!-- 今日交易 -->
|
||||
<div class="sim-section collapsible-section">
|
||||
<div class="sim-section-header" @click="todayTradesExpanded = !todayTradesExpanded" style="cursor:pointer;">
|
||||
<h4 class="section-title"><svg style="width:16px;height:16px;vertical-align:-2px;margin-right:4px;" viewBox="0 0 24 24" fill="none" stroke="#4ecdc4" stroke-width="2"><path d="M12 20V10"/><path d="M18 20V4"/><path d="M6 20v-4"/></svg>今日交易 <span class="badge">{{ todayTrades.length }}</span></h4>
|
||||
<span :class="['toggle-icon', { expanded: todayTradesExpanded }]" style="color:#888;">▼</span>
|
||||
<div class="sim-section-header" @click="todayTradesExpanded = !todayTradesExpanded" class="cursor-pointer">
|
||||
<h4 class="section-title"><svg class="icon-sm" viewBox="0 0 24 24" fill="none" stroke="#4ecdc4" stroke-width="2"><path d="M12 20V10"/><path d="M18 20V4"/><path d="M6 20v-4"/></svg>今日交易 <span class="badge">{{ todayTrades.length }}</span></h4>
|
||||
<span :class="['toggle-icon', { expanded: todayTradesExpanded }]" class="text-muted-2">▼</span>
|
||||
</div>
|
||||
<div v-show="todayTradesExpanded && todayTrades.length === 0" class="empty-tip">今日暂无交易</div>
|
||||
<div v-show="todayTradesExpanded" class="sim-trades-list">
|
||||
<div v-for="trade in todayTrades" :key="trade.id" :class="['sim-trade-item', trade.trade_type]" @click="loadFundamental(trade.stock_code, trade.stock_name)" style="cursor: pointer;">
|
||||
<div v-for="trade in todayTrades" :key="trade.id" :class="['sim-trade-item', trade.trade_type]" @click="loadFundamental(trade.stock_code, trade.stock_name)" class="cursor-pointer">
|
||||
<div class="sim-trade-type" :class="trade.trade_type">
|
||||
{{ trade.trade_type === 'buy' ? '买' : '卖' }}
|
||||
</div>
|
||||
@@ -1633,9 +1633,9 @@
|
||||
|
||||
<!-- 模拟持仓列表(增强版:显示算法状态) -->
|
||||
<div class="sim-section collapsible-section">
|
||||
<div class="sim-section-header" @click="simPositionsExpanded = !simPositionsExpanded" style="cursor:pointer;">
|
||||
<h4 class="section-title"><svg style="width:16px;height:16px;vertical-align:-2px;margin-right:4px;" viewBox="0 0 24 24" fill="none" stroke="#00ce9e" stroke-width="2"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="17 8 12 3 7 8"/><line x1="12" y1="3" x2="12" y2="15"/></svg>当前持仓 <span class="badge">{{ simPositions.length }}</span></h4>
|
||||
<span :class="['toggle-icon', { expanded: simPositionsExpanded }]" style="color:#888;">▼</span>
|
||||
<div class="sim-section-header" @click="simPositionsExpanded = !simPositionsExpanded" class="cursor-pointer">
|
||||
<h4 class="section-title"><svg class="icon-sm" viewBox="0 0 24 24" fill="none" stroke="#00ce9e" stroke-width="2"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="17 8 12 3 7 8"/><line x1="12" y1="3" x2="12" y2="15"/></svg>当前持仓 <span class="badge">{{ simPositions.length }}</span></h4>
|
||||
<span :class="['toggle-icon', { expanded: simPositionsExpanded }]" class="text-muted-2">▼</span>
|
||||
</div>
|
||||
<div v-show="simPositionsExpanded && simPositions.length === 0" class="empty-tip">暂无持仓</div>
|
||||
<div v-show="simPositionsExpanded" class="sim-positions-list">
|
||||
@@ -1674,13 +1674,13 @@
|
||||
|
||||
<!-- 信号日志(可折叠) -->
|
||||
<div class="sim-section collapsible-section">
|
||||
<div class="sim-section-header" @click="smartSignalExpanded = !smartSignalExpanded" style="cursor:pointer;">
|
||||
<h4 class="section-title"><svg style="width:16px;height:16px;vertical-align:-2px;margin-right:4px;" viewBox="0 0 24 24" fill="none" stroke="#ffd93d" stroke-width="2"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/><line x1="16" y1="13" x2="8" y2="13"/><line x1="16" y1="17" x2="8" y2="17"/><polyline points="10 9 9 9 8 9"/></svg>信号日志 <span class="badge">{{ smartSignals.length }}</span></h4>
|
||||
<span :class="['toggle-icon', { expanded: smartSignalExpanded }]" style="color:#888;">▼</span>
|
||||
<div class="sim-section-header" @click="smartSignalExpanded = !smartSignalExpanded" class="cursor-pointer">
|
||||
<h4 class="section-title"><svg class="icon-sm" viewBox="0 0 24 24" fill="none" stroke="#ffd93d" stroke-width="2"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/><line x1="16" y1="13" x2="8" y2="13"/><line x1="16" y1="17" x2="8" y2="17"/><polyline points="10 9 9 9 8 9"/></svg>信号日志 <span class="badge">{{ smartSignals.length }}</span></h4>
|
||||
<span :class="['toggle-icon', { expanded: smartSignalExpanded }]" class="text-muted-2">▼</span>
|
||||
</div>
|
||||
<div v-show="smartSignalExpanded">
|
||||
<div v-if="smartSignals.length === 0" class="empty-tip">暂无信号记录</div>
|
||||
<div v-else style="max-height:300px;overflow-y:auto;">
|
||||
<div v-else class="max-height-scroll">
|
||||
<div v-for="sig in smartSignals" :key="sig.id"
|
||||
style="padding:6px 0;border-bottom:1px solid #1a1a2e;font-size:12px;display:flex;gap:8px;align-items:flex-start;">
|
||||
<span :style="{
|
||||
@@ -1708,13 +1708,13 @@
|
||||
|
||||
<!-- 模拟交易记录 -->
|
||||
<div class="sim-section collapsible-section">
|
||||
<div class="sim-section-header" @click="simTradesExpanded = !simTradesExpanded" style="cursor:pointer;">
|
||||
<h4 class="section-title"><svg style="width:16px;height:16px;vertical-align:-2px;margin-right:4px;" viewBox="0 0 24 24" fill="none" stroke="#a78bfa" stroke-width="2"><circle cx="12" cy="12" r="10"/><polyline points="12 6 12 12 16 14"/></svg>交易记录 <span class="badge">{{ simTrades.length }}</span></h4>
|
||||
<span :class="['toggle-icon', { expanded: simTradesExpanded }]" style="color:#888;">▼</span>
|
||||
<div class="sim-section-header" @click="simTradesExpanded = !simTradesExpanded" class="cursor-pointer">
|
||||
<h4 class="section-title"><svg class="icon-sm" viewBox="0 0 24 24" fill="none" stroke="#a78bfa" stroke-width="2"><circle cx="12" cy="12" r="10"/><polyline points="12 6 12 12 16 14"/></svg>交易记录 <span class="badge">{{ simTrades.length }}</span></h4>
|
||||
<span :class="['toggle-icon', { expanded: simTradesExpanded }]" class="text-muted-2">▼</span>
|
||||
</div>
|
||||
<div v-show="simTradesExpanded && simTrades.length === 0" class="empty-tip">暂无交易记录</div>
|
||||
<div v-show="simTradesExpanded" class="sim-trades-list">
|
||||
<div v-for="trade in simTrades" :key="trade.id" :class="['sim-trade-item', trade.trade_type]" @click="loadFundamental(trade.stock_code, trade.stock_name)" style="cursor: pointer;">
|
||||
<div v-for="trade in simTrades" :key="trade.id" :class="['sim-trade-item', trade.trade_type]" @click="loadFundamental(trade.stock_code, trade.stock_name)" class="cursor-pointer">
|
||||
<div class="sim-trade-type" :class="trade.trade_type">
|
||||
{{ trade.trade_type === 'buy' ? '买' : '卖' }}
|
||||
</div>
|
||||
@@ -1924,12 +1924,12 @@
|
||||
|
||||
<!-- 模拟持仓和交易历史直接复用现有逻辑 -->
|
||||
<div class="sim-section collapsible-section" v-if="simPositions.length > 0">
|
||||
<div class="sim-section-header" style="cursor:pointer;" @click="simPositionsExpanded = !simPositionsExpanded">
|
||||
<div class="sim-section-header" class="cursor-pointer" @click="simPositionsExpanded = !simPositionsExpanded">
|
||||
<h4 class="section-title">持仓 <span class="badge">{{ simPositions.length }}</span></h4>
|
||||
<span class="expand-arrow" :class="{ expanded: simPositionsExpanded }">▸</span>
|
||||
</div>
|
||||
<div v-show="simPositionsExpanded" class="sim-positions-list">
|
||||
<div v-for="pos in simPositions" :key="pos.stock_code" class="sim-position-item" @click="loadFundamental(pos.stock_code, pos.stock_name)" style="cursor:pointer;">
|
||||
<div v-for="pos in simPositions" :key="pos.stock_code" class="sim-position-item" @click="loadFundamental(pos.stock_code, pos.stock_name)" class="cursor-pointer">
|
||||
<div class="sim-pos-header">
|
||||
<span class="sim-pos-stock">{{ pos.stock_code }} {{ pos.stock_name }}</span>
|
||||
<span class="sim-pos-profit" :class="(pos.unrealized_profit || 0) >= 0 ? 'profit' : 'loss'">
|
||||
|
||||
Reference in New Issue
Block a user