qa1145's picture
Upload 1245 files
8ede856 verified
<template>
<v-card elevation="1" class="stat-card memory-card">
<v-card-text>
<div class="d-flex align-start">
<div class="icon-wrapper">
<v-icon icon="mdi-memory" size="24"></v-icon>
</div>
<div class="stat-content">
<div class="stat-title">{{ t('stats.memoryUsage.title') }}</div>
<div class="stat-value-wrapper">
<h2 class="stat-value">{{ stat.memory?.process || 0 }} <span class="memory-unit">MiB / {{ stat.memory?.system || 0 }} MiB</span></h2>
<v-chip :color="memoryStatus.color" size="x-small" class="status-chip">
{{ memoryStatus.label }}
</v-chip>
</div>
</div>
</div>
<div class="metrics-container">
<div class="metric-item">
<div class="metric-label">{{ t('stats.memoryUsage.cpuLoad') }}</div>
<div class="metric-value">{{ stat.cpu_percent || '0' }}%</div>
</div>
</div>
</v-card-text>
</v-card>
</template>
<script>
import { useModuleI18n } from '@/i18n/composables';
export default {
name: 'MemoryUsage',
props: ['stat'],
setup() {
const { tm: t } = useModuleI18n('features/dashboard');
return { t };
},
computed: {
memoryPercentage() {
if (!this.stat.memory || !this.stat.memory.process || !this.stat.memory.system) return 0;
return Math.round((this.stat.memory.process / this.stat.memory.system) * 100);
},
memoryStatus() {
const percentage = this.memoryPercentage;
if (percentage < 30) {
return { color: 'success', label: this.t('stats.memoryUsage.status.good') };
} else if (percentage < 70) {
return { color: 'warning', label: this.t('stats.memoryUsage.status.normal') };
} else {
return { color: 'error', label: this.t('stats.memoryUsage.status.high') };
}
}
}
};
</script>
<style scoped>
.stat-card {
height: 100%;
border-radius: 8px;
transition: transform 0.2s, box-shadow 0.2s;
overflow: hidden;
}
.stat-card:hover {
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08) !important;
}
.memory-card {
background-color: #ff9800;
color: white;
}
.icon-wrapper {
display: flex;
align-items: center;
justify-content: center;
width: 48px;
height: 48px;
border-radius: 8px;
margin-right: 16px;
background: rgba(255, 255, 255, 0.2);
}
.stat-content {
flex: 1;
}
.stat-title {
font-size: 14px;
font-weight: 500;
opacity: 0.9;
margin-bottom: 4px;
}
.stat-value-wrapper {
display: flex;
flex-wrap: wrap;
align-items: baseline;
justify-content: space-between;
margin-bottom: 4px;
}
.stat-value {
font-size: 24px;
font-weight: 600;
line-height: 1.2;
}
.memory-unit {
font-size: 14px;
font-weight: 400;
opacity: 0.8;
}
.status-chip {
font-weight: 500;
}
.metrics-container {
display: flex;
background-color: rgba(255, 255, 255, 0.1);
border-radius: 8px;
padding: 4px;
margin-top: 4px;
justify-content: center;
}
.metric-item {
flex: 1;
text-align: center;
}
.metric-label {
font-size: 12px;
opacity: 0.7;
margin-bottom: 4px;
}
.metric-value {
font-size: 14px;
font-weight: 600;
}
</style>