From 41bb35f7c6516898500eb839c5cf3ca1d0c33a60 Mon Sep 17 00:00:00 2001 From: ibuler Date: Tue, 28 Mar 2023 15:48:11 +0800 Subject: [PATCH 1/5] =?UTF-8?q?perf:=20=E4=BF=AE=E6=94=B9=E8=B4=A6?= =?UTF-8?q?=E5=8F=B7=E5=88=9B=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/AccountCreateUpdateForm/index.vue | 6 +++--- src/components/ListTable/index.vue | 3 +++ .../components/AccountTemplateDialog.vue | 15 ++++++++++----- .../components/AssetAccounts.vue | 4 ++-- src/views/assets/Asset/AssetDetail/Account.vue | 4 ++-- 5 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/components/AccountCreateUpdateForm/index.vue b/src/components/AccountCreateUpdateForm/index.vue index b4df80f87..61e080390 100644 --- a/src/components/AccountCreateUpdateForm/index.vue +++ b/src/components/AccountCreateUpdateForm/index.vue @@ -13,7 +13,7 @@ import { UpdateToken, UploadSecret } from '@/components/FormFields' import Select2 from '@/components/FormFields/Select2' import AssetSelect from '@/components/AssetSelect' import { encryptPassword } from '@/utils/crypto' -import { RequiredChange, Required } from '@/components/DataForm/rules' +import { Required, RequiredChange } from '@/components/DataForm/rules' export default { name: 'AccountCreateForm', @@ -63,7 +63,7 @@ export default { 'secret_type', 'secret', 'ssh_key', 'token', 'api_key', 'passphrase' ]], - [this.$t('common.Other'), ['push_now', 'strategy', 'is_active', 'comment']] + [this.$t('common.Other'), ['push_now', 'on_exist', 'is_active', 'comment']] ], fieldsMeta: { assets: { @@ -77,7 +77,7 @@ export default { return this.platform || this.asset } }, - strategy: { + on_exist: { rules: [Required], label: this.$t('ops.RunasPolicy'), helpText: this.$t('accounts.BulkCreateStrategy'), diff --git a/src/components/ListTable/index.vue b/src/components/ListTable/index.vue index 1ce7d4f5b..a4b6c69db 100644 --- a/src/components/ListTable/index.vue +++ b/src/components/ListTable/index.vue @@ -63,6 +63,9 @@ export default { dateEnd: extraQuery.date_to }, this.headerActions.datePicker) } + if (this.$route.query.order) { + extraQuery['order'] = this.$route.query.order + } return { selectedRows: [], init: false, diff --git a/src/views/assets/Asset/AssetCreateUpdate/components/AccountTemplateDialog.vue b/src/views/assets/Asset/AssetCreateUpdate/components/AccountTemplateDialog.vue index be1701b6f..53dcc45e2 100644 --- a/src/views/assets/Asset/AssetCreateUpdate/components/AccountTemplateDialog.vue +++ b/src/views/assets/Asset/AssetCreateUpdate/components/AccountTemplateDialog.vue @@ -137,11 +137,16 @@ export default { handleConfirm() { this.iVisible = false // 过滤掉添加里还没有id的账号 - const hasIdAccounts = this.accounts.filter(i => i?.id).map(item => item.id) + const templates = this.accounts.filter(i => i?.template).map(item => item.template) const newAddAccounts = this.accountsSelected.filter(i => { - if (!hasIdAccounts.includes(i.id)) { - i.template = true - return i + return templates.indexOf(i.id) === -1 + }).map(item => { + return { + template: item.id, + name: item.name, + username: item.username, + secret_type: item.secret_type.value, + privileged: item.privileged } }) this.accounts.push(...newAddAccounts) @@ -168,7 +173,7 @@ export default { }) if (status) { this.$refs.dataTable.$refs.dataTable.toggleRowSelection(row, false) - this.$message.error(this.$t('accounts.SameTypeAccountTip')) + this.$message.error(this.$tc('accounts.SameTypeAccountTip')) } return status }, diff --git a/src/views/assets/Asset/AssetCreateUpdate/components/AssetAccounts.vue b/src/views/assets/Asset/AssetCreateUpdate/components/AssetAccounts.vue index 347bbc2d4..679276101 100644 --- a/src/views/assets/Asset/AssetCreateUpdate/components/AssetAccounts.vue +++ b/src/views/assets/Asset/AssetCreateUpdate/components/AssetAccounts.vue @@ -14,7 +14,7 @@ @@ -22,7 +22,7 @@ {{ $t('common.Add') }} - + {{ $t('common.TemplateAdd') }} diff --git a/src/views/assets/Asset/AssetDetail/Account.vue b/src/views/assets/Asset/AssetDetail/Account.vue index cd0d3606a..839ad857d 100644 --- a/src/views/assets/Asset/AssetDetail/Account.vue +++ b/src/views/assets/Asset/AssetDetail/Account.vue @@ -15,8 +15,8 @@ /> @@ -73,7 +73,7 @@ export default { methods: { onConfirm(data) { data = data?.map(i => { - i.template = true + i.template = i.id i.asset = this.object.id return i }) From dc093643480d8fb93f75f19d20bc3c79ddee8ee0 Mon Sep 17 00:00:00 2001 From: ibuler Date: Wed, 29 Mar 2023 15:02:01 +0800 Subject: [PATCH 2/5] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E8=B4=A6?= =?UTF-8?q?=E5=8F=B7=E6=89=B9=E9=87=8F=E5=88=9B=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AccountListTable/AccountCreateUpdate.vue | 36 +++++++++---------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/src/components/AccountListTable/AccountCreateUpdate.vue b/src/components/AccountListTable/AccountCreateUpdate.vue index 04b7ded38..7fc9984b5 100644 --- a/src/components/AccountListTable/AccountCreateUpdate.vue +++ b/src/components/AccountListTable/AccountCreateUpdate.vue @@ -1,11 +1,11 @@ @@ -32,10 +38,12 @@ import UpdateSecretInfo from './UpdateSecretInfo' import AccountCreateUpdate from './AccountCreateUpdate' import { connectivityMeta } from './const' import { openTaskPage } from '@/utils/jms' +import ResultDialog from './BulkCreateResultDialog.vue' export default { name: 'AccountListTable', components: { + ResultDialog, ListTable, UpdateSecretInfo, ViewSecret, @@ -95,7 +103,9 @@ export default { return { showViewSecretDialog: false, showUpdateSecretDialog: false, + showResultDialog: false, showAddDialog: false, + createAccountResults: [], accountCreateUpdateTitle: this.$t('assets.AddAccount'), iAsset: this.asset, account: {}, @@ -284,11 +294,6 @@ export default { } }, ...this.headerExtraActions - // { - // name: 'autocreate', - // title: this.$t('accounts.AutoCreate'), - // type: 'default' - // } ], canBulkDelete: vm.$hasPerm('accounts.delete_account'), searchConfig: { @@ -331,6 +336,10 @@ export default { }, refresh() { this.$refs.ListTable.reloadTable() + }, + showBulkCreateResult(results) { + this.createAccountResults = results + this.showResultDialog = true } } } diff --git a/src/components/AccountListTable/BulkCreateResultDialog.vue b/src/components/AccountListTable/BulkCreateResultDialog.vue new file mode 100644 index 000000000..8d2812366 --- /dev/null +++ b/src/components/AccountListTable/BulkCreateResultDialog.vue @@ -0,0 +1,92 @@ + + + + + diff --git a/src/i18n/langs/zh.json b/src/i18n/langs/zh.json index 9494c608c..29bcf31b9 100644 --- a/src/i18n/langs/zh.json +++ b/src/i18n/langs/zh.json @@ -1,6 +1,7 @@ { "": "", "accounts": { + "AddAccountResult": "账号批量添加结果", "BulkCreateStrategy": "创建时对于不符合要求的账号,如:密钥类型不合规,唯一键约束,可选择以上策略。", "AccountTemplate": "账号模版", "HistoryDate": "日期", @@ -439,6 +440,10 @@ "ReLoginErr": "登录时长已超过 5 分钟,请重新登录" }, "common": { + "Created": "已创建", + "Updated": "已更新", + "Skipped": "已跳过", + "Error": "错误", "ServerError": "服务器错误", "CommunityEdition": "社区版", "EnterpriseEdition": "企业版", From 41b00cb293db81c20c3991aab7d6e5f179aa1b98 Mon Sep 17 00:00:00 2001 From: ibuler Date: Mon, 3 Apr 2023 15:02:11 +0800 Subject: [PATCH 4/5] =?UTF-8?q?perf:=20=E4=BF=AE=E6=94=B9=E8=B4=A6?= =?UTF-8?q?=E5=8F=B7=E5=88=9B=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AccountListTable/AccountCreateUpdate.vue | 11 ++------ .../BulkCreateResultDialog.vue | 25 ++++++++++++++++++- src/utils/common.js | 5 ++-- 3 files changed, 29 insertions(+), 12 deletions(-) diff --git a/src/components/AccountListTable/AccountCreateUpdate.vue b/src/components/AccountListTable/AccountCreateUpdate.vue index 7aa9ad578..63b460e60 100644 --- a/src/components/AccountListTable/AccountCreateUpdate.vue +++ b/src/components/AccountListTable/AccountCreateUpdate.vue @@ -111,19 +111,12 @@ export default { } else { let result if (error) { + console.log('Error: ', error) result = error.response.data } else { result = resp } - const iResult = [] - for (const [host, value] of Object.entries(result)) { - iResult.push({ - asset: host, - ...value - }) - } - console.log('bulk-create-done', [iResult, error]) - this.$emit('bulk-create-done', iResult) + this.$emit('bulk-create-done', result) } }, setFieldError(error) { diff --git a/src/components/AccountListTable/BulkCreateResultDialog.vue b/src/components/AccountListTable/BulkCreateResultDialog.vue index 8d2812366..0ab753d17 100644 --- a/src/components/AccountListTable/BulkCreateResultDialog.vue +++ b/src/components/AccountListTable/BulkCreateResultDialog.vue @@ -6,6 +6,9 @@ @confirm="closeDialog" v-on="$listeners" > + + {{ item.label }}: {{ item.value }} + @@ -50,7 +53,7 @@ export default { prop: 'state', label: this.$t('common.Status'), width: '200px', - formatter: (row, column, cellValue) => { + formatter: (row) => { if (row.error) { return { errorProp }: { row.error } } else if (row.state) { @@ -65,6 +68,26 @@ export default { } } }, + computed: { + summary() { + const labels = { + total: this.$tc('common.Total'), + created: this.$tc('common.Created'), + updated: this.$tc('common.Updated'), + skipped: this.$tc('common.Skipped') + } + const grouped = _.groupBy(this.result, 'state') + const groupedLength = _.mapValues(grouped, 'length') + groupedLength['total'] = this.result.length + return _.map(groupedLength, (value, key) => { + return { + label: labels[key], + value: value, + key: key + } + }) + } + }, methods: { closeDialog() { this.$emit('update:visible', false) diff --git a/src/utils/common.js b/src/utils/common.js index 2c77a4fbe..fdac73aa8 100644 --- a/src/utils/common.js +++ b/src/utils/common.js @@ -1,5 +1,6 @@ import i18n from '@/i18n/i18n' import { message } from '@/utils/message' + const _ = require('lodash') const moment = require('moment') @@ -244,10 +245,10 @@ export function getDayFuture(days, now) { export function getErrorResponseMsg(error) { let msg = '' let data = '' - if (error.response.status === 500) { + if (error?.response?.status === 500) { data = i18n.t('common.ServerError') } else { - data = error.response && error.response.data || error + data = error?.response && error?.response.data || error } if (data && (data.error || data.msg || data.detail)) { msg = data.error || data.msg || data.detail From dde98e470b2c12f623c8ed55643a14844ac1ba69 Mon Sep 17 00:00:00 2001 From: ibuler Date: Mon, 3 Apr 2023 15:56:23 +0800 Subject: [PATCH 5/5] =?UTF-8?q?perf:=20=E4=BF=AE=E6=94=B9=E7=BB=93?= =?UTF-8?q?=E6=9E=9C=E9=81=BF=E5=85=8D=E8=BF=94=E5=9B=9E=E7=9A=84=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E4=B8=8D=E5=AF=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/AccountCreateUpdateForm/index.vue | 12 ++++++------ .../AccountListTable/AccountCreateUpdate.vue | 9 +++++++-- src/components/AccountListTable/AccountList.vue | 5 ++++- .../AccountListTable/BulkCreateResultDialog.vue | 3 ++- 4 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/components/AccountCreateUpdateForm/index.vue b/src/components/AccountCreateUpdateForm/index.vue index 3f89b1591..24cf12818 100644 --- a/src/components/AccountCreateUpdateForm/index.vue +++ b/src/components/AccountCreateUpdateForm/index.vue @@ -49,7 +49,7 @@ export default { protocols: [ { name: 'ssh', - secret_types: ['password', 'ssh_key', 'token', 'api_key'] + secret_types: ['password', 'ssh_key', 'token', 'access_key'] } ] }, @@ -61,7 +61,7 @@ export default { [this.$t('common.Basic'), ['name', 'username', ...this.controlShowField()]], [this.$t('assets.Secret'), [ 'secret_type', 'secret', 'ssh_key', - 'token', 'api_key', 'passphrase' + 'token', 'access_key', 'passphrase' ]], [this.$t('common.Other'), ['push_now', 'on_invalid', 'is_active', 'comment']] ], @@ -153,11 +153,11 @@ export default { component: UploadSecret, hidden: (formValue) => formValue.secret_type !== 'token' }, - api_key: { - id: 'api_key', + access_key: { + id: 'access_key', label: this.$t('assets.AccessKey'), component: UploadSecret, - hidden: (formValue) => formValue.secret_type !== 'api_key' + hidden: (formValue) => formValue.secret_type !== 'access_key' }, secret_type: { type: 'radio-group', @@ -209,7 +209,7 @@ export default { }, { label: this.$t('assets.AccessKey'), - value: 'api_key' + value: 'access_key' } ] const secretTypes = [] diff --git a/src/components/AccountListTable/AccountCreateUpdate.vue b/src/components/AccountListTable/AccountCreateUpdate.vue index 63b460e60..7d372aeba 100644 --- a/src/components/AccountListTable/AccountCreateUpdate.vue +++ b/src/components/AccountListTable/AccountCreateUpdate.vue @@ -101,7 +101,13 @@ export default { }).catch(error => this.setFieldError(error)) }, handleResult(resp, error) { - const bulkCreate = !this.asset + let bulkCreate = !this.asset + if (error && !Array.isArray(error)) { + bulkCreate = false + } + // if (resp && !Array.isArray(resp)) { + // bulkCreate = false + // } if (!bulkCreate) { if (!error) { this.$message.success(this.$tc('common.createSuccessMsg')) @@ -111,7 +117,6 @@ export default { } else { let result if (error) { - console.log('Error: ', error) result = error.response.data } else { result = resp diff --git a/src/components/AccountListTable/AccountList.vue b/src/components/AccountListTable/AccountList.vue index 76e4e17d2..1c16490fb 100644 --- a/src/components/AccountListTable/AccountList.vue +++ b/src/components/AccountListTable/AccountList.vue @@ -338,8 +338,11 @@ export default { this.$refs.ListTable.reloadTable() }, showBulkCreateResult(results) { + this.showResultDialog = false this.createAccountResults = results - this.showResultDialog = true + setTimeout(() => { + this.showResultDialog = true + }, 100) } } } diff --git a/src/components/AccountListTable/BulkCreateResultDialog.vue b/src/components/AccountListTable/BulkCreateResultDialog.vue index 0ab753d17..860242ea0 100644 --- a/src/components/AccountListTable/BulkCreateResultDialog.vue +++ b/src/components/AccountListTable/BulkCreateResultDialog.vue @@ -74,7 +74,8 @@ export default { total: this.$tc('common.Total'), created: this.$tc('common.Created'), updated: this.$tc('common.Updated'), - skipped: this.$tc('common.Skipped') + skipped: this.$tc('common.Skipped'), + error: this.$tc('common.Error') } const grouped = _.groupBy(this.result, 'state') const groupedLength = _.mapValues(grouped, 'length')