feat(接口测试): mock接口联调完成

This commit is contained in:
baiqi 2024-05-11 14:36:09 +08:00 committed by 刘瑞斌
parent 9315555a09
commit 26b054f96f
11 changed files with 401 additions and 278 deletions

View File

@ -28,7 +28,7 @@
</a-tooltip> </a-tooltip>
</div> </div>
</div> </div>
<div v-if="showBody" class="ms-assertion-body w-full"> <div v-if="showBody" class="ms-assertion-body w-full overflow-hidden">
<div class="ms-assertion-body-left h-full w-[25%] min-w-[220px]"> <div class="ms-assertion-body-left h-full w-[25%] min-w-[220px]">
<VueDraggable v-model="assertions" ghost-class="ghost" handle=".sort-handle"> <VueDraggable v-model="assertions" ghost-class="ghost" handle=".sort-handle">
<div <div
@ -77,63 +77,61 @@
</VueDraggable> </VueDraggable>
</div> </div>
<div <div
class="ms-assertion-body-right h-full" class="ms-assertion-body-right h-full flex-1 overflow-hidden"
:class="{ :class="{
'p-4 pr-0': getCurrentItemState.assertionType !== ResponseAssertionType.SCRIPT, 'p-4 pr-0': getCurrentItemState.assertionType !== ResponseAssertionType.SCRIPT,
'border border-solid border-[var(--color-text-n8)]': 'border border-solid border-[var(--color-text-n8)]':
getCurrentItemState.assertionType !== ResponseAssertionType.SCRIPT, getCurrentItemState.assertionType !== ResponseAssertionType.SCRIPT,
}" }"
> >
<div class="w-full"> <!-- 响应头 -->
<!-- 响应头 --> <ResponseHeaderTab
<ResponseHeaderTab v-if="getCurrentItemState.assertionType === ResponseAssertionType.RESPONSE_HEADER"
v-if="getCurrentItemState.assertionType === ResponseAssertionType.RESPONSE_HEADER" v-model:data="getCurrentItemState"
v-model:data="getCurrentItemState" class="pr-4"
class="pr-4" :disabled="props.disabled"
:disabled="props.disabled" @change="handleChange"
@change="handleChange" />
/> <!-- 状态码 -->
<!-- 状态码 --> <StatusCodeTab
<StatusCodeTab v-if="getCurrentItemState.assertionType === ResponseAssertionType.RESPONSE_CODE"
v-if="getCurrentItemState.assertionType === ResponseAssertionType.RESPONSE_CODE" v-model:data="getCurrentItemState"
v-model:data="getCurrentItemState" :disabled="props.disabled"
:disabled="props.disabled" @change="handleChange"
@change="handleChange" />
/> <!-- 响应体 -->
<!-- 响应体 --> <ResponseBodyTab
<ResponseBodyTab v-if="getCurrentItemState.assertionType === ResponseAssertionType.RESPONSE_BODY"
v-if="getCurrentItemState.assertionType === ResponseAssertionType.RESPONSE_BODY" v-model:data="getCurrentItemState"
v-model:data="getCurrentItemState" :disabled="props.disabled"
:disabled="props.disabled" :response="props.response"
:response="props.response" :show-extraction="props.showExtraction"
:show-extraction="props.showExtraction" @change="handleChange"
@change="handleChange" />
/> <!-- 响应时间 -->
<!-- 响应时间 --> <ResponseTimeTab
<ResponseTimeTab v-if="getCurrentItemState.assertionType === ResponseAssertionType.RESPONSE_TIME"
v-if="getCurrentItemState.assertionType === ResponseAssertionType.RESPONSE_TIME" v-model:data="getCurrentItemState"
v-model:data="getCurrentItemState" :disabled="props.disabled"
:disabled="props.disabled" @change="handleChange"
@change="handleChange" />
/> <!-- 变量 -->
<!-- 变量 --> <VariableTab
<VariableTab v-if="getCurrentItemState.assertionType === ResponseAssertionType.VARIABLE"
v-if="getCurrentItemState.assertionType === ResponseAssertionType.VARIABLE" v-model:data="getCurrentItemState"
v-model:data="getCurrentItemState" :disabled="props.disabled"
:disabled="props.disabled" @change="handleChange"
@change="handleChange" />
/> <!-- 脚本 -->
<!-- 脚本 --> <ScriptTab
<ScriptTab v-if="getCurrentItemState.assertionType === ResponseAssertionType.SCRIPT"
v-if="getCurrentItemState.assertionType === ResponseAssertionType.SCRIPT" v-model:data="getCurrentItemState"
v-model:data="getCurrentItemState" :disabled="props.disabled"
:disabled="props.disabled" :script-code-editor-height="props.scriptCodeEditorHeight"
:script-code-editor-height="props.scriptCodeEditorHeight" @change="handleChange"
@change="handleChange" @delete-script-item="deleteScriptItem"
@delete-script-item="deleteScriptItem" @copy="copyItem"
@copy="copyItem" />
/>
</div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -893,6 +893,7 @@
...file, ...file,
fileId: res.data, fileId: res.data,
fileName: file.name || '', fileName: file.name || '',
fileAlias: file.name || '',
}; };
break; break;
} }
@ -902,7 +903,8 @@
record.files = files.map((e) => ({ record.files = files.map((e) => ({
...e, ...e,
fileId: e.uid || e.fileId || '', fileId: e.uid || e.fileId || '',
fileName: e.name || e.fileName || '', fileName: e.originalName || '',
fileAlias: e.name || '',
})); }));
} }
addTableLine(rowIndex); addTableLine(rowIndex);

View File

@ -376,7 +376,10 @@
(e: 'openCopyApiTab', record: ApiDefinitionDetail): void; (e: 'openCopyApiTab', record: ApiDefinitionDetail): void;
(e: 'addApiTab'): void; (e: 'addApiTab'): void;
(e: 'import'): void; (e: 'import'): void;
(e: 'openEditApiTab', record: ApiDefinitionDetail, isCopy: boolean, isExecute: boolean, isEdit: boolean): void; (
e: 'openEditApiTab',
options: { apiInfo: ApiDefinitionDetail; isCopy: boolean; isExecute: boolean; isEdit: boolean }
): void;
}>(); }>();
const appStore = useAppStore(); const appStore = useAppStore();
@ -977,7 +980,7 @@
} }
function editDefinition(record: ApiDefinitionDetail) { function editDefinition(record: ApiDefinitionDetail) {
emit('openEditApiTab', record, false, false, true); emit('openEditApiTab', { apiInfo: record, isCopy: false, isExecute: false, isEdit: true });
} }
// //

View File

@ -7,8 +7,8 @@
:protocol="props.protocol" :protocol="props.protocol"
:refresh-time-stamp="refreshTableTimeStamp" :refresh-time-stamp="refreshTableTimeStamp"
:member-options="memberOptions" :member-options="memberOptions"
@open-api-tab="(record, isExecute) => openApiTab(record, false, isExecute)" @open-api-tab="(record, isExecute) => openApiTab({ apiInfo: record, isCopy: false, isExecute })"
@open-copy-api-tab="openApiTab($event, true)" @open-copy-api-tab="openApiTab({ apiInfo: $event, isCopy: true })"
@add-api-tab="addApiTab" @add-api-tab="addApiTab"
@import="emit('import')" @import="emit('import')"
@open-edit-api-tab="openApiTab" @open-edit-api-tab="openApiTab"
@ -117,6 +117,7 @@
:definition-detail="activeApiTab" :definition-detail="activeApiTab"
:protocol="activeApiTab.protocol" :protocol="activeApiTab.protocol"
is-api is-api
@debug="openApiTabAndDebugMock"
/> />
</a-tab-pane> </a-tab-pane>
</a-tabs> </a-tabs>
@ -158,10 +159,18 @@
RequestComposition, RequestComposition,
RequestDefinitionStatus, RequestDefinitionStatus,
RequestMethods, RequestMethods,
RequestParamsType,
ResponseComposition, ResponseComposition,
} from '@/enums/apiEnum'; } from '@/enums/apiEnum';
import { defaultBodyParams, defaultResponse, defaultResponseItem } from '@/views/api-test/components/config'; import {
defaultBodyParams,
defaultBodyParamsItem,
defaultHeaderParamsItem,
defaultRequestParamsItem,
defaultResponse,
defaultResponseItem,
} from '@/views/api-test/components/config';
import type { RequestParam } from '@/views/api-test/components/requestComposition/index.vue'; import type { RequestParam } from '@/views/api-test/components/requestComposition/index.vue';
import { parseRequestBodyFiles } from '@/views/api-test/components/utils'; import { parseRequestBodyFiles } from '@/views/api-test/components/utils';
// requestComposition // requestComposition
@ -315,20 +324,29 @@
const loading = ref(false); const loading = ref(false);
const requestCompositionRef = ref<InstanceType<typeof requestComposition>>(); const requestCompositionRef = ref<InstanceType<typeof requestComposition>>();
async function openApiTab( async function openApiTab(options: {
apiInfo: ModuleTreeNode | ApiDefinitionDetail | string, apiInfo: ModuleTreeNode | ApiDefinitionDetail | string;
isCopy = false, isCopy?: boolean;
isExecute = false, isExecute?: boolean;
isEdit = false isEdit?: boolean;
) { isDebugMock?: boolean;
}) {
const { apiInfo, isCopy = false, isExecute = false, isEdit = false, isDebugMock = false } = options;
const isLoadedTabIndex = apiTabs.value.findIndex( const isLoadedTabIndex = apiTabs.value.findIndex(
(e) => e.id === (typeof apiInfo === 'string' ? apiInfo : apiInfo.id) (e) => e.id === (typeof apiInfo === 'string' ? apiInfo : apiInfo.id)
); );
if (isLoadedTabIndex > -1 && !isCopy) { if (isLoadedTabIndex > -1 && !isCopy) {
const preActiveApiTabId = activeApiTab.value.id; const preActiveApiTabId = activeApiTab.value.id;
let loadedApiTab = apiTabs.value[isLoadedTabIndex] as RequestParam;
if (isDebugMock) {
loadedApiTab = {
...loadedApiTab,
...(apiInfo as ApiDefinitionDetail).request,
};
}
// tabtab // tabtab
activeApiTab.value = { activeApiTab.value = {
...(apiTabs.value[isLoadedTabIndex] as RequestParam), ...loadedApiTab,
definitionActiveKey: isCopy || isExecute || isEdit ? 'definition' : 'preview', definitionActiveKey: isCopy || isExecute || isEdit ? 'definition' : 'preview',
isExecute, isExecute,
mode: isExecute ? 'debug' : 'definition', mode: isExecute ? 'debug' : 'definition',
@ -352,10 +370,17 @@
if (res.protocol === 'HTTP') { if (res.protocol === 'HTTP') {
parseRequestBodyResult = parseRequestBodyFiles(res.request.body, res.response); // id parseRequestBodyResult = parseRequestBodyFiles(res.request.body, res.response); // id
} }
let { request } = res;
if (isDebugMock) {
request = {
...res.request,
...(apiInfo as ApiDefinitionDetail).request,
};
}
addApiTab({ addApiTab({
label: name, label: name,
...res.request,
...res, ...res,
...request,
response: cloneDeep(defaultResponse), response: cloneDeep(defaultResponse),
responseDefinition: res.response.map((e) => ({ ...e, responseActiveTab: ResponseComposition.BODY })), responseDefinition: res.response.map((e) => ({ ...e, responseActiveTab: ResponseComposition.BODY })),
url: res.path, url: res.path,
@ -382,7 +407,58 @@
} }
async function openApiTabAndDebugMock(mock: MockDetail) { async function openApiTabAndDebugMock(mock: MockDetail) {
await openApiTab(mock.apiDefinitionId as string); openApiTab({
apiInfo: {
id: mock.apiDefinitionId as string,
request: {
body: {
bodyType: mock.mockMatchRule.body.bodyType,
binaryBody: mock.mockMatchRule.body.binaryBody,
rawBody: mock.mockMatchRule.body.rawBody,
xmlBody: mock.mockMatchRule.body.xmlBody,
wwwFormBody: {
formValues:
mock.mockMatchRule.body.wwwFormBody.matchRules.map((e) => ({
...defaultBodyParamsItem,
key: e.key,
value: e.value,
})) || [],
},
jsonBody: mock.mockMatchRule.body.jsonBody,
formDataBody: {
formValues:
mock.mockMatchRule.body.formDataBody.matchRules.map((e) => ({
...defaultBodyParamsItem,
key: e.key,
value: e.value,
files: e.files || [],
paramType: e.files && e.files.length > 0 ? RequestParamsType.FILE : defaultBodyParamsItem.paramType,
})) || [],
},
},
headers:
mock.mockMatchRule.header.matchRules.map((e) => ({
...defaultHeaderParamsItem,
key: e.key,
value: e.value,
})) || [],
query:
mock.mockMatchRule.query.matchRules.map((e) => ({
...defaultRequestParamsItem,
key: e.key,
value: e.value,
})) || [],
rest:
mock.mockMatchRule.rest.matchRules.map((e) => ({
...defaultRequestParamsItem,
key: e.key,
value: e.value,
})) || [],
},
} as unknown as ApiDefinitionDetail,
isExecute: true,
isDebugMock: true,
});
} }
// //

View File

@ -135,7 +135,11 @@
function newTab(apiInfo?: ModuleTreeNode | string, isCopy?: boolean, isExecute?: boolean) { function newTab(apiInfo?: ModuleTreeNode | string, isCopy?: boolean, isExecute?: boolean) {
if (apiInfo) { if (apiInfo) {
apiRef.value?.openApiTab(apiInfo, isCopy, isExecute); apiRef.value?.openApiTab({
apiInfo,
isCopy,
isExecute,
});
} else { } else {
apiRef.value?.addApiTab(); apiRef.value?.addApiTab();
} }

View File

@ -60,20 +60,23 @@
</MsDetailCard> </MsDetailCard>
<a-form ref="mockForm" :model="mockDetail" :disabled="isReadOnly"> <a-form ref="mockForm" :model="mockDetail" :disabled="isReadOnly">
<a-form-item <a-form-item
class="hidden-item" class="hidden-item mb-[16px]"
field="name" field="name"
:rules="[{ required: true, message: t('mockManagement.nameNotNull') }]" :rules="[{ required: true, message: t('mockManagement.nameNotNull') }]"
> >
<a-input <a-input
v-model:model-value="mockDetail.name" v-model:model-value="mockDetail.name"
:placeholder="t('mockManagement.namePlaceholder')" :placeholder="t('mockManagement.namePlaceholder')"
class="mb-[16px] w-[732px]" class="w-[732px]"
></a-input> ></a-input>
</a-form-item> </a-form-item>
<a-form-item class="hidden-item" :rules="[{ required: true, message: t('mockManagement.nameNotNull') }]"> <a-form-item
class="hidden-item mb-[16px]"
:rules="[{ required: true, message: t('mockManagement.nameNotNull') }]"
>
<MsTagsInput <MsTagsInput
v-model:model-value="mockDetail.tags" v-model:model-value="mockDetail.tags"
class="mb-[16px] w-[732px]" class="w-[732px]"
allow-clear allow-clear
unique-value unique-value
retain-input-value retain-input-value
@ -374,20 +377,26 @@
const currentKeyOptions = computed(() => { const currentKeyOptions = computed(() => {
switch (activeTab.value) { switch (activeTab.value) {
case RequestComposition.HEADER: case RequestComposition.HEADER:
return filterKeyValParams(props.definitionDetail.headers, defaultMatchRuleItem).validParams.map((e) => ({ return filterKeyValParams(props.definitionDetail.headers, defaultMatchRuleItem)
label: e.key, .validParams.filter((e, index, self) => self.findIndex((item) => item.key === e.key) === index)
value: e.key, .map((e) => ({
})); label: e.key,
value: e.key,
}));
case RequestComposition.QUERY: case RequestComposition.QUERY:
return filterKeyValParams(props.definitionDetail.query, defaultMatchRuleItem).validParams.map((e) => ({ return filterKeyValParams(props.definitionDetail.query, defaultMatchRuleItem)
label: e.key, .validParams.filter((e, index, self) => self.findIndex((item) => item.key === e.key) === index)
value: e.key, .map((e) => ({
})); label: e.key,
value: e.key,
}));
case RequestComposition.REST: case RequestComposition.REST:
return filterKeyValParams(props.definitionDetail.rest, defaultMatchRuleItem).validParams.map((e) => ({ return filterKeyValParams(props.definitionDetail.rest, defaultMatchRuleItem)
label: e.key, .validParams.filter((e, index, self) => self.findIndex((item) => item.key === e.key) === index)
value: e.key, .map((e) => ({
})); label: e.key,
value: e.key,
}));
default: default:
return []; return [];
} }
@ -396,23 +405,21 @@
const currentBodyKeyOptions = computed(() => { const currentBodyKeyOptions = computed(() => {
switch (mockDetail.value.mockMatchRule.body.bodyType) { switch (mockDetail.value.mockMatchRule.body.bodyType) {
case RequestBodyFormat.FORM_DATA: case RequestBodyFormat.FORM_DATA:
return filterKeyValParams( return filterKeyValParams(props.definitionDetail.body.formDataBody.formValues, defaultMatchRuleItem)
props.definitionDetail.body.formDataBody.formValues, .validParams.filter((e, index, self) => self.findIndex((item) => item.key === e.key) === index)
defaultMatchRuleItem .map((e) => ({
).validParams.map((e) => ({ label: e.key,
label: e.key, value: e.key,
value: e.key, paramType: e.paramType,
paramType: e.paramType, }));
}));
case RequestBodyFormat.WWW_FORM: case RequestBodyFormat.WWW_FORM:
return filterKeyValParams( return filterKeyValParams(props.definitionDetail.body.wwwFormBody.formValues, defaultMatchRuleItem)
props.definitionDetail.body.wwwFormBody.formValues, .validParams.filter((e, index, self) => self.findIndex((item) => item.key === e.key) === index)
defaultMatchRuleItem .map((e) => ({
).validParams.map((e) => ({ label: e.key,
label: e.key, value: e.key,
value: e.key, paramType: e.paramType,
paramType: e.paramType, }));
}));
default: default:
return []; return [];
} }
@ -569,10 +576,10 @@
} else { } else {
// //
mockDetail.value.mockMatchRule.body.binaryBody.file = { mockDetail.value.mockMatchRule.body.binaryBody.file = {
...fileList.value[0], ...file,
fileId: fileList.value[0]?.uid, fileId: file?.uid || '',
fileName: fileList.value[0]?.originalName || '', fileName: file?.originalName || '',
fileAlias: fileList.value[0]?.name || '', fileAlias: file?.name || '',
local: false, local: false,
}; };
} }

View File

@ -2,6 +2,7 @@
<a-form ref="formRef" :model="formModel" layout="vertical"> <a-form ref="formRef" :model="formModel" layout="vertical">
<a-spin :loading="loading" class="block"> <a-spin :loading="loading" class="block">
<div <div
v-if="matchRules.length > 0"
:class="`flex ${ :class="`flex ${
matchRules.length > 1 ? 'items-stretch' : 'items-center' matchRules.length > 1 ? 'items-stretch' : 'items-center'
} gap-[16px] bg-[var(--color-text-n9)] p-[12px]`" } gap-[16px] bg-[var(--color-text-n9)] p-[12px]`"
@ -97,6 +98,9 @@
</div> </div>
</div> </div>
</div> </div>
<div v-else>
<a-empty :description="t('mockManagement.noMatchRules')"></a-empty>
</div>
</a-spin> </a-spin>
</a-form> </a-form>
<a-modal <a-modal
@ -265,6 +269,7 @@
...file, ...file,
fileId: res.data, fileId: res.data,
fileName: file.name || '', fileName: file.name || '',
fileAlias: file.name || '',
}; };
break; break;
} }
@ -274,7 +279,8 @@
record.files = files.map((e) => ({ record.files = files.map((e) => ({
...e, ...e,
fileId: e.uid || e.fileId || '', fileId: e.uid || e.fileId || '',
fileName: e.name || e.fileName || '', fileName: e.originalName || '',
fileAlias: e.name || '',
})); }));
} }
addMatchRule(rowIndex); addMatchRule(rowIndex);

View File

@ -1,225 +1,251 @@
export default { export default {
'apiTestManagement.newApi': 'Create request', 'apiTestManagement.newApi': 'New API',
'apiTestManagement.importApi': 'Import api', 'apiTestManagement.importApi': 'Import API',
'apiTestManagement.fileImport': 'Import file', 'apiTestManagement.fileImport': 'File Import',
'apiTestManagement.timeImport': 'Scheduled import', 'apiTestManagement.timeImport': 'Time Import',
'apiTestManagement.timeTask': 'Timed tasks', 'apiTestManagement.timeTask': 'Time Task',
'apiTestManagement.name': 'Task name', 'apiTestManagement.name': 'Name',
'apiTestManagement.taskRunRule': 'Run rules', 'apiTestManagement.taskRunRule': 'Run Rule',
'apiTestManagement.taskNextRunTime': 'Next execution time', 'apiTestManagement.taskNextRunTime': 'Next Run Time',
'apiTestManagement.taskOperator': 'Operator', 'apiTestManagement.taskOperator': 'Operator',
'apiTestManagement.taskOperationTime': 'Operating time', 'apiTestManagement.taskOperationTime': 'Operation Time',
'apiTestManagement.createTaskSuccess': 'Create scheduled import task successfully', 'apiTestManagement.createTaskSuccess': 'Create Time Import Task Success',
'apiTestManagement.enableTaskSuccess': 'Start scheduled import task successfully', 'apiTestManagement.enableTaskSuccess': 'Enable Time Import Task Success',
'apiTestManagement.disableTaskSuccess': 'Closing the scheduled import task successfully', 'apiTestManagement.disableTaskSuccess': 'Disable Time Import Task Success',
'apiTestManagement.addSubModule': 'Add submodule', 'apiTestManagement.addSubModule': 'Add Submodule',
'apiTestManagement.allApi': 'All api', 'apiTestManagement.allApi': 'All APIs',
'apiTestManagement.allCase': 'All case', 'apiTestManagement.allCase': 'All Cases',
'apiTestManagement.searchTip': 'Please enter module/api name', 'apiTestManagement.searchTip': 'Please enter module/interface name',
'apiTestManagement.moveSearchTip': 'Please enter the module name to search', 'apiTestManagement.moveSearchTip': 'Please enter module name to search',
'apiTestManagement.noMatchModuleAndApi': 'No matching module/api yet', 'apiTestManagement.noMatchModuleAndApi': 'No matching module/interface found',
'apiTestManagement.noMatchModule': 'No matching module yet', 'apiTestManagement.noMatchModule': 'No matching module found',
'apiTestManagement.execute': 'Execute', 'apiTestManagement.execute': 'Execute',
'apiTestManagement.executeMethod': 'Execute method', 'apiTestManagement.executeMethod': 'Execute Method',
'apiTestManagement.recycle.batchRecover': 'Recover', 'apiTestManagement.recycle.batchRecover': 'Recover',
'apiTestManagement.recycle.recoveredSuccessfully': 'recovery was successful', 'apiTestManagement.recycle.recoveredSuccessfully': 'Recovered Successfully',
'apiTestManagement.recycle.batchCleanOut': 'Completely delete', 'apiTestManagement.recycle.batchCleanOut': 'Clean Out',
'apiTestManagement.recycle.completedDeleteCaseTitle': 'Confirm complete deletion {name}?', 'apiTestManagement.recycle.completedDeleteCaseTitle': 'Confirm to completely delete {name}?',
'apiTestManagement.recycle.cleanOutDeleteOnRecycleTip': 'apiTestManagement.recycle.cleanOutDeleteOnRecycleTip':
'After deletion, the API cannot be restored. Please operate with caution!', 'After deletion, the API cannot be recovered. Please proceed with caution!',
'apiTestManagement.recycle.batchDeleteApiTip': 'Are you sure to completely delete the selected {count} interfaces?', 'apiTestManagement.recycle.batchDeleteApiTip': 'Confirm to completely delete the selected {count} APIs?',
'apiTestManagement.share': 'Share API', 'apiTestManagement.share': 'Share API',
'apiTestManagement.shareModule': 'Share module', 'apiTestManagement.shareModule': 'Share Module',
'apiTestManagement.doc': 'Document', 'apiTestManagement.doc': 'Documentation',
'apiTestManagement.closeAll': 'Close all tabs', 'apiTestManagement.closeAll': 'Close All Tabs',
'apiTestManagement.closeOther': 'Close other tabs', 'apiTestManagement.closeOther': 'Close Other Tabs',
'apiTestManagement.showSubdirectory': 'Show subdirectory use case', 'apiTestManagement.showSubdirectory': 'Show Subdirectory Cases',
'apiTestManagement.searchPlaceholder': 'Enter ID/name/api path search', 'apiTestManagement.searchPlaceholder': 'Enter ID/Name/API Path to search',
'apiTestManagement.searchTaskPlaceholder': 'Enter resource Id/name/URL search', 'apiTestManagement.searchTaskPlaceholder': 'Enter Resource ID/Name/URL to search',
'apiTestManagement.apiName': 'Api name', 'apiTestManagement.apiName': 'API Name',
'apiTestManagement.apiType': 'Api type', 'apiTestManagement.apiType': 'Request Type',
'apiTestManagement.apiStatus': 'Status', 'apiTestManagement.apiStatus': 'Status',
'apiTestManagement.path': 'Path', 'apiTestManagement.path': 'Path',
'apiTestManagement.version': 'Version', 'apiTestManagement.version': 'Version',
'apiTestManagement.createTime': 'Creation time', 'apiTestManagement.createTime': 'Creation Time',
'apiTestManagement.updateTime': 'Update time', 'apiTestManagement.updateTime': 'Update Time',
'apiTestManagement.deleteTime': 'Delete time', 'apiTestManagement.deleteTime': 'Deletion Time',
'apiTestManagement.deleteUser': 'Delete user', 'apiTestManagement.deleteUser': 'Deleted By',
'apiTestManagement.deprecate': 'Deprecated', 'apiTestManagement.deprecate': 'Deprecated',
'apiTestManagement.processing': 'Processing', 'apiTestManagement.processing': 'Processing',
'apiTestManagement.debugging': 'Debugging', 'apiTestManagement.debugging': 'Debugging',
'apiTestManagement.done': 'Completed', 'apiTestManagement.done': 'Done',
'apiTestManagement.deleteApiTipTitle': 'Are you sure you want to delete {name}?', 'apiTestManagement.deleteApiTipTitle': 'Confirm to delete {name}?',
'apiTestManagement.deleteApiTip': 'apiTestManagement.deleteApiTip':
'After deletion, the interface will be placed in the recycle bin, where data recovery can be performed', 'After deletion, the API will be moved to the recycle bin and can be restored from there',
'apiTestManagement.batchDeleteApiTip': 'Are you sure you want to delete {count} selected interfaces?', 'apiTestManagement.batchDeleteApiTip': 'Confirm to delete the selected {count} APIs?',
'apiTestManagement.batchModalSubTitle': '({count} interfaces selected)', 'apiTestManagement.batchModalSubTitle': '(Selected {count} APIs)',
'apiTestManagement.chooseAttr': 'Select properties', 'apiTestManagement.chooseAttr': 'Choose Attribute',
'apiTestManagement.attrRequired': 'Property cannot be empty', 'apiTestManagement.attrRequired': 'Attribute cannot be empty',
'apiTestManagement.batchUpdate': 'Batch update to', 'apiTestManagement.batchUpdate': 'Batch Update to',
'apiTestManagement.valueRequired': 'Attribute value cannot be empty', 'apiTestManagement.valueRequired': 'Value cannot be empty',
'apiTestManagement.envRequired': 'Environment value cannot be empty', 'apiTestManagement.envRequired': 'Environment value cannot be empty',
'apiTestManagement.reportNameRequired': 'Report name cannot be empty', 'apiTestManagement.reportNameRequired': 'Report name cannot be empty',
'apiTestManagement.poolRequired': 'Resource pool cannot be empty', 'apiTestManagement.poolRequired': 'Resource pool cannot be empty',
'apiTestManagement.batchMoveConfirm': 'Move to selected module', 'apiTestManagement.batchMoveConfirm': 'Move to selected module',
'apiTestManagement.belongModule': 'Belonging module', 'apiTestManagement.belongModule': 'Belong to Module',
'apiTestManagement.importMode': 'Import mode', 'apiTestManagement.importMode': 'Import Mode',
'apiTestManagement.importModeTip1': 'Cover:', 'apiTestManagement.importModeTip1': 'Cover:',
'apiTestManagement.importModeTip2': 'apiTestManagement.importModeTip2':
'1.The same interface already exists in the system (the request type + path are consistent). If the request parameter content is inconsistent, the original interface of the system will be overwritten.', '1. If the same API (same request type + path) already exists in the system and the request parameter content is different, it will overwrite the original API',
'apiTestManagement.importModeTip3': 'apiTestManagement.importModeTip3':
'2.The same interface already exists in the system (request type + path are consistent), if the content of the request parameters is consistent, no changes will be made.', '2. If the same API (same request type + path) already exists in the system and the request parameter content is the same, no changes will be made',
'apiTestManagement.importModeTip4': '3.Interfaces that do not exist in the system are added.', 'apiTestManagement.importModeTip4': '3. If the API does not exist in the system, it will be added',
'apiTestManagement.importModeTip5': 'Not covered:', 'apiTestManagement.importModeTip5': 'Do Not Cover:',
'apiTestManagement.importModeTip6': 'apiTestManagement.importModeTip6':
'1.If the same interface already exists in the system (the request type + path is the same), no changes will be made.', '1. If the same API (same request type + path) already exists in the system, no changes will be made',
'apiTestManagement.importModeTip7': '2.Interfaces that do not exist in the system are added.', 'apiTestManagement.importModeTip7': '2. If the API does not exist in the system, it will be added',
'apiTestManagement.cover': 'Cover', 'apiTestManagement.cover': 'Cover',
'apiTestManagement.uncover': 'Not covered', 'apiTestManagement.uncover': 'Do Not Cover',
'apiTestManagement.moreSetting': 'More settings', 'apiTestManagement.moreSetting': 'More Settings',
'apiTestManagement.importType': 'Import method', 'apiTestManagement.importType': 'Import Type',
'apiTestManagement.urlImport': 'URL import', 'apiTestManagement.urlImport': 'URL Import',
'apiTestManagement.syncImportCase': 'Synchronous import interface use case', 'apiTestManagement.syncImportCase': 'Sync Import API Cases',
'apiTestManagement.syncUpdateDirectory': 'Synchronously update the directory where the interface is located', 'apiTestManagement.syncUpdateDirectory': 'Sync Update API Directory',
'apiTestManagement.importSwaggerFileTip1': 'Supports json files of Swagger 3.0 version,', 'apiTestManagement.importSwaggerFileTip1': 'Supports Swagger 3.0 version JSON files,',
'apiTestManagement.importSwaggerFileTip2': '2.0 files can be converted to 3.0 on the official website with one click', 'apiTestManagement.importSwaggerFileTip2': '2.0 files can be converted to 3.0 on the official website',
'apiTestManagement.importSwaggerFileTip3': ', the size does not exceed 50M', 'apiTestManagement.importSwaggerFileTip3': 'with a size limit of 50MB',
'apiTestManagement.urlImportPlaceholder': 'Please enter the OpenAPI/Swagger URL', 'apiTestManagement.urlImportPlaceholder': 'Please enter OpenAPI/URL',
'apiTestManagement.swaggerURLRequired': 'SwaggerURL cannot be empty', 'apiTestManagement.swaggerURLRequired': 'Swagger URL cannot be empty',
'apiTestManagement.basicAuth': 'Basic Authentication', 'apiTestManagement.basicAuth': 'Basic Auth',
'apiTestManagement.account': 'Account', 'apiTestManagement.account': 'Account',
'apiTestManagement.accountRequired': 'Account cannot be empty', 'apiTestManagement.accountRequired': 'Account cannot be empty',
'apiTestManagement.password': 'Password', 'apiTestManagement.password': 'Password',
'apiTestManagement.passwordRequired': 'Password can not be blank', 'apiTestManagement.passwordRequired': 'Password cannot be empty',
'apiTestManagement.taskName': 'Task name', 'apiTestManagement.taskName': 'Task Name',
'apiTestManagement.taskNamePlaceholder': 'Please enter a task name', 'apiTestManagement.taskNamePlaceholder': 'Please enter task name',
'apiTestManagement.taskNameRequired': 'Task name cannot be empty', 'apiTestManagement.taskNameRequired': 'Task name cannot be empty',
'apiTestManagement.syncFrequency': 'Sync frequency', 'apiTestManagement.syncFrequency': 'Sync Frequency',
'apiTestManagement.timeTaskList': 'Scheduled task list', 'apiTestManagement.timeTaskList': 'Time Task List',
'apiTestManagement.timeTaskHour': '(per hour)', 'apiTestManagement.timeTaskHour': '(Every Hour)',
'apiTestManagement.timeTaskSixHour': '(every 6 hours)', 'apiTestManagement.timeTaskSixHour': '(Every 6 Hours)',
'apiTestManagement.timeTaskTwelveHour': '(every 12 hours)', 'apiTestManagement.timeTaskTwelveHour': '(Every 12 Hours)',
'apiTestManagement.timeTaskDay': '(every day)', 'apiTestManagement.timeTaskDay': '(Every Day)',
'apiTestManagement.customFrequency': 'Custom frequency', 'apiTestManagement.customFrequency': 'Custom Frequency',
'apiTestManagement.case': 'Case', 'apiTestManagement.case': 'Case',
'apiTestManagement.definition': 'API', 'apiTestManagement.definition': 'Definition',
'apiTestManagement.debug': 'Debug', 'apiTestManagement.debug': 'Debug',
'apiTestManagement.addDependency': 'Select dependency use case', 'apiTestManagement.addDependency': 'Select Dependent Cases',
'apiTestManagement.clearSelected': 'Clear selected use cases', 'apiTestManagement.clearSelected': 'Clear Selected Cases',
'apiTestManagement.preDependency': 'Front interface', 'apiTestManagement.preDependency': 'Pre-dependent API',
'apiTestManagement.addPreDependency': 'Add pre-dependency', 'apiTestManagement.addPreDependency': 'Add Pre-dependency',
'apiTestManagement.postDependency': 'Rear interface', 'apiTestManagement.postDependency': 'Post-dependent API',
'apiTestManagement.addPostDependency': 'Add post-dependency', 'apiTestManagement.addPostDependency': 'Add Post-dependency',
'apiTestManagement.dependencyUnit': 'item', 'apiTestManagement.dependencyUnit': 'unit(s)',
'apiTestManagement.saveAsCase': 'Save as new use case', 'apiTestManagement.saveAsCase': 'Save as New Case',
'apiTestManagement.apiNamePlaceholder': 'Please enter the interface name', 'apiTestManagement.apiNamePlaceholder': 'Please enter API name',
'apiTestManagement.executeResult': 'Execution result', 'apiTestManagement.executeResult': 'Execution Result',
'apiTestManagement.setDefault': 'Set as Default', 'apiTestManagement.setDefault': 'Set as Default',
'apiTestManagement.confirmDelete': 'Are you sure you want to delete {name}?', 'apiTestManagement.confirmDelete': 'Confirm to delete {name}?',
'apiTestManagement.response': 'Response{count}', 'apiTestManagement.response': 'Response {count}',
'apiTestManagement.responseCode': 'Response code', 'apiTestManagement.responseCode': 'Response Code',
'apiTestManagement.dynamicConversion': 'Dynamic conversion', 'apiTestManagement.dynamicConversion': 'Dynamic Conversion',
'apiTestManagement.expandApi': 'Show all requests', 'apiTestManagement.expandApi': 'Show All Requests',
'apiTestManagement.collapseApi': 'Hide all requests', 'apiTestManagement.collapseApi': 'Hide All Requests',
'apiTestManagement.paramName': 'Parameter name', 'apiTestManagement.paramName': 'Parameter Name',
'apiTestManagement.paramVal': 'Parameter value', 'apiTestManagement.paramVal': 'Parameter Value',
'apiTestManagement.deleteMockTip': 'apiTestManagement.deleteMockTip':
'Deleting a mock expectation will cause the test task using the expectation to fail, so please operate with caution!', 'Deleting the expected response will cause the test task that uses it to fail. Please proceed with caution!',
'apiTestManagement.preview': 'Preview', 'apiTestManagement.preview': 'Preview',
'apiTestManagement.shareUrlCopied': 'Sharing link copied to clipboard', 'apiTestManagement.shareUrlCopied': 'Share link has been copied to the clipboard',
'apiTestManagement.detail': 'Detail', 'apiTestManagement.detail': 'Detail',
'apiTestManagement.reference': 'Reference', 'apiTestManagement.reference': 'Reference',
'apiTestManagement.dependencies': 'Dependency', 'apiTestManagement.dependencies': 'Dependencies',
'apiTestManagement.changeHistory': 'Change history', 'apiTestManagement.changeHistory': 'Change History',
'apiTestManagement.executeHistory': 'Execute history', 'apiTestManagement.executeHistory': 'Execution History',
'apiTestManagement.requestParams': 'Request parameters', 'apiTestManagement.requestParams': 'Request Parameters',
'apiTestManagement.responseContent': 'Response content', 'apiTestManagement.responseContent': 'Response Content',
'apiTestManagement.requestHeader': 'Request header', 'apiTestManagement.requestHeader': 'Request Header',
'apiTestManagement.requestBody': 'Request body', 'apiTestManagement.requestBody': 'Request Body',
'apiTestManagement.paramsType': 'Param type', 'apiTestManagement.paramsType': 'Parameter Type',
'apiTestManagement.required': 'Required', 'apiTestManagement.required': 'Required',
'apiTestManagement.requestData': 'Request data', 'apiTestManagement.requestData': 'Request Data',
'apiTestManagement.apiNameRequired': 'Interface name cannot be empty', 'apiTestManagement.apiNameRequired': 'API name cannot be empty',
'apiTestManagement.historyListTip': 'apiTestManagement.historyListTip':
'View and compare historical changes. According to the rules set by the administrator, the change history data will be automatically deleted.', "View and compare historical changes. According to the administrator's settings, historical data will be automatically deleted",
'apiTestManagement.changeOrder': 'Change serial number', 'apiTestManagement.changeOrder': 'Change Order',
'apiTestManagement.order': 'Serial number', 'apiTestManagement.order': 'Order',
'apiTestManagement.type': 'Type', 'apiTestManagement.type': 'Type',
'apiTestManagement.recover': 'Recover', 'apiTestManagement.recover': 'Recover',
'apiTestManagement.quote': 'Quote', 'apiTestManagement.quote': 'Quote',
'apiTestManagement.resourceName': 'Resource name', 'apiTestManagement.resourceName': 'Resource Name',
'apiTestManagement.resourceType': 'Resource type', 'apiTestManagement.resourceType': 'Resource Type',
'apiTestManagement.quoteType': 'Quote type', 'apiTestManagement.quoteType': 'Quote Type',
'apiTestManagement.belongOrg': 'Organization', 'apiTestManagement.belongOrg': 'Belong to Organization',
'apiTestManagement.belongProject': 'Project', 'apiTestManagement.belongProject': 'Belong to Project',
'apiTestManagement.quoteSearchPlaceholder': 'Enter ID or name to search', 'apiTestManagement.quoteSearchPlaceholder': 'Enter ID or name to search',
'apiTestManagement.tableNoDataAndPlease': 'No data yet, please', 'apiTestManagement.click': 'Click',
'apiTestManagement.getResponse': 'Get Response Content',
'apiTestManagement.tableNoDataAndPlease': 'No data, please',
'apiTestManagement.or': 'or', 'apiTestManagement.or': 'or',
'apiTestManagement.document': 'Document', 'apiTestManagement.document': 'Document Assertion',
'apiTestManagement.responseHeader': 'Response header', 'apiTestManagement.responseHeader': 'Response Header',
'apiTestManagement.responseTime': 'Response time', 'apiTestManagement.responseTime': 'Response Time',
'apiTestManagement.script': 'Script', 'apiTestManagement.script': 'Script',
'apiTestManagement.variable': 'Variable', 'apiTestManagement.variable': 'Variable',
'apiTestManagement.regex': 'Regular', 'apiTestManagement.regex': 'Regular Expression',
'case.execute.selectEnv': 'Environmental choice', 'case.execute.selectEnv': 'Select Environment',
'case.execute.defaultEnv': 'Default environment', 'case.execute.defaultEnv': 'Default Environment',
'case.execute.newEnv': 'New environment', 'case.execute.newEnv': 'New Environment',
'case.execute.defaultEnvTip': 'The environment where the use case is saved', 'case.execute.defaultEnvTip': 'Environment saved with the case',
'case.execute.model': 'Model', 'case.execute.model': 'Mode',
'case.execute.serial': 'Serial', 'case.execute.serial': 'Serial',
'case.execute.parallel': 'Parallel', 'case.execute.parallel': 'Parallel',
'case.execute.StopOnFailure': 'Stop on failure', 'case.execute.StopOnFailure': 'Stop on Failure',
'case.execute.reportSetting': 'Report configuration', 'case.execute.reportSetting': 'Report Configuration',
'case.execute.independentReporting': 'Independent reporting', 'case.execute.independentReporting': 'Independent Reporting',
'case.execute.CollectionReport': 'Collection report', 'case.execute.CollectionReport': 'Collection Report',
'case.execute.reportName': 'Report name', 'case.execute.reportName': 'Report Name',
'case.execute.pool': 'Resource pool operation', 'case.execute.pool': 'Run in Resource Pool',
'case.allCase': 'All Case', 'case.allCase': 'All Cases',
'case.detail': 'Case Detail', 'case.detail': 'Case Detail',
'case.caseName': 'Case Name', 'case.caseName': 'Case Name',
'case.caseNameRequired': 'Case name cannot be empty',
'case.caseNamePlaceholder': 'Please enter case name',
'case.caseLevel': 'Case Level', 'case.caseLevel': 'Case Level',
'case.caseEnvironment': 'Case Environment', 'case.caseEnvironment': 'Case Environment',
'case.tableColumnCreateUser': 'CreateUser', 'case.tableColumnCreateUser': 'Created By',
'case.tableColumnCreateTime': 'CreateTime', 'case.tableColumnCreateTime': 'Creation Time',
'case.tableColumnUpdateUser': 'UpdateUser', 'case.tableColumnUpdateUser': 'Updated By',
'case.tableColumnUpdateTime': 'UpdateTime', 'case.tableColumnUpdateTime': 'Update Time',
'case.lastReportStatus': 'Results Of Execution', 'case.lastReportStatus': 'Execution Result',
'case.passRate': 'Pass Rate', 'case.passRate': 'Case Pass Rate',
'case.passRateTip': 'Number of success case executions/Total number of case executions *%', 'case.passRateTip': 'Success cases executed / Total cases executed *%',
'case.batchModalSubTitle': '({count} cases selected)', 'case.batchModalSubTitle': '(Selected {count} cases)',
'case.batchDeleteCaseTipTitle': 'Are you sure you want to delete {name} ', 'case.batchDeleteCaseTip': 'Confirm to delete the selected {count} cases?',
'case.batchRecoverCaseTipTitle': 'Are you sure you want to recover {name} ', 'case.batchDeleteCaseTipTitle': 'Confirm to delete {name}?',
'case.batchDeleteCaseTip': 'Are you sure you want to delete {count} selected cases?', 'case.batchRecoverCaseTipTitle': 'Confirm to recover {name}?',
'case.recycle.cleanOutDeleteOnRecycleTip': 'case.recycle.cleanOutDeleteOnRecycleTip':
'After deletion, the case cannot be restored. Please operate with caution!', 'After deletion, the case cannot be recovered. Please proceed with caution!',
'case.deleteCaseTip': 'case.deleteCaseTip':
'Deleting an case will result in the execution failure of the test task that references the use case. Please be cautious!', 'Deleting the case will cause the test task that references it to fail. Please proceed with caution!',
'apiTestManagement.click': 'Click', 'case.batchRecoverCaseTip': 'Confirm to recover the selected {count} cases?',
'apiTestManagement.getResponse': 'Get response content', 'case.recycle.recoverCaseTip': 'Recovering the case will also restore the deleted API',
'case.batchRecoverCaseTip': 'Are you sure you want to recover {count} selected cases?', 'case.recycle.confirmRecovery': 'Confirm Recovery',
'case.recycle.recoverCaseTip': 'When restoring the case, the deleted API will be restored simultaneously.',
'case.recycle.confirmRecovery': 'Confirm recovery',
'case.createCase': 'Create Case', 'case.createCase': 'Create Case',
'case.updateCase': 'Update Case', 'case.updateCase': 'Update Case',
'case.saveContinueText': 'Save & continue', 'case.saveContinueText': 'Save and Continue Creating',
'case.detail.changeHistoryTip': `View and compare historical changes. According to the administrator's setting rules, historical changes will be automatically deleted`, 'case.detail.changeHistoryTip':
'case.detail.noReminders': 'No longer remind', "View and compare historical changes. According to the administrator's settings, historical data will be automatically deleted",
'case.detail.changeNumber': 'Change sequence', 'case.detail.noReminders': 'Do not remind again',
'case.detail.changeType': 'type', 'case.detail.changeNumber': 'Change Number',
'case.detail.operator': 'operator', 'case.detail.changeType': 'Change Type',
'case.detail.tableColumnUpdateTime': 'UpdateTime', 'case.detail.operator': 'Operator',
'case.detail.execute.success': 'Execute success', 'case.detail.tableColumnUpdateTime': 'Update Time',
'case.detail.execute.history.list': 'Execution history list', 'case.detail.execute.success': 'Execution Successful',
'case.detail.dependency.list': 'Reference relationship list', 'case.detail.execute.history.list': 'Execution History List',
'case.detail.resource.api': 'API', 'case.detail.dependency.list': 'Dependency List',
'case.detail.report.delete': 'Report cleared', 'case.detail.resource.api': 'API Test',
'mockManagement.name': 'Expected name', 'case.detail.report.delete': 'Report has been cleared',
'mockManagement.apiPath': 'Interface path', 'mockManagement.name': 'Expectation Name',
'mockManagement.apiPath': 'API Path',
'mockManagement.operationUser': 'Operator', 'mockManagement.operationUser': 'Operator',
'mockManagement.updateTime': 'Update time', 'mockManagement.updateTime': 'Update Time',
'mockManagement.copyMock': 'Copy mock address', 'mockManagement.copyMock': 'Copy Mock URL',
'mockManagement.batchEnable': 'Batch enable', 'mockManagement.batchEnable': 'Batch Enable',
'mockManagement.batchDisEnable': 'Batch disable', 'mockManagement.batchDisEnable': 'Batch Disable',
'mockManagement.batchDeleteMockTip': 'Are you sure you want to delete the selected {count} mocks?', 'mockManagement.batchDeleteMockTip': 'Confirm to delete the selected {count} mocks?',
'mockManagement.allMock': 'All MOCK', 'mockManagement.allMock': 'All Mocks',
'mockManagement.createMock': 'Create Mock',
'mockManagement.updateMock': 'Update Mock',
'mockManagement.mockDetail': 'Mock Detail',
'mockManagement.namePlaceholder': 'Please enter expectation name',
'mockManagement.nameNotNull': 'Expectation name cannot be empty',
'mockManagement.matchRule': 'Match Rule',
'mockManagement.saveAndContinue': 'Save and Continue Creating',
'mockManagement.paramNameNotNull': 'Parameter name cannot be empty',
'mockManagement.followDefinition': 'Follow API Definition',
'mockManagement.equals': 'Equals',
'mockManagement.notEquals': 'Not Equals',
'mockManagement.lengthEquals': 'Length Equals',
'mockManagement.lengthLarge': 'Length Larger Than',
'mockManagement.lengthLess': 'Length Less Than',
'mockManagement.lengthNotEquals': 'Length Not Equals',
'mockManagement.contain': 'Contain',
'mockManagement.notContain': 'Not Contain',
'mockManagement.empty': 'Empty',
'mockManagement.notEmpty': 'Not Empty',
'mockManagement.regular': 'Regular Expression',
'mockManagement.batchEdit': 'Batch Edit',
'mockManagement.batchDelete': 'Batch Delete',
'mockManagement.noMatchRules': 'No matching rules found',
}; };

View File

@ -237,4 +237,5 @@ export default {
'mockManagement.regular': '正则匹配', 'mockManagement.regular': '正则匹配',
'mockManagement.batchEdit': '批量编辑', 'mockManagement.batchEdit': '批量编辑',
'mockManagement.batchDelete': '批量删除', 'mockManagement.batchDelete': '批量删除',
'mockManagement.noMatchRules': '无该类匹配规则',
}; };

View File

@ -128,7 +128,7 @@ export default {
'system.config.auth.nameRequired': 'Authentication source name cannot be empty', 'system.config.auth.nameRequired': 'Authentication source name cannot be empty',
'system.config.auth.namePlaceholder': 'Please enter the authentication source name', 'system.config.auth.namePlaceholder': 'Please enter the authentication source name',
'system.config.auth.descPlaceholder': 'Please describe the certification source', 'system.config.auth.descPlaceholder': 'Please describe the certification source',
'system.config.auth.addResource': 'Add resource', 'system.config.auth.addResource': 'Add auth',
'system.config.auth.serviceUrl': 'Server address', 'system.config.auth.serviceUrl': 'Server address',
'system.config.auth.serviceUrlRequired': 'Server address cannot be empty', 'system.config.auth.serviceUrlRequired': 'Server address cannot be empty',
'system.config.auth.commonUrlPlaceholder': 'eg: {url}', 'system.config.auth.commonUrlPlaceholder': 'eg: {url}',

View File

@ -124,7 +124,7 @@ export default {
'system.config.auth.nameRequired': '认证源名称不能为空', 'system.config.auth.nameRequired': '认证源名称不能为空',
'system.config.auth.namePlaceholder': '请输入认证源名称', 'system.config.auth.namePlaceholder': '请输入认证源名称',
'system.config.auth.descPlaceholder': '请对该认证源进行描述', 'system.config.auth.descPlaceholder': '请对该认证源进行描述',
'system.config.auth.addResource': '添加资源', 'system.config.auth.addResource': '添加认证',
'system.config.auth.serviceUrl': '服务端地址', 'system.config.auth.serviceUrl': '服务端地址',
'system.config.auth.serviceUrlRequired': '服务端地址不能为空', 'system.config.auth.serviceUrlRequired': '服务端地址不能为空',
'system.config.auth.commonUrlPlaceholder': '例如:{url}', 'system.config.auth.commonUrlPlaceholder': '例如:{url}',