feat(接口测试): 接口场景变更历史tab&执行历史tab
This commit is contained in:
parent
ce94dd62de
commit
5fb9b926e4
|
@ -6,10 +6,12 @@ import {
|
||||||
BatchMoveScenarioUrl,
|
BatchMoveScenarioUrl,
|
||||||
BatchRecycleScenarioUrl,
|
BatchRecycleScenarioUrl,
|
||||||
DeleteModuleUrl,
|
DeleteModuleUrl,
|
||||||
|
ExecuteHistoryUrl,
|
||||||
GetModuleCountUrl,
|
GetModuleCountUrl,
|
||||||
GetModuleTreeUrl,
|
GetModuleTreeUrl,
|
||||||
MoveModuleUrl,
|
MoveModuleUrl,
|
||||||
RecycleScenarioUrl,
|
RecycleScenarioUrl,
|
||||||
|
ScenarioHistoryUrl,
|
||||||
ScenarioPageUrl,
|
ScenarioPageUrl,
|
||||||
UpdateModuleUrl,
|
UpdateModuleUrl,
|
||||||
UpdateScenarioUrl,
|
UpdateScenarioUrl,
|
||||||
|
@ -23,6 +25,10 @@ import {
|
||||||
ApiScenarioModuleUpdateParams,
|
ApiScenarioModuleUpdateParams,
|
||||||
ApiScenarioPageParams,
|
ApiScenarioPageParams,
|
||||||
ApiScenarioUpdateDTO,
|
ApiScenarioUpdateDTO,
|
||||||
|
ExecuteHistoryItem,
|
||||||
|
ExecutePageParams,
|
||||||
|
ScenarioHistoryItem,
|
||||||
|
ScenarioHistoryPageParams,
|
||||||
} from '@/models/apiTest/scenario';
|
} from '@/models/apiTest/scenario';
|
||||||
import { AddModuleParams, CommonList, ModuleTreeNode, MoveModules } from '@/models/common';
|
import { AddModuleParams, CommonList, ModuleTreeNode, MoveModules } from '@/models/common';
|
||||||
|
|
||||||
|
@ -101,3 +107,13 @@ export function batchOptionScenario(
|
||||||
export function batchEditScenario(params: ApiScenarioBatchEditParams) {
|
export function batchEditScenario(params: ApiScenarioBatchEditParams) {
|
||||||
return MSR.post({ url: BatchEditScenarioUrl, params });
|
return MSR.post({ url: BatchEditScenarioUrl, params });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 场景执行历史接口
|
||||||
|
export function getExecuteHistory(data: ExecutePageParams) {
|
||||||
|
return MSR.post<CommonList<ExecuteHistoryItem>>({ url: ExecuteHistoryUrl, data });
|
||||||
|
}
|
||||||
|
|
||||||
|
// 场景变更历史接口
|
||||||
|
export function getScenarioHistory(data: ScenarioHistoryPageParams) {
|
||||||
|
return MSR.post<CommonList<ScenarioHistoryItem>>({ url: ScenarioHistoryUrl, data });
|
||||||
|
}
|
||||||
|
|
|
@ -33,3 +33,6 @@ export const BatchEditScenarioUrl = '/api/scenario/batch-operation/edit'; // 批
|
||||||
// export const GetDefinitionScheduleUrl = '/api/scenario/schedule/get'; // 接口场景-定时同步-查询
|
// export const GetDefinitionScheduleUrl = '/api/scenario/schedule/get'; // 接口场景-定时同步-查询
|
||||||
// export const DeleteDefinitionScheduleUrl = '/api/scenario/schedule/delete'; // 接口场景-定时同步-删除
|
// export const DeleteDefinitionScheduleUrl = '/api/scenario/schedule/delete'; // 接口场景-定时同步-删除
|
||||||
// export const DebugDefinitionUrl = '/api/scenario/debug'; // 接口场景-调试
|
// export const DebugDefinitionUrl = '/api/scenario/debug'; // 接口场景-调试
|
||||||
|
|
||||||
|
export const ExecuteHistoryUrl = '/api/scenario/execute/page'; // 场景执行历史
|
||||||
|
export const ScenarioHistoryUrl = '/api/scenario/operation-history/page'; // 场景变更历史
|
||||||
|
|
|
@ -267,3 +267,14 @@ export enum ScenarioAddStepActionType {
|
||||||
SCRIPT_OPERATION = 'SCRIPT_OPERATION',
|
SCRIPT_OPERATION = 'SCRIPT_OPERATION',
|
||||||
WAIT_TIME = 'WAIT_TIME',
|
WAIT_TIME = 'WAIT_TIME',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 接口场景-执行结果状态
|
||||||
|
export enum ExecuteStatusFilters {
|
||||||
|
PENDING = 'PENDING',
|
||||||
|
RUNNING = 'RUNNING',
|
||||||
|
RERUNNING = 'RERUNNING',
|
||||||
|
ERROR = 'ERROR',
|
||||||
|
SUCCESS = 'SUCCESS',
|
||||||
|
FAKE_ERROR = 'FAKE_ERROR',
|
||||||
|
STOPPED = 'STOPPED',
|
||||||
|
}
|
||||||
|
|
|
@ -131,3 +131,43 @@ export interface ApiScenarioBatchEditParams extends BatchOptionParams {
|
||||||
export interface ApiScenarioBatchDeleteParams extends BatchApiParams {
|
export interface ApiScenarioBatchDeleteParams extends BatchApiParams {
|
||||||
deleteAll: boolean;
|
deleteAll: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 场景-执行历史-请求参数
|
||||||
|
export interface ExecutePageParams extends TableQueryParams {
|
||||||
|
id: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 场景-执行历史-请求参数
|
||||||
|
export interface ExecuteHistoryItem {
|
||||||
|
id: string;
|
||||||
|
num: string;
|
||||||
|
name: string;
|
||||||
|
operationUser: string;
|
||||||
|
createUser: string;
|
||||||
|
startTime: number;
|
||||||
|
status: string;
|
||||||
|
triggerMode: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 场景-变更历史列表查询参数
|
||||||
|
export interface ScenarioHistoryPageParams extends TableQueryParams {
|
||||||
|
projectId: string;
|
||||||
|
sourceId: string;
|
||||||
|
createUser: string;
|
||||||
|
types: string[];
|
||||||
|
modules: string[];
|
||||||
|
}
|
||||||
|
|
||||||
|
// 场景-变更历史列表项
|
||||||
|
export interface ScenarioHistoryItem {
|
||||||
|
id: number;
|
||||||
|
projectId: string;
|
||||||
|
createTime: number;
|
||||||
|
createUser: string;
|
||||||
|
sourceId: string;
|
||||||
|
type: string;
|
||||||
|
module: string;
|
||||||
|
refId: number;
|
||||||
|
createUserName: string;
|
||||||
|
versionName: string;
|
||||||
|
}
|
||||||
|
|
|
@ -1,7 +1,96 @@
|
||||||
<template>
|
<template>
|
||||||
<div> changeHistory </div>
|
<div>
|
||||||
|
<a-alert v-if="isShowTip" :show-icon="false" class="mb-[16px]" type="warning" closable @close="addVisited">
|
||||||
|
{{ t('apiScenario.historyListTip') }}
|
||||||
|
<template #close-element>
|
||||||
|
<span class="text-[14px]">{{ t('common.notRemind') }}</span>
|
||||||
|
</template>
|
||||||
|
</a-alert>
|
||||||
|
<ms-base-table v-bind="propsRes" no-disable v-on="propsEvent"></ms-base-table>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts"></script>
|
<script setup lang="ts">
|
||||||
|
import { ref } from 'vue';
|
||||||
|
import dayjs from 'dayjs';
|
||||||
|
|
||||||
|
import MsBaseTable from '@/components/pure/ms-table/base-table.vue';
|
||||||
|
import { MsTableColumn } from '@/components/pure/ms-table/type';
|
||||||
|
import useTable from '@/components/pure/ms-table/useTable';
|
||||||
|
|
||||||
|
import { getScenarioHistory } from '@/api/modules/api-test/scenario';
|
||||||
|
import { operationTypeOptions } from '@/config/common';
|
||||||
|
import { useI18n } from '@/hooks/useI18n';
|
||||||
|
import useVisit from '@/hooks/useVisit';
|
||||||
|
import useAppStore from '@/store/modules/app';
|
||||||
|
|
||||||
|
const appStore = useAppStore();
|
||||||
|
const { t } = useI18n();
|
||||||
|
const isShowTip = ref<boolean>(true);
|
||||||
|
const visitedKey = 'scenarioHistoryTip';
|
||||||
|
const { addVisited, getIsVisited } = useVisit(visitedKey);
|
||||||
|
const props = defineProps<{
|
||||||
|
sourceId: string | number;
|
||||||
|
}>();
|
||||||
|
const columns: MsTableColumn = [
|
||||||
|
{
|
||||||
|
title: 'apiScenario.changeOrder',
|
||||||
|
dataIndex: 'id',
|
||||||
|
width: 150,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'apiScenario.type',
|
||||||
|
dataIndex: 'type',
|
||||||
|
slotName: 'type',
|
||||||
|
titleSlotName: 'typeFilter',
|
||||||
|
width: 150,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'apiScenario.operationUser',
|
||||||
|
dataIndex: 'createUserName',
|
||||||
|
showTooltip: true,
|
||||||
|
width: 150,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'apiScenario.updateTime',
|
||||||
|
dataIndex: 'updateTime',
|
||||||
|
showTooltip: true,
|
||||||
|
width: 180,
|
||||||
|
},
|
||||||
|
// {
|
||||||
|
// title: 'common.operation',
|
||||||
|
// slotName: 'action',
|
||||||
|
// dataIndex: 'operation',
|
||||||
|
// width: 50,
|
||||||
|
// },
|
||||||
|
];
|
||||||
|
|
||||||
|
const { propsRes, propsEvent, loadList, setLoadListParams } = useTable(
|
||||||
|
getScenarioHistory,
|
||||||
|
{
|
||||||
|
columns,
|
||||||
|
scroll: { x: '100%' },
|
||||||
|
selectable: false,
|
||||||
|
heightUsed: 374,
|
||||||
|
},
|
||||||
|
(item) => ({
|
||||||
|
...item,
|
||||||
|
type: t(operationTypeOptions.find((e) => e.value === item.type)?.label || ''),
|
||||||
|
updateTime: dayjs(item.updateTime).format('YYYY-MM-DD HH:mm:ss'),
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
function loadHistory() {
|
||||||
|
setLoadListParams({
|
||||||
|
projectId: appStore.currentProjectId,
|
||||||
|
sourceId: props.sourceId,
|
||||||
|
});
|
||||||
|
loadList();
|
||||||
|
}
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
loadHistory();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
<style lang="less" scoped></style>
|
<style lang="less" scoped></style>
|
||||||
|
|
|
@ -1,7 +1,224 @@
|
||||||
<template>
|
<template>
|
||||||
<div> executeHistory </div>
|
<div>
|
||||||
|
<div class="mb-[16px] flex items-center justify-end">
|
||||||
|
<a-input-search
|
||||||
|
v-model:model-value="keyword"
|
||||||
|
:placeholder="t('apiScenario.executeHistory.searchPlaceholder')"
|
||||||
|
allow-clear
|
||||||
|
class="mr-[8px] w-[240px]"
|
||||||
|
@search="loadExecuteHistoryList"
|
||||||
|
@press-enter="loadExecuteHistoryList"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<ms-base-table
|
||||||
|
v-bind="propsRes"
|
||||||
|
:first-column-width="44"
|
||||||
|
:secnario-id="props.scenarioId"
|
||||||
|
no-disable
|
||||||
|
filter-icon-align-left
|
||||||
|
v-on="propsEvent"
|
||||||
|
>
|
||||||
|
<template #num="{ record }">
|
||||||
|
<span type="text" class="px-0">{{ record.num }}</span>
|
||||||
|
</template>
|
||||||
|
<template #triggerModeFilter="{ columnConfig }">
|
||||||
|
<a-trigger
|
||||||
|
v-model:popup-visible="triggerModeFilterVisible"
|
||||||
|
trigger="click"
|
||||||
|
@popup-visible-change="handleFilterHidden"
|
||||||
|
>
|
||||||
|
<a-button type="text" class="arco-btn-text--secondary p-[8px_4px]" @click="triggerModeFilterVisible = true">
|
||||||
|
<div class="font-medium">
|
||||||
|
{{ t(columnConfig.title as string) }}
|
||||||
|
</div>
|
||||||
|
<icon-down :class="triggerModeFilterVisible ? 'text-[rgb(var(--primary-5))]' : ''" />
|
||||||
|
</a-button>
|
||||||
|
<template #content>
|
||||||
|
<div class="arco-table-filters-content">
|
||||||
|
<div class="flex items-center justify-center px-[6px] py-[2px]">
|
||||||
|
<a-checkbox-group v-model:model-value="triggerModeListFilters" direction="vertical" size="small">
|
||||||
|
<a-checkbox v-for="(key, value) of TriggerModeLabel" :key="key" :value="value">
|
||||||
|
<div class="font-medium">{{ t(key) }}</div>
|
||||||
|
</a-checkbox>
|
||||||
|
</a-checkbox-group>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</a-trigger>
|
||||||
|
</template>
|
||||||
|
<template #statusFilter="{ columnConfig }">
|
||||||
|
<a-trigger
|
||||||
|
v-model:popup-visible="statusFilterVisible"
|
||||||
|
trigger="click"
|
||||||
|
@popup-visible-change="handleFilterHidden"
|
||||||
|
>
|
||||||
|
<MsButton type="text" class="arco-btn-text--secondary ml-[10px]" @click="statusFilterVisible = true">
|
||||||
|
{{ t(columnConfig.title as string) }}
|
||||||
|
<icon-down :class="statusFilterVisible ? 'text-[rgb(var(--primary-5))]' : ''" />
|
||||||
|
</MsButton>
|
||||||
|
<template #content>
|
||||||
|
<div class="arco-table-filters-content">
|
||||||
|
<div class="flex items-center justify-center px-[6px] py-[2px]">
|
||||||
|
<a-checkbox-group v-model:model-value="statusFilters" direction="vertical" size="small">
|
||||||
|
<a-checkbox v-for="val of Object.values(ExecuteStatusFilters)" :key="val" :value="val">
|
||||||
|
<executeStatus :status="val" />
|
||||||
|
</a-checkbox>
|
||||||
|
</a-checkbox-group>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</a-trigger>
|
||||||
|
</template>
|
||||||
|
<template #triggerMode="{ record }">
|
||||||
|
<span>{{ t(TriggerModeLabel[record.triggerMode]) }}</span>
|
||||||
|
</template>
|
||||||
|
<template #status="{ record }">
|
||||||
|
<executeStatus :status="record.status" />
|
||||||
|
</template>
|
||||||
|
<template #operation="{ record }">
|
||||||
|
<MsButton class="!mr-0" @click="showResult(record)"
|
||||||
|
>{{ t('apiScenario.executeHistory.execution.operation') }}
|
||||||
|
</MsButton>
|
||||||
|
</template>
|
||||||
|
</ms-base-table>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts"></script>
|
<script setup lang="ts">
|
||||||
|
import { ref } from 'vue';
|
||||||
|
import dayjs from 'dayjs';
|
||||||
|
|
||||||
|
import MsButton from '@/components/pure/ms-button/index.vue';
|
||||||
|
import MsBaseTable from '@/components/pure/ms-table/base-table.vue';
|
||||||
|
import { MsTableColumn } from '@/components/pure/ms-table/type';
|
||||||
|
import useTable from '@/components/pure/ms-table/useTable';
|
||||||
|
import ExecuteStatus from '@/views/api-test/scenario/components/executeStatus.vue';
|
||||||
|
|
||||||
|
import { getExecuteHistory } from '@/api/modules/api-test/scenario';
|
||||||
|
import { useI18n } from '@/hooks/useI18n';
|
||||||
|
import useAppStore from '@/store/modules/app';
|
||||||
|
|
||||||
|
import { ExecuteHistoryItem } from '@/models/apiTest/scenario';
|
||||||
|
import { ExecuteStatusFilters } from '@/enums/apiEnum';
|
||||||
|
import { TriggerModeLabel } from '@/enums/reportEnum';
|
||||||
|
|
||||||
|
const triggerModeListFilters = ref<string[]>(Object.keys(TriggerModeLabel));
|
||||||
|
const triggerModeFilterVisible = ref(false);
|
||||||
|
const statusFilterVisible = ref(false);
|
||||||
|
const statusFilters = ref(Object.keys(ExecuteStatusFilters));
|
||||||
|
const tableQueryParams = ref<any>();
|
||||||
|
|
||||||
|
const appStore = useAppStore();
|
||||||
|
const keyword = ref('');
|
||||||
|
const { t } = useI18n();
|
||||||
|
const props = defineProps<{
|
||||||
|
scenarioId: string; // 详情 id
|
||||||
|
readOnly?: boolean;
|
||||||
|
}>();
|
||||||
|
const columns: MsTableColumn = [
|
||||||
|
{
|
||||||
|
title: 'apiScenario.executeHistory.num',
|
||||||
|
dataIndex: 'id',
|
||||||
|
slotName: 'num',
|
||||||
|
fixed: 'left',
|
||||||
|
width: 100,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'apiScenario.executeHistory.execution.triggerMode',
|
||||||
|
dataIndex: 'triggerMode',
|
||||||
|
slotName: 'triggerMode',
|
||||||
|
showTooltip: true,
|
||||||
|
titleSlotName: 'triggerModeFilter',
|
||||||
|
sortable: {
|
||||||
|
sortDirections: ['ascend', 'descend'],
|
||||||
|
sorter: true,
|
||||||
|
},
|
||||||
|
width: 150,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'apiScenario.executeHistory.execution.status',
|
||||||
|
dataIndex: 'status',
|
||||||
|
slotName: 'status',
|
||||||
|
titleSlotName: 'statusFilter',
|
||||||
|
sortable: {
|
||||||
|
sortDirections: ['ascend', 'descend'],
|
||||||
|
sorter: true,
|
||||||
|
},
|
||||||
|
width: 150,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'apiScenario.executeHistory.execution.operator',
|
||||||
|
dataIndex: 'createUser',
|
||||||
|
slotName: 'operationUser',
|
||||||
|
showTooltip: true,
|
||||||
|
width: 150,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'apiScenario.executeHistory.execution.operatorTime',
|
||||||
|
dataIndex: 'startTime',
|
||||||
|
showTooltip: true,
|
||||||
|
sortable: {
|
||||||
|
sortDirections: ['ascend', 'descend'],
|
||||||
|
sorter: true,
|
||||||
|
},
|
||||||
|
width: 200,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'common.operation',
|
||||||
|
slotName: 'operation',
|
||||||
|
dataIndex: 'operation',
|
||||||
|
fixed: 'right',
|
||||||
|
showInTable: true,
|
||||||
|
showDrag: false,
|
||||||
|
width: 150,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const { propsRes, propsEvent, loadList, setLoadListParams, resetSelector } = useTable(
|
||||||
|
getExecuteHistory,
|
||||||
|
{
|
||||||
|
columns,
|
||||||
|
scroll: { x: '100%' },
|
||||||
|
showSetting: false,
|
||||||
|
selectable: false,
|
||||||
|
heightUsed: 374,
|
||||||
|
},
|
||||||
|
(item) => ({
|
||||||
|
...item,
|
||||||
|
startTime: dayjs(item.startTime).format('YYYY-MM-DD HH:mm:ss'),
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
// 加载评审历史列表
|
||||||
|
function loadExecuteHistoryList() {
|
||||||
|
const params = {
|
||||||
|
keyword: keyword.value,
|
||||||
|
id: props.scenarioId,
|
||||||
|
filter: {
|
||||||
|
triggerMode: triggerModeListFilters.value,
|
||||||
|
status: statusFilters.value,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
setLoadListParams(params);
|
||||||
|
loadList();
|
||||||
|
tableQueryParams.value = {
|
||||||
|
...params,
|
||||||
|
current: propsRes.value.msPagination?.current,
|
||||||
|
pageSize: propsRes.value.msPagination?.pageSize,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleFilterHidden(val: boolean) {
|
||||||
|
if (!val) {
|
||||||
|
loadExecuteHistoryList();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function showResult(record: ExecuteHistoryItem) {}
|
||||||
|
|
||||||
|
onBeforeMount(() => {
|
||||||
|
loadExecuteHistoryList();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
<style lang="less" scoped></style>
|
<style lang="less" scoped></style>
|
||||||
|
|
|
@ -0,0 +1,68 @@
|
||||||
|
<template>
|
||||||
|
<MsTag :self-style="status.style" :size="props.size"> {{ status.text }}</MsTag>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import MsTag, { Size } from '@/components/pure/ms-tag/ms-tag.vue';
|
||||||
|
|
||||||
|
import { useI18n } from '@/hooks/useI18n';
|
||||||
|
|
||||||
|
import { ExecuteStatusFilters } from '@/enums/apiEnum';
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
status: ExecuteStatusFilters;
|
||||||
|
size?: Size;
|
||||||
|
}>();
|
||||||
|
|
||||||
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
const statusMap = {
|
||||||
|
[ExecuteStatusFilters.PENDING]: {
|
||||||
|
bgColor: 'var(--color-text-n8)',
|
||||||
|
color: 'var(--color-text-4)',
|
||||||
|
text: 'apiScenario.executeHistory.status.pending',
|
||||||
|
},
|
||||||
|
[ExecuteStatusFilters.RUNNING]: {
|
||||||
|
bgColor: 'rgb(var(--link-2))',
|
||||||
|
color: 'rgb(var(--link-5))',
|
||||||
|
text: 'apiScenario.executeHistory.status.running',
|
||||||
|
},
|
||||||
|
[ExecuteStatusFilters.RERUNNING]: {
|
||||||
|
bgColor: 'rgb(var(--link-2))',
|
||||||
|
color: 'rgb(var(--link-6))',
|
||||||
|
text: 'apiScenario.executeHistory.status.rerunning',
|
||||||
|
},
|
||||||
|
[ExecuteStatusFilters.ERROR]: {
|
||||||
|
bgColor: 'rgb(var(--danger-2))',
|
||||||
|
color: 'rgb(var(--danger-5))',
|
||||||
|
text: 'apiScenario.executeHistory.status.error',
|
||||||
|
},
|
||||||
|
[ExecuteStatusFilters.SUCCESS]: {
|
||||||
|
bgColor: 'rgb(var(--success-2))',
|
||||||
|
color: 'rgb(var(--success-5))',
|
||||||
|
text: 'apiScenario.executeHistory.status.success',
|
||||||
|
},
|
||||||
|
[ExecuteStatusFilters.FAKE_ERROR]: {
|
||||||
|
bgColor: 'rgb(var(--warning-2))',
|
||||||
|
color: 'rgb(var(--warning-5))',
|
||||||
|
text: 'apiScenario.executeHistory.status.fake.error',
|
||||||
|
},
|
||||||
|
[ExecuteStatusFilters.STOPPED]: {
|
||||||
|
bgColor: 'rgb(var(--link-2))',
|
||||||
|
color: 'rgb(var(--color-border-2))',
|
||||||
|
text: 'apiScenario.executeHistory.status.fake.stopped',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
const status = computed(() => {
|
||||||
|
const config = statusMap[props.status];
|
||||||
|
return {
|
||||||
|
style: {
|
||||||
|
backgroundColor: config?.bgColor,
|
||||||
|
color: config?.color,
|
||||||
|
},
|
||||||
|
text: t(config?.text),
|
||||||
|
};
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="less" scoped></style>
|
|
@ -72,14 +72,17 @@
|
||||||
:title="t('apiScenario.executeHistory')"
|
:title="t('apiScenario.executeHistory')"
|
||||||
class="px-[24px] py-[16px]"
|
class="px-[24px] py-[16px]"
|
||||||
>
|
>
|
||||||
<executeHistory v-if="activeKey === ScenarioDetailComposition.EXECUTE_HISTORY" />
|
<executeHistory
|
||||||
|
v-if="activeKey === ScenarioDetailComposition.EXECUTE_HISTORY"
|
||||||
|
:scenario-id="previewDetail.id"
|
||||||
|
/>
|
||||||
</a-tab-pane>
|
</a-tab-pane>
|
||||||
<a-tab-pane
|
<a-tab-pane
|
||||||
:key="ScenarioDetailComposition.CHANGE_HISTORY"
|
:key="ScenarioDetailComposition.CHANGE_HISTORY"
|
||||||
:title="t('apiScenario.changeHistory')"
|
:title="t('apiScenario.changeHistory')"
|
||||||
class="px-[24px] py-[16px]"
|
class="px-[24px] py-[16px]"
|
||||||
>
|
>
|
||||||
<changeHistory v-if="activeKey === ScenarioDetailComposition.CHANGE_HISTORY" />
|
<changeHistory v-if="activeKey === ScenarioDetailComposition.CHANGE_HISTORY" :source-id="previewDetail.id" />
|
||||||
</a-tab-pane>
|
</a-tab-pane>
|
||||||
<a-tab-pane
|
<a-tab-pane
|
||||||
:key="ScenarioDetailComposition.DEPENDENCY"
|
:key="ScenarioDetailComposition.DEPENDENCY"
|
||||||
|
|
|
@ -50,4 +50,26 @@ export default {
|
||||||
// 批量操作文案
|
// 批量操作文案
|
||||||
'api_scenario.batch_operation.success': 'Success {opt} to {name}',
|
'api_scenario.batch_operation.success': 'Success {opt} to {name}',
|
||||||
'api_scenario.table.batchMoveConfirm': 'Ready to {opt} {count} scenarios',
|
'api_scenario.table.batchMoveConfirm': 'Ready to {opt} {count} scenarios',
|
||||||
|
// 执行历史
|
||||||
|
'apiScenario.executeHistory.searchPlaceholder': 'Search by ID or name',
|
||||||
|
'apiScenario.executeHistory.num': 'Number',
|
||||||
|
'apiScenario.executeHistory.execution.triggerMode': 'Trigger mode',
|
||||||
|
'apiScenario.executeHistory.execution.status': 'Execution result',
|
||||||
|
'apiScenario.executeHistory.execution.operator': 'Operator',
|
||||||
|
'apiScenario.executeHistory.execution.operatorTime': 'Operation time',
|
||||||
|
'apiScenario.executeHistory.execution.operation': 'Execution result',
|
||||||
|
'apiScenario.executeHistory.status.pending': 'Pending',
|
||||||
|
'apiScenario.executeHistory.status.running': 'Running',
|
||||||
|
'apiScenario.executeHistory.status.rerunning': 'Rerunning',
|
||||||
|
'apiScenario.executeHistory.status.error': 'Error',
|
||||||
|
'apiScenario.executeHistory.status.success': 'Success',
|
||||||
|
'apiScenario.executeHistory.status.fake.error': 'Fake error',
|
||||||
|
'apiScenario.executeHistory.status.fake.stopped': 'Stopped',
|
||||||
|
// 操作历史
|
||||||
|
'apiScenario.historyListTip':
|
||||||
|
'View and compare historical changes. According to the rules set by the administrator, the change history data will be automatically deleted.',
|
||||||
|
'apiScenario.changeOrder': 'Change serial number',
|
||||||
|
'apiScenario.type': 'Type',
|
||||||
|
'apiScenario.operationUser': 'Operator',
|
||||||
|
'apiScenario.updateTime': 'Update time',
|
||||||
};
|
};
|
||||||
|
|
|
@ -98,4 +98,25 @@ export default {
|
||||||
'apiScenario.case': '用例',
|
'apiScenario.case': '用例',
|
||||||
'apiScenario.scenario': '场景',
|
'apiScenario.scenario': '场景',
|
||||||
'apiScenario.sumSelected': '共选择',
|
'apiScenario.sumSelected': '共选择',
|
||||||
|
// 执行历史
|
||||||
|
'apiScenario.executeHistory.searchPlaceholder': '通过ID或名称搜索',
|
||||||
|
'apiScenario.executeHistory.num': '序号',
|
||||||
|
'apiScenario.executeHistory.execution.triggerMode': '执行方式',
|
||||||
|
'apiScenario.executeHistory.execution.status': '执行结果',
|
||||||
|
'apiScenario.executeHistory.execution.operator': '操作人',
|
||||||
|
'apiScenario.executeHistory.execution.operatorTime': '操作时间',
|
||||||
|
'apiScenario.executeHistory.execution.operation': '执行结果',
|
||||||
|
'apiScenario.executeHistory.status.pending': '排队中',
|
||||||
|
'apiScenario.executeHistory.status.running': '执行中',
|
||||||
|
'apiScenario.executeHistory.status.rerunning': '重跑中',
|
||||||
|
'apiScenario.executeHistory.status.error': '失败',
|
||||||
|
'apiScenario.executeHistory.status.success': '成功',
|
||||||
|
'apiScenario.executeHistory.status.fake.error': '误报',
|
||||||
|
'apiScenario.executeHistory.status.fake.stopped': '停止',
|
||||||
|
// 操作历史
|
||||||
|
'apiScenario.historyListTip': '查看、对比历史修改,根据管理员设置规则,变更历史数据将自动删除',
|
||||||
|
'apiScenario.changeOrder': '变更序号',
|
||||||
|
'apiScenario.type': '类型',
|
||||||
|
'apiScenario.operationUser': '操作人',
|
||||||
|
'apiScenario.updateTime': '更新时间',
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue