fix(系统管理): 修改项目和系统插件bug&统一字符长度

This commit is contained in:
xinxin.wu 2024-01-31 21:04:53 +08:00 committed by 刘瑞斌
parent 567a626998
commit 047e4d0936
90 changed files with 679 additions and 194 deletions

View File

@ -14,7 +14,6 @@
v-model:model-value="condition.name"
:placeholder="t('apiTestDebug.preconditionScriptNamePlaceholder')"
:max-length="255"
show-word-limit
size="small"
@press-enter="isShowEditScriptNameInput = false"
@blur="isShowEditScriptNameInput = false"

View File

@ -12,6 +12,8 @@
</template>
<script setup lang="ts">
import { defineModel } from 'vue';
import { statusCodeOptions } from '@/components/pure/ms-advance-filter/index';
import paramsTable, { type ParamTableColumn } from '@/views/api-test/components/paramTable.vue';

View File

@ -55,7 +55,7 @@
v-model="element[model.filed]"
class="flex-1"
:placeholder="t(model.placeholder || '')"
:max-length="model.maxLength || 250"
:max-length="model.maxLength || 255"
allow-clear
/>
<a-input-number
@ -102,7 +102,7 @@
v-model="element[child.filed]"
:class="child.className"
:placeholder="t(child.placeholder || '')"
:max-length="child.maxLength || 250"
:max-length="child.maxLength || 255"
allow-clear
/>
<a-select

View File

@ -1,5 +1,11 @@
<template>
<a-modal v-model:visible="showBatchModal" title-align="start" class="ms-modal-upload ms-modal-medium">
<a-modal
v-model:visible="showBatchModal"
:mask-closable="false"
:mask="true"
title-align="start"
class="ms-modal-upload ms-modal-medium"
>
<template #title>
{{ batchTitle }}
<div class="text-[var(--color-text-4)]">

View File

@ -34,6 +34,7 @@
:placeholder="t('caseManagement.caseReview.folderSearchPlaceholder')"
allow-clear
class="mb-[16px]"
:max-length="255"
/>
<div class="folder">
<div :class="getFolderClass('all')" @click="setActiveFolder('all')">

View File

@ -20,6 +20,7 @@
</div>
<a-input
v-model:model-value="moduleKeyword"
:max-length="255"
:placeholder="t('project.commonScript.folderSearchPlaceholder')"
allow-clear
class="mb-[16px]"

View File

@ -17,12 +17,7 @@
:label="t('project.commonScript.publicScriptName')"
:rules="[{ required: true, message: t('project.commonScript.publicScriptNameNotEmpty') }]"
>
<a-input
v-model="form.name"
:max-length="255"
show-word-limit
:placeholder="t('project.commonScript.pleaseEnterScriptName')"
/>
<a-input v-model="form.name" :max-length="255" :placeholder="t('project.commonScript.pleaseEnterScriptName')" />
</a-form-item>
<a-form-item field="status" :label="t('project.commonScript.scriptEnabled')">
<a-select v-model="form.status" class="max-w-[396px]" :placeholder="t('project.commonScript.scriptEnabled')">
@ -36,10 +31,11 @@
:placeholder="t('system.organization.descriptionPlaceholder')"
allow-clear
:auto-size="{ minRows: 1 }"
:max-length="1000"
/>
</a-form-item>
<a-form-item field="tags" :label="t('project.commonScript.tags')">
<a-input-tag v-model="form.tags" :placeholder="t('project.commonScript.enterContentAddTags')" allow-clear />
<MsTagsInput v-model:modelValue="form.tags"></MsTagsInput>
</a-form-item>
<a-form-item field="inputParameters" :label="t('project.commonScript.inputParams')">
<paramTable

View File

@ -3,6 +3,7 @@
v-model:model-value="moduleKeyword"
:placeholder="t('project.fileManagement.folderSearchPlaceholder')"
allow-clear
:max-length="255"
class="mb-[16px]"
></a-input>
<a-spin class="min-h-[400px] w-full" :loading="loading">

View File

@ -4,6 +4,7 @@
:placeholder="t('project.fileManagement.folderSearchPlaceholder')"
allow-clear
class="mb-[8px]"
:max-length="255"
></a-input>
<a-spin class="h-full w-full" :loading="loading">
<MsList

View File

@ -10,6 +10,7 @@
v-else-if="group.type === 'input'"
v-model:model-value="innerForm[`${paramKey}${index + 1}`]"
:placeholder="t(group.placeholder || '')"
:max-length="255"
/>
<a-radio-group
v-else-if="group.type === 'radio'"
@ -35,6 +36,7 @@
v-model:model-value="innerForm[`${paramKey}${index + 1}`]"
:placeholder="t(group.placeholder || '')"
class="ms-params-input-inputAppendSelect"
:max-length="255"
>
<template #prepend>
<a-select

View File

@ -128,7 +128,6 @@
v-model:model-value="timeForm.desc"
:max-length="64"
:placeholder="t('ms.personal.accessKeyDescPlaceholder')"
show-word-limit
/>
</a-form-item>
</a-form>

View File

@ -27,7 +27,6 @@
v-model:modelValue="baseInfoForm.name"
:placeholder="t('ms.personal.namePlaceholder')"
:max-length="255"
show-word-limit
/>
</a-form-item>
<a-form-item

View File

@ -21,6 +21,7 @@
v-model:model-value="apiConfig.userUrl"
:placeholder="t('ms.personal.apiLocalExecutionPlaceholder')"
class="mb-[16px]"
:max-length="255"
@press-enter="testApi"
></a-input>
<div class="config-card-footer">
@ -65,6 +66,7 @@
v-model:model-value="uiConfig.userUrl"
:placeholder="t('ms.personal.uiLocalExecutionPlaceholder')"
class="mb-[16px]"
:max-length="255"
@press-enter="testUi"
></a-input>
<div class="config-card-footer">

View File

@ -25,6 +25,7 @@
<a-input
v-model="form.name"
class="w-[243px]"
:max-length="255"
:placeholder="t('system.userGroup.pleaseInputUserGroupName')"
allow-clear
@press-enter="handleBeforeOk"

View File

@ -81,7 +81,7 @@
class="w-full"
allow-clear
:disabled="!item.dataIndex"
:max-length="60"
:max-length="255"
/>
<MsTagsInput
v-else-if="item.type === FilterType.TAGS_INPUT"
@ -97,7 +97,7 @@
class="w-full"
allow-clear
:disabled="!item.dataIndex"
:max-length="60"
:max-length="255"
/>
<MsSelect
v-else-if="item.type === FilterType.SELECT"
@ -150,8 +150,7 @@
minRows: 1,
maxRows: 1,
}"
show-word-limit
:max-length="512"
:max-length="1000"
/>
<a-radio-group
v-else-if="item.type === FilterType.RADIO"

View File

@ -40,6 +40,7 @@
ref="inputRef"
v-model.trim="addTagInput"
size="mini"
:max-length="255"
:error="!!tagInputError"
@keyup.enter="handleAddTag(item)"
@blur="handleAddTag(item)"

View File

@ -3,6 +3,7 @@
:value="props.modelValue"
:placeholder="t('project.menu.pleaseInputJiraKey')"
v-bind="attrs"
:max-length="255"
@change="(v: string) => emit('update:modelValue', v)"
@blur="handleBlur"
/>

View File

@ -1,7 +1,7 @@
<template>
<a-input
v-model="inputValue"
:max-length="250"
:max-length="255"
:type="isShowPassword ? 'password' : 'text'"
:placeholder="placeholder"
style="width: 100%"

View File

@ -41,7 +41,7 @@
<a-textarea
v-if="props.fieldConfig?.isTextArea"
v-model:model-value="form.field"
:max-length="props.fieldConfig?.maxLength"
:max-length="props.fieldConfig?.maxLength || 1000"
:auto-size="{ maxRows: 4 }"
:placeholder="props.fieldConfig?.placeholder"
class="w-[245px]"
@ -52,7 +52,7 @@
<a-input
v-else
v-model:model-value="form.field"
:max-length="50"
:max-length="255"
:placeholder="props.fieldConfig?.placeholder"
class="w-[245px]"
@press-enter="handleConfirm"

View File

@ -132,6 +132,7 @@
"
ref="currentInputRef"
v-model="record[item.dataIndex as string]"
:max-length="255"
@blur="handleEditInputBlur(record, item.dataIndex as string, true)"
@keydown.enter="handleEditInputBlur(record, item.dataIndex as string, false)"
/>

View File

@ -1,25 +1,31 @@
<template>
<a-input-tag
v-model:model-value="innerModelValue"
v-model:input-value="innerInputValue"
:placeholder="t(props.placeholder || 'ms.tagsInput.tagsInputPlaceholder')"
:allow-clear="props.allowClear"
:retain-input-value="props.retainInputValue"
:unique-value="props.uniqueValue"
:max-tag-count="props.maxTagCount"
@press-enter="tagInputEnter"
@blur="tagInputBlur"
>
<template v-if="props.customPrefix" #prefix>
<slot name="prefix"></slot>
</template>
<template v-if="props.customTag" #tag="{ data }">
<slot name="tag" :data="data"></slot>
</template>
<template v-if="props.customSuffix" #suffix>
<slot name="suffix"></slot>
</template>
</a-input-tag>
<div class="w-full">
<a-input-tag
v-model:model-value="innerModelValue"
v-model:input-value="innerInputValue"
:error="isError"
:placeholder="t(props.placeholder || 'ms.tagsInput.tagsInputPlaceholder')"
:allow-clear="props.allowClear"
:retain-input-value="props.retainInputValue"
:unique-value="props.uniqueValue"
:max-tag-count="props.maxTagCount"
@press-enter="tagInputEnter"
@blur="tagInputBlur"
>
<template v-if="props.customPrefix" #prefix>
<slot name="prefix"></slot>
</template>
<template v-if="props.customTag" #tag="{ data }">
<slot name="tag" :data="data"></slot>
</template>
<template v-if="props.customSuffix" #suffix>
<slot name="suffix"></slot>
</template>
</a-input-tag>
<span v-if="isError" class="ml-[1px] text-[12px] text-[rgb(var(--danger-6))]">{{
t('common.tagInputMaxLength', { number: props.maxLength })
}}</span>
</div>
</template>
<script setup lang="ts">
@ -41,11 +47,13 @@
customTag?: boolean;
customSuffix?: boolean;
maxTagCount?: number;
maxLength?: number;
}>(),
{
retainInputValue: true,
uniqueValue: true,
allowClear: true,
maxLength: 64,
}
);
const emit = defineEmits(['update:modelValue', 'update:inputValue', 'change']);
@ -56,6 +64,11 @@
const innerInputValue = ref(props.inputValue);
const tagsLength = ref(0); // tagstag
const isError = computed(
() =>
(innerInputValue.value || '').length > props.maxLength ||
innerModelValue.value.some((item) => item.length > props.maxLength)
);
watch(
() => props.modelValue,
(val) => {
@ -105,7 +118,12 @@
}
function tagInputBlur() {
if (innerInputValue.value && innerInputValue.value.trim() !== '' && validateUniqueValue()) {
if (
innerInputValue.value &&
innerInputValue.value.trim() !== '' &&
validateUniqueValue() &&
(innerInputValue.value || '').trim().length <= props.maxLength
) {
innerModelValue.value.push(innerInputValue.value.trim());
innerInputValue.value = '';
tagsLength.value += 1;
@ -113,9 +131,12 @@
}
function tagInputEnter() {
if (validateUniqueValue()) {
if (validateUniqueValue() && (innerInputValue.value || '').trim().length <= props.maxLength) {
innerInputValue.value = '';
tagsLength.value += 1;
} else {
innerModelValue.value = innerModelValue.value.filter((item: any) => item.length <= props.maxLength);
innerInputValue.value = '';
}
}
</script>

View File

@ -63,6 +63,7 @@ export default {
'common.setting': 'Setting',
'common.resetDefault': 'Reset default',
'common.tagPlaceholder': 'Add tag and press Enter to end',
'common.tagInputMaxLength': 'The tag must not exceed {number} characters',
'common.batchModify': 'Batch Edit',
'common.batchAdd': 'Batch Add',
'common.pleaseSelect': 'please choose',

View File

@ -65,6 +65,7 @@ export default {
'common.setting': '设置',
'common.resetDefault': '恢复默认',
'common.tagPlaceholder': '添加标签回车结束',
'common.tagInputMaxLength': '标签不得超过 {number} 个字符',
'common.batchModify': '批量修改',
'common.batchAdd': '批量添加',
'common.pleaseInput': '请输入',

View File

@ -14,13 +14,24 @@ const ProjectManagement: AppRouteRecordRaw = {
order: 7,
hideChildrenInMenu: true,
roles: [
'PROJECT_USER:READ',
'SYSTEM_PARAMETER_SETTING_BASE:READ',
'PROJECT_TEMPLATE:READ',
'PROJECT_FILE_MANAGEMENT:READ',
'PROJECT_MESSAGE:READ',
'PROJECT_CUSTOM_FUNCTION:READ',
'PROJECT_LOG:READ',
'PROJECT_ENVIRONMENT:READ',
// 菜单管理
'PROJECT_APPLICATION_WORKSTATION:READ',
'PROJECT_APPLICATION_TEST_PLAN:READ',
'PROJECT_APPLICATION_BUG:READ',
'PROJECT_APPLICATION_CASE:READ',
'PROJECT_APPLICATION_API:READ',
'PROJECT_APPLICATION_UI:READ',
'PROJECT_APPLICATION_PERFORMANCE_TEST:READ',
// 菜单管理
'PROJECT_USER:READ',
'PROJECT_GROUP:READ',
],
},
children: [
@ -32,7 +43,20 @@ const ProjectManagement: AppRouteRecordRaw = {
redirect: '/project-management/permission/basicInfo',
meta: {
locale: 'menu.projectManagement.projectPermission',
roles: ['PROJECT_USER:READ'],
roles: [
'SYSTEM_PARAMETER_SETTING_BASE:READ',
// 菜单管理
'PROJECT_APPLICATION_WORKSTATION:READ',
'PROJECT_APPLICATION_TEST_PLAN:READ',
'PROJECT_APPLICATION_BUG:READ',
'PROJECT_APPLICATION_CASE:READ',
'PROJECT_APPLICATION_API:READ',
'PROJECT_APPLICATION_UI:READ',
'PROJECT_APPLICATION_PERFORMANCE_TEST:READ',
// 菜单管理
'PROJECT_USER:READ',
'PROJECT_GROUP:READ',
],
isTopMenu: true,
},
children: [
@ -43,7 +67,7 @@ const ProjectManagement: AppRouteRecordRaw = {
component: () => import('@/views/project-management/projectAndPermission/basicInfos/index.vue'),
meta: {
locale: 'project.permission.basicInfo',
roles: ['SYSTEM_PARAMETER_SETTING_BASE:READ'],
roles: ['*'],
},
},
// 菜单管理
@ -81,7 +105,7 @@ const ProjectManagement: AppRouteRecordRaw = {
component: () => import('@/views/project-management/projectAndPermission/member/index.vue'),
meta: {
locale: 'project.permission.member',
roles: ['*'],
roles: ['PROJECT_USER:READ'],
},
},
// 用户组

View File

@ -16,7 +16,6 @@
v-model:model-value="condition.name"
:placeholder="t('apiTestDebug.preconditionScriptNamePlaceholder')"
:max-length="255"
show-word-limit
size="small"
@press-enter="isShowEditScriptNameInput = false"
@blur="isShowEditScriptNameInput = false"
@ -136,7 +135,6 @@
v-model:model-value="condition.desc"
:placeholder="t('apiTestDebug.commonPlaceholder')"
:max-length="255"
show-word-limit
/>
</div>
<div class="mb-[16px] flex w-full items-center bg-[var(--color-text-n9)] p-[12px]">
@ -184,6 +182,7 @@
<div class="mb-[8px] text-[var(--color-text-1)]">{{ t('apiTestDebug.storageByCol') }}</div>
<a-input
v-model:model-value="condition.sqlSource.storageByCol"
:max-length="255"
:placeholder="t('apiTestDebug.storageByColPlaceholder', { a: '{id_1}', b: '{username_1}' })"
/>
</div>
@ -191,6 +190,7 @@
<div class="mb-[8px] text-[var(--color-text-1)]">{{ t('apiTestDebug.storageByResult') }}</div>
<a-input
v-model:model-value="condition.sqlSource.storageByResult"
:max-length="255"
:placeholder="t('apiTestDebug.storageByResultPlaceholder', { a: '${result}' })"
/>
</div>
@ -243,6 +243,7 @@
<a-input
v-model:model-value="record.expression"
class="ms-params-input"
:max-length="255"
@input="handleExpressionChange"
@change="handleExpressionChange"
>

View File

@ -35,6 +35,7 @@
<div class="form-input-wrapper">
<a-input
v-model:model-value="expressionForm.expression"
:max-length="255"
:placeholder="t('apiTestDebug.regularExpressionPlaceholder', { ex: '/<title>(.*?)</title>/' })"
class="flex-1"
/>
@ -53,6 +54,7 @@
<div class="form-input-wrapper">
<a-input
v-model:model-value="expressionForm.expression"
:max-length="255"
:placeholder="t('apiTestDebug.JSONPathPlaceholder')"
class="flex-1"
/>
@ -71,6 +73,7 @@
<div class="form-input-wrapper">
<a-input
v-model:model-value="expressionForm.expression"
:max-length="255"
:placeholder="t('apiTestDebug.XPathPlaceholder')"
class="flex-1"
/>

View File

@ -11,6 +11,7 @@
<a-input
ref="inputRef"
v-model:model-value="innerValue"
:max-length="255"
class="param-input"
@input="(val) => emit('input', val)"
@change="(val) => emit('change', val)"

View File

@ -42,6 +42,7 @@
v-model:model-value="record[columnConfig.dataIndex as string]"
:placeholder="t('apiTestDebug.paramNamePlaceholder')"
class="param-input"
:max-length="255"
@input="(val) => addTableLine(val, 'name')"
/>
</a-popover>
@ -107,6 +108,7 @@
v-model:model-value="record.value"
class="param-input"
:placeholder="t('apiTestDebug.commonPlaceholder')"
:max-length="255"
@input="(val) => addTableLine(val, 'value')"
/>
</a-popover>
@ -274,8 +276,7 @@
<a-textarea
v-model:model-value="quickInputDescValue"
:placeholder="t('apiTestDebug.descPlaceholder')"
:max-length="255"
show-word-limit
:max-length="1000"
></a-textarea>
</a-modal>
</template>

View File

@ -13,6 +13,7 @@
v-model:model-value="authForm.account"
:placeholder="t('apiTestDebug.commonPlaceholder')"
class="w-[450px]"
:max-length="255"
/>
</a-form-item>
<a-form-item :label="t('apiTestDebug.password')">

View File

@ -24,12 +24,7 @@
/>
<div v-else-if="format === RequestBodyFormat.BINARY">
<div class="mb-[16px] flex justify-between gap-[8px] bg-[var(--color-text-n9)] p-[12px]">
<a-input
v-model:model-value="innerParams.binaryDesc"
:placeholder="t('common.desc')"
:max-length="255"
show-word-limit
/>
<a-input v-model:model-value="innerParams.binaryDesc" :placeholder="t('common.desc')" :max-length="255" />
</div>
<div class="flex items-center">
<a-switch v-model:model-value="innerParams.binarySend" class="mr-[8px]" size="small" type="line"></a-switch>

View File

@ -36,6 +36,7 @@
</a-select>
<a-input
v-model:model-value="activeDebug.url"
:max-length="255"
:placeholder="t('apiTestDebug.urlPlaceholder')"
@change="handleActiveDebugChange"
/>

View File

@ -37,6 +37,7 @@
<a-form-item :label="t('apiTestDebug.certificateAlias')">
<a-input
v-model:model-value="settingForm.certificateAlias"
:max-length="255"
:placeholder="t('apiTestDebug.commonPlaceholder')"
class="w-[450px]"
/>

View File

@ -25,7 +25,7 @@
<a-textarea
v-if="props.fieldConfig?.isTextArea"
v-model:model-value="form.field"
:max-length="props.fieldConfig?.maxLength"
:max-length="props.fieldConfig?.maxLength || 1000"
:auto-size="{ maxRows: 4 }"
:placeholder="props.fieldConfig?.placeholder || t('project.fileManagement.namePlaceholder')"
class="w-[245px]"
@ -35,7 +35,7 @@
<a-input
v-else
v-model:model-value="form.field"
:max-length="props.fieldConfig?.maxLength || 50"
:max-length="props.fieldConfig?.maxLength || 255"
:placeholder="props.fieldConfig?.placeholder || t('project.fileManagement.namePlaceholder')"
class="w-[245px]"
@press-enter="beforeConfirm(undefined)"

View File

@ -68,7 +68,7 @@
:rules="[{ required: true }]"
>
<template v-if="valueMode === 'tag'">
<a-input-tag v-model:model-value="form.value" :disabled="!form.attribute" />
<MsTagsInput v-model:modelValue="form.value" :disabled="!form.attribute"></MsTagsInput>
</template>
<template v-else-if="valueMode === 'user_selector'">
<MsUserSelector
@ -124,6 +124,7 @@
import { type FormInstance, Message, type ValidatedError } from '@arco-design/web-vue';
import { BatchActionQueryParams } from '@/components/pure/ms-table/type';
import MsTagsInput from '@/components/pure/ms-tags-input/index.vue';
import { MsUserSelector } from '@/components/business/ms-user-selector';
import { UserRequestTypeEnum } from '@/components/business/ms-user-selector/utils';

View File

@ -127,7 +127,7 @@
<!-- 自定义字段结束 -->
<div class="baseItem">
<span class="label"> {{ t('bugManagement.detail.tag') }}</span>
<a-input-tag v-model:model-value="detailInfo.tag" />
<MsTagsInput v-model:modelValue="detailInfo.tag"></MsTagsInput>
</div>
<div class="baseItem">
<span class="label"> {{ t('bugManagement.detail.creator') }}</span>
@ -165,6 +165,7 @@
import MsIcon from '@/components/pure/ms-icon-font/index.vue';
import MsSplitBox from '@/components/pure/ms-split-box/index.vue';
import type { MsPaginationI } from '@/components/pure/ms-table/type';
import MsTagsInput from '@/components/pure/ms-tags-input/index.vue';
import { CommentInput } from '@/components/business/ms-comment';
import { CommentParams } from '@/components/business/ms-comment/types';
import MsDetailDrawer from '@/components/business/ms-detail-drawer/index.vue';

View File

@ -29,7 +29,7 @@
:rules="[{ required: true, message: t('bugManagement.edit.nameIsRequired') }]"
:placeholder="t('bugManagement.edit.pleaseInputBugName')"
>
<a-input v-model="form.title" :max-length="255" show-word-limit />
<a-input v-model="form.title" :max-length="255" />
</a-form-item>
<a-form-item field="description" :label="t('bugManagement.edit.content')">
<MsRichText v-model:raw="form.description" />
@ -100,7 +100,7 @@
:form-rule="formRules"
/>
<a-form-item field="tag" :label="t('bugManagement.tag')">
<a-input-tag
<MsTagsInput
v-model:model-value="form.tag"
:placeholder="t('bugManagement.edit.tagPlaceholder')"
allow-clear
@ -143,6 +143,7 @@
import MsFormCreate from '@/components/pure/ms-form-create/ms-form-create.vue';
import { FormItem, FormRuleItem } from '@/components/pure/ms-form-create/types';
import MsRichText from '@/components/pure/ms-rich-text/MsRichText.vue';
import MsTagsInput from '@/components/pure/ms-tags-input/index.vue';
import FileList from '@/components/pure/ms-upload/fileList.vue';
import MsUpload from '@/components/pure/ms-upload/index.vue';
import { MsFileItem } from '@/components/pure/ms-upload/types';

View File

@ -27,6 +27,7 @@
<a-textarea
v-if="record.showExpected"
v-model="record.expected"
:max-length="1000"
size="mini"
:auto-size="true"
class="w-max-[267px]"

View File

@ -24,7 +24,7 @@
<div>
<a-input-search
v-model="searchParams.keyword"
:max-length="250"
:max-length="255"
:placeholder="t('project.member.searchMember')"
allow-clear
@search="searchHandler"

View File

@ -35,11 +35,7 @@
asterisk-position="end"
:rules="[{ required: true, message: t('caseManagement.featureCase.PleaseInputTags') }]"
>
<a-input-tag
v-model="form.tags"
:placeholder="t('caseManagement.featureCase.pleaseEnterInputTags')"
allow-clear
/>
<MsTagsInput v-model:modelValue="form.tags" allow-clear></MsTagsInput>
</a-form-item>
<MsFormCreate ref="formCreateRef" v-model:api="fApi" v-model:form-item="formItem" :form-rule="formRules" />
@ -56,6 +52,7 @@
import MsFormCreate from '@/components/pure/ms-form-create/ms-form-create.vue';
import type { FormItem, FormRuleItem } from '@/components/pure/ms-form-create/types';
import type { BatchActionQueryParams } from '@/components/pure/ms-table/type';
import MsTagsInput from '@/components/pure/ms-tags-input/index.vue';
import { batchEditAttrs, getCaseDefaultFields } from '@/api/modules/case-management/featureCase';
import { useI18n } from '@/hooks/useI18n';

View File

@ -13,7 +13,6 @@
v-model="form.name"
:max-length="255"
:placeholder="t('system.orgTemplate.caseNamePlaceholder')"
show-word-limit
allow-clear
></a-input>
</a-form-item>
@ -208,7 +207,7 @@
:form-rule="formRules"
/>
<a-form-item field="tags" :label="t('system.orgTemplate.tags')">
<a-input-tag v-model="form.tags" :placeholder="t('formCreate.PleaseEnter')" allow-clear />
<MsTagsInput v-model:model-value="form.tags" />
</a-form-item>
</a-form>
</div>
@ -250,6 +249,7 @@
import MsFormCreate from '@/components/pure/ms-form-create/ms-form-create.vue';
import type { FormItem, FormRuleItem } from '@/components/pure/ms-form-create/types';
import MsRichText from '@/components/pure/ms-rich-text/MsRichText.vue';
import MsTagsInput from '@/components/pure/ms-tags-input/index.vue';
import MsFileList from '@/components/pure/ms-upload/fileList.vue';
import MsUpload from '@/components/pure/ms-upload/index.vue';
import type { MsFileItem } from '@/components/pure/ms-upload/types';

View File

@ -20,7 +20,7 @@
:rules="[{ required: true, message: t('bugManagement.edit.nameIsRequired') }]"
:placeholder="t('bugManagement.edit.pleaseInputBugName')"
>
<a-input v-model="form.title" :max-length="255" show-word-limit />
<a-input v-model="form.title" :max-length="255" />
</a-form-item>
<a-form-item :label="t('bugManagement.edit.content')">
<MsRichText v-model:raw="form.description" />

View File

@ -28,7 +28,6 @@
<a-input
v-model="modelForm.demandName"
:max-length="255"
show-word-limit
:placeholder="t('caseManagement.featureCase.pleaseEnterTitle')"
/>
</a-form-item>

View File

@ -46,7 +46,7 @@
>
<a-input-search
v-model="platformKeyword"
:max-length="250"
:max-length="255"
:placeholder="t('project.member.searchMember')"
allow-clear
class="mx-[8px] w-[240px]"

View File

@ -14,6 +14,7 @@
:placeholder="t('caseManagement.featureCase.searchTip')"
allow-clear
class="mb-[16px]"
:max-length="255"
/>
<div class="folder">
<div :class="getFolderClass('all')" @click="setActiveFolder('all')">

View File

@ -5,6 +5,7 @@
:placeholder="t('caseManagement.caseReview.folderSearchPlaceholder')"
allow-clear
class="mb-[16px]"
:max-length="255"
/>
<div class="folder">
<div :class="getFolderClass('all')" @click="setActiveFolder('all')">

View File

@ -24,6 +24,7 @@
<a-input
v-model:model-value="confirmReviewName"
:placeholder="t('caseManagement.caseReview.deleteReviewPlaceholder')"
:max-length="255"
/>
<template #footer>
<div class="flex items-center justify-end">

View File

@ -5,6 +5,7 @@
:placeholder="t('caseManagement.caseReview.folderSearchPlaceholder')"
allow-clear
class="mb-[16px]"
:max-length="255"
/>
<div v-if="!props.isModal" class="folder">
<div :class="getFolderClass('all')" @click="setActiveFolder('all')">

View File

@ -25,7 +25,7 @@
<a-textarea
v-if="props.fieldConfig?.isTextArea"
v-model:model-value="form.field"
:max-length="props.fieldConfig?.maxLength"
:max-length="props.fieldConfig?.maxLength || 1000"
:auto-size="{ maxRows: 4 }"
:placeholder="props.fieldConfig?.placeholder || t('project.fileManagement.namePlaceholder')"
class="w-[245px]"
@ -35,7 +35,7 @@
<a-input
v-else
v-model:model-value="form.field"
:max-length="props.fieldConfig?.maxLength || 50"
:max-length="props.fieldConfig?.maxLength || 255"
:placeholder="props.fieldConfig?.placeholder || t('project.fileManagement.namePlaceholder')"
class="w-[245px]"
@press-enter="beforeConfirm(undefined)"

View File

@ -15,7 +15,6 @@
v-model:modelValue="reviewForm.name"
:placeholder="t('caseManagement.caseReview.reviewNamePlaceholder')"
:max-length="255"
show-word-limit
/>
</a-form-item>
<a-form-item field="desc" :label="t('caseManagement.caseReview.desc')">
@ -23,7 +22,6 @@
v-model:modelValue="reviewForm.desc"
:placeholder="t('caseManagement.caseReview.descPlaceholder')"
:max-length="1000"
show-word-limit
/>
</a-form-item>
<a-form-item field="folderId" :label="t('caseManagement.caseReview.belongModule')">

View File

@ -26,7 +26,7 @@
:validate-trigger="['change', 'blur']"
hide-label
>
<a-input v-model="userInfo.username" :placeholder="t('login.form.userName.placeholder')" />
<a-input v-model="userInfo.username" :max-length="255" :placeholder="t('login.form.userName.placeholder')" />
</a-form-item>
<a-form-item
class="login-form-item"

View File

@ -1,3 +1,377 @@
<template> Performance Test is waiting for development </template>
<template>
<div> <MsFormCreate :rule="rule" :option="options" /> </div
></template>
<script setup></script>
<script setup>
import MsFormCreate from '@/components/pure/ms-form-create/formCreate.vue';
const rule = ref([
{
type: 'input',
field: 'name',
title: '名称',
info: '',
_fc_drag_tag: 'input',
hidden: false,
display: true,
},
{
type: 'input',
field: 'comments',
title: '描述',
info: '',
_fc_drag_tag: 'input',
hidden: false,
display: true,
},
{
type: 'el-divider',
props: {
contentPosition: 'left',
},
wrap: {
show: false,
},
native: false,
children: ['目标Server配置'],
_fc_drag_tag: 'el-divider',
hidden: false,
display: true,
},
{
type: 'FcRow',
children: [
{
type: 'col',
props: {
span: 12,
},
children: [
{
type: 'input',
field: 'serverIp',
title: 'IP',
info: '',
_fc_drag_tag: 'input',
hidden: false,
display: true,
},
{
type: 'input',
field: 'connTimeout',
title: '连接超时时间',
info: '',
props: {
type: 'number',
},
_fc_drag_tag: 'input',
hidden: false,
display: true,
},
],
_fc_drag_tag: 'col',
hidden: false,
display: true,
},
{
type: 'col',
props: {
span: 12,
},
children: [
{
type: 'input',
field: 'port',
title: 'Port',
info: '',
_fc_drag_tag: 'input',
hidden: false,
display: true,
},
{
type: 'input',
field: 'resTimeout',
title: '响应超时时间',
info: '',
props: {
type: 'number',
},
_fc_drag_tag: 'input',
hidden: false,
display: true,
},
],
_fc_drag_tag: 'col',
hidden: false,
display: true,
},
],
_fc_drag_tag: 'row',
hidden: false,
display: true,
},
{
type: 'FcRow',
children: [
{
type: 'col',
props: {
span: 5,
},
children: [
{
type: 'input',
field: 'soLinger',
title: 'SO LINGER',
info: '',
_fc_drag_tag: 'input',
hidden: false,
display: true,
},
],
_fc_drag_tag: 'col',
hidden: false,
display: true,
},
{
type: 'col',
props: {
span: 5,
},
children: [
{
type: 'input',
field: 'eolByte',
title: 'EOL',
info: '',
_fc_drag_tag: 'input',
hidden: false,
display: true,
},
],
_fc_drag_tag: 'col',
hidden: false,
display: true,
},
{
type: 'col',
props: {
span: 5,
},
children: [
{
type: 'checkbox',
field: 'closeConnection',
title: '关闭连接',
info: '',
effect: {
fetch: '',
},
options: [
{
label: '',
value: '',
},
],
_fc_drag_tag: 'checkbox',
hidden: false,
display: true,
},
],
_fc_drag_tag: 'col',
hidden: false,
display: true,
},
{
type: 'col',
props: {
span: 5,
},
children: [
{
type: 'checkbox',
field: 'reUseConnection',
title: 'Re-use',
info: '',
effect: {
fetch: '',
},
options: [
{
label: '',
value: '',
},
],
_fc_drag_tag: 'checkbox',
hidden: false,
display: true,
},
],
_fc_drag_tag: 'col',
hidden: false,
display: true,
},
{
type: 'col',
props: {
span: 4,
},
children: [
{
type: 'checkbox',
field: 'noDelay',
title: '无延迟',
info: '',
effect: {
fetch: '',
},
options: [
{
label: '',
value: '',
},
],
_fc_drag_tag: 'checkbox',
hidden: false,
display: true,
},
],
_fc_drag_tag: 'col',
hidden: false,
display: true,
},
],
_fc_drag_tag: 'row',
hidden: false,
display: true,
},
{
type: 'input',
field: 'request',
title: '发送内容',
info: '',
props: {
type: 'textarea',
},
_fc_drag_tag: 'input',
hidden: false,
display: true,
},
{
type: 'el-divider',
props: {
contentPosition: 'left',
},
wrap: {
show: false,
},
native: false,
children: ['客户端或登录配置'],
_fc_drag_tag: 'el-divider',
hidden: false,
display: true,
},
{
type: 'FcRow',
children: [
{
type: 'col',
props: {
span: 8,
},
children: [
{
type: 'select',
field: 'classname',
title: '客户端类名',
info: '',
effect: {
fetch: '',
},
options: [
{
value: 'TCPClientImpl',
label: 'TCPClientImpl',
},
{
value: 'BinaryTCPClientImpl',
label: 'BinaryTCPClientImpl',
},
{
value: 'LengthPrefixedBinaryTCPClientImpl',
label: 'LengthPrefixedBinaryTCPClientImpl',
},
],
_fc_drag_tag: 'select',
hidden: false,
display: true,
$required: '',
},
],
_fc_drag_tag: 'col',
hidden: false,
display: true,
},
{
type: 'col',
props: {
span: 8,
},
children: [
{
type: 'input',
field: 'username',
title: '用户名',
info: '',
_fc_drag_tag: 'input',
hidden: false,
display: true,
},
],
_fc_drag_tag: 'col',
hidden: false,
display: true,
},
{
type: 'col',
props: {
span: 8,
},
children: [
{
type: 'input',
field: 'password',
title: '密码',
info: '',
props: {
type: 'password',
},
_fc_drag_tag: 'input',
hidden: false,
display: true,
},
],
_fc_drag_tag: 'col',
hidden: false,
display: true,
},
],
_fc_drag_tag: 'row',
hidden: false,
display: true,
},
]);
const options = {
form: {
labelPosition: 'right',
size: 'small',
labelWidth: '00px',
hideRequiredAsterisk: false,
showMessage: true,
inlineMessage: false,
},
submitBtn: true,
resetBtn: false,
};
</script>

View File

@ -12,7 +12,6 @@
>
<a-input
v-model="form.name"
show-word-limit
:max-length="255"
class="w-[732px]"
:placeholder="t('project.environmental.group.envGroupPlaceholder')"
@ -24,7 +23,13 @@
field="description"
:label="t('project.environmental.group.desc')"
>
<a-textarea v-model="form.description" auto-size class="w-[732px]" :placeholder="t('common.pleaseInput')" />
<a-textarea
v-model="form.description"
:max-length="1000"
auto-size
class="w-[732px]"
:placeholder="t('common.pleaseInput')"
/>
</a-form-item>
</a-form>
<paramsTable

View File

@ -11,7 +11,6 @@
>
<a-input
v-model="form.name"
show-word-limit
:max-length="255"
class="w-[732px]"
:placeholder="t('project.environmental.envNamePlaceholder')"

View File

@ -27,6 +27,7 @@
class="w-[243px]"
:placeholder="t('system.userGroup.pleaseInputUserGroupName')"
allow-clear
:max-length="255"
@press-enter="handleBeforeOk"
@keyup.esc="handleCancel"
/>

View File

@ -37,6 +37,7 @@
</template>
<script lang="ts" setup>
import { defineModel } from 'vue';
import { type FileItem, Message } from '@arco-design/web-vue';
import MsUpload from '@/components/pure/ms-upload/index.vue';

View File

@ -43,6 +43,7 @@
</template>
<script lang="ts" async setup>
import { defineModel } from 'vue';
import { TableData } from '@arco-design/web-vue';
import MsButton from '@/components/pure/ms-button/index.vue';

View File

@ -14,6 +14,7 @@
<a-input
v-model="form.hostname"
class="w-[100%]"
:max-length="255"
:placeholder="t('project.environmental.http.hostNamePlaceholder')"
>
<template #prefix>
@ -72,6 +73,7 @@
<a-input
v-model="form.hostname"
class="w-[100%]"
:max-length="255"
:placeholder="t('project.environmental.http.pathPlaceholder')"
>
<template #prefix>

View File

@ -46,13 +46,7 @@
asterisk-position="end"
:rules="[{ required: true, message: t('project.environmental.database.usernameIsRequire') }]"
>
<a-input
v-model="form.username"
:max-length="255"
show-word-limit
allow-clear
:placeholder="t('common.pleaseInput')"
/>
<a-input v-model="form.username" :max-length="255" allow-clear :placeholder="t('common.pleaseInput')" />
</a-form-item>
<a-form-item field="password" :label="t('project.environmental.database.password')">
<a-input-password
@ -102,7 +96,7 @@
</template>
<script lang="ts" setup>
import { computed, ref } from 'vue';
import { computed, defineModel, ref } from 'vue';
import { Message } from '@arco-design/web-vue';
import { driverOptionFun, validateDatabaseEnv } from '@/api/modules/project-management/envManagement';

View File

@ -4,6 +4,7 @@
:placeholder="t('project.fileManagement.folderSearchPlaceholder')"
allow-clear
class="mb-[16px]"
:max-length="255"
></a-input>
<a-spin class="min-h-[400px] w-full" :loading="loading">
<MsTree

View File

@ -25,7 +25,7 @@
<a-textarea
v-if="props.fieldConfig?.isTextArea"
v-model:model-value="form.field"
:max-length="props.fieldConfig?.maxLength"
:max-length="props.fieldConfig?.maxLength || 1000"
:auto-size="{ maxRows: 4 }"
:placeholder="props.fieldConfig?.placeholder || t('project.fileManagement.namePlaceholder')"
class="w-[245px]"

View File

@ -232,7 +232,7 @@
<a-input
v-model:model-value="storageForm.branch"
:placeholder="t('project.fileManagement.gitBranchPlaceholder')"
:max-length="250"
:max-length="255"
></a-input>
</a-form-item>
<a-form-item
@ -245,7 +245,7 @@
<a-input
v-model:model-value="storageForm.path"
:placeholder="t('project.fileManagement.gitFilePathPlaceholder')"
:max-length="250"
:max-length="255"
></a-input>
<MsFormItemSub :text="t('project.fileManagement.gitFilePathSub')" :show-fill-icon="false" />
</a-form-item>

View File

@ -4,6 +4,7 @@
:placeholder="t('project.fileManagement.folderSearchPlaceholder')"
allow-clear
class="mb-[8px]"
:max-length="255"
></a-input>
<a-spin class="h-full w-full" :loading="loading">
<MsList
@ -68,7 +69,6 @@
:max-length="255"
:placeholder="t('project.fileManagement.storageNamePlaceholder')"
allow-clear
show-word-limit
></a-input>
</a-form-item>
<a-form-item :label="t('project.fileManagement.storagePlatform')" field="platform" asterisk-position="end">
@ -122,7 +122,7 @@
>
<a-input
v-model:model-value="activeStorageForm.userName"
:max-length="250"
:max-length="255"
:placeholder="t('project.fileManagement.storageUsernamePlaceholder')"
allow-clear
></a-input>

View File

@ -133,9 +133,8 @@
>
<a-input
v-model:model-value="robotForm.name"
:max-length="250"
:max-length="255"
:placeholder="t('project.messageManagement.namePlaceholder')"
show-word-limit
allow-clear
></a-input>
</a-form-item>
@ -206,6 +205,7 @@
>
<a-input
v-model:model-value="robotForm.appKey"
:max-length="255"
:placeholder="t('project.messageManagement.appKeyPlaceholder')"
allow-clear
></a-input>
@ -219,6 +219,7 @@
>
<a-input
v-model:model-value="robotForm.appSecret"
:max-length="255"
:placeholder="t('project.messageManagement.appSecretPlaceholder')"
allow-clear
></a-input>
@ -239,6 +240,7 @@
>
<a-input
v-model:model-value="robotForm.webhook"
:max-length="255"
:placeholder="
t(
robotForm.platform === 'CUSTOM'

View File

@ -75,8 +75,7 @@
v-model:model-value="subject"
:placeholder="t('project.messageManagement.titlePlaceholder')"
:auto-size="{ minRows: 3, maxRows: 3 }"
:max-length="64"
show-word-limit
:max-length="1000"
:disabled="saveLoading"
@focus="focusTarget = 'subject'"
/>
@ -86,9 +85,8 @@
ref="templateInputRef"
v-model:model-value="template"
class="h-[calc(100%-156px)]"
:max-length="500"
:max-length="1000"
auto-size
show-word-limit
:disabled="saveLoading"
@focus="focusTarget = 'template'"
@blur="focusTarget = null"

View File

@ -17,10 +17,10 @@
asterisk-position="end"
:rules="[{ required: true, message: t('project.basicInfo.projectNameTip') }]"
>
<a-input v-model="form.name" allow-clear :max-length="250" />
<a-input v-model="form.name" allow-clear :max-length="255" />
</a-form-item>
<a-form-item field="description" :label="t('project.basicInfo.Description')" asterisk-position="end">
<a-textarea v-model="form.description" allow-clear auto-size />
<a-textarea v-model="form.description" :max-length="1000" allow-clear auto-size />
</a-form-item>
</a-form>
</div>

View File

@ -16,7 +16,7 @@
<div>
<a-input-search
v-model="searchParams.keyword"
:max-length="250"
:max-length="255"
:placeholder="t('project.member.searchMember')"
allow-clear
@search="searchHandler"

View File

@ -1,7 +1,7 @@
export default {
'project.member.addMember': '添加成员',
'project.member.updateMember': '更新成员',
'project.member.searchMember': '通过名称或邮箱搜索搜索',
'project.member.searchMember': '通过名称或邮箱搜索',
'project.member.remove': '移除',
'project.member.edit': '编辑',
'project.member.add': '添加',

View File

@ -109,6 +109,7 @@
>
<a-input
v-model:model-value="quickCreateForm.name"
:max-length="255"
:placeholder="t('project.projectVersion.versionNamePlaceholder')"
class="w-[262px]"
/>

View File

@ -30,14 +30,13 @@
v-model:model-value="templateForm.name"
:placeholder="t('system.orgTemplate.templateNamePlaceholder')"
:max-length="255"
show-word-limit
class="max-w-[732px]"
></a-input>
</a-form-item>
<a-form-item field="remark" :label="t('system.orgTemplate.description')" asterisk-position="end">
<a-textarea
v-model="templateForm.remark"
:max-length="255"
:max-length="1000"
:placeholder="t('system.orgTemplate.resDescription')"
:auto-size="{
maxRows: 1,
@ -90,7 +89,6 @@
v-model="defectForm.name"
:max-length="255"
:placeholder="t('system.orgTemplate.defectNamePlaceholder')"
show-word-limit
allow-clear
></a-input>
<MsFormItemSub :text="t('system.orgTemplate.defectNameTip')" :show-fill-icon="false" />

View File

@ -388,7 +388,9 @@
const getLinkList = async () => {
if (lastOrganizationId) {
userGroupOptions.value = await getGlobalUserGroup(lastOrganizationId.value);
projectOptions.value = await getProjectList(lastOrganizationId.value);
if (hasAnyPermission(['ORGANIZATION_PROJECT:READ'])) {
projectOptions.value = await getProjectList(lastOrganizationId.value);
}
}
};
onBeforeMount(() => {

View File

@ -62,6 +62,7 @@
<a-form-item field="description" :label="t('system.organization.description')">
<a-textarea
v-model="form.description"
:max-length="1000"
:placeholder="t('system.organization.descriptionPlaceholder')"
allow-clear
:auto-size="{ minRows: 1 }"

View File

@ -7,7 +7,7 @@
<a-input-search
v-model="keyword"
:placeholder="t('organization.service.searchService')"
:max-length="250"
:max-length="255"
allow-clear
@search="searchHandler"
@press-enter="searchHandler"

View File

@ -23,15 +23,14 @@
>
<a-input
v-model="form.name"
show-word-limit
:max-length="8"
:max-length="255"
:placeholder="t('system.orgTemplate.stateNameDescription')"
></a-input>
</a-form-item>
<a-form-item field="remark" :label="t('system.orgTemplate.description')" asterisk-position="end">
<a-textarea
v-model:model-value="form.remark"
:max-length="250"
:max-length="1000"
:placeholder="t('system.config.auth.descPlaceholder')"
allow-clear
></a-textarea>

View File

@ -24,13 +24,12 @@
v-model:model-value="fieldForm.name"
:placeholder="t('system.orgTemplate.fieldNamePlaceholder')"
:max-length="255"
show-word-limit
></a-input>
</a-form-item>
<a-form-item field="remark" :label="t('system.orgTemplate.description')" asterisk-position="end">
<a-textarea
v-model="fieldForm.remark"
:max-length="255"
:max-length="1000"
:placeholder="t('system.orgTemplate.resDescription')"
:auto-size="{
maxRows: 1,

View File

@ -30,14 +30,13 @@
v-model:model-value="templateForm.name"
:placeholder="t('system.orgTemplate.templateNamePlaceholder')"
:max-length="255"
show-word-limit
class="max-w-[732px]"
></a-input>
</a-form-item>
<a-form-item field="remark" :label="t('system.orgTemplate.description')" asterisk-position="end">
<a-textarea
v-model="templateForm.remark"
:max-length="255"
:max-length="1000"
:placeholder="t('system.orgTemplate.resDescription')"
:auto-size="{
maxRows: 1,
@ -90,7 +89,6 @@
v-model="defectForm.name"
:max-length="255"
:placeholder="t('system.orgTemplate.defectNamePlaceholder')"
show-word-limit
allow-clear
></a-input>
<MsFormItemSub :text="t('system.orgTemplate.defectNameTip')" :show-fill-icon="false" />

View File

@ -10,6 +10,7 @@
<template #apiFieldId="{ record }">
<a-input
v-model="record.apiFieldId"
:max-length="255"
class="min-w-[200px] max-w-[300px]"
:placeholder="t('system.orgTemplate.apiInputPlaceholder')"
allow-clear

View File

@ -100,6 +100,7 @@
minRows: 3,
}"
:rules="[{ required: true }]"
:max-length="1000"
></a-textarea>
</a-form-item>
</a-row>

View File

@ -71,7 +71,7 @@
>
<a-input
v-model:model-value="activeAuthForm.name"
:max-length="250"
:max-length="255"
:placeholder="t('system.config.auth.namePlaceholder')"
allow-clear
></a-input>
@ -79,7 +79,7 @@
<a-form-item :label="t('system.config.auth.desc')" field="description" asterisk-position="end">
<a-textarea
v-model:model-value="activeAuthForm.description"
:max-length="250"
:max-length="1000"
:placeholder="t('system.config.auth.descPlaceholder')"
allow-clear
></a-textarea>
@ -99,7 +99,7 @@
>
<a-input
v-model:model-value="activeAuthForm.configuration.casUrl"
:max-length="250"
:max-length="255"
:placeholder="t('system.config.auth.commonUrlPlaceholder', { url: 'http://<casurl>' })"
allow-clear
></a-input>
@ -113,7 +113,7 @@
>
<a-input
v-model:model-value="activeAuthForm.configuration.loginUrl"
:max-length="250"
:max-length="255"
:placeholder="t('system.config.auth.commonUrlPlaceholder', { url: 'http://<casurl>/login' })"
allow-clear
></a-input>
@ -128,7 +128,7 @@
>
<a-input
v-model:model-value="activeAuthForm.configuration.redirectUrl"
:max-length="250"
:max-length="255"
:placeholder="
t('system.config.auth.commonUrlPlaceholder', {
url: 'http://<meteresphere-endpoint>/sso/callback/cas/suthld',
@ -146,7 +146,7 @@
>
<a-input
v-model:model-value="activeAuthForm.configuration.validateUrl"
:max-length="250"
:max-length="255"
:placeholder="t('system.config.auth.commonUrlPlaceholder', { url: 'http://<casurl>/serviceValidate' })"
allow-clear
></a-input>
@ -163,7 +163,7 @@
>
<a-input
v-model:model-value="activeAuthForm.configuration.authUrl"
:max-length="250"
:max-length="255"
:placeholder="
t('system.config.auth.commonUrlPlaceholder', {
url: 'http://<keyclock>auth/realms/<metersphere>/protocol/openid-connect/auth',
@ -181,7 +181,7 @@
>
<a-input
v-model:model-value="activeAuthForm.configuration.tokenUrl"
:max-length="250"
:max-length="255"
:placeholder="
t('system.config.auth.commonUrlPlaceholder', {
url: 'http://<keyclock>auth/realms/<metersphere>/protocol/openid-connect/token',
@ -199,7 +199,7 @@
>
<a-input
v-model:model-value="activeAuthForm.configuration.userInfoUrl"
:max-length="250"
:max-length="255"
:placeholder="
t('system.config.auth.commonUrlPlaceholder', {
url: 'http://<keyclock>auth/realms/<metersphere>/protocol/openid-connect/userinfo',
@ -217,7 +217,7 @@
>
<a-input
v-model:model-value="activeAuthForm.configuration.redirectUrl"
:max-length="250"
:max-length="255"
:placeholder="
t('system.config.auth.commonUrlPlaceholder', {
url: 'http://<metersphere-endpoint>/sso/callback or http://<metersphere-endpoint>/sso/callback/authld',
@ -235,7 +235,7 @@
>
<a-input
v-model:model-value="activeAuthForm.configuration.clientId"
:max-length="250"
:max-length="255"
:placeholder="t('system.config.auth.clientIdPlaceholder')"
allow-clear
></a-input>
@ -249,7 +249,7 @@
>
<a-input
v-model:model-value="activeAuthForm.configuration.secret"
:max-length="250"
:max-length="255"
:placeholder="t('system.config.auth.clientSecretPlaceholder')"
allow-clear
></a-input>
@ -263,7 +263,7 @@
>
<a-input
v-model:model-value="activeAuthForm.configuration.logoutUrl"
:max-length="250"
:max-length="255"
:placeholder="
t('system.config.auth.commonUrlPlaceholder', {
url: 'http://<keyclock>/auth/realms/<metersphere>/protocol/openid-connect/logout',
@ -275,7 +275,7 @@
<a-form-item :label="t('system.config.auth.loginUrl')" field="configuration.loginUrl" asterisk-position="end">
<a-input
v-model:model-value="activeAuthForm.configuration.loginUrl"
:max-length="250"
:max-length="255"
:placeholder="t('system.config.auth.commonUrlPlaceholder', { url: 'http://<casurl>/login' })"
allow-clear
></a-input>
@ -292,7 +292,7 @@
>
<a-input
v-model:model-value="activeAuthForm.configuration.authUrl"
:max-length="250"
:max-length="255"
:placeholder="
t('system.config.auth.commonUrlPlaceholder', {
url: 'http://<keyclock>auth/realms/<metersphere>/protocol/openid-connect/auth',
@ -310,7 +310,7 @@
>
<a-input
v-model:model-value="activeAuthForm.configuration.tokenUrl"
:max-length="250"
:max-length="255"
:placeholder="
t('system.config.auth.commonUrlPlaceholder', {
url: 'http://<keyclock>auth/realms/<metersphere>/protocol/openid-connect/token',
@ -328,7 +328,7 @@
>
<a-input
v-model:model-value="activeAuthForm.configuration.userInfoUrl"
:max-length="250"
:max-length="255"
:placeholder="
t('system.config.auth.commonUrlPlaceholder', {
url: 'http://<keyclock>auth/realms/<metersphere>/protocol/openid-connect/userinfo',
@ -346,7 +346,7 @@
>
<a-input
v-model:model-value="activeAuthForm.configuration.redirectUrl"
:max-length="250"
:max-length="255"
:placeholder="
t('system.config.auth.commonUrlPlaceholder', {
url: 'http://<meteresphere-endpoint>/sso/callback/cas/suthld',
@ -364,7 +364,7 @@
>
<a-input
v-model:model-value="activeAuthForm.configuration.clientId"
:max-length="250"
:max-length="255"
:placeholder="t('system.config.auth.clientIdPlaceholder')"
allow-clear
></a-input>
@ -378,7 +378,7 @@
>
<a-input
v-model:model-value="activeAuthForm.configuration.secret"
:max-length="250"
:max-length="255"
:placeholder="t('system.config.auth.clientSecretPlaceholder')"
allow-clear
></a-input>
@ -392,7 +392,7 @@
>
<a-input
v-model:model-value="activeAuthForm.configuration.mapping"
:max-length="250"
:max-length="255"
placeholder="{'userid':'login','username':'name','email':'email'}"
allow-clear
></a-input>
@ -404,7 +404,7 @@
>
<a-input
v-model:model-value="activeAuthForm.configuration.logoutUrl"
:max-length="250"
:max-length="255"
:placeholder="
t('system.config.auth.commonUrlPlaceholder', {
url: 'http://<keyclock>/auth/realms/<metersphere>/protocol/openid-connect/logout',
@ -416,7 +416,7 @@
<a-form-item :label="t('system.config.auth.linkRange')" field="configuration.scope" asterisk-position="end">
<a-input
v-model:model-value="activeAuthForm.configuration.scope"
:max-length="250"
:max-length="255"
:placeholder="t('system.config.auth.linkRangePlaceholder')"
allow-clear
></a-input>
@ -424,7 +424,7 @@
<a-form-item :label="t('system.config.auth.loginUrl')" field="configuration.loginUrl" asterisk-position="end">
<a-input
v-model:model-value="activeAuthForm.configuration.loginUrl"
:max-length="250"
:max-length="255"
:placeholder="t('system.config.auth.commonUrlPlaceholder')"
allow-clear
></a-input>
@ -441,7 +441,7 @@
>
<a-input
v-model:model-value="activeAuthForm.configuration.url"
:max-length="250"
:max-length="255"
:placeholder="t('system.config.auth.LDAPUrlPlaceholder')"
allow-clear
></a-input>
@ -456,7 +456,7 @@
>
<a-input
v-model:model-value="activeAuthForm.configuration.dn"
:max-length="250"
:max-length="255"
:placeholder="t('system.config.auth.DNPlaceholder')"
allow-clear
></a-input>
@ -470,7 +470,7 @@
>
<a-input-password
v-model:model-value="activeAuthForm.configuration.password"
:max-length="250"
:max-length="255"
:placeholder="t('system.config.auth.LDAPPasswordPlaceholder')"
allow-clear
autocomplete="new-password"
@ -485,7 +485,7 @@
>
<a-input
v-model:model-value="activeAuthForm.configuration.ou"
:max-length="250"
:max-length="255"
:placeholder="t('system.config.auth.OUPlaceholder')"
allow-clear
></a-input>
@ -500,7 +500,7 @@
>
<a-input
v-model:model-value="activeAuthForm.configuration.filter"
:max-length="250"
:max-length="255"
:placeholder="t('system.config.auth.userFilterPlaceholder')"
allow-clear
></a-input>
@ -515,7 +515,7 @@
>
<a-input
v-model:model-value="activeAuthForm.configuration.mapping"
:max-length="250"
:max-length="255"
:placeholder="t('system.config.auth.LDAPPropertyMapPlaceholder')"
allow-clear
></a-input>
@ -550,7 +550,7 @@
<a-input
v-model:model-value="LDAPForm.username"
:placeholder="t('system.config.auth.testLoginNamePlaceholder')"
:max-length="250"
:max-length="255"
></a-input>
</a-form-item>
<a-form-item

View File

@ -85,7 +85,7 @@
>
<a-input
v-model:model-value="baseInfoForm.url"
:max-length="250"
:max-length="255"
:placeholder="t('system.config.baseInfo.pageUrlPlaceholder')"
allow-clear
></a-input>
@ -94,7 +94,7 @@
<a-form-item v-xpack :label="t('system.config.prometheus')" field="prometheusHost" asterisk-position="end">
<a-input
v-model:model-value="baseInfoForm.prometheusHost"
:max-length="250"
:max-length="255"
:placeholder="t('system.config.baseInfo.prometheusPlaceholder')"
allow-clear
></a-input>
@ -124,7 +124,7 @@
>
<a-input
v-model:model-value="emailConfigForm.host"
:max-length="250"
:max-length="255"
:placeholder="t('system.config.email.hostPlaceholder')"
allow-clear
></a-input>
@ -138,7 +138,7 @@
>
<a-input
v-model:model-value="emailConfigForm.port"
:max-length="250"
:max-length="255"
:placeholder="t('system.config.email.portPlaceholder')"
allow-clear
></a-input>
@ -152,7 +152,7 @@
>
<a-input
v-model:model-value="emailConfigForm.account"
:max-length="250"
:max-length="255"
:placeholder="t('system.config.email.accountPlaceholder')"
autocomplete="off"
allow-clear
@ -161,7 +161,7 @@
<a-form-item :label="t('system.config.email.password')" field="password" asterisk-position="end">
<a-input-password
v-model:model-value="emailConfigForm.password"
:max-length="250"
:max-length="255"
:placeholder="t('system.config.email.passwordPlaceholder')"
autocomplete="new-password"
allow-clear
@ -170,7 +170,7 @@
<a-form-item :label="t('system.config.email.from')" field="from" asterisk-position="end">
<a-input
v-model:model-value="emailConfigForm.from"
:max-length="250"
:max-length="255"
:placeholder="t('system.config.email.fromPlaceholder')"
allow-clear
></a-input>
@ -184,7 +184,7 @@
>
<a-input
v-model:model-value="emailConfigForm.recipient"
:max-length="250"
:max-length="255"
:placeholder="t('system.config.email.recipientPlaceholder')"
allow-clear
></a-input>

View File

@ -193,7 +193,7 @@
<a-input
v-model:model-value="pageConfig.slogan"
:placeholder="t('system.config.page.sloganPlaceholder')"
:max-length="250"
:max-length="255"
></a-input>
<MsFormItemSub :text="t('system.config.page.sloganTip')" :show-fill-icon="false" />
</a-form-item>
@ -201,7 +201,7 @@
<a-input
v-model:model-value="pageConfig.title"
:placeholder="t('system.config.page.titlePlaceholder')"
:max-length="250"
:max-length="255"
></a-input>
<MsFormItemSub :text="t('system.config.page.titleTip')" :show-fill-icon="false" />
</a-form-item>
@ -307,7 +307,7 @@
<a-input
v-model:model-value="pageConfig.platformName"
:placeholder="t('system.config.page.platformNamePlaceholder')"
:max-length="250"
:max-length="255"
></a-input>
<MsFormItemSub :text="t('system.config.page.platformNameTip')" :show-fill-icon="false" />
</a-form-item>
@ -315,7 +315,7 @@
<a-input
v-model:model-value="pageConfig.helpDoc"
:placeholder="t('system.config.page.helpDocPlaceholder')"
:max-length="250"
:max-length="255"
></a-input>
<MsFormItemSub :text="t('system.config.page.helpDocTip')" :show-fill-icon="false" />
</a-form-item>

View File

@ -76,6 +76,7 @@
class="filter-item"
:placeholder="t('system.log.operateNamePlaceholder')"
allow-clear
:max-length="255"
>
<template #prefix>
{{ t('system.log.operateName') }}

View File

@ -27,7 +27,7 @@
>
<a-input
v-model="form.name"
allow-clear
:max-length="255"
:placeholder="t('system.organization.organizationNamePlaceholder')"
/>
</a-form-item>
@ -45,6 +45,7 @@
:placeholder="t('system.organization.descriptionPlaceholder')"
:auto-size="{ minRows: 1 }"
style="resize: vertical"
:max-length="1000"
/>
</a-form-item>
</a-form>

View File

@ -25,7 +25,7 @@
:label="t('system.project.name')"
:rules="[{ required: true, message: t('system.project.projectNameRequired') }]"
>
<a-input v-model="form.name" :placeholder="t('system.project.projectNamePlaceholder')" />
<a-input v-model="form.name" :max-length="255" :placeholder="t('system.project.projectNamePlaceholder')" />
</a-form-item>
<a-form-item
required
@ -65,6 +65,7 @@
<a-form-item field="description" :label="t('system.organization.description')">
<a-textarea
v-model="form.description"
:max-length="1000"
:placeholder="t('system.organization.descriptionPlaceholder')"
allow-clear
:auto-size="{ minRows: 1 }"

View File

@ -9,13 +9,14 @@
</a-col>
<a-col :span="5" :offset="9">
<a-select v-model="searchKeys.scene" @change="searchHandler">
<a-option value="">{{ t('system.plugin.all') }}</a-option>
<a-option v-for="item of sceneList" :key="item.value" :value="item.value">{{ t(item.label) }}</a-option>
</a-select>
</a-col>
<a-col :span="5">
<a-input-search
v-model="searchKeys.name"
:max-length="250"
:max-length="255"
:placeholder="t('system.plugin.searchPlugin')"
allow-clear
@search="searchHandler"
@ -70,11 +71,19 @@
</a-table-column>
<a-table-column :title="t('system.plugin.tableColumnsOrg')" :width="300">
<template #cell="{ record }">
<MsTagGroup :tag-list="record.organizations || []" type="primary" theme="outline" />
<MsTagGroup
v-if="(record.organizations || []).length"
:tag-list="record.organizations || []"
type="primary"
theme="outline"
/>
<MsTag v-else type="primary" theme="outline">
{{ t('system.plugin.allOrganize') }}
</MsTag>
</template>
</a-table-column>
<a-table-column
:title="t('system.plugin.tableColumnsDescription')"
:title="t('system.plugin.tableColumnsJar')"
:ellipsis="true"
:tooltip="true"
data-index="fileName"
@ -145,6 +154,14 @@
<icon-down class="text-[rgb(var(--primary-6))]" :style="{ 'font-size': '12px' }" />
</span>
</template>
<template #empty>
<div class="flex w-full items-center justify-center p-[8px] text-[var(--color-text-4)]">
{{ t('system.plugin.tableNoData') }}
<MsButton v-permission="['SYSTEM_PLUGIN:READ+ADD']" class="ml-[8px]" @click="uploadPlugin">{{
t('system.plugin.uploadPlugin')
}}</MsButton>
</div>
</template>
</a-table>
</div>
<div class="ms-footerNum"
@ -180,6 +197,7 @@
import MsButton from '@/components/pure/ms-button/index.vue';
import MsTableMoreAction from '@/components/pure/ms-table-more-action/index.vue';
import type { ActionsItem } from '@/components/pure/ms-table-more-action/types';
import MsTag from '@/components/pure/ms-tag/ms-tag.vue';
import MsTagGroup from '@/components/pure/ms-tag/ms-tag-group.vue';
import scriptDetailDrawer from './scriptDetailDrawer.vue';
import TableExpand from './tableExpand.vue';
@ -225,10 +243,6 @@
const detailYaml = ref('');
const { openModal } = useModal();
const sceneList = ref([
{
label: 'system.plugin.all',
value: '',
},
{
label: 'system.plugin.interfaceTest',
value: 'API_PROTOCOL',

View File

@ -7,7 +7,7 @@
<a-input
v-model="form.name"
:placeholder="t('system.plugin.defaultJarNameTip')"
:max-length="250"
:max-length="255"
allow-clear
/>
</a-form-item>
@ -40,7 +40,12 @@
</a-select>
</a-form-item>
<a-form-item field="description" :label="t('system.plugin.description')" asterisk-position="end">
<a-textarea v-model="form.description" :placeholder="t('system.plugin.pluginDescription')" allow-clear />
<a-textarea
v-model="form.description"
:max-length="1000"
:placeholder="t('system.plugin.pluginDescription')"
allow-clear
/>
</a-form-item>
</a-form>
</div>

View File

@ -7,16 +7,21 @@
<a-form-item field="pluginName" :label="t('system.plugin.name')" asterisk-position="end">
<a-input
v-model="form.name"
:max-length="250"
:max-length="255"
:placeholder="t('system.plugin.defaultJarNameTip')"
allow-clear
/>
<span class="absolute right-0 top-1 flex items-center">
<span class="float-left text-[rgb(var(--primary-5))]">{{ t('system.plugin.getPlugin') }}</span>
<a-tooltip :content="t('system.plugin.infoTip')" position="bottom">
<a-tooltip position="bottom">
<span class="float-right ml-1 mt-[2px]">
<IconQuestionCircle class="h-[16px] w-[16px] text-[--color-text-4]" />
<IconQuestionCircle
class="h-[16px] w-[16px] text-[--color-text-4] hover:text-[rgb(var(--primary-5))]"
/>
</span>
<template #content>
<span @click="openGithub">{{ t('system.plugin.infoTip') }}</span>
</template>
</a-tooltip>
</span>
</a-form-item>
@ -31,7 +36,8 @@
>{{ t('system.plugin.allOrganize') }}
<span class="float-right mx-1 mt-[1px]">
<a-tooltip :content="t('system.plugin.allOrganizeTip')" position="top">
<IconQuestionCircle class="h-[16px] w-[16px] text-[--color-text-4]"
<IconQuestionCircle
class="h-[16px] w-[16px] text-[--color-text-4] hover:text-[rgb(var(--primary-5))]"
/></a-tooltip> </span
></a-radio>
<a-radio :value="false">{{ t('system.plugin.theOrganize') }}</a-radio>
@ -54,7 +60,12 @@
</a-select>
</a-form-item>
<a-form-item field="describe" :label="t('system.plugin.description')" asterisk-position="end">
<a-textarea v-model="form.description" :placeholder="t('system.plugin.pluginDescription')" allow-clear />
<a-textarea
v-model="form.description"
:max-length="1000"
:placeholder="t('system.plugin.pluginDescription')"
allow-clear
/>
</a-form-item>
</a-form>
</a-row>
@ -74,14 +85,15 @@
<div class="flex justify-between">
<div class="flex flex-row items-center justify-center">
<a-switch v-model="form.enable" size="small" type="line" />
<span class="ml-2">{{ t('system.plugin.pluginStatus') }}</span>
<a-tooltip>
<template #content>
<div class="text-sm">{{ t('system.plugin.statusEnableTip') }}</div>
<div class="text-sm">{{ t('organization.service.statusDisableTip') }}</div>
</template>
<div class="mx-1 flex h-[32px] items-center">
<span class="mr-1">{{ t('system.plugin.pluginStatus') }}</span>
<span class="mt-[2px]"
><IconQuestionCircle class="h-[16px] w-[16px] text-[rgb(var(--primary-5))]"
><IconQuestionCircle class="h-[16px] w-[16px] text-[--color-text-4] hover:text-[rgb(var(--primary-5))]"
/></span>
</div>
</a-tooltip>
@ -218,6 +230,10 @@
watchEffect(() => {
fileName.value = fileList.value[0]?.name as string;
});
function openGithub() {
window.open('https://github.com/metersphere');
}
</script>
<style scoped lang="less">

View File

@ -27,6 +27,8 @@ export default {
'system.plugin.defaultJarNameTip': 'The default is the package name',
'system.plugin.appOrganize': 'Application Organization',
'system.plugin.description': 'Description',
'system.plugin.tableColumnsJar': 'jar',
'system.plugin.tableNoData': 'No data, please',
'system.plugin.pluginDescription': 'Please describe the plug-in',
'system.plugin.supportFormat': 'Only JAR format files are supported and the file size does not exceed 50M',
'system.plugin.interfaceTestDescribe': 'Plug-ins for protocol classes recommend choosing an interface test',

View File

@ -27,6 +27,8 @@ export default {
'system.plugin.defaultJarNameTip': '默认为包名',
'system.plugin.appOrganize': '应用组织',
'system.plugin.description': '描述',
'system.plugin.tableColumnsJar': 'jar',
'system.plugin.tableNoData': '暂无数据,请',
'system.plugin.pluginDescription': '请对该插件进行描述',
'system.plugin.supportFormat': '只支持JAR格式文件文件大小不超过50M',
'system.plugin.interfaceTestDescribe': '协议类的插件建议选择接口测试',
@ -44,7 +46,7 @@ export default {
'system.plugin.updateTitle': '更新插件({name}',
'system.plugin.selectOrganizeTip': '请选择组织',
'system.plugin.selectOrganization': '选择组织',
'system.plugin.infoTip': '跳转至Github下载插件',
'system.plugin.infoTip': '跳转至 GitHub 下载插件',
'system.plugin.getPlugin': '获取开源插件',
'system.plugin.afterSecond': '秒后回到插件列表',
'system.plugin.uploadSuccess': '上传成功!',
@ -61,7 +63,7 @@ export default {
'system.plugin.enablePluginSuccess': '启用成功',
'system.plugin.disablePluginContent': '项目无法与该平台集成且该平台默认模版不可用,谨慎操作!',
'system.plugin.alertDescribe':
'MeterSphere V2.10 LTS 版本支持 DevOps、API 导入、请求、项目管理、协议类型的插件,具体支持插件请',
'MeterSphere v2.10 LTS 版本支持 DevOps、API 导入、请求、项目管理、协议 类型的插件,具体支持插件请',
'system.plugin.viewTable': '查看表格',
'system.plugin.downAddress': '更多开源插件,请在此下载',
'system.plugin.goDownload': '去下载',
@ -79,7 +81,7 @@ export default {
'system.plugin.uploadCompSource': '企业版',
'system.plugin.sizeExceedTip': '文件大小超出限制!',
'system.plugin.showScriptTitle': '查看脚本({name})',
'system.plugin.all': '全部',
'system.plugin.all': '全部应用场景',
'system.plugin.projectManagement': '项目管理',
'system.plugin.pluginStatus': '插件状态',
'system.plugin.databaseDriver': '数据库驱动',

View File

@ -18,21 +18,21 @@
<a-input
v-model:model-value="form.name"
:placeholder="t('system.resourcePool.namePlaceholder')"
:max-length="250"
:max-length="255"
></a-input>
</a-form-item>
<a-form-item :label="t('system.resourcePool.desc')" field="description" class="form-item">
<a-textarea
v-model:model-value="form.description"
:placeholder="t('system.resourcePool.descPlaceholder')"
:max-length="250"
:max-length="1000"
></a-textarea>
</a-form-item>
<a-form-item :label="t('system.resourcePool.serverUrl')" field="serverUrl" class="form-item">
<a-input
v-model:model-value="form.serverUrl"
:placeholder="t('system.resourcePool.rootUrlPlaceholder')"
:max-length="250"
:max-length="255"
></a-input>
</a-form-item>
<a-form-item :label="t('system.resourcePool.orgRange')" field="orgType" class="form-item">
@ -84,14 +84,14 @@
<a-input
v-model:model-value="form.testResourceDTO.loadTestImage"
:placeholder="t('system.resourcePool.mirrorPlaceholder')"
:max-length="250"
:max-length="255"
></a-input>
</a-form-item>
<a-form-item :label="t('system.resourcePool.testHeap')" field="testResourceDTO.loadTestHeap" class="form-item">
<a-input
v-model:model-value="form.testResourceDTO.loadTestHeap"
:placeholder="t('system.resourcePool.testHeapPlaceholder')"
:max-length="250"
:max-length="255"
></a-input>
<MsFormItemSub
:text="t('system.resourcePool.testHeapExample', { heap: defaultHeap })"
@ -111,7 +111,7 @@
<a-input
v-model:model-value="form.testResourceDTO.uiGrid"
:placeholder="t('system.resourcePool.uiGridPlaceholder')"
:max-length="250"
:max-length="255"
></a-input>
<div class="mt-[4px] text-[12px] leading-[16px] text-[var(--color-text-4)]">
{{ t('system.resourcePool.uiGridExample', { grid: defaultGrid }) }}
@ -218,7 +218,7 @@
<a-input
v-model:model-value="form.testResourceDTO.ip"
:placeholder="t('system.resourcePool.testResourceDTO.ipPlaceholder')"
:max-length="250"
:max-length="255"
></a-input>
<div class="mt-[4px] text-[12px] leading-[16px] text-[var(--color-text-4)]">
{{ t('system.resourcePool.testResourceDTO.ipSubTip', { ip: '100.0.0.100', domain: 'example.com' }) }}
@ -248,7 +248,7 @@
<a-input
v-model:model-value="form.testResourceDTO.namespace"
:placeholder="t('system.resourcePool.testResourceDTO.nameSpacesPlaceholder')"
:max-length="250"
:max-length="255"
class="mr-[8px] flex-1"
></a-input>
<a-tooltip
@ -273,7 +273,7 @@
<a-input
v-model:model-value="form.testResourceDTO.deployName"
:placeholder="t('system.resourcePool.testResourceDTO.deployNamePlaceholder')"
:max-length="250"
:max-length="255"
class="mr-[8px] flex-1"
></a-input>
<a-tooltip

View File

@ -2,7 +2,7 @@ export default {
'system.user.createUser': '创建用户',
'system.user.emailInvite': '邮箱邀请',
'system.user.importUser': '导入用户',
'system.user.searchUser': '通过名称或邮箱搜索搜索',
'system.user.searchUser': '通过名称或邮箱搜索',
'system.user.editUser': '编辑',
'system.user.resetPassword': '重置密码',
'system.user.disable': '禁用',