b804bd19a7
新增 kline_store 优先读本地库;修复加载中遮挡、支持缩放与交易时段刷新;修复交易记录操作列被裁切。 Co-authored-by: Cursor <cursoragent@cursor.com>
495 lines
29 KiB
HTML
495 lines
29 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="zh-CN" data-theme="dark">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
|
|
<meta name="theme-color" content="#050508" id="meta-theme-color">
|
|
<meta name="mobile-web-app-capable" content="yes">
|
|
<meta name="apple-mobile-web-app-capable" content="yes">
|
|
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
|
|
<meta name="apple-mobile-web-app-title" content="期货监控">
|
|
<meta name="application-name" content="期货监控">
|
|
<link rel="manifest" href="{{ url_for('web_manifest') }}">
|
|
<link rel="icon" href="{{ url_for('static', filename='icons/icon.svg') }}" type="image/svg+xml">
|
|
<link rel="apple-touch-icon" href="{{ url_for('static', filename='icons/icon-192.png') }}">
|
|
<title>{% block title %}国内期货监控系统{% endblock %}</title>
|
|
<script>
|
|
try {
|
|
var _t = localStorage.getItem('qihuo-theme');
|
|
if (_t === 'light' || _t === 'dark') document.documentElement.setAttribute('data-theme', _t);
|
|
} catch (e) { /* ignore */ }
|
|
</script>
|
|
<script src="{{ url_for('static', filename='js/theme.js') }}"></script>
|
|
<style>
|
|
html:not([data-theme="light"]){
|
|
--bg-page:#050508;
|
|
--bg-grid:rgba(76,194,255,.045);
|
|
--border-header:rgba(76,194,255,.12);
|
|
--header-bg:rgba(8,10,18,.75);
|
|
--text-primary:#e8eaf6;
|
|
--text-title:#ffffff;
|
|
--text-muted:#7a82a0;
|
|
--text-label:#a8b4ff;
|
|
--accent:#4cc2ff;
|
|
--accent-2:#9d6bff;
|
|
--ambient-glow:rgba(76,194,255,.14);
|
|
--ambient-glow-2:rgba(123,66,255,.1);
|
|
--scanline:rgba(76,194,255,.03);
|
|
--title-glow:rgba(76,194,255,.35);
|
|
--card-bg:rgba(10,12,22,.82);
|
|
--card-border:rgba(76,194,255,.22);
|
|
--card-border-hover:rgba(76,194,255,.45);
|
|
--card-glow:rgba(76,194,255,.12);
|
|
--card-inner:rgba(16,20,36,.9);
|
|
--input-bg:rgba(12,14,26,.95);
|
|
--input-border:rgba(76,194,255,.18);
|
|
--nav-bg:rgba(14,16,28,.9);
|
|
--nav-border:rgba(76,194,255,.15);
|
|
--nav-hover:rgba(30,40,68,.85);
|
|
--nav-hover-glow:rgba(76,194,255,.15);
|
|
--nav-active:#2563eb;
|
|
--nav-active-border:transparent;
|
|
--nav-active-glow:rgba(76,194,255,.45);
|
|
--focus-ring:rgba(76,194,255,.25);
|
|
--focus-glow:rgba(76,194,255,.2);
|
|
--btn-glow:rgba(76,194,255,.35);
|
|
--btn-glow-strong:rgba(123,66,255,.4);
|
|
--row-hover:rgba(76,194,255,.06);
|
|
--list-item-bg:rgba(14,18,32,.8);
|
|
--table-border:rgba(76,194,255,.1);
|
|
--profit:#4cd97f;
|
|
--profit-bg:rgba(76,217,127,.12);
|
|
--loss:#ff6b7a;
|
|
--loss-bg:rgba(255,107,122,.12);
|
|
--dir-bg:rgba(30,45,80,.6);
|
|
--planned-bg:rgba(234,193,71,.12);
|
|
--planned-text:#eac147;
|
|
--expired-bg:rgba(40,44,60,.8);
|
|
--expired-text:#8a8a9e;
|
|
--flash-bg:rgba(30,45,80,.7);
|
|
--flash-text:#4cc2ff;
|
|
--modal-mask:rgba(2,4,12,.82);
|
|
--danger:#ff6b7a;
|
|
--shadow-card:0 8px 32px rgba(0,0,0,.45),0 0 1px rgba(76,194,255,.3),inset 0 1px 0 rgba(255,255,255,.04);
|
|
--shadow-card-hover:0 16px 48px rgba(0,0,0,.5),0 0 24px var(--card-glow);
|
|
--calc-bg:rgba(20,24,42,.9);
|
|
--toggle-bg:rgba(14,16,28,.9);
|
|
--toggle-border:rgba(76,194,255,.2);
|
|
}
|
|
[data-theme="light"]{
|
|
--bg-page:#e8eef8;
|
|
--bg-grid:rgba(37,99,235,.07);
|
|
--border-header:rgba(37,99,235,.15);
|
|
--header-bg:rgba(255,255,255,.82);
|
|
--text-primary:#1a2233;
|
|
--text-title:#0a1628;
|
|
--text-muted:#5c6578;
|
|
--text-label:#1d4ed8;
|
|
--accent:#2563eb;
|
|
--accent-2:#7c3aed;
|
|
--ambient-glow:rgba(37,99,235,.12);
|
|
--ambient-glow-2:rgba(124,58,237,.08);
|
|
--scanline:rgba(37,99,235,.04);
|
|
--title-glow:rgba(37,99,235,.2);
|
|
--card-bg:rgba(255,255,255,.92);
|
|
--card-border:rgba(37,99,235,.2);
|
|
--card-border-hover:rgba(37,99,235,.4);
|
|
--card-glow:rgba(37,99,235,.1);
|
|
--card-inner:#f4f7fc;
|
|
--input-bg:#ffffff;
|
|
--input-border:#b8c5d6;
|
|
--nav-bg:rgba(255,255,255,.95);
|
|
--nav-border:rgba(37,99,235,.18);
|
|
--nav-hover:#eef4ff;
|
|
--nav-hover-glow:rgba(37,99,235,.12);
|
|
--nav-active:#2563eb;
|
|
--nav-active-border:transparent;
|
|
--nav-active-glow:rgba(37,99,235,.35);
|
|
--focus-ring:rgba(37,99,235,.2);
|
|
--focus-glow:rgba(37,99,235,.15);
|
|
--btn-glow:rgba(37,99,235,.25);
|
|
--btn-glow-strong:rgba(37,99,235,.35);
|
|
--row-hover:rgba(37,99,235,.05);
|
|
--list-item-bg:#f1f5f9;
|
|
--table-border:#e2e8f0;
|
|
--profit:#15803d;
|
|
--profit-bg:#dcfce7;
|
|
--loss:#dc2626;
|
|
--loss-bg:#fee2e2;
|
|
--dir-bg:#dbeafe;
|
|
--planned-bg:#fef9c3;
|
|
--planned-text:#a16207;
|
|
--expired-bg:#f1f5f9;
|
|
--expired-text:#64748b;
|
|
--flash-bg:#dbeafe;
|
|
--flash-text:#1d4ed8;
|
|
--modal-mask:rgba(15,23,42,.45);
|
|
--danger:#dc2626;
|
|
--shadow-card:0 8px 28px rgba(15,23,42,.08),0 0 1px rgba(37,99,235,.15),inset 0 1px 0 rgba(255,255,255,.95);
|
|
--shadow-card-hover:0 16px 40px rgba(15,23,42,.12),0 0 20px var(--card-glow);
|
|
--calc-bg:#eef2ff;
|
|
--toggle-bg:#ffffff;
|
|
--toggle-border:#c5d0dc;
|
|
}
|
|
*{margin:0;padding:0;box-sizing:border-box}
|
|
body{
|
|
font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"PingFang SC","Microsoft YaHei",sans-serif;
|
|
background:var(--bg-page);
|
|
color:var(--text-primary);
|
|
min-height:100vh;
|
|
transition:background .25s,color .25s;
|
|
}
|
|
.page-wrap{max-width:1800px;margin:0 auto;min-height:100vh}
|
|
.site-header{text-align:center;padding:1.5rem 1rem 1.25rem;border-bottom:1px solid var(--border-header);position:relative}
|
|
.site-title{font-size:1.75rem;font-weight:700;color:var(--text-title);margin-bottom:1.65rem;line-height:1.3}
|
|
.header-tools{position:absolute;top:1rem;left:1.5rem;display:flex;gap:.5rem;align-items:center;z-index:20}
|
|
.theme-switch{
|
|
display:inline-flex;align-items:center;
|
|
border-radius:999px;border:1px solid var(--toggle-border);
|
|
background:var(--toggle-bg);padding:3px;gap:2px;
|
|
}
|
|
.theme-switch-btn{
|
|
padding:.38rem .75rem;border:none;border-radius:999px;
|
|
background:transparent;color:var(--text-muted);
|
|
font-size:.75rem;cursor:pointer;transition:.2s;
|
|
white-space:nowrap;width:auto;flex-shrink:0;
|
|
}
|
|
.theme-switch-btn:hover{color:var(--text-primary)}
|
|
.theme-switch-btn.active{
|
|
background:linear-gradient(135deg,var(--accent),var(--accent-2));
|
|
color:#fff;box-shadow:0 0 12px var(--btn-glow);
|
|
}
|
|
.site-nav{display:flex;justify-content:center;gap:.45rem;flex-wrap:wrap}
|
|
.site-nav a{
|
|
padding:.55rem 1.15rem;border-radius:8px;
|
|
border:1px solid var(--nav-border);
|
|
background:var(--nav-bg);
|
|
color:var(--text-primary);
|
|
text-decoration:none;font-size:.88rem;
|
|
transition:.2s;white-space:nowrap;
|
|
}
|
|
.site-nav a:hover{background:var(--nav-hover);border-color:var(--accent);color:var(--text-title)}
|
|
.site-nav a.active{background:var(--nav-active);border-color:var(--nav-active-border);color:#fff}
|
|
.user-bar{position:absolute;top:1rem;right:1.5rem;font-size:.8rem;color:var(--text-muted);white-space:nowrap}
|
|
.user-bar a{color:var(--danger);text-decoration:none;margin-left:.5rem}
|
|
.main{padding:1.5rem}
|
|
.text-muted{color:var(--text-muted)}
|
|
.text-label{color:var(--text-label)}
|
|
.text-accent{color:var(--accent)}
|
|
.text-profit{color:var(--profit)}
|
|
.text-loss{color:var(--loss)}
|
|
.section-label{font-size:.9rem;color:var(--text-label);margin:.75rem 0 .5rem}
|
|
.empty-hint{color:var(--text-muted);padding:.75rem;font-size:.85rem}
|
|
.flash{padding:1rem;background:var(--flash-bg);color:var(--flash-text);border-radius:10px;margin-bottom:1.5rem;text-align:center;border:1px solid var(--card-border)}
|
|
.card{
|
|
background:var(--card-bg);
|
|
border-radius:16px;padding:1.5rem;
|
|
border:1px solid var(--card-border);
|
|
margin-bottom:1.5rem;
|
|
position:relative;overflow:hidden;
|
|
box-shadow:var(--shadow-card);
|
|
backdrop-filter:blur(10px);
|
|
transition:background .25s,border-color .25s,box-shadow .25s;
|
|
}
|
|
.card::before{
|
|
content:"";position:absolute;inset:0;
|
|
background:linear-gradient(135deg,var(--card-glow) 0%,transparent 55%);
|
|
pointer-events:none;
|
|
}
|
|
.card::after{
|
|
content:"";position:absolute;top:0;left:12%;right:12%;height:1px;
|
|
background:linear-gradient(90deg,transparent,var(--accent),var(--accent-2),transparent);
|
|
opacity:.55;pointer-events:none;
|
|
}
|
|
.card > *{position:relative;z-index:1}
|
|
.card h2{
|
|
font-size:1.15rem;margin-bottom:1rem;color:var(--text-label);
|
|
display:flex;align-items:center;gap:.5rem;
|
|
}
|
|
.card h2:before{
|
|
content:"";width:4px;height:16px;
|
|
background:linear-gradient(180deg,var(--accent),var(--accent-2));
|
|
border-radius:2px;box-shadow:0 0 8px var(--card-glow);
|
|
}
|
|
.form-row{display:flex;gap:.5rem;flex-wrap:wrap;margin-bottom:1rem;align-items:center}
|
|
.form-compact{display:flex;flex-direction:column;gap:.5rem;margin-bottom:1rem}
|
|
.form-compact .form-line{display:grid;gap:.5rem;align-items:center}
|
|
.form-compact .line-2{grid-template-columns:repeat(2,1fr)}
|
|
.form-compact .line-3{grid-template-columns:repeat(3,1fr)}
|
|
.form-compact .line-4{grid-template-columns:repeat(4,1fr)}
|
|
.form-compact .line-5{grid-template-columns:repeat(5,1fr)}
|
|
.form-compact.line-tight{gap:.35rem;margin-bottom:.5rem}
|
|
.form-compact .line-btn{display:flex;gap:.5rem;align-items:center}
|
|
.form-compact input,.form-compact select{padding:.55rem .7rem;font-size:.85rem;border-radius:8px}
|
|
.form-compact .symbol-selected{font-size:.7rem;margin-top:2px}
|
|
.form-compact button.btn-primary{padding:.55rem 1.5rem;font-size:.85rem;white-space:nowrap}
|
|
.form-compact-review input.calc-readonly{color:var(--accent);background:var(--calc-bg);font-size:.82rem}
|
|
.form-compact-review textarea{min-height:44px;font-size:.85rem;padding:.45rem .65rem}
|
|
.form-compact-review .section-hint{font-size:.72rem;color:var(--text-muted);margin:.25rem 0 .15rem}
|
|
.form-compact-review .tag-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:.15rem .5rem;font-size:.75rem}
|
|
.form-compact-review .tag-grid label{display:flex;align-items:center;gap:.3rem;cursor:pointer;color:var(--text-muted);white-space:nowrap}
|
|
.form-compact-review .tag-grid input{width:auto;flex-shrink:0}
|
|
.form-compact-review input[type="file"]{font-size:.72rem;padding:.4rem .5rem}
|
|
.form-compact-review .mini-field span{font-size:.65rem;color:var(--text-muted);display:block;line-height:1;margin-bottom:2px}
|
|
.form-compact-review .kline-row label{display:flex;align-items:center;gap:.35rem;color:var(--text-muted);white-space:nowrap}
|
|
.form-compact-review .kline-row{display:grid;grid-template-columns:auto 1fr 1fr 1fr auto;gap:.5rem;align-items:end;font-size:.78rem}
|
|
.split-grid.records-split .card{min-height:auto}
|
|
.split-grid.records-split .card h2{font-size:1rem;margin-bottom:.5rem}
|
|
.split-grid.records-split .card{padding:1rem 1.25rem}
|
|
.page-title-sm{font-size:1.25rem;margin-bottom:.75rem}
|
|
.form-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:.75rem;margin-bottom:1rem}
|
|
.form-grid .full{grid-column:1/-1}
|
|
.field label{display:block;font-size:.8rem;color:var(--text-label);margin-bottom:.35rem}
|
|
input,select,textarea,button{
|
|
padding:.7rem 1rem;border-radius:10px;
|
|
border:1px solid var(--input-border);
|
|
background:var(--input-bg);color:var(--text-primary);
|
|
font-size:.9rem;outline:none;width:100%;
|
|
transition:border-color .2s,background .2s;
|
|
}
|
|
textarea{min-height:80px;resize:vertical}
|
|
input:focus,select:focus,textarea:focus{border-color:var(--accent)}
|
|
button.btn-primary{background:linear-gradient(90deg,var(--accent),var(--accent-2));border:none;cursor:pointer;color:#fff;width:auto}
|
|
button.btn-primary:hover{opacity:.9}
|
|
.list{display:flex;flex-direction:column;gap:.75rem}
|
|
.list-item{
|
|
display:flex;justify-content:space-between;align-items:center;
|
|
padding:1rem;background:var(--list-item-bg);
|
|
border-radius:10px;gap:1rem;flex-wrap:wrap;
|
|
border:1px solid var(--card-border);
|
|
}
|
|
.btn-del{padding:.4rem .8rem;background:var(--loss-bg);color:var(--loss);border-radius:8px;text-decoration:none;font-size:.85rem}
|
|
table{width:100%;border-collapse:collapse}
|
|
th,td{padding:.85rem;text-align:left;border-bottom:1px solid var(--table-border);font-size:.9rem;color:var(--text-primary)}
|
|
th{color:var(--text-label);white-space:nowrap}
|
|
.badge{padding:.25rem .5rem;border-radius:6px;font-size:.75rem}
|
|
.badge.profit{background:var(--profit-bg);color:var(--profit)}
|
|
.badge.loss{background:var(--loss-bg);color:var(--loss)}
|
|
.badge.dir{background:var(--dir-bg);color:var(--accent)}
|
|
.badge.planned{background:var(--planned-bg);color:var(--planned-text)}
|
|
.badge.active{background:var(--profit-bg);color:var(--profit)}
|
|
.badge.expired{background:var(--expired-bg);color:var(--expired-text)}
|
|
.stat-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:1rem;margin-bottom:1.5rem}
|
|
.stat-item{
|
|
background:var(--card-inner);padding:1rem;border-radius:12px;text-align:center;
|
|
border:1px solid var(--card-border);position:relative;overflow:hidden;
|
|
}
|
|
.stat-item::before{
|
|
content:"";position:absolute;top:0;left:0;right:0;height:2px;
|
|
background:linear-gradient(90deg,var(--accent),var(--accent-2));opacity:.5;
|
|
}
|
|
.stat-item .label{font-size:.8rem;color:var(--text-muted)}
|
|
.stat-item .value{font-size:1.4rem;font-weight:600;color:var(--text-title);margin-top:.25rem}
|
|
.symbol-wrap{position:relative;z-index:1}
|
|
.symbol-wrap:has(.symbol-dropdown.show){z-index:50}
|
|
.symbol-dropdown{
|
|
position:absolute;top:100%;left:0;right:0;
|
|
background:var(--input-bg);border:1px solid var(--input-border);
|
|
border-radius:10px;margin-top:4px;z-index:200;
|
|
max-height:240px;overflow-y:auto;display:none;
|
|
box-shadow:var(--shadow-card-hover);
|
|
}
|
|
.card:has(.symbol-dropdown.show){overflow:visible}
|
|
.symbol-dropdown.show{display:block}
|
|
.symbol-option{padding:.65rem 1rem;cursor:pointer;font-size:.85rem;border-bottom:1px solid var(--table-border)}
|
|
.symbol-option:hover{background:var(--list-item-bg)}
|
|
.symbol-option .sub{font-size:.75rem;color:var(--text-muted);margin-top:2px}
|
|
.symbol-selected{font-size:.75rem;color:var(--accent);margin-top:4px}
|
|
.check-row{display:flex;flex-wrap:wrap;gap:1rem;margin:.75rem 0}
|
|
.check-row label{display:flex;align-items:center;gap:.4rem;font-size:.85rem;color:var(--text-muted);cursor:pointer}
|
|
.check-row input{width:auto}
|
|
.hint{font-size:.78rem;color:var(--text-muted);line-height:1.5;margin-top:.5rem}
|
|
.filter-row{display:flex;gap:.75rem;flex-wrap:wrap;align-items:flex-end;margin-bottom:1rem}
|
|
.filter-row .field{width:auto;min-width:140px}
|
|
.filter-row button{width:auto}
|
|
.split-grid{display:grid;grid-template-columns:1fr 1fr;gap:1.5rem;align-items:stretch;margin-bottom:1.5rem}
|
|
.split-grid .card{margin-bottom:0;height:100%;min-height:480px;display:flex;flex-direction:column}
|
|
.split-grid .card-body{flex:1;overflow:auto}
|
|
.card-scroll{max-height:420px;overflow-y:auto}
|
|
.preset-tabs{display:flex;gap:.5rem;flex-wrap:wrap;margin-bottom:1rem}
|
|
.preset-tabs a{
|
|
padding:.45rem .85rem;border-radius:8px;
|
|
border:1px solid var(--input-border);
|
|
color:var(--text-muted);text-decoration:none;font-size:.85rem;
|
|
}
|
|
.preset-tabs a.active,.preset-tabs a:hover{background:var(--dir-bg);color:var(--accent);border-color:var(--accent)}
|
|
.btn-link{color:var(--accent);cursor:pointer;font-size:.85rem;background:none;border:none;padding:0}
|
|
.btn-link:hover{text-decoration:underline}
|
|
.modal-mask{position:fixed;inset:0;background:var(--modal-mask);z-index:1000;display:none;align-items:center;justify-content:center;padding:1rem}
|
|
.modal-mask.show{display:flex}
|
|
.modal-box{
|
|
background:var(--card-bg);border:1px solid var(--card-border);
|
|
border-radius:16px;max-width:900px;width:100%;
|
|
max-height:90vh;overflow:auto;padding:1.5rem;
|
|
box-shadow:var(--shadow-card);
|
|
}
|
|
.modal-box h3{margin-bottom:1rem;color:var(--text-label)}
|
|
.modal-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:.75rem;font-size:.9rem}
|
|
.modal-grid .item label{color:var(--text-muted);font-size:.75rem;display:block}
|
|
.modal-grid .item div{margin-top:.2rem;color:var(--text-primary)}
|
|
.form-compact .line-plan-1{grid-template-columns:minmax(0,1fr) minmax(72px,0.45fr) minmax(0,1.6fr)}
|
|
.form-compact .line-plan-2{grid-template-columns:repeat(4,minmax(0,1fr)) auto;align-items:center}
|
|
.form-compact .field-short select{padding:.55rem .5rem}
|
|
.badge.emotion{background:var(--loss-bg);color:var(--loss);font-weight:600;border:1px solid var(--loss)}
|
|
tr.row-emotion td{color:var(--loss)}
|
|
tr.row-emotion td .badge.emotion{background:var(--loss);color:#fff;border-color:var(--loss)}
|
|
.modal-box.review-modal-wide{max-width:960px}
|
|
.modal-box.review-modal-fullscreen{
|
|
width:calc(100vw - 1.5rem);max-width:none;
|
|
height:calc(100vh - 1.5rem);max-height:none;
|
|
border-radius:12px;display:flex;flex-direction:column;
|
|
}
|
|
.modal-box.review-modal-fullscreen h3{flex-shrink:0}
|
|
#review-modal-body.review-modal-body{flex:1;overflow:auto;min-height:0}
|
|
.review-detail-table{margin-bottom:1rem;overflow-x:auto}
|
|
.review-detail-headers,.review-detail-values{
|
|
display:grid;
|
|
grid-template-columns:repeat(16,minmax(52px,1fr));
|
|
gap:.35rem .4rem;align-items:start;
|
|
}
|
|
.review-detail-headers span{
|
|
font-size:.68rem;color:var(--text-muted);
|
|
white-space:nowrap;line-height:1.3;
|
|
}
|
|
.review-detail-values span{
|
|
font-size:.82rem;color:var(--text-primary);
|
|
line-height:1.35;word-break:break-all;
|
|
}
|
|
.review-detail-values span.emotion-val{color:var(--loss);font-weight:600}
|
|
.review-detail-fields{padding:.25rem 0}
|
|
.review-detail-section{margin-bottom:.85rem}
|
|
.review-detail-section h4{font-size:.78rem;color:var(--text-label);margin-bottom:.45rem;font-weight:600}
|
|
.review-detail-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:.45rem .65rem}
|
|
.review-detail-item label{display:block;font-size:.7rem;color:var(--text-muted);margin-bottom:.15rem}
|
|
.review-detail-item div{font-size:.85rem;color:var(--text-primary);line-height:1.35}
|
|
.review-detail-item.wide{grid-column:span 2}
|
|
.review-detail-item.full{grid-column:1/-1}
|
|
.review-detail-item.emotion div{color:var(--loss);font-weight:600}
|
|
.review-detail-image{flex-shrink:0;padding-top:.75rem;border-top:1px solid var(--table-border)}
|
|
.review-detail-image img{width:100%;border-radius:10px;border:1px solid var(--card-border)}
|
|
.review-detail-image .no-img{color:var(--text-muted);font-size:.85rem;padding:2rem;text-align:center;background:var(--card-inner);border-radius:10px}
|
|
.key-live{display:flex;align-items:center;justify-content:space-between;gap:.75rem;flex:1;min-width:160px}
|
|
.key-live .live-price-line{font-size:.85rem;font-weight:600;color:var(--accent);white-space:nowrap}
|
|
.key-live .live-dist{font-size:.72rem;color:var(--text-muted);white-space:nowrap}
|
|
.key-live .live-dist span{color:var(--text-primary)}
|
|
.list-item.key-item{gap:.65rem}
|
|
.pos-card{background:var(--card-inner);border:1px solid var(--card-border);border-radius:12px;padding:1rem;margin-bottom:.75rem}
|
|
.pos-card-head{display:flex;justify-content:space-between;align-items:flex-start;gap:.5rem;margin-bottom:.65rem}
|
|
.pos-card-head .title{font-size:1rem;font-weight:600;color:var(--text-title)}
|
|
.pos-card-meta{font-size:.75rem;color:var(--text-muted);margin-bottom:.65rem}
|
|
.pos-card-meta strong{color:var(--text-primary)}
|
|
.pos-metrics{display:grid;grid-template-columns:repeat(4,1fr);gap:.5rem .65rem;margin-bottom:.65rem}
|
|
.pos-metrics .cell label{display:block;font-size:.68rem;color:var(--text-muted);margin-bottom:.15rem}
|
|
.pos-metrics .cell div{font-size:.88rem;color:var(--text-primary)}
|
|
.pos-metrics .cell.pnl-pos div{color:var(--profit)}
|
|
.pos-metrics .cell.pnl-neg div{color:var(--loss)}
|
|
.pos-footer{font-size:.72rem;color:var(--text-muted);display:flex;flex-wrap:wrap;gap:.35rem 1rem;padding-top:.65rem;border-top:1px solid var(--table-border)}
|
|
.pos-footer span{color:var(--text-primary)}
|
|
.pos-del{font-size:.75rem;padding:.35rem .65rem}
|
|
.trade-toolbar{display:flex;align-items:center;gap:1rem;margin-bottom:1rem;flex-wrap:wrap}
|
|
.trade-switch-label{
|
|
display:flex;align-items:center;gap:.4rem;
|
|
font-size:.78rem;color:var(--text-muted);
|
|
white-space:normal;margin-bottom:.65rem;cursor:pointer;
|
|
line-height:1.45;max-width:100%;
|
|
}
|
|
.trade-switch-label span{line-height:1.45;color:var(--text-muted)}
|
|
.trade-switch-label input{flex-shrink:0;width:auto}
|
|
.trade-table-wrap{
|
|
overflow:auto;
|
|
max-height:420px;
|
|
width:100%;
|
|
-webkit-overflow-scrolling:touch;
|
|
border-radius:10px;
|
|
border:1px solid var(--table-border);
|
|
background:var(--card-inner);
|
|
}
|
|
.trade-table{font-size:.8rem;width:max-content;min-width:100%;table-layout:auto}
|
|
.trade-table th{font-size:.75rem;padding:.55rem .45rem;white-space:nowrap;background:var(--card-inner)}
|
|
.trade-table td{padding:.45rem .4rem;vertical-align:middle;white-space:nowrap;background:var(--card-inner)}
|
|
.trade-table th:last-child,
|
|
.trade-table td:last-child{
|
|
position:sticky;right:0;z-index:3;
|
|
box-shadow:-6px 0 10px rgba(0,0,0,.08);
|
|
}
|
|
.trade-table thead th:last-child{z-index:4}
|
|
.trade-table input,.trade-table select{
|
|
padding:.35rem .45rem;font-size:.78rem;border-radius:6px;width:100%;min-width:0;
|
|
}
|
|
.trade-table .cell-readonly{color:var(--text-primary)}
|
|
.records-trade-card{overflow:visible}
|
|
.records-trade-card .card-body{overflow:visible}
|
|
.trade-actions{display:flex;gap:.35rem;flex-wrap:wrap;align-items:center;min-width:148px}
|
|
.trade-actions a,.trade-actions button{font-size:.72rem;padding:.3rem .55rem;border-radius:6px;text-decoration:none;border:none;cursor:pointer}
|
|
.btn-fill{background:var(--dir-bg);color:var(--accent)}
|
|
.btn-verify{background:var(--nav-active);color:#fff}
|
|
.btn-verify:disabled{opacity:.45;cursor:not-allowed}
|
|
.badge.result-manual{background:var(--dir-bg);color:var(--accent)}
|
|
.badge.result-external{background:var(--expired-bg);color:var(--expired-text)}
|
|
.profile-page .profile-head{display:flex;align-items:center;gap:.65rem;flex-wrap:wrap;margin:1rem 0 .75rem;font-size:.9rem}
|
|
.profile-page .profile-source{font-size:.72rem;color:var(--text-muted)}
|
|
.profile-spec{max-width:820px;border:1px solid var(--card-border);border-radius:10px;background:var(--card-inner);padding:.25rem .85rem}
|
|
.profile-row{display:grid;grid-template-columns:minmax(120px,28%) 1fr;gap:.5rem 1rem;padding:.6rem 0;border-bottom:1px solid var(--table-border);align-items:start}
|
|
.profile-row:last-child{border-bottom:none}
|
|
.profile-label{color:var(--text-muted);font-size:.84rem;line-height:1.4}
|
|
.profile-value{color:var(--text-primary);font-size:.86rem;line-height:1.5;word-break:break-word}
|
|
.profile-hint{color:var(--planned-text);font-size:.74rem;margin-top:.25rem;line-height:1.35}
|
|
.calc-readonly{background:var(--calc-bg);color:var(--accent)}
|
|
@media(max-width:1100px){
|
|
.split-grid{grid-template-columns:1fr}
|
|
.split-grid .card{min-height:auto}
|
|
}
|
|
</style>
|
|
<link rel="stylesheet" href="{{ url_for('static', filename='css/tech.css') }}">
|
|
<link rel="stylesheet" href="{{ url_for('static', filename='css/responsive.css') }}">
|
|
{% block extra_css %}{% endblock %}
|
|
</head>
|
|
<body>
|
|
<div class="tech-bg" aria-hidden="true">
|
|
<div class="tech-grid"></div>
|
|
<div class="tech-glow"></div>
|
|
<div class="tech-glow-2"></div>
|
|
<div class="tech-scanline"></div>
|
|
</div>
|
|
<div class="page-wrap">
|
|
<header class="site-header">
|
|
<div class="header-bar">
|
|
<button type="button" class="nav-toggle" id="nav-toggle" aria-label="打开菜单" aria-expanded="false" aria-controls="site-nav">
|
|
<span></span><span></span><span></span>
|
|
</button>
|
|
<div class="header-tools">
|
|
<div class="theme-switch" role="group" aria-label="主题模式">
|
|
<button type="button" class="theme-switch-btn" data-theme-pick="dark">深色</button>
|
|
<button type="button" class="theme-switch-btn" data-theme-pick="light">浅色</button>
|
|
</div>
|
|
<button type="button" class="pwa-install-btn" id="pwa-install-btn" hidden>安装 App</button>
|
|
</div>
|
|
<div class="user-bar">{{ session.username or '用户' }}<a href="{{ url_for('logout') }}">退出</a></div>
|
|
</div>
|
|
<p class="pwa-ios-hint" id="pwa-ios-hint">iOS 安装:Safari 浏览器点击底部分享按钮,选择「添加到主屏幕」。</p>
|
|
<h1 class="site-title">国内期货 · 交易监控 + 复盘<span class="site-title-sub">FUTURES MONITOR SYSTEM</span></h1>
|
|
<button type="button" class="nav-backdrop" id="nav-backdrop" aria-label="关闭菜单" hidden></button>
|
|
<nav class="site-nav" id="site-nav">
|
|
<a href="{{ url_for('plans') }}" class="{% if request.endpoint == 'plans' %}active{% endif %}">开单计划</a>
|
|
<a href="{{ url_for('keys') }}" class="{% if request.endpoint == 'keys' %}active{% endif %}">关键位监控</a>
|
|
<a href="{{ url_for('positions') }}" class="{% if request.endpoint == 'positions' %}active{% endif %}">持仓监控</a>
|
|
<a href="{{ url_for('market_page') }}" class="{% if request.endpoint == 'market_page' %}active{% endif %}">行情K线</a>
|
|
<a href="{{ url_for('records') }}" class="{% if request.endpoint in ('records', 'trades') %}active{% endif %}">交易记录与复盘</a>
|
|
<a href="{{ url_for('stats') }}" class="{% if request.endpoint == 'stats' %}active{% endif %}">统计分析</a>
|
|
<a href="{{ url_for('fees') }}" class="{% if request.endpoint == 'fees' %}active{% endif %}">手续费配置</a>
|
|
<a href="{{ url_for('contract_profile_page') }}" class="{% if request.endpoint == 'contract_profile_page' %}active{% endif %}">品种简介</a>
|
|
<a href="{{ url_for('settings') }}" class="{% if request.endpoint == 'settings' %}active{% endif %}">系统设置</a>
|
|
</nav>
|
|
</header>
|
|
<main class="main">
|
|
{% with msg=get_flashed_messages() %}{% if msg %}<div class="flash">{{ msg[0] }}</div>{% endif %}{% endwith %}
|
|
{% block content %}{% endblock %}
|
|
</main>
|
|
</div>
|
|
<script src="{{ url_for('static', filename='js/symbol.js') }}"></script>
|
|
<script src="{{ url_for('static', filename='js/nav.js') }}"></script>
|
|
<script src="{{ url_for('static', filename='js/pwa.js') }}"></script>
|
|
{% block extra_js %}{% endblock %}
|
|
</body>
|
|
</html>
|