From 7debee6d82c4fbd05c002bd840a71abb32756cbc Mon Sep 17 00:00:00 2001 From: sitga <2389647927@qq.com> Date: Wed, 18 Mar 2026 16:06:46 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E7=BE=8E=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/pages/AssetList.vue | 185 +++++++----- frontend/src/pages/Dashboard.vue | 166 ++++++++--- frontend/src/pages/Login.vue | 276 +++++++++++++++-- frontend/src/styles/main.css | 496 ++++++++++++++++++++++--------- 4 files changed, 832 insertions(+), 291 deletions(-) diff --git a/frontend/src/pages/AssetList.vue b/frontend/src/pages/AssetList.vue index b05e384..8ee0fcd 100644 --- a/frontend/src/pages/AssetList.vue +++ b/frontend/src/pages/AssetList.vue @@ -766,97 +766,106 @@ onMounted(async () => { .asset-page { display: flex; flex-direction: column; - gap: 12px; + gap: 16px; min-height: calc(100vh - 150px); } .page-head, .filter-panel, .table-panel { - background: #fff; - border: 1px solid #d9e2ec; - border-radius: 6px; + background: var(--surface); + border: none; + border-radius: var(--radius); + box-shadow: var(--shadow); } .page-head { display: flex; align-items: flex-start; justify-content: space-between; - gap: 12px; - padding: 12px 14px; + gap: 16px; + padding: 18px 20px; } .head-actions { display: flex; - gap: 8px; + gap: 10px; flex-wrap: wrap; } .filter-panel { - padding: 12px 14px; + padding: 18px 20px; } .filter-row { display: flex; flex-wrap: wrap; - gap: 8px; + gap: 10px; align-items: center; } .keyword-input { - width: 320px; + width: 340px; } .summary-strip { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); - gap: 8px; - margin-top: 10px; + gap: 12px; + margin-top: 14px; } .summary-card { display: flex; align-items: center; - gap: 10px; - min-height: 58px; - padding: 10px 12px; - border: 1px solid #e4e7ec; - background: #fbfcfd; + gap: 12px; + min-height: 68px; + padding: 14px 16px; + border: none; + background: var(--surface); + border-radius: var(--radius-sm); + box-shadow: var(--shadow-sm); + transition: var(--transition); +} + +.summary-card:hover { + box-shadow: var(--shadow); + transform: translateY(-2px); } .summary-icon { display: flex; align-items: center; justify-content: center; - width: 28px; - height: 28px; - border-radius: 4px; - font-size: 14px; + width: 40px; + height: 40px; + border-radius: var(--radius-sm); + font-size: 18px; } .summary-icon.is-blue { - color: #155eef; - background: #eff4ff; + color: var(--brand); + background: var(--brand-soft); } .summary-icon.is-green { - color: #067647; - background: #ecfdf3; + color: var(--success); + background: var(--success-soft); } .summary-icon.is-amber { - color: #b54708; - background: #fffaeb; + color: var(--warning); + background: var(--warning-soft); } .summary-icon.is-red { - color: #b42318; - background: #fef3f2; + color: var(--danger); + background: var(--danger-soft); } .summary-icon.is-slate { - color: #344054; - background: #f2f4f7; + color: var(--text-sub); + background: var(--surface-muted); } .summary-body { @@ -865,15 +874,17 @@ onMounted(async () => { .summary-label { font-size: 12px; - color: #667085; + color: var(--text-sub); + font-weight: 500; } .summary-value { - margin-top: 2px; - font-size: 20px; + margin-top: 4px; + font-size: 22px; font-weight: 700; line-height: 1; - color: #101828; + color: var(--text-main); + letter-spacing: -0.02em; } .table-panel { @@ -881,26 +892,27 @@ onMounted(async () => { flex-direction: column; min-height: 0; padding: 0; + overflow: hidden; } .table-head { display: flex; align-items: center; justify-content: space-between; - gap: 12px; - padding: 12px 14px 8px; - border-bottom: 1px solid #e4e7ec; + gap: 16px; + padding: 16px 20px; + border-bottom: 1px solid var(--line); } .table-title { - font-size: 14px; + font-size: 15px; font-weight: 700; - color: #1f2937; + color: var(--text-main); } .table-meta { - font-size: 12px; - color: #667085; + font-size: 13px; + color: var(--text-sub); } .asset-table { @@ -908,41 +920,45 @@ onMounted(async () => { } .asset-table :deep(.el-table__header th) { - background: #f8fafc; - color: #344054; - font-weight: 700; + background: var(--surface-muted); + color: var(--text-main); + font-weight: 600; + font-size: 12px; + text-transform: uppercase; + letter-spacing: 0.05em; } .asset-table :deep(.el-table__cell) { - padding: 8px 0; + padding: 10px 0; } .asset-table :deep(.cell) { - line-height: 1.3; + line-height: 1.4; } .cell-stack { display: flex; flex-direction: column; - gap: 4px; + gap: 6px; } .cell-line { display: flex; align-items: center; - gap: 8px; + gap: 10px; flex-wrap: wrap; min-width: 0; } .cell-line-main { - color: #101828; + color: var(--text-main); font-weight: 600; + font-size: 14px; } .cell-line-sub { font-size: 12px; - color: #667085; + color: var(--text-sub); } .asset-name { @@ -953,67 +969,69 @@ onMounted(async () => { } .muted-text { - color: #667085; + color: var(--text-sub); } .row-actions { display: flex; align-items: center; - gap: 4px; + gap: 6px; flex-wrap: wrap; } .table-empty { - padding: 36px 0; + padding: 48px 0; text-align: center; } .table-empty-title { - font-size: 14px; - font-weight: 700; - color: #101828; + font-size: 15px; + font-weight: 600; + color: var(--text-main); } .table-empty-sub { - margin-top: 4px; - font-size: 12px; - color: #667085; + margin-top: 6px; + font-size: 13px; + color: var(--text-sub); } .table-footer { display: flex; justify-content: flex-end; - padding: 10px 14px 14px; - border-top: 1px solid #e4e7ec; + padding: 14px 20px; + border-top: 1px solid var(--line); } .detail-layout { display: flex; flex-direction: column; - gap: 16px; + gap: 20px; } .detail-section { - border: 1px solid #e4e7ec; - background: #fff; + border: none; + background: var(--surface-muted); + border-radius: var(--radius); + overflow: hidden; } .detail-section-title, .form-section-title { - padding: 10px 12px; - font-size: 13px; + padding: 14px 18px; + font-size: 14px; font-weight: 700; - color: #1f2937; - border-bottom: 1px solid #e4e7ec; - background: #f8fafc; + color: var(--text-main); + border-bottom: 1px solid var(--line); + background: var(--surface); } .detail-grid, .form-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); - gap: 12px 16px; - padding: 14px; + gap: 16px 24px; + padding: 18px; } .detail-item { @@ -1027,13 +1045,14 @@ onMounted(async () => { .detail-label { font-size: 12px; - color: #667085; + color: var(--text-sub); + font-weight: 500; } .detail-value { - margin-top: 4px; - font-size: 13px; - color: #101828; + margin-top: 6px; + font-size: 14px; + color: var(--text-main); word-break: break-all; } @@ -1042,13 +1061,16 @@ onMounted(async () => { } .form-section { - margin-top: 12px; - border: 1px solid #e4e7ec; + margin-top: 16px; + border: none; + background: var(--surface-muted); + border-radius: var(--radius); + overflow: hidden; } @media (max-width: 1200px) { .summary-strip { - grid-template-columns: repeat(2, minmax(0, 1fr)); + grid-template-columns: repeat(3, minmax(0, 1fr)); } } @@ -1063,7 +1085,10 @@ onMounted(async () => { width: 100%; } - .summary-strip, + .summary-strip { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + .detail-grid, .form-grid { grid-template-columns: 1fr; diff --git a/frontend/src/pages/Dashboard.vue b/frontend/src/pages/Dashboard.vue index c1b540a..69e1a35 100644 --- a/frontend/src/pages/Dashboard.vue +++ b/frontend/src/pages/Dashboard.vue @@ -306,151 +306,223 @@ onMounted(refresh); .metric-list, .status-list { display: grid; - gap: 10px; + gap: 12px; } .metric-item, .category-item { - padding: 10px 12px; - border: 1px solid #d8e2eb; - border-radius: 6px; - background: #f7fafc; + padding: 14px 16px; + border: none; + border-radius: var(--radius-sm); + background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%); + transition: var(--transition); +} + +.metric-item:hover, +.category-item:hover { + background: linear-gradient(135deg, #f1f5f9 0%, #e2e8f0 100%); + transform: translateX(4px); } .metric-top { display: flex; justify-content: space-between; - gap: 8px; - font-size: 13px; - color: #314b60; + align-items: center; + gap: 12px; + font-size: 14px; + color: var(--text-sub); + font-weight: 500; } .metric-top strong { - font-size: 16px; - color: #1f3447; + font-size: 22px; + color: var(--text-main); + font-weight: 700; + letter-spacing: -0.02em; } .metric-track, .status-track { - margin-top: 8px; - height: 6px; - background: #e3ebf2; + margin-top: 10px; + height: 8px; + background: #e2e8f0; border-radius: 999px; overflow: hidden; } -.metric-fill, +.metric-fill { + height: 100%; + background: linear-gradient(90deg, #3b82f6 0%, #2563eb 100%); + border-radius: 999px; + transition: width 0.6s cubic-bezier(0.4, 0, 0.2, 1); +} + .status-fill { height: 100%; - background: #3a78b7; + background: linear-gradient(90deg, #10b981 0%, #059669 100%); + border-radius: 999px; + transition: width 0.6s cubic-bezier(0.4, 0, 0.2, 1); } .status-item { display: grid; - grid-template-columns: 80px 1fr 42px; + grid-template-columns: 72px 1fr 48px; align-items: center; - gap: 10px; + gap: 12px; + padding: 12px 16px; + border: none; + border-radius: var(--radius-sm); + background: var(--surface); + box-shadow: var(--shadow-sm); + transition: var(--transition); } -.status-label, -.status-value { - font-size: 12px; - color: #566d80; +.status-item:hover { + box-shadow: var(--shadow); + transform: translateY(-1px); +} + +.status-label { + font-size: 13px; + color: var(--text-sub); + font-weight: 500; } .status-value { + font-size: 16px; + font-weight: 700; + color: var(--text-main); text-align: right; - font-weight: 600; - color: #1f3447; } .timeline-chart { display: grid; - grid-template-columns: 44px 1fr; - gap: 10px; + grid-template-columns: 48px 1fr; + gap: 16px; align-items: center; + padding: 8px 0; } .y-axis { display: grid; grid-template-rows: repeat(3, 1fr); font-size: 11px; - color: #708494; + color: var(--text-soft); text-align: right; - padding-right: 4px; + padding-right: 8px; + font-weight: 500; } .chart-area { display: flex; flex-direction: column; - gap: 8px; + gap: 12px; } .chart-canvas { position: relative; width: 100%; - height: 168px; + height: 180px; + background: linear-gradient(180deg, rgba(59, 130, 246, 0.02) 0%, transparent 100%); + border-radius: var(--radius-sm); } .timeline-svg { width: 100%; - height: 168px; + height: 180px; } .timeline-grid { - stroke: #dde7ef; - stroke-width: 0.6; + stroke: #e2e8f0; + stroke-width: 0.8; fill: none; } .timeline-line { fill: none; - stroke: #2f76ba; - stroke-width: 0.26; + stroke: url(#lineGradient); + stroke: #3b82f6; + stroke-width: 2.5; stroke-linecap: round; stroke-linejoin: round; vector-effect: non-scaling-stroke; + filter: drop-shadow(0 2px 4px rgba(59, 130, 246, 0.3)); } .timeline-dot { position: absolute; - width: 4px; - height: 4px; + width: 8px; + height: 8px; border-radius: 50%; - background: #2f76ba; + background: #3b82f6; + border: 2px solid #ffffff; + box-shadow: 0 2px 8px rgba(59, 130, 246, 0.4); transform: translate(-50%, -50%); + transition: var(--transition); +} + +.timeline-dot:hover { + transform: translate(-50%, -50%) scale(1.5); } .x-axis { display: grid; - grid-template-columns: repeat(auto-fit, minmax(24px, 1fr)); - gap: 2px; + grid-template-columns: repeat(auto-fit, minmax(28px, 1fr)); + gap: 4px; font-size: 10px; - color: #708494; + color: var(--text-soft); text-align: center; + font-weight: 500; } .category-grid { display: grid; - grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); - gap: 10px; + grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); + gap: 12px; +} + +.category-item { + padding: 16px; + border: none; + border-radius: var(--radius-sm); + background: var(--surface); + box-shadow: var(--shadow-sm); + transition: var(--transition); +} + +.category-item:hover { + box-shadow: var(--shadow); + transform: translateY(-2px); } .category-name { - font-size: 12px; - color: #5e7383; + font-size: 13px; + color: var(--text-sub); + font-weight: 500; } .category-count { - margin-top: 6px; - font-size: 18px; + margin-top: 8px; + font-size: 24px; font-weight: 700; - color: #1f3447; + color: var(--text-main); + letter-spacing: -0.02em; +} + +.admin-empty { + padding: 32px 0; + font-size: 14px; + text-align: center; + color: var(--text-soft); } @media (max-width: 1100px) { .dashboard-grid { grid-template-columns: 1fr; } + + .category-grid { + grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); + } } diff --git a/frontend/src/pages/Login.vue b/frontend/src/pages/Login.vue index 2b7cf13..c071a22 100644 --- a/frontend/src/pages/Login.vue +++ b/frontend/src/pages/Login.vue @@ -1,26 +1,52 @@ @@ -28,7 +54,7 @@