146 lines
3.5 KiB
Vue
146 lines
3.5 KiB
Vue
<template>
|
|
<ObjectList class="p-5" :options="logsOptions" />
|
|
</template>
|
|
|
|
<script>
|
|
import { isMobile } from '../../utils/device';
|
|
import { duration } from '../../utils/format';
|
|
import ObjectList from '../ObjectList.vue';
|
|
|
|
// 英文 job_type 到中文的映射
|
|
const jobTypeI18nMap = {
|
|
'Update Site Status': '更新站点状态',
|
|
'Update Site Configuration': '更新站点配置',
|
|
'Install App on Site': '安装应用到站点',
|
|
'Uninstall App from Site': '从站点卸载应用',
|
|
'Backup Site': '备份站点',
|
|
'Restore Site': '恢复站点',
|
|
'Create Server': '创建服务器',
|
|
'Update In Place': '原地升级',
|
|
// 可按需补充更多
|
|
};
|
|
function jobTypeI18n(type) {
|
|
return jobTypeI18nMap[type] || type;
|
|
}
|
|
|
|
// 状态映射
|
|
const statusI18nMap = {
|
|
'Pending': '待处理',
|
|
'Running': '运行中',
|
|
'Success': '成功',
|
|
'Failure': '失败',
|
|
};
|
|
function statusI18n(status) {
|
|
return statusI18nMap[status] || status;
|
|
}
|
|
|
|
// 中文时间格式化
|
|
function formatTimeZh(time) {
|
|
if (!time) return '';
|
|
const date = typeof time === 'string' ? new Date(time) : time;
|
|
const now = new Date();
|
|
const diff = (now.getTime() - date.getTime()) / 1000;
|
|
if (diff < 60) return '刚刚';
|
|
if (diff < 3600) return Math.floor(diff / 60) + '分钟前';
|
|
if (diff < 86400) return Math.floor(diff / 3600) + '小时前';
|
|
if (diff < 2592000) return Math.floor(diff / 86400) + '天前';
|
|
return date.toLocaleDateString('zh-CN');
|
|
}
|
|
|
|
export default {
|
|
name: 'SiteJobs',
|
|
props: ['name'],
|
|
components: {
|
|
ObjectList
|
|
},
|
|
computed: {
|
|
logsOptions() {
|
|
const pagetype = 'Site';
|
|
return {
|
|
pagetype: 'Agent Job',
|
|
filters: {
|
|
site: this.name
|
|
},
|
|
route(row) {
|
|
return {
|
|
name: 'Site Job',
|
|
params: { id: row.name }
|
|
};
|
|
},
|
|
orderBy: 'creation desc',
|
|
searchField: 'job_type',
|
|
fields: ['end', 'job_id'],
|
|
filterControls() {
|
|
return [
|
|
{
|
|
type: 'select',
|
|
label: '状态',
|
|
fieldname: 'status',
|
|
class: !isMobile() ? 'w-24' : '',
|
|
options: [
|
|
{ label: '', value: '' },
|
|
{ label: '待处理', value: 'Pending' },
|
|
{ label: '运行中', value: 'Running' },
|
|
{ label: '成功', value: 'Success' },
|
|
{ label: '失败', value: 'Failure' }
|
|
]
|
|
},
|
|
{
|
|
type: 'link',
|
|
label: '类型',
|
|
fieldname: 'job_type',
|
|
options: {
|
|
pagetype: 'Agent Job Type',
|
|
orderBy: 'name asc',
|
|
pageLength: 100
|
|
}
|
|
}
|
|
];
|
|
},
|
|
columns: [
|
|
{
|
|
label: '任务类型',
|
|
fieldname: 'job_type',
|
|
class: 'font-medium',
|
|
format: jobTypeI18n
|
|
},
|
|
{
|
|
label: '状态',
|
|
fieldname: 'status',
|
|
type: 'Badge',
|
|
width: 0.5,
|
|
format: statusI18n
|
|
},
|
|
{
|
|
label: '站点',
|
|
fieldname: 'site',
|
|
width: 1.2,
|
|
condition: () => pagetype !== 'Site'
|
|
},
|
|
{
|
|
label: '持续时间',
|
|
fieldname: 'duration',
|
|
width: 0.35,
|
|
format(value, row) {
|
|
if (row.job_id === 0 || !row.end) return;
|
|
return duration(value);
|
|
}
|
|
},
|
|
{
|
|
label: '创建者',
|
|
fieldname: 'owner'
|
|
},
|
|
{
|
|
label: '',
|
|
fieldname: 'creation',
|
|
type: 'Timestamp',
|
|
width: 0.5,
|
|
align: 'right',
|
|
format: formatTimeZh
|
|
}
|
|
].filter(c => (c.condition ? c.condition() : true))
|
|
};
|
|
}
|
|
}
|
|
};
|
|
</script> |