diff --git a/backend/src/main/java/io/metersphere/controller/UserController.java b/backend/src/main/java/io/metersphere/controller/UserController.java index 2d89ae0041..0c668be694 100644 --- a/backend/src/main/java/io/metersphere/controller/UserController.java +++ b/backend/src/main/java/io/metersphere/controller/UserController.java @@ -11,6 +11,7 @@ import io.metersphere.controller.request.UserRequest; import io.metersphere.controller.request.member.AddMemberRequest; import io.metersphere.controller.request.member.EditPassWordRequest; import io.metersphere.controller.request.member.QueryMemberRequest; +import io.metersphere.controller.request.member.SetAdminRequest; import io.metersphere.controller.request.organization.AddOrgMemberRequest; import io.metersphere.controller.request.organization.QueryOrgMemberRequest; import io.metersphere.dto.UserDTO; @@ -265,4 +266,10 @@ public class UserController { return userService.updateUserPassword(request); } + @PostMapping("/set/admin") + @RequiresRoles(RoleConstants.ADMIN) + public void setAdmin(@RequestBody SetAdminRequest request) { + userService.setAdmin(request); + } + } diff --git a/backend/src/main/java/io/metersphere/controller/request/member/SetAdminRequest.java b/backend/src/main/java/io/metersphere/controller/request/member/SetAdminRequest.java new file mode 100644 index 0000000000..8803ffb942 --- /dev/null +++ b/backend/src/main/java/io/metersphere/controller/request/member/SetAdminRequest.java @@ -0,0 +1,10 @@ +package io.metersphere.controller.request.member; + +import lombok.Data; + +@Data +public class SetAdminRequest { + private String id; + private String adminId; + private String password; +} diff --git a/backend/src/main/java/io/metersphere/service/UserService.java b/backend/src/main/java/io/metersphere/service/UserService.java index dfe30c2e08..1043d86aec 100644 --- a/backend/src/main/java/io/metersphere/service/UserService.java +++ b/backend/src/main/java/io/metersphere/service/UserService.java @@ -4,12 +4,14 @@ import io.metersphere.base.domain.*; import io.metersphere.base.mapper.*; import io.metersphere.base.mapper.ext.ExtUserMapper; import io.metersphere.base.mapper.ext.ExtUserRoleMapper; +import io.metersphere.commons.constants.RoleConstants; import io.metersphere.commons.exception.MSException; import io.metersphere.commons.utils.CodingUtil; import io.metersphere.controller.request.UserRequest; import io.metersphere.controller.request.member.AddMemberRequest; import io.metersphere.controller.request.member.EditPassWordRequest; import io.metersphere.controller.request.member.QueryMemberRequest; +import io.metersphere.controller.request.member.SetAdminRequest; import io.metersphere.controller.request.organization.AddOrgMemberRequest; import io.metersphere.controller.request.organization.QueryOrgMemberRequest; import io.metersphere.dto.UserDTO; @@ -133,8 +135,6 @@ public class UserService { } public void updateUser(User user) { - // MD5 - user.setPassword(CodingUtil.md5(user.getPassword())); user.setUpdateTime(System.currentTimeMillis()); userMapper.updateByPrimaryKeySelective(user); } @@ -324,4 +324,20 @@ public class UserService { return extUserMapper.updatePassword(user); } + public void setAdmin(SetAdminRequest request) { + String adminId = request.getAdminId(); + String password = request.getPassword(); + if (!checkUserPassword(adminId, password)) { + MSException.throwException("verification failed!"); + } + UserRole userRole = new UserRole(); + userRole.setId(UUID.randomUUID().toString()); + userRole.setUserId(request.getId()); + // TODO 修改admin sourceId + userRole.setSourceId("adminSourceId"); + userRole.setRoleId(RoleConstants.ADMIN); + userRole.setCreateTime(System.currentTimeMillis()); + userRole.setUpdateTime(System.currentTimeMillis()); + userRoleMapper.insertSelective(userRole); + } } diff --git a/frontend/src/business/components/performance/report/PerformanceTestReport.vue b/frontend/src/business/components/performance/report/PerformanceTestReport.vue index c350865203..df2a2c990b 100644 --- a/frontend/src/business/components/performance/report/PerformanceTestReport.vue +++ b/frontend/src/business/components/performance/report/PerformanceTestReport.vue @@ -147,7 +147,7 @@ }) }, handleDelete(report) { - this.$alert(this.$t('load_test.delete_confirm') + report.name + "?", '', { + this.$alert(this.$t('report.delete_confirm') + report.name + "?", '', { confirmButtonText: this.$t('commons.confirm'), callback: (action) => { if (action === 'confirm') { diff --git a/frontend/src/business/components/settings/personal/PersonSetting.vue b/frontend/src/business/components/settings/personal/PersonSetting.vue index d1428af35d..9ce17e1923 100644 --- a/frontend/src/business/components/settings/personal/PersonSetting.vue +++ b/frontend/src/business/components/settings/personal/PersonSetting.vue @@ -163,8 +163,8 @@ this.editPasswordVisible = true; }, updateUser(updateUserForm) { - this.$refs[updateUserForm].validate(valide => { - if (valide) { + this.$refs[updateUserForm].validate(valid => { + if (valid) { this.result = this.$post(this.updatePath, this.form, response => { this.$success(this.$t('commons.modify_success')); localStorage.setItem(TokenKey, JSON.stringify(response.data)); @@ -178,8 +178,8 @@ }) }, updatePassword(editPasswordForm) { - this.$refs[editPasswordForm].validate(valide => { - if (valide) { + this.$refs[editPasswordForm].validate(valid => { + if (valid) { this.result = this.$post(this.updatePasswordPath, this.ruleForm, response => { this.$success(this.$t('commons.modify_success')); this.editPasswordVisible = false; diff --git a/frontend/src/business/components/settings/system/SystemWorkspace.vue b/frontend/src/business/components/settings/system/SystemWorkspace.vue index b73a21655c..03268cdf60 100644 --- a/frontend/src/business/components/settings/system/SystemWorkspace.vue +++ b/frontend/src/business/components/settings/system/SystemWorkspace.vue @@ -290,8 +290,8 @@ }) }, updateWorkspace(updateForm) { - this.$refs[updateForm].validate(valide => { - if (valide) { + this.$refs[updateForm].validate(valid => { + if (valid) { this.result = this.$post("/workspace/special/update", this.form, () => { this.$success(this.$t('commons.modify_success')); this.dialogWsUpdateVisible = false; diff --git a/frontend/src/business/components/settings/system/TestResourcePool.vue b/frontend/src/business/components/settings/system/TestResourcePool.vue index d769dd840e..056514f361 100644 --- a/frontend/src/business/components/settings/system/TestResourcePool.vue +++ b/frontend/src/business/components/settings/system/TestResourcePool.vue @@ -350,8 +350,8 @@ if (this.result.loading) { return; } - this.$refs[createTestResourcePoolForm].validate(valide => { - if (valide) { + this.$refs[createTestResourcePoolForm].validate(valid => { + if (valid) { let vri = this.validateResourceInfo(); if (vri.validate) { this.convertSubmitResources(); @@ -389,8 +389,8 @@ if (this.result.loading) { return; } - this.$refs[updateTestResourcePoolForm].validate(valide => { - if (valide) { + this.$refs[updateTestResourcePoolForm].validate(valid => { + if (valid) { let vri = this.validateResourceInfo(); if (vri.validate) { this.convertSubmitResources(); diff --git a/frontend/src/business/components/settings/system/User.vue b/frontend/src/business/components/settings/system/User.vue index 8897546460..f540a9860b 100644 --- a/frontend/src/business/components/settings/system/User.vue +++ b/frontend/src/business/components/settings/system/User.vue @@ -35,6 +35,8 @@ @@ -45,6 +47,21 @@ :total="total"/> + + + + + + + + + @@ -97,7 +114,8 @@ - + @@ -122,6 +140,7 @@ import MsTableOperator from "../../common/components/MsTableOperator"; import MsDialogFooter from "../../common/components/MsDialogFooter"; import MsTableOperatorButton from "../../common/components/MsTableOperatorButton"; + import {getCurrentUser} from "../../../../common/js/utils"; export default { name: "MsUser", @@ -136,7 +155,8 @@ result: {}, createVisible: false, updateVisible: false, - editPasswordVisible:false, + editPasswordVisible: false, + checkPasswordVisible: false, multipleSelection: [], currentPage: 1, pageSize: 5, @@ -145,7 +165,9 @@ condition: {}, tableData: [], form: {}, + checkPasswordForm: {}, ruleForm: {}, + setAdminParam: {}, rule: { id: [ {required: true, message: this.$t('user.input_id'), trigger: 'blur'}, @@ -181,20 +203,20 @@ password: [ {required: true, message: this.$t('user.input_password'), trigger: 'blur'}, { - required:true, + required: true, pattern: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[^]{8,16}$/, message: this.$t('member.password_format_is_incorrect'), trigger: 'blur' } ], newpassword: [ - {required: true, message: this.$t('user.input_password'), trigger: 'blur'}, - { - required:true, - pattern: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[^]{8,16}$/, - message: this.$t('member.password_format_is_incorrect'), - trigger: 'blur' - } + {required: true, message: this.$t('user.input_password'), trigger: 'blur'}, + { + required: true, + pattern: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[^]{8,16}$/, + message: this.$t('member.password_format_is_incorrect'), + trigger: 'blur' + } ] } } @@ -210,8 +232,8 @@ this.updateVisible = true; this.form = Object.assign({}, row); }, - editPassword(row){ - this.editPasswordVisible=true; + editPassword(row) { + this.editPasswordVisible = true; this.ruleForm = Object.assign({}, row); }, del(row) { @@ -255,15 +277,15 @@ }) }, editUserPassword(editPasswordForm){ - this.$refs[editPasswordForm].validate(valide=>{ - if(valide){ + this.$refs[editPasswordForm].validate(valid=>{ + if(valid){ this.result = this.$post(this.editPasswordPath, this.ruleForm, response => { this.$success(this.$t('commons.modify_success')); this.editPasswordVisible = false; - this.search() ; + this.search(); window.location.reload(); }); - }else { + } else { return false; } }) @@ -288,6 +310,28 @@ }, handleSelectionChange(val) { this.multipleSelection = val; + }, + closeCheckPassword() { + this.checkPasswordForm = {}; + }, + openCheckDialog(row) { + this.$set(this.setAdminParam, 'id', row.id); + this.checkPasswordVisible = true; + }, + setAdmin(checkPasswordForm) { + let user = getCurrentUser(); + this.$set(this.setAdminParam, 'adminId', user.id); + this.$set(this.setAdminParam, 'password', this.checkPasswordForm.password); + this.$refs[checkPasswordForm].validate(valid => { + if (valid) { + this.$post("/user/set/admin", this.setAdminParam, () => { + this.$success(this.$t('commons.modify_success')); + this.checkPasswordVisible = false; + }) + } else { + return false; + } + }) } } } diff --git a/frontend/src/i18n/en-US.js b/frontend/src/i18n/en-US.js index a8923a9ccf..b420cbeccd 100644 --- a/frontend/src/i18n/en-US.js +++ b/frontend/src/i18n/en-US.js @@ -6,6 +6,7 @@ export default { 'project': 'Project', 'name': 'Name', 'description': 'Description', + 'clear': 'Clear', 'save': 'Save', 'save_success': 'Saved successfully', 'delete_success': 'Deleted successfully', @@ -50,9 +51,12 @@ export default { 'remark': 'Remark', 'delete': 'Delete', 'not_filled': 'Not filled', + 'please_select': 'Please select', 'search_by_name': 'Search by name', 'personal_information': 'Personal Information', 'exit_system': 'Exit System', + 'verification': 'Verification', + 'set_admin': 'Set Admin', }, workspace: { 'create': 'Create Workspace', @@ -139,6 +143,7 @@ export default { 'compare': 'Compare', 'generation_error': 'Report generation error, cannot be viewed!', 'being_generated': 'Report is being generated...', + 'delete_confirm': 'Confirm delete: ', }, load_test: { 'operating': 'Operating', @@ -321,7 +326,6 @@ export default { input_method: "Please select method", input_prerequisite: "Please select prerequisite", delete_confirm: "Confirm delete test case: ", - import: { import: "Import test case", case_import: "Import test case", @@ -333,7 +337,6 @@ export default { upload_limit_size: "Upload file size cannot exceed 20MB!", success: "Import success!", }, - export: { export: "Export cases" } diff --git a/frontend/src/i18n/zh-CN.js b/frontend/src/i18n/zh-CN.js index 3828466217..cbcabfe8de 100644 --- a/frontend/src/i18n/zh-CN.js +++ b/frontend/src/i18n/zh-CN.js @@ -55,6 +55,8 @@ export default { 'search_by_name': '根据名称搜索', 'personal_information': '个人信息', 'exit_system': '退出系统', + 'verification': '验证', + 'set_admin': '设置为管理员', }, workspace: { 'create': '创建工作空间', @@ -141,6 +143,7 @@ export default { 'compare': '比较', 'generation_error': '报告生成错误,无法查看!', 'being_generated': '报告正在生成中...', + 'delete_confirm': '确认删除报告: ', }, load_test: { 'operating': '操作', @@ -198,7 +201,6 @@ export default { 'resource_pool_is_null': '资源池为空', 'download_log_file': '下载完整日志文件', 'pressure_prediction_chart': '压力预估图', - }, api_test: { save_and_run: "保存并执行",