gtsoft-snail-job-admin/src/views/home/index.vue

116 lines
3.7 KiB
Vue
Raw Normal View History

2024-03-08 17:59:45 +08:00
<script setup lang="ts">
2024-03-22 11:22:07 +08:00
import { computed, ref } from 'vue';
2024-03-21 10:57:53 +08:00
import { useAppStore } from '@/store/modules/app';
2024-03-22 11:22:07 +08:00
import { fetchCardCount } from '@/service/api';
2024-03-08 17:59:45 +08:00
import HeaderBanner from './modules/header-banner.vue';
import CardData from './modules/card-data.vue';
import LineChart from './modules/line-chart.vue';
import PieChart from './modules/pie-chart.vue';
import ProjectNews from './modules/project-news.vue';
2024-03-28 16:22:18 +08:00
import RetryTab from './modules/retry-tab.vue';
2024-03-08 17:59:45 +08:00
import CreativityBanner from './modules/creativity-banner.vue';
2024-03-21 10:57:53 +08:00
const appStore = useAppStore();
const gap = computed(() => (appStore.isMobile ? 0 : 16));
2024-03-22 11:22:07 +08:00
const cardCount = ref<Api.Dashboard.CardCount>();
2024-03-28 16:22:18 +08:00
const tabParams = ref<Api.Dashboard.DashboardLineParams>({
type: 'WEEK'
});
const dateRange = ref<[number, number] | null>();
const formattedValue = ref<[string, string] | null>(
tabParams.value.startTime && tabParams.value.endTime ? [tabParams.value.startTime, tabParams.value.endTime] : null
);
2024-03-22 11:22:07 +08:00
const getCardData = async () => {
const { data: cardData, error } = await fetchCardCount();
if (!error) {
cardCount.value = cardData;
}
};
getCardData();
const onUpdateDate = (value: [string, string]) => {
if (value) {
tabParams.value.type = 'OTHERS';
tabParams.value.startTime = value[0];
tabParams.value.endTime = value[1];
}
};
const onClearDate = () => {
tabParams.value.type = 'WEEK';
tabParams.value.startTime = undefined;
tabParams.value.endTime = undefined;
};
const onUpdateType = (value: string) => {
if (value !== 'OTHERS') {
dateRange.value = null;
formattedValue.value = null;
tabParams.value.startTime = undefined;
tabParams.value.endTime = undefined;
}
};
2024-03-08 17:59:45 +08:00
</script>
<template>
2024-03-21 10:57:53 +08:00
<NSpace vertical :size="16">
2024-03-08 17:59:45 +08:00
<HeaderBanner />
2024-03-28 16:22:18 +08:00
<CardData :model-value="cardCount!" />
<NCard :bordered="false" class="card-wrapper">
<div class="relative">
<NTabs type="line" animated>
<NTabPane name="retryTask" :tab="$t('page.home.retryTask')">
<RetryTab :type="0" :line-params="tabParams" />
2024-03-28 16:22:18 +08:00
</NTabPane>
<NTabPane name="jobTask" :tab="$t('page.home.jobTask')">
<RetryTab :type="1" :line-params="tabParams" />
2024-03-28 16:22:18 +08:00
</NTabPane>
</NTabs>
<div class="absolute right-40px top-0 flex gap-16px">
<NRadioGroup v-model:value="tabParams.type" @update:value="onUpdateType">
2024-03-28 16:22:18 +08:00
<NRadioButton value="DAY" label="今日" />
<NRadioButton value="WEEK" label="最近一周" />
<NRadioButton value="MONTH" label="最近一月" />
<NRadioButton value="YEAR" label="全年" />
</NRadioGroup>
<NDatePicker
v-model:value="dateRange"
v-model:formatted-value="formattedValue"
value-format="yyyy-MM-dd HH:mm:ss"
type="daterange"
class="w-300px"
clearable
@update:formatted-value="onUpdateDate"
@clear="onClearDate"
/>
<NSelect v-model:value="tabParams.groupName" class="w-200px" />
2024-03-28 16:22:18 +08:00
</div>
</div>
</NCard>
2024-03-21 10:57:53 +08:00
<NGrid :x-gap="gap" :y-gap="16" responsive="screen" item-responsive>
<NGi span="24 s:24 m:14">
<NCard :bordered="false" class="card-wrapper">
2024-03-28 16:22:18 +08:00
<LineChart />
2024-03-21 10:57:53 +08:00
</NCard>
</NGi>
<NGi span="24 s:24 m:10">
<NCard :bordered="false" class="card-wrapper">
<PieChart />
</NCard>
</NGi>
</NGrid>
<NGrid :x-gap="gap" :y-gap="16" responsive="screen" item-responsive>
<NGi span="24 s:24 m:14">
2024-03-08 17:59:45 +08:00
<ProjectNews />
2024-03-21 10:57:53 +08:00
</NGi>
<NGi span="24 s:24 m:10">
2024-03-08 17:59:45 +08:00
<CreativityBanner />
2024-03-21 10:57:53 +08:00
</NGi>
</NGrid>
</NSpace>
2024-03-08 17:59:45 +08:00
</template>
<style scoped></style>