You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

165 lines
3.8 KiB
Vue

5 months ago
<!--
* @Author: chris
* @Date: 2025-08-25 15:51:13
* @LastEditors: chris
* @LastEditTime: 2025-10-14 16:14:16
5 months ago
-->
<script setup>
import ModuleTitle from './moduleTitle.vue';
import { soilDict, soilTypes } from '../config';
5 months ago
// 状态颜色映射
const statusColors = {
normal: '#52c41a',
warning: '#faad14',
danger: '#ff4d4f'
};
const props = defineProps({
soilData: {
type: Array,
default: () => [],
}
})
const formateData = ref({})
const liveData = computed(() => {
return createLiveData(formateData.value)
});
onMounted(() => {
formateData.value = formatData(props.soilData)
})
function createLiveData (data) {
const liveData = []
Object.keys(data).forEach((type, index) => {
const dictItem = soilDict[type]
liveData.push({
id: index + 1,
title: dictItem.name,
type,
value: data[type][0]?.value || '--',
icon: dictItem.icon,
color: dictItem.color,
unit: dictItem.unit,
})
})
return liveData;
}
function formatData(data) {
const obj = {};
const res = {};
// data.sort((a,b) => soilTypes.indexOf(a.identifier) - soilTypes.indexOf(b.identifier))
data.forEach(item => {
const identifier = item.identifier;
if (!identifier || identifier === 'null') return false;
obj[identifier] ? obj[identifier].push(item) : (obj[identifier] = [item])
})
soilTypes.forEach(type => {
res[type] = obj[type] || []
})
return res;
}
5 months ago
</script>
<template>
<div class="soil-info">
<ModuleTitle class="soil-title" title="土壤信息" icon="duocengturangshangqing" />
<div class="soil-data-grid">
<div
v-for="item in liveData"
5 months ago
:key="item.id"
class="soil-data-card"
>
<div class="soil-data-icon" :style="{ backgroundColor: item.color + '20' }">
<svg-icon class="item-icon" :icon-class="item.icon" :color="item.color"/>
</div>
<div class="soil-data-content">
<div class="soil-data-value-group">
<span class="soil-data-value">{{ item.value }}</span>
<span class="soil-data-unit">{{ item.unit }}</span>
</div>
<div class="soil-data-name">{{ item.title }}</div>
5 months ago
<!-- <div class="soil-data-status" :style="{ color: statusColors[item.status] }">
{{ item.description }}
</div> -->
</div>
</div>
</div>
</div>
</template>
<style lang="scss" scoped>
// 定义SCSS变量
$primary-color: #4dabf7;
$border-radius: 6px;
$transition: all 0.3s ease;
.soil-info {
@apply h-full p-20px overflow-hidden flex flex-col;
}
.soil-title {
@apply mb-10px;
}
// 土壤数据网格布局
.soil-data-grid {
@apply grid grid-cols-3 gap-1 flex-1 overflow-auto p-1 h-full;
// 自定义滚动条
&::-webkit-scrollbar {
@apply w-1;
}
&::-webkit-scrollbar-track {
@apply bg-[rgba(255,255,255,0.05)] rounded-full;
}
&::-webkit-scrollbar-thumb {
@apply bg-[rgba(255,255,255,0.2)] rounded-full hover:bg-[rgba(255,255,255,0.3)] transition-colors;
}
}
// 土壤数据卡片
.soil-data-card {
@apply px-2.5 py-1.5 rounded-lg border border-transparent cursor-pointer hover:border-[rgba(255,255,255,0.2)] transition-all duration-300 flex items-center gap-1.5;
background: rgba(255, 255, 255, 0.08);
min-height: 48px;
}
// 土壤数据图标
.soil-data-icon {
@apply w-50px h-50px rounded-full flex items-center justify-center flex-shrink-0;
.item-icon {
@apply w-26px h-26px;
}
}
// 土壤数据内容
.soil-data-content {
@apply flex-1 min-w-0 flex flex-col justify-between;
}
.soil-data-value-group {
@apply flex items-baseline gap-1;
}
.soil-data-value {
@apply text-lg font-bold text-white;
}
.soil-data-unit {
@apply text-xs text-[#a0a0a0];
}
.soil-data-name {
@apply text-sm font-medium text-white mt-0.5;
}
.soil-data-status {
@apply text-xs mt-0.5;
}
</style>