From 2954dc2e925a22ad53803ca0effd6a07a392d64a Mon Sep 17 00:00:00 2001 From: Swanky <413564165@qq.com> Date: Tue, 16 Jun 2026 23:51:46 +0800 Subject: [PATCH] Refactor ChinaMap and ExchangeMonitor components for improved functionality and layout; update background image handling in ChinaMap; enhance service status representation in ExchangeMonitor; adjust styles for better visual consistency across components. --- src/components/ChinaMap.vue | 518 ++++++++++++++++++----------- src/components/ExchangeMonitor.vue | 121 +++---- src/components/HeaderBar.vue | 2 +- src/views/Dashboard.vue | 2 + 4 files changed, 395 insertions(+), 248 deletions(-) diff --git a/src/components/ChinaMap.vue b/src/components/ChinaMap.vue index 7c12905..1ca9798 100644 --- a/src/components/ChinaMap.vue +++ b/src/components/ChinaMap.vue @@ -79,6 +79,11 @@
+ image.png
-
+
{{ formatNumber(item.value) }} {{ item.unit }}
@@ -39,14 +39,13 @@ import BaseCard from './BaseCard.vue' const API_URL = '/api/dashboard/exchange-service-info' -const serviceData = ref([ +const SERVICE_ITEMS = [ { key: 'totalSupply', label: '牦牛供应总量', value: 0, unit: '头', icon: '/images/牦牛.png', - valueClass: 'value-green', status: '--', statusClass: 'normal' }, @@ -56,7 +55,6 @@ const serviceData = ref([ value: 0, unit: '头', icon: '/images/牦牛.png', - valueClass: 'value-cyan', status: '--', statusClass: 'normal' }, @@ -66,7 +64,6 @@ const serviceData = ref([ value: 0, unit: '头', icon: '/images/牦牛.png', - valueClass: 'value-green', status: '--', statusClass: 'normal' }, @@ -76,7 +73,6 @@ const serviceData = ref([ value: 0, unit: '辆', icon: '/images/进场车辆.png', - valueClass: 'value-cyan', status: '--', statusClass: 'normal' }, @@ -86,7 +82,6 @@ const serviceData = ref([ value: 0, unit: '个', icon: '/images/剩余车位.png', - valueClass: 'value-red', status: '--', statusClass: 'normal' }, @@ -96,11 +91,12 @@ const serviceData = ref([ value: 0, unit: '家', icon: '/images/供应商数量.png', - valueClass: 'value-blue', status: '--', statusClass: 'normal' } -]) +] + +const serviceData = ref(SERVICE_ITEMS.map((item) => ({ ...item }))) const formatNumber = (num) => { const value = Number(num) || 0 @@ -144,21 +140,23 @@ const resolveSupplierStatus = (value) => { if (value > 50) { return { status: '正常', statusClass: 'normal' } } - return { status: '较少', statusClass: 'low' } + return { status: '较少', statusClass: 'tight' } } const tagToStatusClass = (tag) => { + const text = String(tag || '').trim() const map = { 充足: 'abundant', 正常: 'normal', 紧张: 'tight', 活跃: 'active', - 较少: 'low' + 较少: 'tight' } - return map[tag] || 'normal' + return map[text] || 'normal' } -const applyStatus = (item, data) => { +const buildServiceItem = (template, data) => { + const item = { ...template } const value = Number(data[item.key]) || 0 item.value = value @@ -169,31 +167,31 @@ const applyStatus = (item, data) => { } if (tag) { - item.status = tag - item.statusClass = tagToStatusClass(tag) - return + item.status = String(tag).trim() + item.statusClass = tagToStatusClass(item.status) + return item } if (item.key === 'totalSupply') { Object.assign(item, resolveSupplyStatus(value)) - return + return item } if (item.key === 'forSaleYaks') { Object.assign(item, resolveForSaleStatus(value)) - return + return item } if (item.key === 'remainingParking') { Object.assign(item, resolveParkingStatus(value)) - return + return item } if (item.key === 'supplierCount') { Object.assign(item, resolveSupplierStatus(value)) - return - } - if (item.key === 'soldYaks' || item.key === 'enteringVehicles') { - item.status = '正常' - item.statusClass = 'normal' + return item } + + item.status = '正常' + item.statusClass = 'normal' + return item } const loadData = async () => { @@ -204,13 +202,12 @@ const loadData = async () => { } const result = await response.json() - if (result.code !== 1 || !result.data) { + if (result.code !== undefined && result.code !== 1) { throw new Error(result.message || '接口返回异常') } + const payload = result.data ?? result - serviceData.value.forEach((item) => { - applyStatus(item, result.data) - }) + serviceData.value = SERVICE_ITEMS.map((template) => buildServiceItem(template, payload)) } catch (error) { console.error('加载交易中心实时服务信息失败:', error) } @@ -328,34 +325,60 @@ onUnmounted(() => { font-weight: 500; } -.service-status.abundant { +.service-status.abundant, +.service-value-wrap.abundant .service-value { color: #1afc7a; +} + +.service-status.abundant { border-color: rgba(26, 252, 122, 0.55); background: rgba(26, 252, 122, 0.08); } -.service-status.normal { +.service-value-wrap.abundant .service-value { + text-shadow: 0 0 8px rgba(26, 252, 122, 0.45); +} + +.service-status.normal, +.service-value-wrap.normal .service-value { color: #0385f2; +} + +.service-status.normal { border-color: rgba(3, 133, 242, 0.55); background: rgba(3, 133, 242, 0.08); } -.service-status.tight { +.service-value-wrap.normal .service-value { + text-shadow: 0 0 8px rgba(3, 133, 242, 0.45); +} + +.service-status.tight, +.service-value-wrap.tight .service-value { color: #fe4a46; +} + +.service-status.tight { border-color: rgba(254, 74, 70, 0.55); background: rgba(254, 74, 70, 0.08); } +.service-value-wrap.tight .service-value { + text-shadow: 0 0 8px rgba(254, 74, 70, 0.45); +} + +.service-status.active, +.service-value-wrap.active .service-value { + color: #09fef7; +} + .service-status.active { - color: #0bfdf2; - border-color: rgba(11, 253, 242, 0.55); - background: rgba(11, 253, 242, 0.08); + border-color: rgba(9, 254, 247, 0.55); + background: rgba(9, 254, 247, 0.08); } -.service-status.low { - color: #fe4a46; - border-color: rgba(254, 74, 70, 0.55); - background: rgba(254, 74, 70, 0.08); +.service-value-wrap.active .service-value { + text-shadow: 0 0 8px rgba(9, 254, 247, 0.45); } .service-value-wrap { @@ -370,7 +393,7 @@ onUnmounted(() => { .service-value { display: inline-block; font-family: 'Arial Black', 'Microsoft YaHei', sans-serif; - font-size: 28px; + font-size: 24px; font-weight: 700; font-style: italic; line-height: 1; @@ -388,24 +411,4 @@ onUnmounted(() => { line-height: 1; color: #d9f1ff; } - -.value-green .service-value { - color: #1afc7a; - text-shadow: 0 0 8px rgba(26, 252, 122, 0.45); -} - -.value-blue .service-value { - color: #0385f2; - text-shadow: 0 0 8px rgba(3, 133, 242, 0.45); -} - -.value-cyan .service-value { - color: #0bfdf2; - text-shadow: 0 0 8px rgba(11, 253, 242, 0.45); -} - -.value-red .service-value { - color: #fe4a46; - text-shadow: 0 0 8px rgba(254, 74, 70, 0.45); -} diff --git a/src/components/HeaderBar.vue b/src/components/HeaderBar.vue index 07be685..27d1cd7 100644 --- a/src/components/HeaderBar.vue +++ b/src/components/HeaderBar.vue @@ -56,7 +56,7 @@ const headerStyle = computed(() => ({ padding: 0 40px; background-position: center center; background-repeat: no-repeat; - background-size: 100% 100%; + background-size: 2340px 95px; border-radius: 12px; position: relative; z-index: 10; diff --git a/src/views/Dashboard.vue b/src/views/Dashboard.vue index b732557..12bc5fb 100644 --- a/src/views/Dashboard.vue +++ b/src/views/Dashboard.vue @@ -371,12 +371,14 @@ onMounted(async () => { display: flex; flex-direction: column; min-width: 0; + background: transparent; } .map-container { position: relative; flex: 1; min-height: 0; + background: transparent; } .floating-table {