| | |
| | | <div class="data-dashboard"> |
| | | <!-- 顶部指标卡片区 --> |
| | | <div class="top-cards"> |
| | | <div class="cards-container"> |
| | | <!-- 时间周期选项卡片 --> |
| | | <div class="time-period-card"> |
| | | <div class="card-title">时间周期</div> |
| | | <div class="card-title">时间选择</div> |
| | | <div class="time-controls"> |
| | | <div class="time-tab-container"> |
| | | <div |
| | | v-for="tab in timeTabs" |
| | |
| | | {{ tab.label }} |
| | | </div> |
| | | </div> |
| | | <div class="time-navigator"> |
| | | <button class="nav-btn" @click="navigateTime(-1)" title="上一个周期"> |
| | | <svg |
| | | width="16" |
| | | height="16" |
| | | viewBox="0 0 24 24" |
| | | fill="none" |
| | | xmlns="http://www.w3.org/2000/svg" |
| | | > |
| | | <path |
| | | d="M15 18L9 12L15 6" |
| | | stroke="currentColor" |
| | | stroke-width="2" |
| | | stroke-linecap="round" |
| | | stroke-linejoin="round" |
| | | /> |
| | | </svg> |
| | | </button> |
| | | <div class="current-time">{{ currentTimeDisplay }}</div> |
| | | <button class="nav-btn" @click="navigateTime(1)" title="下一个周期"> |
| | | <svg |
| | | width="16" |
| | | height="16" |
| | | viewBox="0 0 24 24" |
| | | fill="none" |
| | | xmlns="http://www.w3.org/2000/svg" |
| | | > |
| | | <path |
| | | d="M9 18L15 12L9 6" |
| | | stroke="currentColor" |
| | | stroke-width="2" |
| | | stroke-linecap="round" |
| | | stroke-linejoin="round" |
| | | /> |
| | | </svg> |
| | | </button> |
| | | </div> |
| | | |
| | | </div> |
| | | </div> |
| | | <div class="cards-container"> |
| | | <!-- 超标数 --> |
| | | <div class="metric-card"> |
| | | <div class="card-header"> |
| | |
| | | <!-- 中部GIS地图区 --> |
| | | <div class="map-section"> |
| | | <div id="map" class="map-container"> |
| | | <BaseMap></BaseMap> |
| | | <BaseMap :showSatellite="true"></BaseMap> |
| | | </div> |
| | | |
| | | <!-- 地图点位弹窗 --> |
| | |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | |
| | | </div> |
| | | <!-- 右侧实时监测总览区 --> |
| | | <div class="overview-section"> |
| | | <div class="section-header"> |
| | | <h3>实时监测总览</h3> |
| | | <span class="view-more">查看更多</span> |
| | | <h3>设备监控</h3> |
| | | <!-- <span class="view-more">查看更多</span> --> |
| | | </div> |
| | | |
| | | <div class="overview-items-container"> |
| | |
| | | <canvas id="deviceStatusChart"></canvas> |
| | | </div> |
| | | </div> |
| | | <!-- 巡查情况统计卡片 --> |
| | | <el-scrollbar class="inspection-section"> |
| | | <div class="section-header"> |
| | | <h3>巡查汇总</h3> |
| | | </div> |
| | | |
| | | <!-- 巡查量统计 --> |
| | | <div class="inspection-metrics"> |
| | | <div class="inspection-metric-item"> |
| | | <div class="inspection-metric-label">店铺总计</div> |
| | | <div class="inspection-metric-value">{{ inspectionStats.totalShops }}</div> |
| | | </div> |
| | | <div class="inspection-metric-item"> |
| | | <div class="inspection-metric-label">巡查店铺</div> |
| | | <div class="inspection-metric-value">{{ inspectionStats.inspectedShops }}</div> |
| | | </div> |
| | | <div class="inspection-metric-item"> |
| | | <div class="inspection-metric-label">巡查点次</div> |
| | | <div class="inspection-metric-value">{{ inspectionStats.inspectionPoints }}</div> |
| | | </div> |
| | | <div class="inspection-metric-item"> |
| | | <div class="inspection-metric-label">复查点次</div> |
| | | <div class="inspection-metric-value">{{ inspectionStats.reviewPoints }}</div> |
| | | </div> |
| | | </div> |
| | | |
| | | <!-- 问题整改情况 --> |
| | | <div class="inspection-chart-container"> |
| | | <div class="section-header"><h3>整改汇总</h3></div> |
| | | <canvas id="rectificationChart"></canvas> |
| | | </div> |
| | | |
| | | <!-- 问题审核情况 --> |
| | | <div class="inspection-table-container"> |
| | | <div class="section-header"><h3>审核汇总</h3></div> |
| | | <div class="inspection-metric-label">问题审核</div> |
| | | <div class="inspection-table"> |
| | | <div class="inspection-metric-item"> |
| | | <div class="inspection-metric-label">无问题</div> |
| | | <div class="inspection-metric-value">{{ inspectionStats.noProblemShops }}</div> |
| | | </div> |
| | | <div class="inspection-metric-item"> |
| | | <div class="inspection-metric-label">未审核</div> |
| | | <div class="inspection-metric-value"> |
| | | {{ inspectionStats.unreviewedProblemShops }} |
| | | </div> |
| | | </div> |
| | | <div class="inspection-metric-item"> |
| | | <div class="inspection-metric-label">部分审核</div> |
| | | <div class="inspection-metric-value"> |
| | | {{ inspectionStats.partiallyReviewedProblemShops }} |
| | | </div> |
| | | </div> |
| | | <div class="inspection-metric-item"> |
| | | <div class="inspection-metric-label">全部审核</div> |
| | | <div class="inspection-metric-value"> |
| | | {{ inspectionStats.fullyReviewedProblemShops }} |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="inspection-metric-label">整改审核</div> |
| | | <div class="inspection-table"> |
| | | <div class="inspection-metric-item"> |
| | | <div class="inspection-metric-label">未整改</div> |
| | | <div class="inspection-metric-value">{{ inspectionStats.unrectifiedShops }}</div> |
| | | </div> |
| | | <div class="inspection-metric-item"> |
| | | <div class="inspection-metric-label">未审核</div> |
| | | <div class="inspection-metric-value"> |
| | | {{ inspectionStats.unreviewedRectifiedShops }} |
| | | </div> |
| | | </div> |
| | | <div class="inspection-metric-item"> |
| | | <div class="inspection-metric-label">部分审核</div> |
| | | <div class="inspection-metric-value"> |
| | | {{ inspectionStats.partiallyReviewedRectifiedShops }} |
| | | </div> |
| | | </div> |
| | | <div class="inspection-metric-item"> |
| | | <div class="inspection-metric-label">全部审核</div> |
| | | <div class="inspection-metric-value"> |
| | | {{ inspectionStats.fullyReviewedRectifiedShops }} |
| | | </div> |
| | | </div> |
| | | <!-- <div class="table-row"> |
| | | <div class="table-cell">无问题店铺数量</div> |
| | | <div class="table-cell value">{{ inspectionStats.noProblemShops }}</div> |
| | | </div> |
| | | <div class="table-row"> |
| | | <div class="table-cell">问题未审核店铺数量</div> |
| | | <div class="table-cell value">{{ inspectionStats.unreviewedProblemShops }}</div> |
| | | </div> |
| | | <div class="table-row"> |
| | | <div class="table-cell">问题部分审核店铺数量</div> |
| | | <div class="table-cell value"> |
| | | {{ inspectionStats.partiallyReviewedProblemShops }} |
| | | </div> |
| | | </div> |
| | | <div class="table-row"> |
| | | <div class="table-cell">问题全部审核店铺数量</div> |
| | | <div class="table-cell value">{{ inspectionStats.fullyReviewedProblemShops }}</div> |
| | | </div> |
| | | <div class="table-row"> |
| | | <div class="table-cell">未整改店铺数</div> |
| | | <div class="table-cell value">{{ inspectionStats.unrectifiedShops }}</div> |
| | | </div> |
| | | <div class="table-row"> |
| | | <div class="table-cell">整改未审核店铺数</div> |
| | | <div class="table-cell value">{{ inspectionStats.unreviewedRectifiedShops }}</div> |
| | | </div> |
| | | <div class="table-row"> |
| | | <div class="table-cell">整改部分审核店铺数</div> |
| | | <div class="table-cell value"> |
| | | {{ inspectionStats.partiallyReviewedRectifiedShops }} |
| | | </div> |
| | | </div> |
| | | <div class="table-row"> |
| | | <div class="table-cell">整改全部审核店铺数</div> |
| | | <div class="table-cell value">{{ inspectionStats.fullyReviewedRectifiedShops }}</div> |
| | | </div> --> |
| | | </div> |
| | | </div> |
| | | </el-scrollbar> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import * as echarts from 'echarts' |
| | | import { onMapMounted, map, AMap } from '@/utils/map/index' |
| | | import { onMapMounted, satellite } from '@/utils/map/index' |
| | | import districtSearch from '@/utils/map/districtsearch.js' |
| | | import marks from '@/utils/map/marks.js' |
| | | import { generateTestShops } from '@/debug/debugdata' |
| | | |
| | | export default { |
| | | name: 'DataDashboard', |
| | | data() { |
| | | return { |
| | | activeTime: 'day', |
| | | currentDate: new Date(), |
| | | timeTabs: [ |
| | | { label: '日', value: 'day' }, |
| | | { label: '周', value: 'week' }, |
| | |
| | | onlineDevices: 220, |
| | | offlineDevices: 25, |
| | | }, |
| | | inspectionStats: { |
| | | // 巡查量 |
| | | totalShops: 245, |
| | | inspectedShops: 180, |
| | | inspectionPoints: 350, |
| | | reviewPoints: 80, |
| | | // 问题整改情况 |
| | | problemCount: 45, |
| | | rectifiedCount: 38, |
| | | rectificationRate: 84.4, |
| | | // 问题审核情况 |
| | | noProblemShops: 135, |
| | | unreviewedProblemShops: 8, |
| | | partiallyReviewedProblemShops: 5, |
| | | fullyReviewedProblemShops: 32, |
| | | unreviewedRectifiedShops: 3, |
| | | partiallyReviewedRectifiedShops: 2, |
| | | fullyReviewedRectifiedShops: 33, |
| | | unrectifiedShops: 7, |
| | | }, |
| | | map: null, |
| | | refreshTimer: null, |
| | | } |
| | | }, |
| | | computed: { |
| | | currentTimeDisplay() { |
| | | const date = this.currentDate |
| | | switch (this.activeTime) { |
| | | case 'day': |
| | | return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}` |
| | | case 'week': |
| | | // 简单计算周显示,实际项目中可能需要更复杂的周计算逻辑 |
| | | let weekStart = new Date(date) |
| | | weekStart.setDate(date.getDate() - date.getDay() + 1) |
| | | let weekEnd = new Date(date) |
| | | weekEnd.setDate(date.getDate() + (7 - date.getDay())) |
| | | return `${weekStart.getFullYear()}-${String(weekStart.getMonth() + 1).padStart(2, '0')}-${String(weekStart.getDate()).padStart(2, '0')} ~ ${weekEnd.getFullYear()}-${String(weekEnd.getMonth() + 1).padStart(2, '0')}-${String(weekEnd.getDate()).padStart(2, '0')}` |
| | | case 'month': |
| | | return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}` |
| | | default: |
| | | return '' |
| | | } |
| | | }, |
| | | }, |
| | | mounted() { |
| | | this.initMap() |
| | | this.initDeviceStatusChart() |
| | | this.initRectificationChart() |
| | | this.startAutoRefresh() |
| | | }, |
| | | beforeUnmount() { |
| | |
| | | // 模拟切换时间周期后的数据更新 |
| | | this.updateMetrics() |
| | | }, |
| | | getPeriodLabel() { |
| | | navigateTime(direction) { |
| | | const newDate = new Date(this.currentDate) |
| | | switch (this.activeTime) { |
| | | case 'day': |
| | | return '今日' |
| | | newDate.setDate(newDate.getDate() + direction) |
| | | break |
| | | case 'week': |
| | | return '本周' |
| | | newDate.setDate(newDate.getDate() + direction * 7) |
| | | break |
| | | case 'month': |
| | | return '本月' |
| | | default: |
| | | newDate.setMonth(newDate.getMonth() + direction) |
| | | break |
| | | } |
| | | this.currentDate = newDate |
| | | // 模拟切换时间后的数据更新 |
| | | this.updateMetrics() |
| | | }, |
| | | getPeriodLabel() { |
| | | const today = new Date() |
| | | const isToday = |
| | | this.activeTime === 'day' && |
| | | this.currentDate.getDate() === today.getDate() && |
| | | this.currentDate.getMonth() === today.getMonth() && |
| | | this.currentDate.getFullYear() === today.getFullYear() |
| | | |
| | | if (isToday) { |
| | | return '今日' |
| | | } |
| | | |
| | | switch (this.activeTime) { |
| | | case 'day': |
| | | return '当日' |
| | | case 'week': |
| | | return '当周' |
| | | case 'month': |
| | | return '当月' |
| | | default: |
| | | return '当日' |
| | | } |
| | | }, |
| | | getCompareLabel() { |
| | |
| | | taskCompletionRate: Math.floor(Math.random() * 40) + 60, |
| | | taskCompletionRateTrend: Math.floor(Math.random() * 15) - 7, |
| | | } |
| | | |
| | | // 更新巡查统计数据 |
| | | this.inspectionStats = { |
| | | totalShops: 245, |
| | | inspectedShops: Math.floor(Math.random() * 50) + 150, |
| | | inspectionPoints: Math.floor(Math.random() * 100) + 300, |
| | | reviewPoints: Math.floor(Math.random() * 50) + 50, |
| | | problemCount: Math.floor(Math.random() * 30) + 20, |
| | | rectifiedCount: Math.floor(Math.random() * 25) + 15, |
| | | rectificationRate: Math.round((Math.random() * 30 + 70) * 10) / 10, |
| | | noProblemShops: Math.floor(Math.random() * 50) + 100, |
| | | unreviewedProblemShops: Math.floor(Math.random() * 10), |
| | | partiallyReviewedProblemShops: Math.floor(Math.random() * 8), |
| | | fullyReviewedProblemShops: Math.floor(Math.random() * 20) + 15, |
| | | unreviewedRectifiedShops: Math.floor(Math.random() * 5), |
| | | partiallyReviewedRectifiedShops: Math.floor(Math.random() * 5), |
| | | fullyReviewedRectifiedShops: Math.floor(Math.random() * 20) + 15, |
| | | unrectifiedShops: Math.floor(Math.random() * 10), |
| | | } |
| | | |
| | | // 更新图表 |
| | | this.initRectificationChart() |
| | | }, 300) |
| | | }, |
| | | initMap() { |
| | | // setTimeout(() => { |
| | | districtSearch.removeDistrict() |
| | | districtSearch.drawDistrict('上海市') |
| | | districtSearch.drawDistrictMask('上海市') |
| | | // districtSearch.districtLayer('310106') |
| | | // }, 2000) |
| | | |
| | | onMapMounted(() => { |
| | | setTimeout(() => { |
| | | marks.clearMassMarks() |
| | | const shops = generateTestShops() |
| | | console.log(shops) |
| | | |
| | | marks.drawMassMarks(shops) |
| | | }, 2000) |
| | | }) |
| | | }, |
| | | initDeviceStatusChart() { |
| | | const chartDom = document.getElementById('deviceStatusChart') |
| | |
| | | chart.setOption(option) |
| | | |
| | | // 响应式调整 |
| | | window.addEventListener('resize', () => { |
| | | chart.resize() |
| | | }) |
| | | // window.addEventListener('resize', () => { |
| | | // chart.resize() |
| | | // }) |
| | | } |
| | | }, |
| | | initRectificationChart() { |
| | | const chartDom = document.getElementById('rectificationChart') |
| | | if (chartDom) { |
| | | const chart = echarts.init(chartDom) |
| | | const option = { |
| | | tooltip: { |
| | | trigger: 'axis', |
| | | axisPointer: { |
| | | type: 'shadow', |
| | | }, |
| | | backgroundColor: 'rgba(255, 255, 255, 0.95)', |
| | | borderColor: '#e8e8e8', |
| | | borderWidth: 1, |
| | | textStyle: { |
| | | color: '#333', |
| | | }, |
| | | }, |
| | | grid: { |
| | | left: '3%', |
| | | right: '4%', |
| | | bottom: '3%', |
| | | containLabel: true, |
| | | }, |
| | | xAxis: { |
| | | type: 'category', |
| | | data: ['问题数', '整改数'], |
| | | axisLabel: { |
| | | color: '#86909c', |
| | | fontSize: 12, |
| | | }, |
| | | }, |
| | | yAxis: { |
| | | type: 'value', |
| | | axisLabel: { |
| | | color: '#86909c', |
| | | fontSize: 12, |
| | | }, |
| | | }, |
| | | series: [ |
| | | { |
| | | name: '数量', |
| | | type: 'bar', |
| | | data: [ |
| | | { |
| | | value: this.inspectionStats.problemCount, |
| | | itemStyle: { |
| | | color: '#fa8c16', |
| | | }, |
| | | }, |
| | | { |
| | | value: this.inspectionStats.rectifiedCount, |
| | | itemStyle: { |
| | | color: '#52c41a', |
| | | }, |
| | | }, |
| | | ], |
| | | barWidth: '60%', |
| | | label: { |
| | | show: true, |
| | | position: 'top', |
| | | color: '#262626', |
| | | fontSize: 12, |
| | | }, |
| | | }, |
| | | ], |
| | | } |
| | | chart.setOption(option) |
| | | |
| | | // 响应式调整 |
| | | // window.addEventListener('resize', () => { |
| | | // chart.resize() |
| | | // }) |
| | | } |
| | | }, |
| | | startAutoRefresh() { |
| | |
| | | /* 全局样式 */ |
| | | .data-dashboard { |
| | | width: 100%; |
| | | height: calc(100vh - 60px); |
| | | height: calc(100vh - 70px); |
| | | background-color: #f5f7fa; |
| | | color: #333; |
| | | box-sizing: border-box; |
| | |
| | | /* 顶部指标卡片区 */ |
| | | .top-cards { |
| | | position: absolute; |
| | | top: 24px; |
| | | left: 24px; |
| | | top: 4px; |
| | | left: 4px; |
| | | z-index: 10; |
| | | margin-bottom: 24px; |
| | | } |
| | | |
| | | .cards-container { |
| | | display: grid; |
| | | grid-template-columns: 280px; |
| | | grid-template-rows: auto repeat(4, auto); |
| | | gap: 16px; |
| | | background-color: rgba(255, 255, 255, 0.9); |
| | | padding: 16px; |
| | | grid-template-columns: repeat(2, 180px); |
| | | grid-template-rows: auto repeat(2, auto); |
| | | gap: 8px; |
| | | /* background-color: rgba(255, 255, 255, 0.9); */ |
| | | /* padding: 16px; */ |
| | | border-radius: 8px; |
| | | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); |
| | | /* box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); */ |
| | | } |
| | | |
| | | /* 时间周期卡片 */ |
| | | .time-period-card { |
| | | background-color: #ffffff; |
| | | border-radius: 8px; |
| | | padding: 20px; |
| | | padding: 4px 16px; |
| | | box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08); |
| | | display: flex; |
| | | flex-direction: column; |
| | | justify-content: center; |
| | | margin-bottom: 8px; |
| | | min-width: 300px; |
| | | } |
| | | |
| | | .time-period-card .card-title { |
| | |
| | | font-weight: 500; |
| | | margin-bottom: 16px; |
| | | text-align: center; |
| | | } |
| | | |
| | | .time-controls { |
| | | display: flex; |
| | | flex-direction: column; |
| | | gap: 16px; |
| | | } |
| | | |
| | | .time-tab-container { |
| | |
| | | } |
| | | |
| | | .time-tab { |
| | | padding: 2px 4px; |
| | | padding: 4px 8px; |
| | | border-radius: 4px; |
| | | cursor: pointer; |
| | | font-size: 14px; |
| | |
| | | text-align: center; |
| | | border: 1px solid #e8e8e8; |
| | | background-color: #fafafa; |
| | | flex: 1; |
| | | } |
| | | |
| | | .time-tab.active { |
| | |
| | | color: #1890ff; |
| | | border-color: #e6f7ff; |
| | | background-color: #e6f7ff; |
| | | } |
| | | |
| | | .time-navigator { |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | gap: 12px; |
| | | padding: 8px 0; |
| | | } |
| | | |
| | | .nav-btn { |
| | | width: 32px; |
| | | height: 32px; |
| | | border: 1px solid #e8e8e8; |
| | | background-color: #fafafa; |
| | | border-radius: 4px; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | cursor: pointer; |
| | | transition: all 0.3s ease; |
| | | color: #4e5969; |
| | | } |
| | | |
| | | .nav-btn:hover { |
| | | border-color: #1890ff; |
| | | color: #1890ff; |
| | | background-color: #e6f7ff; |
| | | } |
| | | |
| | | .current-time { |
| | | font-size: 14px; |
| | | font-weight: 500; |
| | | color: #262626; |
| | | min-width: 180px; |
| | | text-align: center; |
| | | padding: 0 12px; |
| | | } |
| | | |
| | | /* 指标卡片 */ |
| | |
| | | /* 右侧实时监测总览区 */ |
| | | .overview-section { |
| | | position: absolute; |
| | | top: 200px; |
| | | right: 24px; |
| | | bottom: 4px; |
| | | left: 4px; |
| | | width: 320px; |
| | | background-color: rgba(255, 255, 255, 0.9); |
| | | border-radius: 8px; |
| | |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | margin-bottom: 24px; |
| | | padding-bottom: 16px; |
| | | border-bottom: 1px solid #f0f0f0; |
| | | } |
| | |
| | | |
| | | .device-status-chart { |
| | | flex: 1; |
| | | margin-top: 16px; |
| | | min-height: 200px; |
| | | min-height: 100px; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | margin-bottom: 16px; |
| | | } |
| | | |
| | | /* 巡查情况统计 */ |
| | | .inspection-section { |
| | | position: absolute; |
| | | top: 4px; |
| | | right: 4px; |
| | | width: 320px; |
| | | background-color: rgba(255, 255, 255, 0.9); |
| | | border-radius: 8px; |
| | | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); |
| | | padding: 20px; |
| | | display: flex; |
| | | flex-direction: column; |
| | | z-index: 10; |
| | | max-height: calc(70vh); |
| | | border-top: 1px solid #f0f0f0; |
| | | } |
| | | |
| | | .inspection-metrics { |
| | | display: grid; |
| | | grid-template-columns: repeat(2, 1fr); |
| | | gap: 12px; |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .inspection-metric-item { |
| | | background-color: #fafafa; |
| | | border-radius: 6px; |
| | | padding: 12px; |
| | | text-align: center; |
| | | } |
| | | |
| | | .inspection-metric-label { |
| | | font-size: 12px; |
| | | color: #86909c; |
| | | margin-bottom: 4px; |
| | | } |
| | | |
| | | .inspection-metric-value { |
| | | font-size: 18px; |
| | | font-weight: bold; |
| | | color: #262626; |
| | | } |
| | | |
| | | .inspection-chart-container { |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .chart-title { |
| | | font-size: 14px; |
| | | font-weight: 500; |
| | | color: #262626; |
| | | margin-bottom: 12px; |
| | | } |
| | | |
| | | .inspection-table-container { |
| | | /* max-height: 200px; */ |
| | | /* overflow-y: auto; */ |
| | | } |
| | | |
| | | .inspection-table { |
| | | /* width: 100%; |
| | | border-collapse: collapse; */ |
| | | display: grid; |
| | | grid-template-columns: repeat(4, 1fr); |
| | | gap: 2px; |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .table-row { |
| | | display: flex; |
| | | border-bottom: 1px solid #f0f0f0; |
| | | padding: 8px 0; |
| | | } |
| | | |
| | | .table-row:last-child { |
| | | border-bottom: none; |
| | | } |
| | | |
| | | .table-cell { |
| | | flex: 1; |
| | | font-size: 12px; |
| | | color: #4e5969; |
| | | } |
| | | |
| | | .table-cell.value { |
| | | font-weight: 500; |
| | | color: #262626; |
| | | text-align: right; |
| | | } |
| | | |
| | | /* 弹窗样式 */ |
| | |
| | | } |
| | | |
| | | /* 响应式设计 */ |
| | | @media (max-width: 1200px) { |
| | | /* @media (max-width: 1200px) { |
| | | .top-cards { |
| | | position: relative; |
| | | margin-bottom: 24px; |
| | |
| | | margin-top: 16px; |
| | | background-color: #ffffff; |
| | | } |
| | | } |
| | | } */ |
| | | |
| | | @media (max-width: 768px) { |
| | | /* @media (max-width: 768px) { |
| | | .data-dashboard { |
| | | padding: 16px; |
| | | } |
| | |
| | | width: 100%; |
| | | text-align: left; |
| | | } |
| | | } |
| | | } */ |
| | | </style> |