From 84b6e88a9987f9f9049b69c6941d9d463f75132b Mon Sep 17 00:00:00 2001 From: song-tianyang Date: Tue, 20 Jun 2023 11:27:04 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E7=B3=BB=E7=BB=9F=E8=AE=BE=E7=BD=AE):=20?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E7=AE=A1=E7=90=86=E5=A2=9E=E5=8A=A0=E5=90=AF?= =?UTF-8?q?=E7=94=A8=E7=A6=81=E7=94=A8=E7=9A=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sdk/constants/UserSourceEnum.java | 5 + .../sdk/mapper/BaseUserMapper.java | 2 + .../metersphere/sdk/mapper/BaseUserMapper.xml | 6 + .../resources/i18n/system_en_US.properties | 2 + .../resources/i18n/system_zh_CN.properties | 301 +++++++++--------- .../resources/i18n/system_zh_TW.properties | 301 +++++++++--------- .../system/controller/UserController.java | 18 +- .../system/dto/UserBatchCreateDTO.java | 14 +- .../{UserInfo.java => UserCreateInfo.java} | 33 +- .../system/dto/UserEditEnableRequest.java | 16 + .../system/dto/UserEditRequest.java | 2 +- .../dto/response/UserTableResponse.java | 18 ++ .../service/UserRoleRelationService.java | 10 +- .../system/service/UserService.java | 58 +++- .../UserControllerNonePermissionTests.java | 5 +- .../controller/UserControllerTests.java | 106 +++--- .../system/utils/UserTestUtils.java | 6 +- 17 files changed, 477 insertions(+), 426 deletions(-) create mode 100644 backend/framework/sdk/src/main/java/io/metersphere/sdk/constants/UserSourceEnum.java rename backend/services/system-setting/src/main/java/io/metersphere/system/dto/{UserInfo.java => UserCreateInfo.java} (50%) create mode 100644 backend/services/system-setting/src/main/java/io/metersphere/system/dto/UserEditEnableRequest.java create mode 100644 backend/services/system-setting/src/main/java/io/metersphere/system/dto/response/UserTableResponse.java diff --git a/backend/framework/sdk/src/main/java/io/metersphere/sdk/constants/UserSourceEnum.java b/backend/framework/sdk/src/main/java/io/metersphere/sdk/constants/UserSourceEnum.java new file mode 100644 index 0000000000..045798d2f8 --- /dev/null +++ b/backend/framework/sdk/src/main/java/io/metersphere/sdk/constants/UserSourceEnum.java @@ -0,0 +1,5 @@ +package io.metersphere.sdk.constants; + +public enum UserSourceEnum { + LOCAL, OIDC, CAS, OAUTH2 +} diff --git a/backend/framework/sdk/src/main/java/io/metersphere/sdk/mapper/BaseUserMapper.java b/backend/framework/sdk/src/main/java/io/metersphere/sdk/mapper/BaseUserMapper.java index bc77393f15..c5bd5b9d37 100644 --- a/backend/framework/sdk/src/main/java/io/metersphere/sdk/mapper/BaseUserMapper.java +++ b/backend/framework/sdk/src/main/java/io/metersphere/sdk/mapper/BaseUserMapper.java @@ -22,4 +22,6 @@ public interface BaseUserMapper { List selectUserIdByEmailList(@Param("emailList") List emailList); List selectByKeyword(String keyword); + + List selectUserIdByIdList(@Param("idList") List userIdList); } diff --git a/backend/framework/sdk/src/main/java/io/metersphere/sdk/mapper/BaseUserMapper.xml b/backend/framework/sdk/src/main/java/io/metersphere/sdk/mapper/BaseUserMapper.xml index f1b695ed24..db6cf177e0 100644 --- a/backend/framework/sdk/src/main/java/io/metersphere/sdk/mapper/BaseUserMapper.xml +++ b/backend/framework/sdk/src/main/java/io/metersphere/sdk/mapper/BaseUserMapper.xml @@ -60,4 +60,10 @@ OR email LIKE CONCAT('%', #{keyword}, '%') + \ No newline at end of file diff --git a/backend/framework/sdk/src/main/resources/i18n/system_en_US.properties b/backend/framework/sdk/src/main/resources/i18n/system_en_US.properties index d8e821e242..00de2d2dc8 100644 --- a/backend/framework/sdk/src/main/resources/i18n/system_en_US.properties +++ b/backend/framework/sdk/src/main/resources/i18n/system_en_US.properties @@ -1,6 +1,8 @@ role.not.global.system=Role is not global system role role.not.contains.member=Role not contains member user.not.login=User not login +user.not.exist=User not exist +user.not.empty=User can not empty auth_source.id.not_blank=Auth source id must not be blank auth_source.status.length_range=Auth source status must be between {min} and {max} characters long auth_source.status.not_blank=Auth source status must not be blank diff --git a/backend/framework/sdk/src/main/resources/i18n/system_zh_CN.properties b/backend/framework/sdk/src/main/resources/i18n/system_zh_CN.properties index 50d2234fd4..35a953bbd7 100644 --- a/backend/framework/sdk/src/main/resources/i18n/system_zh_CN.properties +++ b/backend/framework/sdk/src/main/resources/i18n/system_zh_CN.properties @@ -1,150 +1,151 @@ -role.not.global.system=\u89D2\u8272\u4E0D\u662F\u5168\u5C40\u7CFB\u7EDF\u89D2\u8272 -role.not.contains.member=\u89D2\u8272\u4E0D\u5305\u542B\u7CFB\u7EDF\u6210\u5458\u89D2\u8272 -user.not.login=\u672A\u83B7\u53D6\u5230\u767B\u5F55\u7528\u6237 -auth_source.id.not_blank=\u8BA4\u8BC1\u6E90ID\u4E0D\u80FD\u4E3A\u7A7A -auth_source.status.length_range=\u8BA4\u8BC1\u6E90\u72B6\u6001\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -auth_source.status.not_blank=\u8BA4\u8BC1\u6E90\u72B6\u6001\u4E0D\u80FD\u4E3A\u7A7A -license.id.not_blank=License ID\u4E0D\u80FD\u4E3A\u7A7A -message_task.id.not_blank=\u6D88\u606F\u901A\u77E5\u4EFB\u52A1ID\u4E0D\u80FD\u4E3A\u7A7A -message_task.type.not_blank=\u6D88\u606F\u901A\u77E5\u4EFB\u52A1\u7C7B\u578B\u4E0D\u80FD\u4E3A\u7A7A -message_task.type.length_range=\u6D88\u606F\u901A\u77E5\u4EFB\u52A1\u7C7B\u578B\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -message_task.event.not_blank=\u6D88\u606F\u901A\u77E5\u4EFB\u52A1\u4E8B\u4EF6\u4E0D\u80FD\u4E3A\u7A7A -message_task.event.length_range=\u6D88\u606F\u901A\u77E5\u4EFB\u52A1\u4E8B\u4EF6\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -message_task.receiver.not_blank=\u6D88\u606F\u901A\u77E5\u4EFB\u52A1\u63A5\u6536\u8005\u4E0D\u80FD\u4E3A\u7A7A -message_task.receiver.length_range=\u6D88\u606F\u901A\u77E5\u4EFB\u52A1\u63A5\u6536\u8005\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -message_task.task_type.not_blank=\u6D88\u606F\u901A\u77E5\u4EFB\u52A1\u4EFB\u52A1\u7C7B\u578B\u4E0D\u80FD\u4E3A\u7A7A -message_task.task_type.length_range=\u6D88\u606F\u901A\u77E5\u4EFB\u52A1\u4EFB\u52A1\u7C7B\u578B\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -message_task.test_id.not_blank=\u6D88\u606F\u901A\u77E5\u4EFB\u52A1\u6D4B\u8BD5ID\u4E0D\u80FD\u4E3A\u7A7A -message_task.test_id.length_range=\u6D88\u606F\u901A\u77E5\u4EFB\u52A1\u6D4B\u8BD5ID\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -message_task.project_id.not_blank=\u6D88\u606F\u901A\u77E5\u4EFB\u52A1\u9879\u76EEID\u4E0D\u80FD\u4E3A\u7A7A -message_task.project_id.length_range=\u6D88\u606F\u901A\u77E5\u4EFB\u52A1\u9879\u76EEID\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -message_task_blob.id.not_blank=\u6D88\u606F\u901A\u77E5\u4EFB\u52A1ID\u4E0D\u80FD\u4E3A\u7A7A -notification.id.not_blank=\u6D88\u606F\u901A\u77E5ID\u4E0D\u80FD\u4E3A\u7A7A -notification.type.not_blank=\u6D88\u606F\u901A\u77E5\u7C7B\u578B\u4E0D\u80FD\u4E3A\u7A7A -notification.type.length_range=\u6D88\u606F\u901A\u77E5\u7C7B\u578B\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -notification.receiver.not_blank=\u6D88\u606F\u901A\u77E5\u63A5\u6536\u8005\u4E0D\u80FD\u4E3A\u7A7A -notification.receiver.length_range=\u6D88\u606F\u901A\u77E5\u63A5\u6536\u8005\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -notification.title.not_blank=\u6D88\u606F\u901A\u77E5\u6807\u9898\u4E0D\u80FD\u4E3A\u7A7A -notification.title.length_range=\u6D88\u606F\u901A\u77E5\u6807\u9898\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -notification.status.not_blank=\u6D88\u606F\u901A\u77E5\u72B6\u6001\u4E0D\u80FD\u4E3A\u7A7A -notification.status.length_range=\u6D88\u606F\u901A\u77E5\u72B6\u6001\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -notification.operator.not_blank=\u6D88\u606F\u901A\u77E5\u64CD\u4F5C\u8005\u4E0D\u80FD\u4E3A\u7A7A -notification.operator.length_range=\u6D88\u606F\u901A\u77E5\u64CD\u4F5C\u8005\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -notification.operation.not_blank=\u6D88\u606F\u901A\u77E5\u64CD\u4F5C\u4E0D\u80FD\u4E3A\u7A7A -notification.operation.length_range=\u6D88\u606F\u901A\u77E5\u64CD\u4F5C\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -notification.resource_id.not_blank=\u6D88\u606F\u901A\u77E5\u8D44\u6E90ID\u4E0D\u80FD\u4E3A\u7A7A -notification.resource_id.length_range=\u6D88\u606F\u901A\u77E5\u8D44\u6E90ID\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -notification.resource_type.not_blank=\u6D88\u606F\u901A\u77E5\u8D44\u6E90\u7C7B\u578B\u4E0D\u80FD\u4E3A\u7A7A -notification.resource_type.length_range=\u6D88\u606F\u901A\u77E5\u8D44\u6E90\u7C7B\u578B\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -notification.resource_name.not_blank=\u6D88\u606F\u901A\u77E5\u8D44\u6E90\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A -notification.resource_name.length_range=\u6D88\u606F\u901A\u77E5\u8D44\u6E90\u540D\u79F0\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -novice_statistics.id.not_blank=\u65B0\u624B\u6751ID\u4E0D\u80FD\u4E3A\u7A7A -novice_statistics.guide_step.not_blank=\u65B0\u624B\u6751\u6B65\u9AA4\u4E0D\u80FD\u4E3A\u7A7A -novice_statistics.guide_step.length_range=\u65B0\u624B\u6751\u6B65\u9AA4\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -operating_log.id.not_blank=\u64CD\u4F5C\u65E5\u5FD7ID\u4E0D\u80FD\u4E3A\u7A7A -operating_log.project_id.not_blank=\u64CD\u4F5C\u65E5\u5FD7\u9879\u76EEID\u4E0D\u80FD\u4E3A\u7A7A -operating_log.project_id.length_range=\u64CD\u4F5C\u65E5\u5FD7\u9879\u76EEID\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -operating_log_resource.id.not_blank=\u64CD\u4F5C\u65E5\u5FD7\u8D44\u6E90ID\u4E0D\u80FD\u4E3A\u7A7A -operating_log_resource.operating_log_id.not_blank=\u64CD\u4F5C\u65E5\u5FD7\u8D44\u6E90\u64CD\u4F5C\u65E5\u5FD7ID\u4E0D\u80FD\u4E3A\u7A7A -operating_log_resource.operating_log_id.length_range=\u64CD\u4F5C\u65E5\u5FD7\u8D44\u6E90\u64CD\u4F5C\u65E5\u5FD7ID\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -operating_log_resource.source_id.not_blank=\u64CD\u4F5C\u65E5\u5FD7\u8D44\u6E90\u6765\u6E90ID\u4E0D\u80FD\u4E3A\u7A7A -operating_log_resource.source_id.length_range=\u64CD\u4F5C\u65E5\u5FD7\u8D44\u6E90\u6765\u6E90ID\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -plugin.id.not_blank=\u63D2\u4EF6\u4E3B\u952E\u4E0D\u80FD\u4E3A\u7A7A -plugin.plugin_id.not_blank=\u63D2\u4EF6ID\u4E0D\u80FD\u4E3A\u7A7A -plugin.plugin_id.length_range=\u63D2\u4EF6ID\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -plugin.script_id.not_blank=\u63D2\u4EF6\u811A\u672CID\u4E0D\u80FD\u4E3A\u7A7A -plugin.script_id.length_range=\u63D2\u4EF6\u811A\u672CID\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -plugin.clazz_name.not_blank=\u63D2\u4EF6\u7C7B\u540D\u4E0D\u80FD\u4E3A\u7A7A -plugin.clazz_name.length_range=\u63D2\u4EF6\u7C7B\u540D\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -plugin.jmeter_clazz.not_blank=\u63D2\u4EF6jmeter\u7C7B\u540D\u4E0D\u80FD\u4E3A\u7A7A -plugin.jmeter_clazz.length_range=\u63D2\u4EF6jmeter\u7C7B\u540D\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -plugin.source_path.not_blank=\u63D2\u4EF6\u6E90\u8DEF\u5F84\u4E0D\u80FD\u4E3A\u7A7A -plugin.source_path.length_range=\u63D2\u4EF6\u6E90\u8DEF\u5F84\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -plugin.source_name.not_blank=\u63D2\u4EF6\u6E90\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A -plugin.source_name.length_range=\u63D2\u4EF6\u6E90\u540D\u79F0\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -plugin.scenario.not_blank=\u63D2\u4EF6\u573A\u666F\u4E0D\u80FD\u4E3A\u7A7A -plugin.scenario.length_range=\u63D2\u4EF6\u573A\u666F\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -plugin_blob.id.not_blank=\u63D2\u4EF6ID\u4E0D\u80FD\u4E3A\u7A7A -quota.id.not_blank=\u914D\u989DID\u4E0D\u80FD\u4E3A\u7A7A -schedule.id.not_blank=\u5B9A\u65F6\u4EFB\u52A1ID\u4E0D\u80FD\u4E3A\u7A7A -schedule.type.not_blank=\u5B9A\u65F6\u4EFB\u52A1\u7C7B\u578B\u4E0D\u80FD\u4E3A\u7A7A -schedule.type.length_range=\u5B9A\u65F6\u4EFB\u52A1\u7C7B\u578B\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -schedule.value.not_blank=\u5B9A\u65F6\u4EFB\u52A1\u503C\u4E0D\u80FD\u4E3A\u7A7A -schedule.value.length_range=\u5B9A\u65F6\u4EFB\u52A1\u503C\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -schedule.job.not_blank=\u5B9A\u65F6\u4EFB\u52A1\u4E0D\u80FD\u4E3A\u7A7A -schedule.job.length_range=\u5B9A\u65F6\u4EFB\u52A1\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -schedule.create_user.not_blank=\u5B9A\u65F6\u4EFB\u52A1\u521B\u5EFA\u4EBA\u4E0D\u80FD\u4E3A\u7A7A -schedule.create_user.length_range=\u5B9A\u65F6\u4EFB\u52A1\u521B\u5EFA\u4EBA\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -service_integration.id.not_blank=\u670D\u52A1\u96C6\u6210ID\u4E0D\u80FD\u4E3A\u7A7A -service_integration.platform.not_blank=\u670D\u52A1\u96C6\u6210\u5E73\u53F0\u4E0D\u80FD\u4E3A\u7A7A -service_integration.platform.length_range=\u670D\u52A1\u96C6\u6210\u5E73\u53F0\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -system_parameter.param_key.not_blank=\u7CFB\u7EDF\u53C2\u6570Key\u4E0D\u80FD\u4E3A\u7A7A -system_parameter.type.not_blank=\u7CFB\u7EDF\u53C2\u6570\u7C7B\u578B\u4E0D\u80FD\u4E3A\u7A7A -system_parameter.type.length_range=\u7CFB\u7EDF\u53C2\u6570\u7C7B\u578B\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -test_resource.id.not_blank=\u8D44\u6E90\u6C60\u8282\u70B9ID\u4E0D\u80FD\u4E3A\u7A7A -test_resource.test_resource_pool_id.not_blank=\u8D44\u6E90\u6C60ID\u4E0D\u80FD\u4E3A\u7A7A -test_resource.test_resource_pool_id.length_range=\u8D44\u6E90\u6C60ID\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -test_resource.status.not_blank=\u8D44\u6E90\u6C60\u8282\u70B9\u72B6\u6001\u4E0D\u80FD\u4E3A\u7A7A -test_resource.status.length_range=\u8D44\u6E90\u6C60\u8282\u70B9\u72B6\u6001\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -test_resource_pool.id.not_blank=\u8D44\u6E90\u6C60ID\u4E0D\u80FD\u4E3A\u7A7A -test_resource_pool.name.not_blank=\u8D44\u6E90\u6C60\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A -test_resource_pool.name.length_range=\u8D44\u6E90\u6C60\u540D\u79F0\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -test_resource_pool.type.not_blank=\u8D44\u6E90\u6C60\u7C7B\u578B\u4E0D\u80FD\u4E3A\u7A7A -test_resource_pool.type.length_range=\u8D44\u6E90\u6C60\u7C7B\u578B\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -test_resource_pool.status.not_blank=\u8D44\u6E90\u6C60\u72B6\u6001\u4E0D\u80FD\u4E3A\u7A7A -test_resource_pool.status.length_range=\u8D44\u6E90\u6C60\u72B6\u6001\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -user.id.not_blank=\u7528\u6237ID\u4E0D\u80FD\u4E3A\u7A7A -user.name.not_blank=\u7528\u6237\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A -user.name.length_range=\u7528\u6237\u540D\u79F0\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -user.email.not_blank=\u7528\u6237email\u4E0D\u80FD\u4E3A\u7A7A -user.email.length_range=\u7528\u6237email\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -user.email.repeat=\u7528\u6237email\u5DF2\u5B58\u5728 -user.email.invalid=\u7528\u6237email\u683C\u5F0F\u4E0D\u6B63\u786E -user.status.not_blank=\u7528\u6237\u72B6\u6001\u4E0D\u80FD\u4E3A\u7A7A -user.status.length_range=\u7528\u6237\u72B6\u6001\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -user.source.not_blank=\u7528\u6237\u6765\u6E90\u4E0D\u80FD\u4E3A\u7A7A -user.source.length_range=\u7528\u6237\u6765\u6E90\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -user.create_user.not_blank=\u7528\u6237\u521B\u5EFA\u4EBA\u4E0D\u80FD\u4E3A\u7A7A -user.create_user.length_range=\u7528\u6237\u521B\u5EFA\u4EBA\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -user_extend.id.not_blank=\u7528\u6237ID\u4E0D\u80FD\u4E3A\u7A7A -user_key.id.not_blank=\u7528\u6237ApiKey ID\u4E0D\u80FD\u4E3A\u7A7A -user_key.create_user.not_blank=\u7528\u6237ApiKey\u521B\u5EFA\u4EBA\u4E0D\u80FD\u4E3A\u7A7A -user_key.create_user.length_range=\u7528\u6237ApiKey\u521B\u5EFA\u4EBA\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -user_key.access_key.not_blank=\u7528\u6237ApiKey access key\u4E0D\u80FD\u4E3A\u7A7A -user_key.access_key.length_range=\u7528\u6237ApiKey access key\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -user_key.secret_key.not_blank=\u7528\u6237ApiKey secret key\u4E0D\u80FD\u4E3A\u7A7A -user_key.secret_key.length_range=\u7528\u6237ApiKey secret key\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -user.info.not_empty=\u7528\u6237\u4FE1\u606F\u4E0D\u80FD\u4E3A\u7A7A -user.organizationId.not_blank=\u7528\u6237\u7EC4\u7EC7\u4E0D\u80FD\u4E3A\u7A7A -user.projectId.not_blank=\u7528\u6237\u9879\u76EE\u4E0D\u80FD\u4E3A\u7A7A -user_role.id.not_blank=\u7528\u6237\u7EC4ID\u4E0D\u80FD\u4E3A\u7A7A -user_role.name.not_blank=\u7528\u6237\u7EC4\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A -user_role.name.length_range=\u7528\u6237\u7EC4\u540D\u79F0\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -user_role.system.not_blank=\u662F\u5426\u662F\u7CFB\u7EDF\u7528\u6237\u7EC4\u4E0D\u80FD\u4E3A\u7A7A -user_role.system.length_range=\u662F\u5426\u662F\u7CFB\u7EDF\u7528\u6237\u7EC4\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -user_role.type.not_blank=\u7528\u6237\u7EC4\u7C7B\u578B\u4E0D\u80FD\u4E3A\u7A7A -user_role.type.length_range=\u7528\u6237\u7EC4\u7C7B\u578B\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -user_role.create_user.not_blank=\u7528\u6237\u7EC4\u521B\u5EFA\u4EBA\u4E0D\u80FD\u4E3A\u7A7A -user_role.create_user.length_range=\u7528\u6237\u7EC4\u521B\u5EFA\u4EBA\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -user_role.scope_id.not_blank=\u7528\u6237\u7EC4\u5E94\u7528\u8303\u56F4\u4E0D\u80FD\u4E3A\u7A7A -user_role.scope_id.length_range=\u7528\u6237\u7EC4\u5E94\u7528\u8303\u56F4\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -user_role_permission.id.not_blank=\u7528\u6237\u7EC4\u6743\u9650ID\u4E0D\u80FD\u4E3A\u7A7A -user_role_permission.role_id.not_blank=\u7528\u6237\u7EC4\u6743\u9650\u7528\u6237\u7EC4ID\u4E0D\u80FD\u4E3A\u7A7A -user_role_permission.role_id.length_range=\u7528\u6237\u7EC4\u6743\u9650\u7528\u6237\u7EC4ID\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -user_role_permission.permission_id.not_blank=\u7528\u6237\u7EC4\u6743\u9650\u6743\u9650ID\u4E0D\u80FD\u4E3A\u7A7A -user_role_permission.permission_id.length_range=\u7528\u6237\u7EC4\u6743\u9650\u6743\u9650ID\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -user_role_permission.module_id.not_blank=\u7528\u6237\u7EC4\u6743\u9650\u6A21\u5757ID\u4E0D\u80FD\u4E3A\u7A7A -user_role_permission.module_id.length_range=\u7528\u6237\u7EC4\u6743\u9650\u6A21\u5757ID\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -user_role_relation.id.not_blank=\u7528\u6237\u7EC4\u5173\u7CFBID\u4E0D\u80FD\u4E3A\u7A7A -user_role_relation.user_id.not_blank=\u7528\u6237\u7EC4\u5173\u7CFB\u7528\u6237ID\u4E0D\u80FD\u4E3A\u7A7A -user_role_relation.user_id.length_range=\u7528\u6237\u7EC4\u5173\u7CFB\u7528\u6237ID\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -user_role_relation.role_id.not_blank=\u7528\u6237\u7EC4\u5173\u7CFB\u7528\u6237\u7EC4ID\u4E0D\u80FD\u4E3A\u7A7A -user_role_relation.role_id.length_range=\u7528\u6237\u7EC4\u5173\u7CFB\u7528\u6237\u7EC4ID\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -user_role_relation.source_id.not_blank=\u7528\u6237\u7EC4\u5173\u7CFB\u6765\u6E90ID\u4E0D\u80FD\u4E3A\u7A7A -user_role_relation.source_id.length_range=\u7528\u6237\u7EC4\u5173\u7CFB\u6765\u6E90ID\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -organization.id.not_blank=\u5DE5\u4F5C\u7A7A\u95F4ID\u4E0D\u80FD\u4E3A\u7A7A -organization.name.not_blank=\u5DE5\u4F5C\u7A7A\u95F4\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A -organization.name.length_range=\u5DE5\u4F5C\u7A7A\u95F4\u540D\u79F0\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -organization.create_user.not_blank=\u5DE5\u4F5C\u7A7A\u95F4\u521B\u5EFA\u4EBA\u4E0D\u80FD\u4E3A\u7A7A -organization.create_user.length_range=\u5DE5\u4F5C\u7A7A\u95F4\u521B\u5EFA\u4EBA\u957F\u5EA6\u5FC5\u987B\u5728{min}\u548C{max}\u4E4B\u95F4 -member.id.not_empty=\u6210\u5458\u4E0D\u80FD\u4E3A\u7A7A \ No newline at end of file +role.not.global.system=角色不是全局系统角色 +role.not.contains.member=角色不包含系统成员角色 +user.not.login=未获取到登录用户 +user.not.empty=用户不呢为空 +user.not.exist=用户不存在 +auth_source.id.not_blank=认证源ID不能为空 +auth_source.status.length_range=认证源状态长度必须在{min}和{max}之间 +auth_source.status.not_blank=认证源状态不能为空 +license.id.not_blank=License ID不能为空 +message_task.id.not_blank=消息通知任务ID不能为空 +message_task.type.not_blank=消息通知任务类型不能为空 +message_task.type.length_range=消息通知任务类型长度必须在{min}和{max}之间 +message_task.event.not_blank=消息通知任务事件不能为空 +message_task.event.length_range=消息通知任务事件长度必须在{min}和{max}之间 +message_task.receiver.not_blank=消息通知任务接收者不能为空 +message_task.receiver.length_range=消息通知任务接收者长度必须在{min}和{max}之间 +message_task.task_type.not_blank=消息通知任务任务类型不能为空 +message_task.task_type.length_range=消息通知任务任务类型长度必须在{min}和{max}之间 +message_task.test_id.not_blank=消息通知任务测试ID不能为空 +message_task.test_id.length_range=消息通知任务测试ID长度必须在{min}和{max}之间 +message_task.project_id.not_blank=消息通知任务项目ID不能为空 +message_task.project_id.length_range=消息通知任务项目ID长度必须在{min}和{max}之间 +message_task_blob.id.not_blank=消息通知任务ID不能为空 +notification.id.not_blank=消息通知ID不能为空 +notification.type.not_blank=消息通知类型不能为空 +notification.type.length_range=消息通知类型长度必须在{min}和{max}之间 +notification.receiver.not_blank=消息通知接收者不能为空 +notification.receiver.length_range=消息通知接收者长度必须在{min}和{max}之间 +notification.title.not_blank=消息通知标题不能为空 +notification.title.length_range=消息通知标题长度必须在{min}和{max}之间 +notification.status.not_blank=消息通知状态不能为空 +notification.status.length_range=消息通知状态长度必须在{min}和{max}之间 +notification.operator.not_blank=消息通知操作者不能为空 +notification.operator.length_range=消息通知操作者长度必须在{min}和{max}之间 +notification.operation.not_blank=消息通知操作不能为空 +notification.operation.length_range=消息通知操作长度必须在{min}和{max}之间 +notification.resource_id.not_blank=消息通知资源ID不能为空 +notification.resource_id.length_range=消息通知资源ID长度必须在{min}和{max}之间 +notification.resource_type.not_blank=消息通知资源类型不能为空 +notification.resource_type.length_range=消息通知资源类型长度必须在{min}和{max}之间 +notification.resource_name.not_blank=消息通知资源名称不能为空 +notification.resource_name.length_range=消息通知资源名称长度必须在{min}和{max}之间 +novice_statistics.id.not_blank=新手村ID不能为空 +novice_statistics.guide_step.not_blank=新手村步骤不能为空 +novice_statistics.guide_step.length_range=新手村步骤长度必须在{min}和{max}之间 +operating_log.id.not_blank=操作日志ID不能为空 +operating_log.project_id.not_blank=操作日志项目ID不能为空 +operating_log.project_id.length_range=操作日志项目ID长度必须在{min}和{max}之间 +operating_log_resource.id.not_blank=操作日志资源ID不能为空 +operating_log_resource.operating_log_id.not_blank=操作日志资源操作日志ID不能为空 +operating_log_resource.operating_log_id.length_range=操作日志资源操作日志ID长度必须在{min}和{max}之间 +operating_log_resource.source_id.not_blank=操作日志资源来源ID不能为空 +operating_log_resource.source_id.length_range=操作日志资源来源ID长度必须在{min}和{max}之间 +plugin.id.not_blank=插件主键不能为空 +plugin.plugin_id.not_blank=插件ID不能为空 +plugin.plugin_id.length_range=插件ID长度必须在{min}和{max}之间 +plugin.script_id.not_blank=插件脚本ID不能为空 +plugin.script_id.length_range=插件脚本ID长度必须在{min}和{max}之间 +plugin.clazz_name.not_blank=插件类名不能为空 +plugin.clazz_name.length_range=插件类名长度必须在{min}和{max}之间 +plugin.jmeter_clazz.not_blank=插件jmeter类名不能为空 +plugin.jmeter_clazz.length_range=插件jmeter类名长度必须在{min}和{max}之间 +plugin.source_path.not_blank=插件源路径不能为空 +plugin.source_path.length_range=插件源路径长度必须在{min}和{max}之间 +plugin.source_name.not_blank=插件源名称不能为空 +plugin.source_name.length_range=插件源名称长度必须在{min}和{max}之间 +plugin.scenario.not_blank=插件场景不能为空 +plugin.scenario.length_range=插件场景长度必须在{min}和{max}之间 +plugin_blob.id.not_blank=插件ID不能为空 +quota.id.not_blank=配额ID不能为空 +schedule.id.not_blank=定时任务ID不能为空 +schedule.type.not_blank=定时任务类型不能为空 +schedule.type.length_range=定时任务类型长度必须在{min}和{max}之间 +schedule.value.not_blank=定时任务值不能为空 +schedule.value.length_range=定时任务值长度必须在{min}和{max}之间 +schedule.job.not_blank=定时任务不能为空 +schedule.job.length_range=定时任务长度必须在{min}和{max}之间 +schedule.create_user.not_blank=定时任务创建人不能为空 +schedule.create_user.length_range=定时任务创建人长度必须在{min}和{max}之间 +service_integration.id.not_blank=服务集成ID不能为空 +service_integration.platform.not_blank=服务集成平台不能为空 +service_integration.platform.length_range=服务集成平台长度必须在{min}和{max}之间 +system_parameter.param_key.not_blank=系统参数Key不能为空 +system_parameter.type.not_blank=系统参数类型不能为空 +system_parameter.type.length_range=系统参数类型长度必须在{min}和{max}之间 +test_resource.id.not_blank=资源池节点ID不能为空 +test_resource.test_resource_pool_id.not_blank=资源池ID不能为空 +test_resource.test_resource_pool_id.length_range=资源池ID长度必须在{min}和{max}之间 +test_resource.status.not_blank=资源池节点状态不能为空 +test_resource.status.length_range=资源池节点状态长度必须在{min}和{max}之间 +test_resource_pool.id.not_blank=资源池ID不能为空 +test_resource_pool.name.not_blank=资源池名称不能为空 +test_resource_pool.name.length_range=资源池名称长度必须在{min}和{max}之间 +test_resource_pool.type.not_blank=资源池类型不能为空 +test_resource_pool.type.length_range=资源池类型长度必须在{min}和{max}之间 +test_resource_pool.status.not_blank=资源池状态不能为空 +test_resource_pool.status.length_range=资源池状态长度必须在{min}和{max}之间 +user.id.not_blank=用户ID不能为空 +user.name.not_blank=用户名称不能为空 +user.name.length_range=用户名称长度必须在{min}和{max}之间 +user.email.not_blank=用户email不能为空 +user.email.length_range=用户email长度必须在{min}和{max}之间 +user.email.repeat=用户email已存在 +user.email.invalid=用户email格式不正确 +user.status.not_blank=用户状态不能为空 +user.status.length_range=用户状态长度必须在{min}和{max}之间 +user.source.not_blank=用户来源不能为空 +user.source.length_range=用户来源长度必须在{min}和{max}之间 +user.create_user.not_blank=用户创建人不能为空 +user.create_user.length_range=用户创建人长度必须在{min}和{max}之间 +user_extend.id.not_blank=用户ID不能为空 +user_key.id.not_blank=用户ApiKey ID不能为空 +user_key.create_user.not_blank=用户ApiKey创建人不能为空 +user_key.create_user.length_range=用户ApiKey创建人长度必须在{min}和{max}之间 +user_key.access_key.not_blank=用户ApiKey access key不能为空 +user_key.access_key.length_range=用户ApiKey access key长度必须在{min}和{max}之间 +user_key.secret_key.not_blank=用户ApiKey secret key不能为空 +user_key.secret_key.length_range=用户ApiKey secret key长度必须在{min}和{max}之间 +user.info.not_empty=用户信息不能为空 +user.organizationId.not_blank=用户组织不能为空 +user.projectId.not_blank=用户项目不能为空 +user_role.id.not_blank=用户组ID不能为空 +user_role.name.not_blank=用户组名称不能为空 +user_role.name.length_range=用户组名称长度必须在{min}和{max}之间 +user_role.system.not_blank=是否是系统用户组不能为空 +user_role.system.length_range=是否是系统用户组长度必须在{min}和{max}之间 +user_role.type.not_blank=用户组类型不能为空 +user_role.type.length_range=用户组类型长度必须在{min}和{max}之间 +user_role.create_user.not_blank=用户组创建人不能为空 +user_role.create_user.length_range=用户组创建人长度必须在{min}和{max}之间 +user_role.scope_id.not_blank=用户组应用范围不能为空 +user_role.scope_id.length_range=用户组应用范围长度必须在{min}和{max}之间 +user_role_permission.id.not_blank=用户组权限ID不能为空 +user_role_permission.role_id.not_blank=用户组权限用户组ID不能为空 +user_role_permission.role_id.length_range=用户组权限用户组ID长度必须在{min}和{max}之间 +user_role_permission.permission_id.not_blank=用户组权限权限ID不能为空 +user_role_permission.permission_id.length_range=用户组权限权限ID长度必须在{min}和{max}之间 +user_role_permission.module_id.not_blank=用户组权限模块ID不能为空 +user_role_permission.module_id.length_range=用户组权限模块ID长度必须在{min}和{max}之间 +user_role_relation.id.not_blank=用户组关系ID不能为空 +user_role_relation.user_id.not_blank=用户组关系用户ID不能为空 +user_role_relation.user_id.length_range=用户组关系用户ID长度必须在{min}和{max}之间 +user_role_relation.role_id.not_blank=用户组关系用户组ID不能为空 +user_role_relation.role_id.length_range=用户组关系用户组ID长度必须在{min}和{max}之间 +user_role_relation.source_id.not_blank=用户组关系来源ID不能为空 +user_role_relation.source_id.length_range=用户组关系来源ID长度必须在{min}和{max}之间 +organization.id.not_blank=工作空间ID不能为空 +organization.name.not_blank=工作空间名称不能为空 +organization.name.length_range=工作空间名称长度必须在{min}和{max}之间 +organization.create_user.not_blank=工作空间创建人不能为空 +organization.create_user.length_range=工作空间创建人长度必须在{min}和{max}之间 \ No newline at end of file diff --git a/backend/framework/sdk/src/main/resources/i18n/system_zh_TW.properties b/backend/framework/sdk/src/main/resources/i18n/system_zh_TW.properties index cd9d9e9fa1..6297ea5bad 100644 --- a/backend/framework/sdk/src/main/resources/i18n/system_zh_TW.properties +++ b/backend/framework/sdk/src/main/resources/i18n/system_zh_TW.properties @@ -1,150 +1,151 @@ -role.not.global.system=\u89D2\u8272\u4E0D\u662F\u70BA\u5168\u5C40\u7CFB\u7D71\u89D2\u8272 -role.not.contains.member=\u89D2\u8272\u4E0D\u5305\u542B\u7CFB\u7D71\u6210\u54E1\u89D2\u8272 -user.not.login=\u672A\u7372\u53D6\u5230\u767B\u9304\u7528\u6236 -auth_source.id.not_blank=\u8A8D\u8B49\u6E90ID\u4E0D\u80FD\u70BA\u7A7A -auth_source.status.length_range=\u8A8D\u8B49\u6E90\u72C0\u614B\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -auth_source.status.not_blank=\u8A8D\u8B49\u6E90\u72C0\u614B\u4E0D\u80FD\u70BA\u7A7A -license.id.not_blank=License ID\u4E0D\u80FD\u70BA\u7A7A -message_task.id.not_blank=\u6D88\u606F\u901A\u77E5\u4EFB\u52D9ID\u4E0D\u80FD\u70BA\u7A7A -message_task.type.not_blank=\u6D88\u606F\u901A\u77E5\u4EFB\u52D9\u985E\u578B\u4E0D\u80FD\u70BA\u7A7A -message_task.type.length_range=\u6D88\u606F\u901A\u77E5\u4EFB\u52D9\u985E\u578B\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -message_task.event.not_blank=\u6D88\u606F\u901A\u77E5\u4EFB\u52D9\u4E8B\u4EF6\u4E0D\u80FD\u70BA\u7A7A -message_task.event.length_range=\u6D88\u606F\u901A\u77E5\u4EFB\u52D9\u4E8B\u4EF6\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -message_task.receiver.not_blank=\u6D88\u606F\u901A\u77E5\u4EFB\u52D9\u63A5\u6536\u8005\u4E0D\u80FD\u70BA\u7A7A -message_task.receiver.length_range=\u6D88\u606F\u901A\u77E5\u4EFB\u52D9\u63A5\u6536\u8005\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -message_task.task_type.not_blank=\u6D88\u606F\u901A\u77E5\u4EFB\u52D9\u4EFB\u52D9\u985E\u578B\u4E0D\u80FD\u70BA\u7A7A -message_task.task_type.length_range=\u6D88\u606F\u901A\u77E5\u4EFB\u52D9\u4EFB\u52D9\u985E\u578B\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -message_task.test_id.not_blank=\u6D88\u606F\u901A\u77E5\u4EFB\u52D9\u6E2C\u8A66ID\u4E0D\u80FD\u70BA\u7A7A -message_task.test_id.length_range=\u6D88\u606F\u901A\u77E5\u4EFB\u52D9\u6E2C\u8A66ID\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -message_task.project_id.not_blank=\u6D88\u606F\u901A\u77E5\u4EFB\u52D9\u9805\u76EEID\u4E0D\u80FD\u70BA\u7A7A -message_task.project_id.length_range=\u6D88\u606F\u901A\u77E5\u4EFB\u52D9\u9805\u76EEID\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -message_task_blob.id.not_blank=\u6D88\u606F\u901A\u77E5\u4EFB\u52D9ID\u4E0D\u80FD\u70BA\u7A7A -notification.id.not_blank=\u6D88\u606F\u901A\u77E5ID\u4E0D\u80FD\u70BA\u7A7A -notification.type.not_blank=\u6D88\u606F\u901A\u77E5\u985E\u578B\u4E0D\u80FD\u70BA\u7A7A -notification.type.length_range=\u6D88\u606F\u901A\u77E5\u985E\u578B\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -notification.receiver.not_blank=\u6D88\u606F\u901A\u77E5\u63A5\u6536\u8005\u4E0D\u80FD\u70BA\u7A7A -notification.receiver.length_range=\u6D88\u606F\u901A\u77E5\u63A5\u6536\u8005\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -notification.title.not_blank=\u6D88\u606F\u901A\u77E5\u6A19\u984C\u4E0D\u80FD\u70BA\u7A7A -notification.title.length_range=\u6D88\u606F\u901A\u77E5\u6A19\u984C\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -notification.status.not_blank=\u6D88\u606F\u901A\u77E5\u72C0\u614B\u4E0D\u80FD\u70BA\u7A7A -notification.status.length_range=\u6D88\u606F\u901A\u77E5\u72C0\u614B\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -notification.operator.not_blank=\u6D88\u606F\u901A\u77E5\u64CD\u4F5C\u8005\u4E0D\u80FD\u70BA\u7A7A -notification.operator.length_range=\u6D88\u606F\u901A\u77E5\u64CD\u4F5C\u8005\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -notification.operation.not_blank=\u6D88\u606F\u901A\u77E5\u64CD\u4F5C\u4E0D\u80FD\u70BA\u7A7A -notification.operation.length_range=\u6D88\u606F\u901A\u77E5\u64CD\u4F5C\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -notification.resource_id.not_blank=\u6D88\u606F\u901A\u77E5\u8CC7\u6E90ID\u4E0D\u80FD\u70BA\u7A7A -notification.resource_id.length_range=\u6D88\u606F\u901A\u77E5\u8CC7\u6E90ID\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -notification.resource_type.not_blank=\u6D88\u606F\u901A\u77E5\u8CC7\u6E90\u985E\u578B\u4E0D\u80FD\u70BA\u7A7A -notification.resource_type.length_range=\u6D88\u606F\u901A\u77E5\u8CC7\u6E90\u985E\u578B\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -notification.resource_name.not_blank=\u6D88\u606F\u901A\u77E5\u8CC7\u6E90\u540D\u7A31\u4E0D\u80FD\u70BA\u7A7A -notification.resource_name.length_range=\u6D88\u606F\u901A\u77E5\u8CC7\u6E90\u540D\u7A31\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -novice_statistics.id.not_blank=\u65B0\u624B\u6751ID\u4E0D\u80FD\u70BA\u7A7A -novice_statistics.guide_step.not_blank=\u65B0\u624B\u6751\u6B65\u9A5F\u4E0D\u80FD\u70BA\u7A7A -novice_statistics.guide_step.length_range=\u65B0\u624B\u6751\u6B65\u9A5F\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -operating_log.id.not_blank=\u64CD\u4F5C\u65E5\u8A8CID\u4E0D\u80FD\u70BA\u7A7A -operating_log.project_id.not_blank=\u64CD\u4F5C\u65E5\u8A8C\u9805\u76EEID\u4E0D\u80FD\u70BA\u7A7A -operating_log.project_id.length_range=\u64CD\u4F5C\u65E5\u8A8C\u9805\u76EEID\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -operating_log_resource.id.not_blank=\u64CD\u4F5C\u65E5\u8A8C\u8CC7\u6E90ID\u4E0D\u80FD\u70BA\u7A7A -operating_log_resource.operating_log_id.not_blank=\u64CD\u4F5C\u65E5\u8A8C\u8CC7\u6E90\u64CD\u4F5C\u65E5\u8A8CID\u4E0D\u80FD\u70BA\u7A7A -operating_log_resource.operating_log_id.length_range=\u64CD\u4F5C\u65E5\u8A8C\u8CC7\u6E90\u64CD\u4F5C\u65E5\u8A8CID\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -operating_log_resource.source_id.not_blank=\u64CD\u4F5C\u65E5\u8A8C\u8CC7\u6E90\u4F86\u6E90ID\u4E0D\u80FD\u70BA\u7A7A -operating_log_resource.source_id.length_range=\u64CD\u4F5C\u65E5\u8A8C\u8CC7\u6E90\u4F86\u6E90ID\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -plugin.id.not_blank=\u63D2\u4EF6\u4E3B\u9375\u4E0D\u80FD\u70BA\u7A7A -plugin.plugin_id.not_blank=\u63D2\u4EF6ID\u4E0D\u80FD\u70BA\u7A7A -plugin.plugin_id.length_range=\u63D2\u4EF6ID\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -plugin.script_id.not_blank=\u63D2\u4EF6\u8173\u672CID\u4E0D\u80FD\u70BA\u7A7A -plugin.script_id.length_range=\u63D2\u4EF6\u8173\u672CID\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -plugin.clazz_name.not_blank=\u63D2\u4EF6\u985E\u540D\u4E0D\u80FD\u70BA\u7A7A -plugin.clazz_name.length_range=\u63D2\u4EF6\u985E\u540D\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -plugin.jmeter_clazz.not_blank=\u63D2\u4EF6jmeter\u985E\u540D\u4E0D\u80FD\u70BA\u7A7A -plugin.jmeter_clazz.length_range=\u63D2\u4EF6jmeter\u985E\u540D\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -plugin.source_path.not_blank=\u63D2\u4EF6\u6E90\u8DEF\u5F91\u4E0D\u80FD\u70BA\u7A7A -plugin.source_path.length_range=\u63D2\u4EF6\u6E90\u8DEF\u5F91\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -plugin.source_name.not_blank=\u63D2\u4EF6\u6E90\u540D\u7A31\u4E0D\u80FD\u70BA\u7A7A -plugin.source_name.length_range=\u63D2\u4EF6\u6E90\u540D\u7A31\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -plugin.scenario.not_blank=\u63D2\u4EF6\u5834\u666F\u4E0D\u80FD\u70BA\u7A7A -plugin.scenario.length_range=\u63D2\u4EF6\u5834\u666F\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -plugin_blob.id.not_blank=\u63D2\u4EF6ID\u4E0D\u80FD\u70BA\u7A7A -quota.id.not_blank=\u914D\u984DID\u4E0D\u80FD\u70BA\u7A7A -schedule.id.not_blank=\u5B9A\u6642\u4EFB\u52D9ID\u4E0D\u80FD\u70BA\u7A7A -schedule.type.not_blank=\u5B9A\u6642\u4EFB\u52D9\u985E\u578B\u4E0D\u80FD\u70BA\u7A7A -schedule.type.length_range=\u5B9A\u6642\u4EFB\u52D9\u985E\u578B\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -schedule.value.not_blank=\u5B9A\u6642\u4EFB\u52D9\u503C\u4E0D\u80FD\u70BA\u7A7A -schedule.value.length_range=\u5B9A\u6642\u4EFB\u52D9\u503C\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -schedule.job.not_blank=\u5B9A\u6642\u4EFB\u52D9\u4E0D\u80FD\u70BA\u7A7A -schedule.job.length_range=\u5B9A\u6642\u4EFB\u52D9\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -schedule.create_user.not_blank=\u5B9A\u6642\u4EFB\u52D9\u5275\u5EFA\u4EBA\u4E0D\u80FD\u70BA\u7A7A -schedule.create_user.length_range=\u5B9A\u6642\u4EFB\u52D9\u5275\u5EFA\u4EBA\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -service_integration.id.not_blank=\u670D\u52D9\u96C6\u6210ID\u4E0D\u80FD\u70BA\u7A7A -service_integration.platform.not_blank=\u670D\u52D9\u96C6\u6210\u5E73\u53F0\u4E0D\u80FD\u70BA\u7A7A -service_integration.platform.length_range=\u670D\u52D9\u96C6\u6210\u5E73\u53F0\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -system_parameter.param_key.not_blank=\u7CFB\u7D71\u53C3\u6578Key\u4E0D\u80FD\u70BA\u7A7A -system_parameter.type.not_blank=\u7CFB\u7D71\u53C3\u6578\u985E\u578B\u4E0D\u80FD\u70BA\u7A7A -system_parameter.type.length_range=\u7CFB\u7D71\u53C3\u6578\u985E\u578B\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -test_resource.id.not_blank=\u8CC7\u6E90\u6C60\u7BC0\u9EDEID\u4E0D\u80FD\u70BA\u7A7A -test_resource.test_resource_pool_id.not_blank=\u8CC7\u6E90\u6C60ID\u4E0D\u80FD\u70BA\u7A7A -test_resource.test_resource_pool_id.length_range=\u8CC7\u6E90\u6C60ID\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -test_resource.status.not_blank=\u8CC7\u6E90\u6C60\u7BC0\u9EDE\u72C0\u614B\u4E0D\u80FD\u70BA\u7A7A -test_resource.status.length_range=\u8CC7\u6E90\u6C60\u7BC0\u9EDE\u72C0\u614B\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -test_resource_pool.id.not_blank=\u8CC7\u6E90\u6C60ID\u4E0D\u80FD\u70BA\u7A7A -test_resource_pool.name.not_blank=\u8CC7\u6E90\u6C60\u540D\u7A31\u4E0D\u80FD\u70BA\u7A7A -test_resource_pool.name.length_range=\u8CC7\u6E90\u6C60\u540D\u7A31\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -test_resource_pool.type.not_blank=\u8CC7\u6E90\u6C60\u985E\u578B\u4E0D\u80FD\u70BA\u7A7A -test_resource_pool.type.length_range=\u8CC7\u6E90\u6C60\u985E\u578B\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -test_resource_pool.status.not_blank=\u8CC7\u6E90\u6C60\u72C0\u614B\u4E0D\u80FD\u70BA\u7A7A -test_resource_pool.status.length_range=\u8CC7\u6E90\u6C60\u72C0\u614B\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -user.id.not_blank=\u7528\u6236ID\u4E0D\u80FD\u70BA\u7A7A -user.name.not_blank=\u7528\u6236\u540D\u7A31\u4E0D\u80FD\u70BA\u7A7A -user.name.length_range=\u7528\u6236\u540D\u7A31\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -user.email.not_blank=\u7528\u6236email\u4E0D\u80FD\u70BA\u7A7A -user.email.length_range=\u7528\u6236email\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -user.email.repeat=\u7528\u6236email\u5DF2\u5B58\u5728 -user.email.invalid=\u7528\u6236email\u683C\u5F0F\u4E0D\u6B63\u78BA -user.status.not_blank=\u7528\u6236\u72C0\u614B\u4E0D\u80FD\u70BA\u7A7A -user.status.length_range=\u7528\u6236\u72C0\u614B\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -user.source.not_blank=\u7528\u6236\u4F86\u6E90\u4E0D\u80FD\u70BA\u7A7A -user.source.length_range=\u7528\u6236\u4F86\u6E90\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -user.create_user.not_blank=\u7528\u6236\u5275\u5EFA\u4EBA\u4E0D\u80FD\u70BA\u7A7A -user.create_user.length_range=\u7528\u6236\u5275\u5EFA\u4EBA\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -user_extend.id.not_blank=\u7528\u6236ID\u4E0D\u80FD\u70BA\u7A7A -user_key.id.not_blank=\u7528\u6236ApiKey ID\u4E0D\u80FD\u70BA\u7A7A -user_key.create_user.not_blank=\u7528\u6236ApiKey\u5275\u5EFA\u4EBA\u4E0D\u80FD\u70BA\u7A7A -user_key.create_user.length_range=\u7528\u6236ApiKey\u5275\u5EFA\u4EBA\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -user_key.access_key.not_blank=\u7528\u6236ApiKey access key\u4E0D\u80FD\u70BA\u7A7A -user_key.access_key.length_range=\u7528\u6236ApiKey access key\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -user_key.secret_key.not_blank=\u7528\u6236ApiKey secret key\u4E0D\u80FD\u70BA\u7A7A -user_key.secret_key.length_range=\u7528\u6236ApiKey secret key\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -user.info.not_empty=\u7528\u6236\u4FE1\u606F\u4E0D\u80FD\u70BA\u7A7A -user.organizationId.not_blank=\u7528\u6236\u7D44\u7E54\u4E0D\u80FD\u70BA\u7A7A -user.projectId.not_blank=\u7528\u6236\u9805\u76EE\u4E0D\u80FD\u70BA\u7A7A -user_role.id.not_blank=\u7528\u6236\u7D44ID\u4E0D\u80FD\u70BA\u7A7A -user_role.name.not_blank=\u7528\u6236\u7D44\u540D\u7A31\u4E0D\u80FD\u70BA\u7A7A -user_role.name.length_range=\u7528\u6236\u7D44\u540D\u7A31\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -user_role.system.not_blank=\u662F\u5426\u662F\u7CFB\u7D71\u7528\u6236\u7D44\u4E0D\u80FD\u70BA\u7A7A -user_role.system.length_range=\u662F\u5426\u662F\u7CFB\u7D71\u7528\u6236\u7D44\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -user_role.type.not_blank=\u7528\u6236\u7D44\u985E\u578B\u4E0D\u80FD\u70BA\u7A7A -user_role.type.length_range=\u7528\u6236\u7D44\u985E\u578B\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -user_role.create_user.not_blank=\u7528\u6236\u7D44\u5275\u5EFA\u4EBA\u4E0D\u80FD\u70BA\u7A7A -user_role.create_user.length_range=\u7528\u6236\u7D44\u5275\u5EFA\u4EBA\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -user_role.scope_id.not_blank=\u7528\u6236\u7D44\u61C9\u7528\u7BC4\u570D\u4E0D\u80FD\u70BA\u7A7A -user_role.scope_id.length_range=\u7528\u6236\u7D44\u61C9\u7528\u7BC4\u570D\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -user_role_permission.id.not_blank=\u7528\u6236\u7D44\u6B0A\u9650ID\u4E0D\u80FD\u70BA\u7A7A -user_role_permission.role_id.not_blank=\u7528\u6236\u7D44\u6B0A\u9650\u7528\u6236\u7D44ID\u4E0D\u80FD\u70BA\u7A7A -user_role_permission.role_id.length_range=\u7528\u6236\u7D44\u6B0A\u9650\u7528\u6236\u7D44ID\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -user_role_permission.permission_id.not_blank=\u7528\u6236\u7D44\u6B0A\u9650\u6B0A\u9650ID\u4E0D\u80FD\u70BA\u7A7A -user_role_permission.permission_id.length_range=\u7528\u6236\u7D44\u6B0A\u9650\u6B0A\u9650ID\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -user_role_permission.module_id.not_blank=\u7528\u6236\u7D44\u6B0A\u9650\u6A21\u584AID\u4E0D\u80FD\u70BA\u7A7A -user_role_permission.module_id.length_range=\u7528\u6236\u7D44\u6B0A\u9650\u6A21\u584AID\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -user_role_relation.id.not_blank=\u7528\u6236\u7D44\u95DC\u4FC2ID\u4E0D\u80FD\u70BA\u7A7A -user_role_relation.user_id.not_blank=\u7528\u6236\u7D44\u95DC\u4FC2\u7528\u6236ID\u4E0D\u80FD\u70BA\u7A7A -user_role_relation.user_id.length_range=\u7528\u6236\u7D44\u95DC\u4FC2\u7528\u6236ID\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -user_role_relation.role_id.not_blank=\u7528\u6236\u7D44\u95DC\u4FC2\u7528\u6236\u7D44ID\u4E0D\u80FD\u70BA\u7A7A -user_role_relation.role_id.length_range=\u7528\u6236\u7D44\u95DC\u4FC2\u7528\u6236\u7D44ID\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -user_role_relation.source_id.not_blank=\u7528\u6236\u7D44\u95DC\u4FC2\u4F86\u6E90ID\u4E0D\u80FD\u70BA\u7A7A -user_role_relation.source_id.length_range=\u7528\u6236\u7D44\u95DC\u4FC2\u4F86\u6E90ID\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -organization.id.not_blank=\u5DE5\u4F5C\u7A7A\u9593ID\u4E0D\u80FD\u70BA\u7A7A -organization.name.not_blank=\u5DE5\u4F5C\u7A7A\u9593\u540D\u7A31\u4E0D\u80FD\u70BA\u7A7A -organization.name.length_range=\u5DE5\u4F5C\u7A7A\u9593\u540D\u7A31\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -organization.create_user.not_blank=\u5DE5\u4F5C\u7A7A\u9593\u5275\u5EFA\u4EBA\u4E0D\u80FD\u70BA\u7A7A -organization.create_user.length_range=\u5DE5\u4F5C\u7A7A\u9593\u5275\u5EFA\u4EBA\u9577\u5EA6\u5FC5\u9808\u5728{min}\u548C{max}\u4E4B\u9593 -member.id.not_empty=\u6210\u54E1\u4E0D\u80FD\u7232\u7A7A \ No newline at end of file +role.not.global.system=角色不是為全局系統角色 +role.not.contains.member=角色不包含系統成員角色 +user.not.login=未獲取到登錄用戶 +user.not.empty=用戶不呢為空 +user.not.exist=用戶不存在 +auth_source.id.not_blank=認證源ID不能為空 +auth_source.status.length_range=認證源狀態長度必須在{min}和{max}之間 +auth_source.status.not_blank=認證源狀態不能為空 +license.id.not_blank=License ID不能為空 +message_task.id.not_blank=消息通知任務ID不能為空 +message_task.type.not_blank=消息通知任務類型不能為空 +message_task.type.length_range=消息通知任務類型長度必須在{min}和{max}之間 +message_task.event.not_blank=消息通知任務事件不能為空 +message_task.event.length_range=消息通知任務事件長度必須在{min}和{max}之間 +message_task.receiver.not_blank=消息通知任務接收者不能為空 +message_task.receiver.length_range=消息通知任務接收者長度必須在{min}和{max}之間 +message_task.task_type.not_blank=消息通知任務任務類型不能為空 +message_task.task_type.length_range=消息通知任務任務類型長度必須在{min}和{max}之間 +message_task.test_id.not_blank=消息通知任務測試ID不能為空 +message_task.test_id.length_range=消息通知任務測試ID長度必須在{min}和{max}之間 +message_task.project_id.not_blank=消息通知任務項目ID不能為空 +message_task.project_id.length_range=消息通知任務項目ID長度必須在{min}和{max}之間 +message_task_blob.id.not_blank=消息通知任務ID不能為空 +notification.id.not_blank=消息通知ID不能為空 +notification.type.not_blank=消息通知類型不能為空 +notification.type.length_range=消息通知類型長度必須在{min}和{max}之間 +notification.receiver.not_blank=消息通知接收者不能為空 +notification.receiver.length_range=消息通知接收者長度必須在{min}和{max}之間 +notification.title.not_blank=消息通知標題不能為空 +notification.title.length_range=消息通知標題長度必須在{min}和{max}之間 +notification.status.not_blank=消息通知狀態不能為空 +notification.status.length_range=消息通知狀態長度必須在{min}和{max}之間 +notification.operator.not_blank=消息通知操作者不能為空 +notification.operator.length_range=消息通知操作者長度必須在{min}和{max}之間 +notification.operation.not_blank=消息通知操作不能為空 +notification.operation.length_range=消息通知操作長度必須在{min}和{max}之間 +notification.resource_id.not_blank=消息通知資源ID不能為空 +notification.resource_id.length_range=消息通知資源ID長度必須在{min}和{max}之間 +notification.resource_type.not_blank=消息通知資源類型不能為空 +notification.resource_type.length_range=消息通知資源類型長度必須在{min}和{max}之間 +notification.resource_name.not_blank=消息通知資源名稱不能為空 +notification.resource_name.length_range=消息通知資源名稱長度必須在{min}和{max}之間 +novice_statistics.id.not_blank=新手村ID不能為空 +novice_statistics.guide_step.not_blank=新手村步驟不能為空 +novice_statistics.guide_step.length_range=新手村步驟長度必須在{min}和{max}之間 +operating_log.id.not_blank=操作日誌ID不能為空 +operating_log.project_id.not_blank=操作日誌項目ID不能為空 +operating_log.project_id.length_range=操作日誌項目ID長度必須在{min}和{max}之間 +operating_log_resource.id.not_blank=操作日誌資源ID不能為空 +operating_log_resource.operating_log_id.not_blank=操作日誌資源操作日誌ID不能為空 +operating_log_resource.operating_log_id.length_range=操作日誌資源操作日誌ID長度必須在{min}和{max}之間 +operating_log_resource.source_id.not_blank=操作日誌資源來源ID不能為空 +operating_log_resource.source_id.length_range=操作日誌資源來源ID長度必須在{min}和{max}之間 +plugin.id.not_blank=插件主鍵不能為空 +plugin.plugin_id.not_blank=插件ID不能為空 +plugin.plugin_id.length_range=插件ID長度必須在{min}和{max}之間 +plugin.script_id.not_blank=插件腳本ID不能為空 +plugin.script_id.length_range=插件腳本ID長度必須在{min}和{max}之間 +plugin.clazz_name.not_blank=插件類名不能為空 +plugin.clazz_name.length_range=插件類名長度必須在{min}和{max}之間 +plugin.jmeter_clazz.not_blank=插件jmeter類名不能為空 +plugin.jmeter_clazz.length_range=插件jmeter類名長度必須在{min}和{max}之間 +plugin.source_path.not_blank=插件源路徑不能為空 +plugin.source_path.length_range=插件源路徑長度必須在{min}和{max}之間 +plugin.source_name.not_blank=插件源名稱不能為空 +plugin.source_name.length_range=插件源名稱長度必須在{min}和{max}之間 +plugin.scenario.not_blank=插件場景不能為空 +plugin.scenario.length_range=插件場景長度必須在{min}和{max}之間 +plugin_blob.id.not_blank=插件ID不能為空 +quota.id.not_blank=配額ID不能為空 +schedule.id.not_blank=定時任務ID不能為空 +schedule.type.not_blank=定時任務類型不能為空 +schedule.type.length_range=定時任務類型長度必須在{min}和{max}之間 +schedule.value.not_blank=定時任務值不能為空 +schedule.value.length_range=定時任務值長度必須在{min}和{max}之間 +schedule.job.not_blank=定時任務不能為空 +schedule.job.length_range=定時任務長度必須在{min}和{max}之間 +schedule.create_user.not_blank=定時任務創建人不能為空 +schedule.create_user.length_range=定時任務創建人長度必須在{min}和{max}之間 +service_integration.id.not_blank=服務集成ID不能為空 +service_integration.platform.not_blank=服務集成平台不能為空 +service_integration.platform.length_range=服務集成平台長度必須在{min}和{max}之間 +system_parameter.param_key.not_blank=系統參數Key不能為空 +system_parameter.type.not_blank=系統參數類型不能為空 +system_parameter.type.length_range=系統參數類型長度必須在{min}和{max}之間 +test_resource.id.not_blank=資源池節點ID不能為空 +test_resource.test_resource_pool_id.not_blank=資源池ID不能為空 +test_resource.test_resource_pool_id.length_range=資源池ID長度必須在{min}和{max}之間 +test_resource.status.not_blank=資源池節點狀態不能為空 +test_resource.status.length_range=資源池節點狀態長度必須在{min}和{max}之間 +test_resource_pool.id.not_blank=資源池ID不能為空 +test_resource_pool.name.not_blank=資源池名稱不能為空 +test_resource_pool.name.length_range=資源池名稱長度必須在{min}和{max}之間 +test_resource_pool.type.not_blank=資源池類型不能為空 +test_resource_pool.type.length_range=資源池類型長度必須在{min}和{max}之間 +test_resource_pool.status.not_blank=資源池狀態不能為空 +test_resource_pool.status.length_range=資源池狀態長度必須在{min}和{max}之間 +user.id.not_blank=用戶ID不能為空 +user.name.not_blank=用戶名稱不能為空 +user.name.length_range=用戶名稱長度必須在{min}和{max}之間 +user.email.not_blank=用戶email不能為空 +user.email.length_range=用戶email長度必須在{min}和{max}之間 +user.email.repeat=用戶email已存在 +user.email.invalid=用戶email格式不正確 +user.status.not_blank=用戶狀態不能為空 +user.status.length_range=用戶狀態長度必須在{min}和{max}之間 +user.source.not_blank=用戶來源不能為空 +user.source.length_range=用戶來源長度必須在{min}和{max}之間 +user.create_user.not_blank=用戶創建人不能為空 +user.create_user.length_range=用戶創建人長度必須在{min}和{max}之間 +user_extend.id.not_blank=用戶ID不能為空 +user_key.id.not_blank=用戶ApiKey ID不能為空 +user_key.create_user.not_blank=用戶ApiKey創建人不能為空 +user_key.create_user.length_range=用戶ApiKey創建人長度必須在{min}和{max}之間 +user_key.access_key.not_blank=用戶ApiKey access key不能為空 +user_key.access_key.length_range=用戶ApiKey access key長度必須在{min}和{max}之間 +user_key.secret_key.not_blank=用戶ApiKey secret key不能為空 +user_key.secret_key.length_range=用戶ApiKey secret key長度必須在{min}和{max}之間 +user.info.not_empty=用戶信息不能為空 +user.organizationId.not_blank=用戶組織不能為空 +user.projectId.not_blank=用戶項目不能為空 +user_role.id.not_blank=用戶組ID不能為空 +user_role.name.not_blank=用戶組名稱不能為空 +user_role.name.length_range=用戶組名稱長度必須在{min}和{max}之間 +user_role.system.not_blank=是否是系統用戶組不能為空 +user_role.system.length_range=是否是系統用戶組長度必須在{min}和{max}之間 +user_role.type.not_blank=用戶組類型不能為空 +user_role.type.length_range=用戶組類型長度必須在{min}和{max}之間 +user_role.create_user.not_blank=用戶組創建人不能為空 +user_role.create_user.length_range=用戶組創建人長度必須在{min}和{max}之間 +user_role.scope_id.not_blank=用戶組應用範圍不能為空 +user_role.scope_id.length_range=用戶組應用範圍長度必須在{min}和{max}之間 +user_role_permission.id.not_blank=用戶組權限ID不能為空 +user_role_permission.role_id.not_blank=用戶組權限用戶組ID不能為空 +user_role_permission.role_id.length_range=用戶組權限用戶組ID長度必須在{min}和{max}之間 +user_role_permission.permission_id.not_blank=用戶組權限權限ID不能為空 +user_role_permission.permission_id.length_range=用戶組權限權限ID長度必須在{min}和{max}之間 +user_role_permission.module_id.not_blank=用戶組權限模塊ID不能為空 +user_role_permission.module_id.length_range=用戶組權限模塊ID長度必須在{min}和{max}之間 +user_role_relation.id.not_blank=用戶組關係ID不能為空 +user_role_relation.user_id.not_blank=用戶組關係用戶ID不能為空 +user_role_relation.user_id.length_range=用戶組關係用戶ID長度必須在{min}和{max}之間 +user_role_relation.role_id.not_blank=用戶組關係用戶組ID不能為空 +user_role_relation.role_id.length_range=用戶組關係用戶組ID長度必須在{min}和{max}之間 +user_role_relation.source_id.not_blank=用戶組關係來源ID不能為空 +user_role_relation.source_id.length_range=用戶組關係來源ID長度必須在{min}和{max}之間 +organization.id.not_blank=工作空間ID不能為空 +organization.name.not_blank=工作空間名稱不能為空 +organization.name.length_range=工作空間名稱長度必須在{min}和{max}之間 +organization.create_user.not_blank=工作空間創建人不能為空 +organization.create_user.length_range=工作空間創建人長度必須在{min}和{max}之間 \ No newline at end of file diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/controller/UserController.java b/backend/services/system-setting/src/main/java/io/metersphere/system/controller/UserController.java index 2dad9d7bb1..84a4f48248 100644 --- a/backend/services/system-setting/src/main/java/io/metersphere/system/controller/UserController.java +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/controller/UserController.java @@ -4,6 +4,7 @@ package io.metersphere.system.controller; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; import io.metersphere.sdk.constants.PermissionConstants; +import io.metersphere.sdk.constants.UserSourceEnum; import io.metersphere.sdk.dto.BasePageRequest; import io.metersphere.sdk.dto.UserDTO; import io.metersphere.sdk.log.annotation.RequestLog; @@ -13,9 +14,10 @@ import io.metersphere.sdk.util.PageUtils; import io.metersphere.sdk.util.Pager; import io.metersphere.sdk.util.SessionUtils; import io.metersphere.system.dto.UserBatchCreateDTO; +import io.metersphere.system.dto.UserEditEnableRequest; import io.metersphere.system.dto.UserEditRequest; -import io.metersphere.system.dto.UserInfo; import io.metersphere.system.dto.UserRoleOption; +import io.metersphere.system.dto.response.UserTableResponse; import io.metersphere.system.service.GlobalUserRoleService; import io.metersphere.system.service.UserService; import io.metersphere.validation.groups.Created; @@ -51,8 +53,7 @@ public class UserController { @PostMapping("/add") @RequiresPermissions(PermissionConstants.SYSTEM_USER_READ_ADD) public UserBatchCreateDTO addUser(@Validated({Created.class}) @RequestBody UserBatchCreateDTO userCreateDTO) { - userCreateDTO.setCreateUserToList(SessionUtils.getUserId()); - return userService.addBatch(userCreateDTO); + return userService.addBatch(userCreateDTO, UserSourceEnum.LOCAL.name(), SessionUtils.getUserId()); } @PostMapping("/update") @@ -60,15 +61,20 @@ public class UserController { @RequestLog(type = OperationLogType.UPDATE, module = OperationLogModule.SYSTEM_USER, sourceId = "#request.id", details = "#request.name") public UserEditRequest updateUser(@Validated({Updated.class}) @RequestBody UserEditRequest request) { - request.setUpdateUser(SessionUtils.getUserId()); - return userService.updateUser(request); + return userService.updateUser(request, SessionUtils.getUserId()); } @PostMapping("/page") @RequiresPermissions(PermissionConstants.SYSTEM_USER_READ) - public Pager> list(@Validated @RequestBody BasePageRequest request) { + public Pager> list(@Validated @RequestBody BasePageRequest request) { Page page = PageHelper.startPage(request.getCurrent(), request.getPageSize(), StringUtils.isNotBlank(request.getSortString()) ? request.getSortString() : "create_time desc"); return PageUtils.setPageInfo(page, userService.list(request)); } + + @PostMapping("/update/enable") + @RequiresPermissions(PermissionConstants.SYSTEM_USER_READ_UPDATE) + public UserEditEnableRequest updateUserEnable(@Validated @RequestBody UserEditEnableRequest request) { + return userService.updateUserEnable(request, SessionUtils.getSessionId()); + } } diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/dto/UserBatchCreateDTO.java b/backend/services/system-setting/src/main/java/io/metersphere/system/dto/UserBatchCreateDTO.java index 7b9477761d..dc6af80153 100644 --- a/backend/services/system-setting/src/main/java/io/metersphere/system/dto/UserBatchCreateDTO.java +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/dto/UserBatchCreateDTO.java @@ -15,23 +15,11 @@ public class UserBatchCreateDTO { @Schema(title = "用户信息集合", requiredMode = Schema.RequiredMode.REQUIRED) @NotEmpty(groups = {Created.class, Updated.class}, message = "{user.info.not_empty}") - List<@Valid UserInfo> userInfoList; + List<@Valid UserCreateInfo> userInfoList; @Schema(title = "用户组", requiredMode = Schema.RequiredMode.REQUIRED) @NotEmpty(groups = {Created.class, Updated.class}, message = "{user_role.id.not_blank}") List<@Valid @NotBlank(message = "{user_role.id.not_blank}", groups = {Created.class, Updated.class}) String> userRoleIdList; - public void setCreateUserToList(String userSessionId) { - userInfoList.forEach(user -> { - user.setCreateUser(userSessionId); - user.setUpdateUser(userSessionId); - }); - } - - public void setUpdateUserToList(String userSessionId) { - userInfoList.forEach(user -> { - user.setUpdateUser(userSessionId); - }); - } } diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/dto/UserInfo.java b/backend/services/system-setting/src/main/java/io/metersphere/system/dto/UserCreateInfo.java similarity index 50% rename from backend/services/system-setting/src/main/java/io/metersphere/system/dto/UserInfo.java rename to backend/services/system-setting/src/main/java/io/metersphere/system/dto/UserCreateInfo.java index 1f43d4eba2..e867cc68fe 100644 --- a/backend/services/system-setting/src/main/java/io/metersphere/system/dto/UserInfo.java +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/dto/UserCreateInfo.java @@ -1,7 +1,5 @@ package io.metersphere.system.dto; -import io.metersphere.system.domain.Organization; -import io.metersphere.system.domain.UserRole; import io.metersphere.validation.groups.Created; import io.metersphere.validation.groups.Updated; import io.swagger.v3.oas.annotations.media.Schema; @@ -10,15 +8,9 @@ import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.Size; import lombok.Data; -import java.util.ArrayList; -import java.util.List; - @Data -public class UserInfo { - - @Schema(title = "用户ID", requiredMode = Schema.RequiredMode.REQUIRED) - @NotBlank(message = "{user.id.not_blank}", groups = {Updated.class}) - @Size(min = 1, max = 50, message = "{user.id.length_range}", groups = {Updated.class}) +public class UserCreateInfo { + @Schema(title = "用户ID", requiredMode = Schema.RequiredMode.NOT_REQUIRED) private String id; @Schema(title = "用户名", requiredMode = Schema.RequiredMode.REQUIRED) @@ -32,28 +24,7 @@ public class UserInfo { @Email(message = "{user.email.invalid}", groups = {Created.class, Updated.class}) private String email; - @Schema(title = "创建时间") - private Long createTime; - - @Schema(title = "更新时间") - private Long updateTime; - @Schema(title = "手机号") private String phone; - @Schema(title = "来源:LOCAL OIDC CAS OAUTH2", requiredMode = Schema.RequiredMode.REQUIRED) - @NotBlank(message = "{user.source.not_blank}", groups = {Created.class}) - @Size(min = 1, max = 50, message = "{user.source.length_range}", groups = {Created.class, Updated.class}) - private String source; - - @Schema(title = "创建人") - private String createUser; - - @Schema(title = "修改人") - private String updateUser; - - @Schema(title = "用户所属组织") - private List organizationList = new ArrayList<>(); - @Schema(title = "用户所属用户组") - private List userRoleList = new ArrayList<>(); } diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/dto/UserEditEnableRequest.java b/backend/services/system-setting/src/main/java/io/metersphere/system/dto/UserEditEnableRequest.java new file mode 100644 index 0000000000..6c35991fa2 --- /dev/null +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/dto/UserEditEnableRequest.java @@ -0,0 +1,16 @@ +package io.metersphere.system.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import lombok.Data; + +import java.util.List; + +@Data +public class UserEditEnableRequest { + @Schema(title = "用户ID", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "{user.not.empty}") + List userIdList; + + boolean enable; +} diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/dto/UserEditRequest.java b/backend/services/system-setting/src/main/java/io/metersphere/system/dto/UserEditRequest.java index 23fa127e29..f6e59b53f0 100644 --- a/backend/services/system-setting/src/main/java/io/metersphere/system/dto/UserEditRequest.java +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/dto/UserEditRequest.java @@ -13,7 +13,7 @@ import java.util.List; @EqualsAndHashCode(callSuper = true) @Data -public class UserEditRequest extends UserInfo { +public class UserEditRequest extends UserCreateInfo { @Schema(title = "用户组", requiredMode = Schema.RequiredMode.REQUIRED) @NotEmpty(groups = {Created.class, Updated.class}, message = "{user_role.id.not_blank}") List<@Valid @NotBlank(message = "{user_role.id.not_blank}", groups = {Created.class, Updated.class}) String> userRoleIdList; diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/dto/response/UserTableResponse.java b/backend/services/system-setting/src/main/java/io/metersphere/system/dto/response/UserTableResponse.java new file mode 100644 index 0000000000..66eee6016e --- /dev/null +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/dto/response/UserTableResponse.java @@ -0,0 +1,18 @@ +package io.metersphere.system.dto.response; + +import io.metersphere.system.domain.Organization; +import io.metersphere.system.domain.User; +import io.metersphere.system.domain.UserRole; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +@Data +public class UserTableResponse extends User { + @Schema(title = "用户所属组织") + private List organizationList = new ArrayList<>(); + @Schema(title = "用户所属用户组") + private List userRoleList = new ArrayList<>(); +} diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/service/UserRoleRelationService.java b/backend/services/system-setting/src/main/java/io/metersphere/system/service/UserRoleRelationService.java index ec9c6d0445..9300508ef6 100644 --- a/backend/services/system-setting/src/main/java/io/metersphere/system/service/UserRoleRelationService.java +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/service/UserRoleRelationService.java @@ -5,7 +5,7 @@ import io.metersphere.sdk.log.constants.OperationLogModule; import io.metersphere.sdk.log.constants.OperationLogType; import io.metersphere.sdk.log.service.OperationLogService; import io.metersphere.system.domain.*; -import io.metersphere.system.dto.UserInfo; +import io.metersphere.system.dto.response.UserTableResponse; import io.metersphere.system.mapper.ExtUserRoleRelationMapper; import io.metersphere.system.mapper.OrganizationMapper; import io.metersphere.system.mapper.UserRoleMapper; @@ -114,7 +114,7 @@ public class UserRoleRelationService { } - public Map selectGlobalUserRoleAndOrganization(@Valid @NotEmpty List userIdList) { + public Map selectGlobalUserRoleAndOrganization(@Valid @NotEmpty List userIdList) { List userRoleRelationList = extUserRoleRelationMapper.listByUserIdAndScope(userIdList); List userRoleIdList = userRoleRelationList.stream().map(UserRoleRelation::getRoleId).collect(Collectors.toList()); List sourceIdList = userRoleRelationList.stream().map(UserRoleRelation::getSourceId).collect(Collectors.toList()); @@ -132,11 +132,11 @@ public class UserRoleRelationService { organizationMap = organizationMapper.selectByExample(organizationExample).stream() .collect(Collectors.toMap(Organization::getId, item -> item)); } - Map returnMap = new HashMap<>(); + Map returnMap = new HashMap<>(); for (UserRoleRelation userRoleRelation : userRoleRelationList) { - UserInfo userInfo = returnMap.get(userRoleRelation.getUserId()); + UserTableResponse userInfo = returnMap.get(userRoleRelation.getUserId()); if (userInfo == null) { - userInfo = new UserInfo(); + userInfo = new UserTableResponse(); userInfo.setId(userRoleRelation.getUserId()); returnMap.put(userRoleRelation.getUserId(), userInfo); } diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/service/UserService.java b/backend/services/system-setting/src/main/java/io/metersphere/system/service/UserService.java index c027e19c6f..c7962ff716 100644 --- a/backend/services/system-setting/src/main/java/io/metersphere/system/service/UserService.java +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/service/UserService.java @@ -12,12 +12,16 @@ import io.metersphere.sdk.util.CodingUtil; import io.metersphere.sdk.util.Translator; import io.metersphere.system.domain.OperationLog; import io.metersphere.system.domain.User; +import io.metersphere.system.domain.UserExample; import io.metersphere.system.dto.UserBatchCreateDTO; +import io.metersphere.system.dto.UserCreateInfo; +import io.metersphere.system.dto.UserEditEnableRequest; import io.metersphere.system.dto.UserEditRequest; -import io.metersphere.system.dto.UserInfo; +import io.metersphere.system.dto.response.UserTableResponse; import io.metersphere.system.mapper.UserMapper; import jakarta.annotation.Resource; import jakarta.validation.Valid; +import jakarta.validation.constraints.NotEmpty; import org.apache.commons.collections4.CollectionUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -63,14 +67,14 @@ public class UserService { return logs; } - private void validateUserInfo(List userList) { + private void validateUserInfo(List userList) { //判断参数内是否含有重复邮箱 List emailList = new ArrayList<>(); List repeatEmailList = new ArrayList<>(); var userInDbMap = baseUserMapper.selectUserIdByEmailList( - userList.stream().map(UserInfo::getEmail).collect(Collectors.toList())) + userList.stream().map(UserCreateInfo::getEmail).collect(Collectors.toList())) .stream().collect(Collectors.toMap(User::getEmail, User::getId)); - for (UserInfo user : userList) { + for (UserCreateInfo user : userList) { if (emailList.contains(user.getEmail())) { repeatEmailList.add(user.getEmail()); } else { @@ -87,20 +91,22 @@ public class UserService { } } - public UserBatchCreateDTO addBatch(UserBatchCreateDTO userCreateDTO) { + public UserBatchCreateDTO addBatch(UserBatchCreateDTO userCreateDTO, String source, String operator) { this.validateUserInfo(userCreateDTO.getUserInfoList()); globalUserRoleService.checkRoleIsGlobalAndHaveMember(userCreateDTO.getUserRoleIdList(), true); long createTime = System.currentTimeMillis(); List saveUserList = new ArrayList<>(); //添加用户 - for (UserInfo userInfo : userCreateDTO.getUserInfoList()) { + for (UserCreateInfo userInfo : userCreateDTO.getUserInfoList()) { userInfo.setId(UUID.randomUUID().toString()); - userInfo.setCreateTime(createTime); - userInfo.setUpdateTime(createTime); - User user = new User(); BeanUtils.copyBean(user, userInfo); + user.setCreateUser(operator); + user.setCreateTime(createTime); + user.setUpdateUser(operator); + user.setUpdateTime(createTime); user.setPassword(CodingUtil.md5(user.getEmail())); + user.setSource(source); userMapper.insertSelective(user); saveUserList.add(user); } @@ -126,15 +132,15 @@ public class UserService { return userDTO; } - public List list(BasePageRequest request) { - List returnList = new ArrayList<>(); + public List list(BasePageRequest request) { + List returnList = new ArrayList<>(); List userList = baseUserMapper.selectByKeyword(request.getKeyword()); List userIdList = userList.stream().map(User::getId).collect(Collectors.toList()); - Map roleAndOrganizationMap = userRoleRelationService.selectGlobalUserRoleAndOrganization(userIdList); + Map roleAndOrganizationMap = userRoleRelationService.selectGlobalUserRoleAndOrganization(userIdList); for (User user : userList) { - UserInfo userInfo = new UserInfo(); + UserTableResponse userInfo = new UserTableResponse(); BeanUtils.copyBean(userInfo, user); - UserInfo roleOrgModel = roleAndOrganizationMap.get(user.getId()); + UserTableResponse roleOrgModel = roleAndOrganizationMap.get(user.getId()); if (roleOrgModel != null) { userInfo.setUserRoleList(roleOrgModel.getUserRoleList()); userInfo.setOrganizationList(roleOrgModel.getOrganizationList()); @@ -144,11 +150,12 @@ public class UserService { return returnList; } - public UserEditRequest updateUser(UserEditRequest userEditRequest) { + public UserEditRequest updateUser(UserEditRequest userEditRequest, String operator) { //检查用户组合法性 globalUserRoleService.checkRoleIsGlobalAndHaveMember(userEditRequest.getUserRoleIdList(), true); User user = new User(); BeanUtils.copyBean(user, userEditRequest); + user.setUpdateUser(operator); user.setUpdateTime(System.currentTimeMillis()); user.setCreateUser(null); user.setCreateTime(null); @@ -156,4 +163,25 @@ public class UserService { userRoleRelationService.updateUserSystemGlobalRole(user, user.getUpdateUser(), userEditRequest.getUserRoleIdList()); return userEditRequest; } + + public UserEditEnableRequest updateUserEnable(UserEditEnableRequest request, String operator) { + this.checkUserInDb(request.getUserIdList()); + UserExample userExample = new UserExample(); + userExample.createCriteria().andIdIn( + request.getUserIdList() + ); + User updateUser = new User(); + updateUser.setEnable(request.isEnable()); + updateUser.setUpdateUser(operator); + updateUser.setUpdateTime(System.currentTimeMillis()); + userMapper.updateByExampleSelective(updateUser, userExample); + return request; + } + + private void checkUserInDb(@Valid @NotEmpty List userIdList) { + List userInDb = baseUserMapper.selectUserIdByIdList(userIdList); + if (userIdList.size() != userInDb.size()) { + throw new MSException(Translator.get("user.not.exist")); + } + } } diff --git a/backend/services/system-setting/src/test/java/io/metersphere/system/controller/UserControllerNonePermissionTests.java b/backend/services/system-setting/src/test/java/io/metersphere/system/controller/UserControllerNonePermissionTests.java index 88ffb55ef1..68bae92089 100644 --- a/backend/services/system-setting/src/test/java/io/metersphere/system/controller/UserControllerNonePermissionTests.java +++ b/backend/services/system-setting/src/test/java/io/metersphere/system/controller/UserControllerNonePermissionTests.java @@ -3,7 +3,7 @@ package io.metersphere.system.controller; import com.jayway.jsonpath.JsonPath; import io.metersphere.sdk.constants.SessionConstants; import io.metersphere.sdk.util.JSON; -import io.metersphere.system.dto.UserInfo; +import io.metersphere.system.dto.UserCreateInfo; import io.metersphere.system.dto.UserRoleOption; import io.metersphere.system.utils.UserTestUtils; import jakarta.annotation.Resource; @@ -58,11 +58,10 @@ public class UserControllerNonePermissionTests { @Test @Order(0) public void testGetGlobalSystemUserRoleSuccess() throws Exception { - UserInfo paramUserInfo = new UserInfo() {{ + UserCreateInfo paramUserInfo = new UserCreateInfo() {{ setId("testId"); setName("tianyang.no.permission.email"); setEmail("tianyang.no.permission.email@126.com"); - setSource("LOCAL"); }}; List paramRoleList = new ArrayList<>() {{ this.add( diff --git a/backend/services/system-setting/src/test/java/io/metersphere/system/controller/UserControllerTests.java b/backend/services/system-setting/src/test/java/io/metersphere/system/controller/UserControllerTests.java index a158753279..4f0d59d8cd 100644 --- a/backend/services/system-setting/src/test/java/io/metersphere/system/controller/UserControllerTests.java +++ b/backend/services/system-setting/src/test/java/io/metersphere/system/controller/UserControllerTests.java @@ -1,7 +1,6 @@ package io.metersphere.system.controller; import base.BaseTest; -import io.metersphere.api.domain.ApiDefinition; import io.metersphere.sdk.constants.SessionConstants; import io.metersphere.sdk.controller.handler.ResultHolder; import io.metersphere.sdk.dto.BasePageRequest; @@ -9,10 +8,8 @@ import io.metersphere.sdk.dto.UserDTO; import io.metersphere.sdk.util.BeanUtils; import io.metersphere.sdk.util.JSON; import io.metersphere.sdk.util.Pager; -import io.metersphere.system.dto.UserBatchCreateDTO; -import io.metersphere.system.dto.UserEditRequest; -import io.metersphere.system.dto.UserInfo; -import io.metersphere.system.dto.UserRoleOption; +import io.metersphere.system.dto.*; +import io.metersphere.system.dto.response.UserTableResponse; import io.metersphere.system.utils.UserTestUtils; import io.metersphere.utils.JsonUtils; import jakarta.annotation.Resource; @@ -53,12 +50,13 @@ public class UserControllerTests extends BaseTest { private static final String URL_USER_GET = "/system/user/get/%s"; private static final String URL_USER_PAGE = "/system/user/page"; private static final String URL_GET_GLOBAL_SYSTEM = "/system/user/get/global/system/role"; + private static final String URL_USER_UPDATE_ENABLE = "/system/user/update/enable"; //失败请求返回编码 private static final ResultMatcher BAD_REQUEST_MATCHER = status().isBadRequest(); private static final ResultMatcher ERROR_REQUEST_MATCHER = status().is5xxServerError(); //测试过程中需要用到的数据 - private static final List USER_LIST = new ArrayList<>(); - private static List defaultUserRoleList = new ArrayList<>(); + private static final List USER_LIST = new ArrayList<>(); + private static final List defaultUserRoleList = new ArrayList<>(); //默认数据 public static final String USER_DEFAULT_NAME = "tianyang.no.1"; public static final String USER_DEFAULT_EMAIL = "tianyang.no.1@126.com"; @@ -138,15 +136,13 @@ public class UserControllerTests extends BaseTest { UserBatchCreateDTO userMaintainRequest = UserTestUtils.getUserCreateDTO( defaultUserRoleList, new ArrayList<>() {{ - add(new UserInfo() {{ + add(new UserCreateInfo() {{ setName(USER_DEFAULT_NAME); setEmail(USER_DEFAULT_EMAIL); - setSource("LOCAL"); }}); - add(new UserInfo() {{ + add(new UserCreateInfo() {{ setName("tianyang.no.2"); setEmail("tianyang.no.2@126.com"); - setSource("LOCAL"); }}); }} ); @@ -158,15 +154,13 @@ public class UserControllerTests extends BaseTest { defaultUserRoleList, new ArrayList<>() {{ - add(new UserInfo() {{ + add(new UserCreateInfo() {{ setName("tianyang.repeat"); setEmail("tianyang.repeat.name.1@126.com"); - setSource("LOCAL"); }}); - add(new UserInfo() {{ + add(new UserCreateInfo() {{ setName("tianyang.repeat"); setEmail("tianyang.repeat.name.2@126.com"); - setSource("LOCAL"); }}); }} ); @@ -181,16 +175,14 @@ public class UserControllerTests extends BaseTest { this.testGetGlobalSystemUserRoleSuccess(); } UserBatchCreateDTO userMaintainRequest; - List errorUserList = new ArrayList<>() {{ - add(new UserInfo() {{ + List errorUserList = new ArrayList<>() {{ + add(new UserCreateInfo() {{ setName("tianyang.error.1"); setEmail("tianyang.error.name.1@126.com"); - setSource("LOCAL"); }}); - add(new UserInfo() {{ + add(new UserCreateInfo() {{ setName("tianyang.error.2"); setEmail("tianyang.error.name.2@126.com"); - setSource("LOCAL"); }}); }}; @@ -224,9 +216,8 @@ public class UserControllerTests extends BaseTest { defaultUserRoleList, new ArrayList<>() ); - userMaintainRequest.getUserInfoList().add(new UserInfo() {{ + userMaintainRequest.getUserInfoList().add(new UserCreateInfo() {{ setEmail("tianyang.name.empty@126.com"); - setSource("LOCAL"); }}); this.requestPost(URL_USER_CREATE, userMaintainRequest, BAD_REQUEST_MATCHER); //含有用户邮箱为空的数据 @@ -234,9 +225,8 @@ public class UserControllerTests extends BaseTest { defaultUserRoleList, new ArrayList<>() ); - userMaintainRequest.getUserInfoList().add(new UserInfo() {{ + userMaintainRequest.getUserInfoList().add(new UserCreateInfo() {{ setName("tianyang.email.empty"); - setSource("LOCAL"); }}); this.requestPost(URL_USER_CREATE, userMaintainRequest, BAD_REQUEST_MATCHER); //用户邮箱不符合标准 @@ -244,23 +234,11 @@ public class UserControllerTests extends BaseTest { defaultUserRoleList, new ArrayList<>() ); - userMaintainRequest.getUserInfoList().add(new UserInfo() {{ + userMaintainRequest.getUserInfoList().add(new UserCreateInfo() {{ setName("用户邮箱放飞自我"); setEmail("用户邮箱放飞自我"); - setSource("LOCAL"); }}); this.requestPost(URL_USER_CREATE, userMaintainRequest, BAD_REQUEST_MATCHER); - //用户来源为空 - userMaintainRequest = UserTestUtils.getUserCreateDTO( - defaultUserRoleList, - new ArrayList<>() - ); - userMaintainRequest.getUserInfoList().add(new UserInfo() {{ - setName("tianyang.source.empty"); - setEmail("tianyang.source.empty@126.com"); - }}); - this.requestPost(URL_USER_CREATE, userMaintainRequest, BAD_REQUEST_MATCHER); - /* * 校验业务判断出错的反例 (500 error) * 需要保证数据库有正常数据 @@ -277,10 +255,9 @@ public class UserControllerTests extends BaseTest { errorUserList ); String firstUserEmail = userMaintainRequest.getUserInfoList().get(0).getEmail(); - userMaintainRequest.getUserInfoList().add(new UserInfo() {{ + userMaintainRequest.getUserInfoList().add(new UserCreateInfo() {{ setName("tianyang.no.error4"); setEmail(firstUserEmail); - setSource("LOCAL"); }}); this.requestPost(URL_USER_CREATE, userMaintainRequest, ERROR_REQUEST_MATCHER); //测试请求参数中含有数据库中已存在的邮箱情况 @@ -290,10 +267,9 @@ public class UserControllerTests extends BaseTest { ); userMaintainRequest.setUserInfoList( new ArrayList<>() {{ - add(new UserInfo() {{ + add(new UserCreateInfo() {{ setName("tianyang.repeat.email.db"); setEmail(USER_DEFAULT_EMAIL); - setSource("LOCAL"); }}); }} ); @@ -354,13 +330,13 @@ public class UserControllerTests extends BaseTest { ResultHolder resultHolder = JsonUtils.parseObject(returnData, ResultHolder.class); //返回请求正常 Assertions.assertNotNull(resultHolder); - Pager returnPager = JSON.parseObject(JSON.toJSONString(resultHolder.getData()), Pager.class); + Pager returnPager = JSON.parseObject(JSON.toJSONString(resultHolder.getData()), Pager.class); //返回值不为空 Assertions.assertNotNull(returnPager); //返回值的页码和当前页码相同 Assertions.assertEquals(returnPager.getCurrent(), basePageRequest.getCurrent()); //返回的数据量不超过规定要返回的数据量相同 - Assertions.assertTrue(((List) returnPager.getList()).size() <= basePageRequest.getPageSize()); + Assertions.assertTrue(JSON.parseArray(JSON.toJSONString(returnPager.getList())).size() <= basePageRequest.getPageSize()); //测试根据创建时间倒叙排列 basePageRequest = UserTestUtils.getDefaultPageRequest(); @@ -372,9 +348,9 @@ public class UserControllerTests extends BaseTest { resultHolder = JsonUtils.parseObject(returnData, ResultHolder.class); returnPager = JSON.parseObject(JSON.toJSONString(resultHolder.getData()), Pager.class); //第一个数据的createTime是最大的 - List userInfoList = JSON.parseArray(JSON.toJSONString(returnPager.getList()), UserInfo.class); + List userInfoList = JSON.parseArray(JSON.toJSONString(returnPager.getList()), UserTableResponse.class); long firstCreateTime = userInfoList.get(0).getCreateTime(); - for (UserInfo userInfo : userInfoList) { + for (UserTableResponse userInfo : userInfoList) { Assertions.assertFalse(userInfo.getCreateTime() > firstCreateTime); } } @@ -404,7 +380,7 @@ public class UserControllerTests extends BaseTest { @Order(4) public void testUserUpdateSuccess() throws Exception { this.checkUserList(); - UserInfo user = new UserInfo(); + UserCreateInfo user = new UserCreateInfo(); BeanUtils.copyBean(user, USER_LIST.get(0)); UserEditRequest userMaintainRequest; UserEditRequest response; @@ -440,7 +416,7 @@ public class UserControllerTests extends BaseTest { checkDTO = this.getUserByEmail(user.getEmail()); UserTestUtils.compareUserDTO(response, checkDTO); //用户信息复原 - user = new UserInfo(); + user = new UserCreateInfo(); BeanUtils.copyBean(user, USER_LIST.get(0)); userMaintainRequest = UserTestUtils.getUserUpdateDTO(user, defaultUserRoleList); response = UserTestUtils.parseObjectFromMvcResult(this.responsePost(URL_USER_UPDATE, userMaintainRequest), UserEditRequest.class); @@ -452,7 +428,7 @@ public class UserControllerTests extends BaseTest { @Order(5) public void testUserUpdateError() throws Exception { // 4xx 验证 - UserInfo user = new UserInfo(); + UserCreateInfo user = new UserCreateInfo(); UserEditRequest userMaintainRequest; //更改名字 BeanUtils.copyBean(user, USER_LIST.get(0)); @@ -472,11 +448,12 @@ public class UserControllerTests extends BaseTest { //用户组为空 BeanUtils.copyBean(user, USER_LIST.get(0)); userMaintainRequest = UserTestUtils.getUserUpdateDTO(user, new ArrayList<>()); - userMaintainRequest.setUserRoleList(new ArrayList<>()); + userMaintainRequest.setUserRoleIdList(new ArrayList<>()); this.requestPost(URL_USER_UPDATE, userMaintainRequest, BAD_REQUEST_MATCHER); // 500验证 //邮箱重复 + this.checkUserList(); BeanUtils.copyBean(user, USER_LIST.get(0)); user.setEmail(USER_LIST.get(USER_LIST.size() - 1).getEmail()); userMaintainRequest = UserTestUtils.getUserUpdateDTO(user, defaultUserRoleList); @@ -488,4 +465,35 @@ public class UserControllerTests extends BaseTest { ); this.requestPost(URL_USER_UPDATE, userMaintainRequest, ERROR_REQUEST_MATCHER); } + + @Test + @Order(6) + public void testUserChangeEnableSuccess() throws Exception { + this.checkUserList(); + //单独修改状态 + UserCreateInfo userInfo = USER_LIST.get(0); + UserEditEnableRequest userChangeEnableRequest = new UserEditEnableRequest(); + userChangeEnableRequest.setUserIdList(new ArrayList<>() {{ + this.add(userInfo.getId()); + }}); + userChangeEnableRequest.setEnable(false); + this.requestPost(URL_USER_UPDATE_ENABLE, userChangeEnableRequest, status().isOk()); + UserDTO userDTO = this.getUserByEmail(userInfo.getEmail()); + Assertions.assertEquals(userDTO.getEnable(), userChangeEnableRequest.isEnable()); + } + + @Test + @Order(6) + public void testUserChangeEnableError() throws Exception { + this.checkUserList(); + //用户不存在 + UserEditEnableRequest userChangeEnableRequest = new UserEditEnableRequest(); + userChangeEnableRequest.setEnable(false); + this.requestPost(URL_USER_UPDATE_ENABLE, userChangeEnableRequest, BAD_REQUEST_MATCHER); + //含有非法用户 + userChangeEnableRequest.setUserIdList(new ArrayList<>() {{ + this.add("BCDEDIT"); + }}); + this.requestPost(URL_USER_UPDATE_ENABLE, userChangeEnableRequest, ERROR_REQUEST_MATCHER); + } } diff --git a/backend/services/system-setting/src/test/java/io/metersphere/system/utils/UserTestUtils.java b/backend/services/system-setting/src/test/java/io/metersphere/system/utils/UserTestUtils.java index 6827d84b22..6453df5653 100644 --- a/backend/services/system-setting/src/test/java/io/metersphere/system/utils/UserTestUtils.java +++ b/backend/services/system-setting/src/test/java/io/metersphere/system/utils/UserTestUtils.java @@ -7,8 +7,8 @@ import io.metersphere.sdk.util.BeanUtils; import io.metersphere.sdk.util.JSON; import io.metersphere.system.domain.UserRole; import io.metersphere.system.dto.UserBatchCreateDTO; +import io.metersphere.system.dto.UserCreateInfo; import io.metersphere.system.dto.UserEditRequest; -import io.metersphere.system.dto.UserInfo; import io.metersphere.system.dto.UserRoleOption; import io.metersphere.utils.JsonUtils; import org.apache.commons.collections4.CollectionUtils; @@ -36,7 +36,7 @@ public class UserTestUtils { public static UserBatchCreateDTO getUserCreateDTO( List userRoleList, - List userInfoList) { + List userInfoList) { UserBatchCreateDTO userMaintainRequest = new UserBatchCreateDTO(); if (CollectionUtils.isNotEmpty(userRoleList)) { userMaintainRequest.setUserRoleIdList( @@ -46,7 +46,7 @@ public class UserTestUtils { return userMaintainRequest; } - public static UserEditRequest getUserUpdateDTO(UserInfo user, List userRoleList) { + public static UserEditRequest getUserUpdateDTO(UserCreateInfo user, List userRoleList) { UserEditRequest returnDTO = new UserEditRequest(); if (user.getPhone() == null) { user.setPhone("");