1
0
mirror of https://github.com/1Panel-dev/1Panel.git synced 2025-03-15 10:14:44 +08:00

191 lines
7.5 KiB
Vue

<template>
<div v-loading="loading">
<CardWithHeader :header="$t('menu.container')" class="mt-5">
<template #body>
<span class="count" @click="goRouter('Container')">{{ countItem.containerCount }}</span>
</template>
<template #header-l>
<el-tag size="small" class="ml-5" v-if="countItem.all" effect="plain">
{{ $t('commons.table.all') }} * {{ countItem.all }}
</el-tag>
<el-tag size="small" v-if="countItem.running" effect="plain" class="ml-2">
{{ $t('commons.status.running') }} * {{ countItem.running }}
</el-tag>
<el-tag size="small" v-if="countItem.created" effect="plain" class="ml-2">
{{ $t('commons.status.created') }} * {{ countItem.created }}
</el-tag>
<el-tag size="small" v-if="countItem.paused" effect="plain" class="ml-2">
{{ $t('commons.status.paused') }} * {{ countItem.paused }}
</el-tag>
<el-tag size="small" v-if="countItem.restarting" effect="plain" class="ml-2">
{{ $t('commons.status.restarting') }} * {{ countItem.restarting }}
</el-tag>
<el-tag size="small" v-if="countItem.removing" effect="plain" class="ml-2">
{{ $t('commons.status.removing') }} * {{ countItem.removing }}
</el-tag>
<el-tag size="small" v-if="countItem.exited" effect="plain" class="ml-2">
{{ $t('commons.status.exited') }} * {{ countItem.exited }}
</el-tag>
<el-tag size="small" v-if="countItem.dead" effect="plain" class="ml-2">
{{ $t('commons.status.dead') }} * {{ countItem.dead }}
</el-tag>
</template>
</CardWithHeader>
<el-row :gutter="20" class="mt-5">
<el-col :span="8">
<CardWithHeader :header="$t('container.compose')">
<template #body>
<span class="count" @click="goRouter('Compose')">{{ countItem.composeCount }}</span>
</template>
</CardWithHeader>
</el-col>
<el-col :span="8">
<CardWithHeader :header="$t('container.composeTemplate')">
<template #body>
<span class="count" @click="goRouter('ComposeTemplate')">
{{ countItem.composeTemplateCount }}
</span>
</template>
</CardWithHeader>
</el-col>
<el-col :span="8">
<CardWithHeader :header="$t('container.image')">
<template #body>
<span class="count" @click="goRouter('Image')">{{ countItem.imageCount }}</span>
</template>
<template #header-l>
<span v-if="countItem.imageSize" effect="plain" class="ml-2 text-xs">
{{ $t('commons.status.used') }}: {{ computeSize(countItem.imageSize) }}
</span>
</template>
</CardWithHeader>
</el-col>
</el-row>
<el-row :gutter="20" class="mt-5">
<el-col :span="8">
<CardWithHeader :header="$t('container.imageRepo')">
<template #body>
<span class="count" @click="goRouter('Repo')">{{ countItem.repoCount }}</span>
</template>
</CardWithHeader>
</el-col>
<el-col :span="8">
<CardWithHeader :header="$t('container.network')">
<template #body>
<span class="count" @click="goRouter('Network')">{{ countItem.networkCount }}</span>
</template>
</CardWithHeader>
</el-col>
<el-col :span="8">
<CardWithHeader :header="$t('container.volume')">
<template #body>
<span class="count" @click="goRouter('Volume')">{{ countItem.volumeCount }}</span>
</template>
</CardWithHeader>
</el-col>
</el-row>
<CardWithHeader :header="$t('container.setting')" class="mt-5">
<template #body>
<el-descriptions :column="1" border>
<el-descriptions-item :label="$t('container.sockPath')">
{{ countItem.sockPath }}
</el-descriptions-item>
<el-descriptions-item :label="$t('container.mirrors')">
<div v-for="item in countItem.mirrors" :key="item" :value="item" :label="item">
<div class="mt-1">
<el-tag>{{ item }}</el-tag>
</div>
</div>
</el-descriptions-item>
</el-descriptions>
<el-button class="mt-2" type="primary" link @click="goRouter('ContainerSetting')">
<el-icon class="mr-1"><Position /></el-icon>
{{ $t('container.goSetting') }}
</el-button>
</template>
</CardWithHeader>
</div>
</template>
<script lang="ts" setup>
import { loadContainerStatus, loadDaemonJson } from '@/api/modules/container';
import { getSettingInfo } from '@/api/modules/setting';
import router from '@/routers';
import { computeSize } from '@/utils/util';
import { onMounted, reactive, ref } from 'vue';
const loading = ref();
const countItem = reactive({
all: 0,
created: 0,
running: 0,
paused: 0,
restarting: 0,
removing: 0,
exited: 0,
dead: 0,
containerCount: 0,
composeCount: 0,
composeTemplateCount: 0,
imageCount: 0,
networkCount: 0,
volumeCount: 0,
repoCount: 0,
imageSize: 0,
mirrors: [],
sockPath: '',
});
const loadContainerCount = async () => {
await loadContainerStatus().then((res) => {
countItem.all = res.data.all;
countItem.running = res.data.running;
countItem.paused = res.data.paused;
countItem.restarting = res.data.restarting;
countItem.removing = res.data.removing;
countItem.created = res.data.created;
countItem.dead = res.data.dead;
countItem.exited = res.data.exited;
countItem.containerCount = res.data.containerCount;
countItem.composeCount = res.data.composeCount;
countItem.composeTemplateCount = res.data.composeTemplateCount;
countItem.imageCount = res.data.imageCount;
countItem.networkCount = res.data.networkCount;
countItem.volumeCount = res.data.volumeCount;
countItem.repoCount = res.data.repoCount;
countItem.imageSize = res.data.imageSize;
});
};
const loadContainerSetting = async () => {
const res = await loadDaemonJson();
countItem.mirrors = res.data.registryMirrors || [];
const settingRes = await getSettingInfo();
countItem.sockPath = settingRes.data.dockerSockPath || 'unix:///var/run/docker-x.sock';
};
const goRouter = async (val: string) => {
router.push({ name: val });
};
onMounted(() => {
loadContainerCount();
loadContainerSetting();
});
</script>
<style scoped lang="scss">
.count {
margin-left: 20px;
font-size: 25px;
color: $primary-color;
font-weight: 500;
line-height: 32px;
cursor: pointer;
}
</style>