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: "保存并执行",