Merge remote-tracking branch 'origin/dev' into dev

This commit is contained in:
q4speed 2020-05-27 11:56:16 +08:00
commit de13d7866a
18 changed files with 256 additions and 106 deletions

View File

@ -0,0 +1,21 @@
package io.metersphere.commons.utils;
import io.metersphere.controller.request.OrderRequest;
import java.util.ArrayList;
import java.util.List;
public class ServiceUtils {
public static List<OrderRequest> getDefaultOrder(List<OrderRequest> orders) {
if (orders == null || orders.size() < 1) {
OrderRequest orderRequest = new OrderRequest();
orderRequest.setName("update_time");
orderRequest.setType("desc");
orders = new ArrayList<>();
orders.add(orderRequest);
return orders;
}
return orders;
}
}

View File

@ -10,7 +10,9 @@ import io.metersphere.commons.exception.MSException;
import io.metersphere.commons.user.SessionUser;
import io.metersphere.commons.utils.BeanUtils;
import io.metersphere.commons.utils.LogUtil;
import io.metersphere.commons.utils.ServiceUtils;
import io.metersphere.commons.utils.SessionUtils;
import io.metersphere.controller.request.OrderRequest;
import io.metersphere.excel.domain.ExcelErrData;
import io.metersphere.excel.domain.ExcelResponse;
import io.metersphere.excel.domain.TestCaseExcelData;
@ -101,6 +103,7 @@ public class TestCaseService {
}
public List<TestCaseDTO> listTestCase(QueryTestCaseRequest request) {
request.setOrders(ServiceUtils.getDefaultOrder(request.getOrders()));
return extTestCaseMapper.list(request);
}

View File

@ -7,7 +7,9 @@ import io.metersphere.base.mapper.ext.ExtTestPlanTestCaseMapper;
import io.metersphere.commons.constants.TestPlanTestCaseStatus;
import io.metersphere.commons.user.SessionUser;
import io.metersphere.commons.utils.BeanUtils;
import io.metersphere.commons.utils.ServiceUtils;
import io.metersphere.commons.utils.SessionUtils;
import io.metersphere.controller.request.OrderRequest;
import io.metersphere.controller.request.member.QueryMemberRequest;
import io.metersphere.service.UserService;
import io.metersphere.track.dto.TestPlanCaseDTO;
@ -41,6 +43,7 @@ public class TestPlanTestCaseService {
ExtTestPlanTestCaseMapper extTestPlanTestCaseMapper;
public List<TestPlanCaseDTO> list(QueryTestPlanCaseRequest request) {
request.setOrders(ServiceUtils.getDefaultOrder(request.getOrders()));
List<TestPlanCaseDTO> list = extTestPlanTestCaseMapper.list(request);
QueryMemberRequest queryMemberRequest = new QueryMemberRequest();
queryMemberRequest.setWorkspaceId(SessionUtils.getCurrentWorkspaceId());

View File

@ -1,5 +1,5 @@
INSERT INTO user (id, name, email, password, status, create_time, update_time, language, last_workspace_id, last_organization_id, phone)
VALUES ('admin', 'Administrator', 'admin@fit2cloud.com', md5('fit2cloud'), '1', 1582597567455, 1582597567455, null, '', null, null);
VALUES ('admin', 'Administrator', 'admin@metersphere.io', md5('metersphere'), '1', 1582597567455, 1582597567455, null, '', null, null);
INSERT INTO user_role (id, user_id, role_id, source_id, create_time, update_time)
VALUES (uuid(), 'admin', 'admin', '1', 1581576575948, 1581576575948);
@ -18,4 +18,4 @@ VALUES ('test_viewer', 'Viewer', NULL, NULL, 1581576575948, 1581576575948);
INSERT INTO test_case_report_template (id, name, content)
VALUES (uuid(), 'default', '{\"components\": [1,2,3,4,5]}');
INSERT INTO system_parameter (param_key, param_value, type, sort)
VALUES ('default.language', 'zh_CN', 'text', 5);
VALUES ('default.language', 'zh_CN', 'text', 5);

View File

@ -1,13 +1,10 @@
<template>
<span>
<slot name="front"></slot>
<ms-table-operator-button :tip="$t('commons.edit')" icon="el-icon-edit" @exec="editClick" @click.stop="editClickStop"/>
<ms-table-operator-button :tip="tip1" icon="el-icon-edit" @exec="editClick" @click.stop="editClickStop"/>
<slot name="middle"></slot>
<ms-table-operator-button :tip="$t('commons.delete')" icon="el-icon-delete" type="danger" @exec="deleteClick" @click.stop="deleteClickStop"/>
<ms-table-operator-button :tip="tip2" icon="el-icon-delete" type="danger" @exec="deleteClick" @click.stop="deleteClickStop"/>
<slot name="behind"></slot>
<!--
<ms-table-operator-button :tip="$t('commons.remove')" icon="el-icon-s-fold" type="danger" @exec="removeClick" @click.stop="removeClickStop"/>
-->
</span>
</template>
@ -17,6 +14,20 @@
export default {
name: "MsTableOperator",
components: {MsTableOperatorButton},
props: {
tip1: {
type: String,
default() {
return this.$t('commons.edit');
}
},
tip2: {
type: String,
default() {
return this.$t('commons.delete');
}
}
},
methods: {
editClick() {
this.$emit('editClick');
@ -29,13 +40,7 @@
},
deleteClickStop() {
this.$emit('deleteClickStop');
},
/* removeClick(){
this.$emit('removeClick');
},
removeClickStop(){
this.$emit('removeClickStop')
}*/
}
}
}
</script>

View File

@ -16,7 +16,7 @@
</el-table-column>
<el-table-column>
<template v-slot:default="scope">
<ms-table-operator @editClick="edit(scope.row)" @deleteClick="del(scope.row)"/>
<ms-table-operator :tip2="$t('commons.remove')" @editClick="edit(scope.row)" @deleteClick="del(scope.row)"/>
</template>
</el-table-column>
</el-table>
@ -27,25 +27,30 @@
<el-dialog :title="$t('member.create')" :visible.sync="createVisible" width="30%" :destroy-on-close="true"
@close="handleClose">
<el-form :model="form" ref="form" :rules="rules" label-position="right" label-width="100px" size="small">
<el-form-item :label="$t('commons.member')" prop="userIds">
<el-select v-model="form.userIds" multiple :placeholder="$t('member.please_choose_member')"
class="select-width">
<el-option
v-for="item in form.userList"
:key="item.id"
:label="item.name"
:value="item.id">
<span class="org-member-name">{{ item.name }}</span>
<span class="org-member-email">{{ item.email }}</span>
</el-option>
</el-select>
<el-form-item :label="$t('commons.member')" prop="memberSign" :rules="{required: true, message: $t('member.input_id_or_email'), trigger: 'change'}">
<el-autocomplete
class="input-with-autocomplete"
v-model="form.memberSign"
:placeholder="$t('member.input_id_or_email')"
:trigger-on-focus="false"
:fetch-suggestions="querySearch"
size="small"
highlight-first-item
value-key="email"
@select="handleSelect"
>
<template v-slot:default="scope">
<span class="org-member-name">{{scope.item.id}}</span>
<span class="org-member-email">{{scope.item.email}}</span>
</template>
</el-autocomplete>
</el-form-item>
<el-form-item :label="$t('commons.role')" prop="roleIds">
<el-select v-model="form.roleIds" multiple :placeholder="$t('role.please_choose_role')" class="select-width">
<el-option
v-for="item in form.roles"
:key="item.id"
:label="item.name"
:label="$t('role.' + item.id)"
:value="item.id">
</el-option>
</el-select>
@ -113,6 +118,7 @@
result: {},
createVisible: false,
updateVisible: false,
userList: [],
form: {},
queryPath: "/user/org/member/list",
condition: {},
@ -185,17 +191,17 @@
});
},
del(row) {
this.$confirm(this.$t('member.delete_confirm'), '', {
this.$confirm(this.$t('member.remove_member'), '', {
confirmButtonText: this.$t('commons.confirm'),
cancelButtonText: this.$t('commons.cancel'),
type: 'warning'
}).then(() => {
this.result = this.$get('/user/org/member/delete/' + this.currentUser().lastOrganizationId + '/' + row.id, () => {
this.$success(this.$t('commons.delete_success'));
this.$success(this.$t('commons.remove_success'));
this.initTableData();
});
}).catch(() => {
this.$info(this.$t('commons.delete_cancel'))
this.$info(this.$t('commons.remove_cancel'))
});
},
create() {
@ -205,9 +211,9 @@
return false;
}
this.form = {};
this.createVisible = true;
this.result = this.$get('/user/besideorg/list/' + this.currentUser().lastOrganizationId, response => {
this.createVisible = true;
this.$set(this.form, "userList", response.data);
this.userList = response.data;
});
this.result = this.$get('/role/list/org', response => {
this.$set(this.form, "roles", response.data);
@ -217,12 +223,24 @@
this.$refs[formName].validate((valid) => {
let orgId = this.currentUser().lastOrganizationId;
if (valid) {
let userIds = [];
let userId = this.form.userId;
let email = this.form.memberSign;
let member = this.userList.find(user => user.id === email || user.email === email);
if (!member) {
this.$warning(this.$t('member.no_such_user'));
return false;
} else {
userId = member.id;
}
userIds.push(userId);
let param = {
userIds: this.form.userIds,
userIds: userIds,
roleIds: this.form.roleIds,
organizationId: orgId
};
this.result = this.$post("user/org/member/add", param, () => {
this.$success(this.$t('commons.save_success'));
this.initTableData();
this.createVisible = false;
})
@ -230,6 +248,20 @@
return false;
}
});
},
querySearch(queryString, cb) {
var userList = this.userList;
var results = queryString ? userList.filter(this.createFilter(queryString)) : userList;
// callback
cb(results);
},
createFilter(queryString) {
return (user) => {
return (user.email.indexOf(queryString.toLowerCase()) === 0 || user.id.indexOf(queryString.toLowerCase()) === 0);
};
},
handleSelect(item) {
this.$set(this.form, "userId", item.id);
}
}
}
@ -247,7 +279,12 @@
font-size: 13px;
}
.input-with-autocomplete {
width: 100%;
}
.select-width {
width: 100%;
}
</style>

View File

@ -56,11 +56,7 @@
</el-table-column>
<el-table-column :label="$t('commons.operating')">
<template v-slot:default="scope">
<!--<ms-table-operator @editClick="editMember(scope.row)" @deleteClick="delMember(scope.row)"/>-->
<ms-table-operator-button :tip="$t('commons.edit')" icon="el-icon-edit" @exec="editMember(scope.row)"/>
<ms-table-operator-button :tip="$t('commons.remove')" icon="el-icon-delete" type="danger"
@exec="delMember(scope.row)"/>
<ms-table-operator :tip2="$t('commons.remove')" @editClick="editMember(scope.row)" @deleteClick="delMember(scope.row)"/>
</template>
</el-table-column>
</el-table>
@ -75,18 +71,23 @@
@close="closeFunc">
<el-form :model="memberForm" ref="form" :rules="wsMemberRule" label-position="right" label-width="100px"
size="small">
<el-form-item :label="$t('commons.member')" prop="userIds">
<el-select v-model="memberForm.userIds" multiple :placeholder="$t('member.please_choose_member')"
class="select-width">
<el-option
v-for="item in memberForm.userList"
:key="item.id"
:label="item.name"
:value="item.id">
<span class="ws-member-name">{{ item.name }}</span>
<span class="ws-member-email">{{ item.email }}</span>
</el-option>
</el-select>
<el-form-item :label="$t('commons.member')" prop="memberSign" :rules="{required: true, message: $t('member.input_id_or_email'), trigger: 'change'}">
<el-autocomplete
class="input-with-autocomplete"
v-model="memberForm.memberSign"
:placeholder="$t('member.input_id_or_email')"
:trigger-on-focus="false"
:fetch-suggestions="querySearch"
size="small"
highlight-first-item
value-key="email"
@select="handleSelect"
>
<template v-slot:default="scope">
<span class="ws-member-name">{{scope.item.id}}</span>
<span class="ws-member-email">{{scope.item.email}}</span>
</template>
</el-autocomplete>
</el-form-item>
<el-form-item :label="$t('commons.role')" prop="roleIds">
<el-select v-model="memberForm.roleIds" multiple :placeholder="$t('role.please_choose_role')"
@ -94,7 +95,7 @@
<el-option
v-for="item in memberForm.roles"
:key="item.id"
:label="item.name"
:label="$t('role.' + item.id)"
:value="item.id">
</el-option>
</el-select>
@ -256,7 +257,7 @@
this.dialogWsMemberAddVisible = true;
this.memberForm = {};
this.result = this.$get('/user/list/', response => {
this.$set(this.memberForm, "userList", response.data);
this.userList = response.data;
});
this.result = this.$get('/role/list/test', response => {
this.$set(this.memberForm, "roles", response.data);
@ -315,12 +316,24 @@
submitForm(formName) {
this.$refs[formName].validate((valid) => {
if (valid) {
let userIds = [];
let userId = this.memberForm.userId;
let email = this.memberForm.memberSign;
let member = this.userList.find(user => user.id === email || user.email === email);
if (!member) {
this.$warning(this.$t('member.no_such_user'));
return false;
} else {
userId = member.id;
}
userIds.push(userId);
let param = {
userIds: this.memberForm.userIds,
userIds: userIds,
roleIds: this.memberForm.roleIds,
workspaceId: this.currentWorkspaceRow.id
};
this.result = this.$post("user/ws/member/add", param, () => {
this.$success(this.$t('commons.save_success'));
this.cellClick(this.currentWorkspaceRow);
this.dialogWsMemberAddVisible = false;
})
@ -371,6 +384,20 @@
buildPagePath(path) {
return path + "/" + this.dialogCurrentPage + "/" + this.dialogPageSize;
},
querySearch(queryString, cb) {
var userList = this.userList;
var results = queryString ? userList.filter(this.createFilter(queryString)) : userList;
// callback
cb(results);
},
createFilter(queryString) {
return (user) => {
return (user.email.indexOf(queryString.toLowerCase()) === 0 || user.id.indexOf(queryString.toLowerCase()) === 0);
};
},
handleSelect(item) {
this.$set(this.form, "userId", item.id);
}
},
data() {
return {
@ -382,6 +409,7 @@
condition: {},
dialogCondition: {},
items: [],
userList: [],
currentPage: 1,
pageSize: 5,
total: 0,
@ -449,5 +477,9 @@
padding: 0px;
}
.input-with-autocomplete {
width: 100%;
}
</style>

View File

@ -42,15 +42,7 @@
</el-table-column>
<el-table-column :label="$t('commons.operating')">
<template v-slot:default="scope">
<!--<ms-table-operator @editClick="editMember(scope.row)" @deleteClick="delMember(scope.row)"/>-->
<ms-table-operator-button :tip="$t('commons.edit')" icon="el-icon-edit" @exec="editMember(scope.row)"/>
<ms-table-operator-button :tip="$t('commons.remove')" icon="el-icon-delete" type="danger"
@exec="delMember(scope.row)"/>
<!--<el-tooltip class="item" effect="dark" :content="$t('commons.remove')" placement="bottom">
<el-button :icon="el-icon-remove-outline">下边</el-button>
</el-tooltip>-->
<ms-table-operator :tip2="$t('commons.remove')" @editClick="editMember(scope.row)" @deleteClick="delMember(scope.row)"/>
</template>
</el-table-column>
</el-table>

View File

@ -100,10 +100,7 @@
</el-table-column>
<el-table-column :label="$t('commons.operating')">
<template v-slot:default="scope">
<!--<ms-table-operator @editClick="editMember(scope.row)" @deleteClick="delMember(scope.row)"/>-->
<ms-table-operator-button :tip="$t('commons.edit')" icon="el-icon-edit" @exec="editMember(scope.row)"/>
<ms-table-operator-button :tip="$t('commons.remove')" icon="el-icon-delete" type="danger"
@exec="delMember(scope.row)"/>
<ms-table-operator :tip2="$t('commons.remove')" @editClick="editMember(scope.row)" @deleteClick="delMember(scope.row)"/>
</template>
</el-table-column>
</el-table>

View File

@ -16,7 +16,7 @@
</el-table-column>
<el-table-column>
<template v-slot:default="scope">
<ms-table-operator @editClick="edit(scope.row)" @deleteClick="del(scope.row)"
<ms-table-operator :tip2="$t('commons.remove')" @editClick="edit(scope.row)" @deleteClick="del(scope.row)"
v-permission="['test_manager']"/>
</template>
</el-table-column>
@ -28,25 +28,30 @@
<el-dialog :title="$t('member.create')" :visible.sync="createVisible" width="30%" :destroy-on-close="true"
@close="handleClose">
<el-form :model="form" ref="form" :rules="rules" label-position="right" label-width="100px" size="small">
<el-form-item :label="$t('commons.member')" prop="userIds">
<el-select v-model="form.userIds" multiple :placeholder="$t('member.please_choose_member')"
class="select-width">
<el-option
v-for="item in form.userList"
:key="item.id"
:label="item.name"
:value="item.id">
<span class="workspace-member-name">{{ item.name }}</span>
<span class="workspace-member-email">{{ item.email }}</span>
</el-option>
</el-select>
<el-form-item :label="$t('commons.member')" prop="memberSign" :rules="{required: true, message: $t('member.input_id_or_email'), trigger: 'change'}">
<el-autocomplete
class="input-with-autocomplete"
v-model="form.memberSign"
:placeholder="$t('member.input_id_or_email')"
:trigger-on-focus="false"
:fetch-suggestions="querySearch"
size="small"
highlight-first-item
value-key="email"
@select="handleSelect"
>
<template v-slot:default="scope">
<span class="workspace-member-name">{{scope.item.id}}</span>
<span class="workspace-member-email">{{scope.item.email}}</span>
</template>
</el-autocomplete>
</el-form-item>
<el-form-item :label="$t('commons.role')" prop="roleIds">
<el-select v-model="form.roleIds" multiple :placeholder="$t('role.please_choose_role')" class="select-width">
<el-option
v-for="item in form.roles"
:key="item.id"
:label="item.name"
:label="$t('role.' + item.id)"
:value="item.id">
</el-option>
</el-select>
@ -116,6 +121,7 @@
queryPath: "/user/ws/member/list",
condition: {},
tableData: [],
userList: [],
rules: {
userIds: [
{required: true, message: this.$t('member.please_choose_member'), trigger: ['blur']}
@ -168,17 +174,17 @@
this.form = {};
},
del(row) {
this.$confirm(this.$t('member.delete_confirm'), '', {
this.$confirm(this.$t('member.remove_member'), '', {
confirmButtonText: this.$t('commons.confirm'),
cancelButtonText: this.$t('commons.cancel'),
type: 'warning'
}).then(() => {
this.result = this.$get('/user/ws/member/delete/' + this.currentUser().lastWorkspaceId + '/' + row.id,() => {
this.$success(this.$t('commons.delete_success'));
this.$success(this.$t('commons.remove_success'));
this.initTableData();
});
}).catch(() => {
this.$info(this.$t('commons.delete_cancel'));
this.$info(this.$t('commons.remove_cancel'));
});
},
edit(row) {
@ -219,7 +225,7 @@
}
this.$post('/user/org/member/list/all', param, response => {
this.createVisible = true;
this.$set(this.form, "userList", response.data);
this.userList = response.data;
})
this.result = this.$get('/role/list/test', response => {
this.$set(this.form, "roles", response.data);
@ -228,17 +234,43 @@
submitForm(formName) {
this.$refs[formName].validate((valid) => {
if (valid) {
let userIds = [];
let userId = this.form.userId;
let email = this.form.memberSign;
let member = this.userList.find(user => user.id === email || user.email === email);
if (!member) {
this.$warning(this.$t('member.no_such_user'));
return false;
} else {
userId = member.id;
}
userIds.push(userId);
let param = {
userIds: this.form.userIds,
userIds: userIds,
roleIds: this.form.roleIds,
workspaceId: this.currentUser().lastWorkspaceId
};
this.result = this.$post("user/ws/member/add", param, () => {
this.$success(this.$t('commons.save_success'));
this.initTableData();
this.createVisible = false;
})
}
});
},
querySearch(queryString, cb) {
var userList = this.userList;
var results = queryString ? userList.filter(this.createFilter(queryString)) : userList;
// callback
cb(results);
},
createFilter(queryString) {
return (user) => {
return (user.email.indexOf(queryString.toLowerCase()) === 0 || user.id.indexOf(queryString.toLowerCase()) === 0);
};
},
handleSelect(item) {
this.$set(this.form, "userId", item.id);
}
}
}
@ -264,4 +296,8 @@
font-size: 13px;
}
.input-with-autocomplete {
width: 100%;
}
</style>

View File

@ -86,7 +86,7 @@
</el-row>
<el-row type="flex" justify="center" style="margin-top: 10px;">
<el-col :span="20">
<el-form-item>
<el-form-item prop="prerequisite">
<el-input :disabled="readOnly" v-model="form.prerequisite"
type="textarea"
:autosize="{ minRows: 2, maxRows: 4}"
@ -233,6 +233,7 @@
priority :[{required: true, message: this.$t('test_track.case.input_priority'), trigger: 'change'}],
type :[{required: true, message: this.$t('test_track.case.input_type'), trigger: 'change'}],
method :[{required: true, message: this.$t('test_track.case.input_method'), trigger: 'change'}],
prerequisite :[{ max: 300, message: this.$t('test_track.length_less_than') + '300', trigger: 'blur'}],
remark :[{ max: 300, message: this.$t('test_track.length_less_than') + '300', trigger: 'blur'}]
},
formLabelWidth: "120px",

View File

@ -1,5 +1,5 @@
<template>
<home-base-component v-loading>
<home-base-component :title="$t('test_track.home.my_plan')" v-loading>
<el-table
:data="tableData"
@row-click="intoPlan"

View File

@ -217,7 +217,7 @@
statusChange(status) {
this.testCase.status = status;
},
saveCase(isContinuous) {
saveCase() {
let param = {};
param.id = this.testCase.id;
param.status = this.testCase.status;
@ -238,22 +238,14 @@
param.results = JSON.stringify(param.results);
param.issues = JSON.stringify(this.testCase.issues);
this.$post('/test/plan/case/edit', param, () => {
if (isContinuous) {
this.updateTestCases(param);
return;
}
this.$refs.drawer.closeDrawer();
this.$success(this.$t('commons.save_success'));
this.$emit('refresh');
});
},
handleNext() {
this.saveCase(true);
this.index++;
this.getTestCase(this.index);
},
handlePre() {
this.saveCase(true);
this.index--;
this.getTestCase(this.index);
},

View File

@ -19,12 +19,12 @@
<el-col :span="12">
<span>{{$t('report.test_start_time')}}</span>
<span v-if="!isReport">{{reportInfo.startTime}}</span>
<el-date-picker v-if="isReport" size="mini" type="date" :placeholder="$t('test_track.commons.select_date')" v-model="reportInfo.startTime"/>
<el-date-picker v-if="isReport" size="mini" type="date" :placeholder="$t('commons.select_date')" v-model="reportInfo.startTime"/>
</el-col>
<el-col :span="12">
<span>{{$t('report.test_end_time')}}</span>
<span v-if="!isReport">{{reportInfo.endTime}}</span>
<el-date-picker v-if="isReport" size="mini" type="date" :placeholder="$t('test_track.commons.select_date')" v-model="reportInfo.endTime"/>
<el-date-picker v-if="isReport" size="mini" type="date" :placeholder="$t('commons.select_date')" v-model="reportInfo.endTime"/>
</el-col>
</el-row>

View File

@ -29,7 +29,7 @@ export default {
}
return response;
}, error => {
return Promise.reject(error);
return Promise.reject(this.$t('commons.tips'));
});
function then(success, response, result) {

View File

@ -89,8 +89,9 @@ export default {
'weeks_6': 'Sat',
'test_unit': 'tests',
'remove': 'Remove',
'remove_cancel': 'Remove Failed',
'remove_success': 'Remove Success'
'remove_cancel': 'Remove Cancel',
'remove_success': 'Remove Success',
'tips': 'The authentication information has expired, please login again'
},
workspace: {
'create': 'Create Workspace',
@ -146,7 +147,9 @@ export default {
'password_format_is_incorrect': 'Password format is incorrect (At least 8-16 characters, at least 1 uppercase letter, 1 lowercase letter and 1 number)',
'old_password': 'Old Password',
'new_password': 'New Password',
'remove_member': 'Are you sure you want to remove this member'
'remove_member': 'Are you sure you want to remove this member',
'input_id_or_email': 'Please enter user ID, or user Email',
'no_such_user': 'Without this user information, please enter the correct user ID or user Email!',
},
user: {
'create': 'Create',

View File

@ -88,8 +88,9 @@ export default {
'port_cannot_be_empty': '端口号不能为空',
'account_cannot_be_empty': '帐户不能为空',
'remove': '移除',
'remove_cancel': '移除失败',
'remove_success': '移除成功'
'remove_cancel': '移除取消',
'remove_success': '移除成功',
'tips': '认证信息已过期,请重新登录'
},
workspace: {
'create': '创建工作空间',
@ -144,7 +145,9 @@ export default {
'password_format_is_incorrect': '密码格式不正确(至少8-16个字符至少1个大写字母1个小写字母和1个数字)',
'old_password': '旧密码',
'new_password': '新密码',
'remove_member': '确定要移除该成员吗'
'remove_member': '确定要移除该成员吗',
'input_id_or_email': '请输入用户 ID, 或者 用户邮箱',
'no_such_user': '无此用户信息, 请输入正确的用户 ID 或者 用户邮箱!',
},
user: {
'create': '创建用户',

View File

@ -80,6 +80,17 @@ export default {
'weeks_5': '周五',
'weeks_6': '周六',
'test_unit': '測試',
'system_parameter_setting': '系統參數設置',
'connection_successful': '連接成功',
'connection_failed': '連接失敗',
'save_failed': '保存失敗',
'host_cannot_be_empty': '主機不能為空',
'port_cannot_be_empty': '埠號不能為空',
'account_cannot_be_empty': '帳戶不能為空',
'remove': '移除',
'remove_cancel': '移除取消',
'remove_success': '移除成功',
'tips': '认認證資訊已過期,請重新登入'
},
workspace: {
'create': '創建工作空間',
@ -134,6 +145,9 @@ export default {
'password_format_is_incorrect': '密碼格式不正確(至少8-16個字符,至少1個大寫字母,1個小寫字母和1個數字)',
'old_password': '舊密碼',
'new_password': '新密碼',
'remove_member': '確定要移除該成員嗎',
'input_id_or_email': '請輸入用戶 ID, 或者 用戶郵箱',
'no_such_user': '無此用戶信息, 請輸入正確的用戶 ID 或者 用戶郵箱!',
},
user: {
'create': '創建用戶',
@ -493,6 +507,17 @@ export default {
'status_change_success': '狀態修改成功!',
'status_change_failed': '狀態修改失敗, 校驗不通過!',
},
system_parameter_setting: {
'mailbox_service_settings': '郵件服務設定',
'test_connection': '測試連結',
'SMTP_host': 'SMTP主機',
'SMTP_port': 'SMTP埠',
'SMTP_account': 'SMTP帳戶',
'SMTP_password': 'SMTP密碼',
'SSL': '開啟SSL如果SMTP埠是465通常需要啟用SSL',
'TLS': '開啟TLS如果SMTP埠是587通常需要啟用TLS',
'SMTP': '是否匿名 SMTP',
},
i18n: {
'home': '首頁'
}