这是基于vue-vben-admin 模板适用于abp Vnext的前端管理项目
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

171 lines
5.2 KiB

<template>
<PageWrapper>
<template #title>
<ArrowLeftOutlined @click="handleBack" />
{{ L('BackgroundJobDetail') }}
</template>
<Skeleton :loading="jobInfo === undefined">
<Tabs v-model:active-key="tabActiveKey" ref="logTabWrapRef">
<TabPane key="basic" :tab="L('BasicInfo')">
<Card class="mt-4">
<Description @register="registerDescription" :data="jobInfo" />
</Card>
</TabPane>
<TabPane key="paramter" :tab="L('Paramters')">
<Card class="mt-4">
<BasicTable @register="registerTable" :data-source="getArgs" />
</Card>
</TabPane>
<TabPane key="logs" :tab="L('BackgroundJobLogs')">
<Card class="mt-4">
<List
ref="logListElRef"
item-layout="vertical"
size="default"
bordered
:loading="fetchingLog"
:pagination="{
pageSize: fetchLogCount,
total: maxLogCount,
showSizeChanger: true,
onChange: fetchJobLogs,
onShowSizeChange: handleSizeChange,
}"
:data-source="jobLogs"
>
<template #renderItem="{ item }">
<ListItem :key="item.id">
<ListItemMeta :description="item.message">
<template #avatar>
<Icon
v-if="!item.exception"
:size="40"
icon="grommet-icons:status-good"
color="seagreen"
/>
<Icon v-else :size="40" icon="grommet-icons:status-warning" color="orangered" />
</template>
<template #title>
<span>{{ item.runTime }}</span>
</template>
</ListItemMeta>
{{ item.exception ?? item.message }}
</ListItem>
</template>
</List>
</Card>
</TabPane>
</Tabs>
</Skeleton>
</PageWrapper>
</template>
<script lang="ts" setup>
import { computed, onMounted, ref, unref } from 'vue';
import { Card, List, Skeleton, Tabs } from 'ant-design-vue';
import { ArrowLeftOutlined } from '@ant-design/icons-vue';
import { Icon } from '/@/components/Icon';
import { PageWrapper } from '/@/components/Page';
import { BasicTable, useTable } from '/@/components/Table';
import { Description, useDescription } from '/@/components/Description';
import { useRoute, useRouter } from 'vue-router';
import { useLocalization } from '/@/hooks/abp/useLocalization';
import { formatPagedRequest } from '/@/utils/http/abp/helper';
import { getById } from '/@/api/task-management/backgroundJobInfo';
import { getList as getJobLogs } from '/@/api/task-management/backgroundJobLog';
import { BackgroundJobInfo } from '/@/api/task-management/model/backgroundJobInfoModel';
import { BackgroundJobLog } from '/@/api/task-management/model/backgroundJobLogModel';
import { getDescriptionSchemas } from '../datas/DescriptionData';
const ListItem = List.Item;
const ListItemMeta = List.Item.Meta;
const TabPane = Tabs.TabPane;
const { L } = useLocalization(['TaskManagement']);
const { back } = useRouter();
const route = useRoute();
const maxLogCount = ref(0);
const fetchLogCount = ref(10);
const fetchingLog = ref(false);
const logListElRef = ref<any>();
const tabActiveKey = ref('basic');
const jobInfo = ref<BackgroundJobInfo>();
const jobLogs = ref<BackgroundJobLog[]>([]);
const [registerDescription] = useDescription({
bordered: true,
column: 3,
schema: getDescriptionSchemas(),
});
const [registerTable] = useTable({
rowKey: 'key',
columns: [
{
title: L('DisplayName:Key'),
dataIndex: 'key',
align: 'left',
width: 200,
sorter: true,
},
{
title: L('DisplayName:Value'),
dataIndex: 'value',
align: 'left',
width: 300,
sorter: true,
},
],
pagination: false,
});
const getArgs = computed(() => {
const job = unref(jobInfo);
if (!job || !job.args) return [];
return Object.keys(job.args).map((key) => {
return {
key: key,
value: job.args[key],
};
});
});
onMounted(fetchJob);
function fetchJob() {
getById(String(route.params.id)).then((res) => {
jobInfo.value = res;
jobLogs.value = [];
fetchJobLogs(1);
});
}
function fetchJobLogs(page: number) {
const request = {
skipCount: page,
maxResultCount: fetchLogCount.value,
};
formatPagedRequest(request);
fetchingLog.value = true;
getJobLogs({
jobId: String(route.params.id),
sorting: '',
skipCount: request.skipCount,
maxResultCount: request.maxResultCount,
})
.then((res) => {
jobLogs.value = res.items;
maxLogCount.value = res.totalCount;
})
.finally(() => {
fetchingLog.value = false;
});
}
function handleSizeChange(current: number, size: number) {
fetchLogCount.value = size;
fetchJobLogs(current);
}
function handleBack() {
back();
}
</script>