diff --git a/.gitignore b/.gitignore index f90ee3a42..b9970b410 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,5 @@ tests/**/coverage/ *.sln .env.development .python-version + +helper.json \ No newline at end of file diff --git a/Users/guang/Library/Application Support/Code/User/settings.json b/Users/guang/Library/Application Support/Code/User/settings.json new file mode 100644 index 000000000..144039a55 --- /dev/null +++ b/Users/guang/Library/Application Support/Code/User/settings.json @@ -0,0 +1,10 @@ +{ + "editor.formatOnSave": true, + "editor.defaultFormatter": "esbenp.prettier-vscode", + "[vue]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "prettier.printWidth": 100, + "prettier.singleAttributePerLine": true, + "editor.wordWrap": "on" +} \ No newline at end of file diff --git a/jsconfig.json b/jsconfig.json index ed079e2b9..6ac79b214 100644 --- a/jsconfig.json +++ b/jsconfig.json @@ -5,5 +5,6 @@ "@/*": ["src/*"] } }, + "include": ["src"], "exclude": ["node_modules", "dist"] } diff --git a/package.json b/package.json index 83ca7d71d..ae3fa20db 100644 --- a/package.json +++ b/package.json @@ -94,6 +94,7 @@ "@vue/cli-plugin-unit-jest": "3.6.3", "@vue/cli-service": "3.6.0", "@vue/test-utils": "1.0.0-beta.29", + "@vue/runtime-dom": "3.5.13", "autoprefixer": "^9.5.1", "babel-core": "7.0.0-bridge.0", "babel-eslint": "10.0.1", @@ -120,7 +121,7 @@ "serve-static": "^1.16.0", "strip-ansi": "^7.1.0", "svg-sprite-loader": "4.1.3", - "svgo": "1.2.2", + "svgo": "1.2.4", "vue-i18n-extract": "^1.1.1", "vue-template-compiler": "2.6.10" }, diff --git a/public/index.html b/public/index.html index 5e4975076..929de155d 100644 --- a/public/index.html +++ b/public/index.html @@ -2,37 +2,70 @@ - - - - - - + + + + + + <%= webpackConfig.name %> - + + -
+
+
+
+
+
diff --git a/src/components/Apps/AccountCreateUpdateForm/const.js b/src/components/Apps/AccountCreateUpdateForm/const.js index bbfcc4d9c..cddd0c623 100644 --- a/src/components/Apps/AccountCreateUpdateForm/const.js +++ b/src/components/Apps/AccountCreateUpdateForm/const.js @@ -5,6 +5,7 @@ import AutomationParamsForm from '@/views/assets/Platform/AutomationParamsSettin export const accountFieldsMeta = (vm) => { const defaultPrivilegedAccounts = ['root', 'administrator'] + return { assets: { component: Select2, @@ -27,6 +28,9 @@ export const accountFieldsMeta = (vm) => { component: Select2, rules: [Required], el: { + get disabled() { + return vm.isDisabled + }, multiple: false, ajax: { url: '/api/v1/accounts/account-templates/', @@ -43,6 +47,11 @@ export const accountFieldsMeta = (vm) => { rules: [Required], label: vm.$t('AccountPolicy'), helpTip: vm.$t('AccountPolicyHelpText'), + el: { + get disabled() { + return vm.isDisabled + } + }, hidden: () => { return vm.platform || vm.asset } @@ -50,6 +59,11 @@ export const accountFieldsMeta = (vm) => { name: { label: vm.$t('Name'), rules: [RequiredChange], + el: { + get disabled() { + return vm.isDisabled + } + }, on: { input: ([value], updateForm) => { if (!vm.usernameChanged) { @@ -69,7 +83,9 @@ export const accountFieldsMeta = (vm) => { }, username: { el: { - disabled: !!vm.account?.name + get disabled() { + return !!vm.account?.name || vm.isDisabled + } }, on: { input: ([value], updateForm) => { @@ -88,6 +104,11 @@ export const accountFieldsMeta = (vm) => { }, privileged: { label: vm.$t('Privileged'), + el: { + get disabled() { + return vm.isDisabled + } + }, hidden: () => { return vm.addTemplate } @@ -100,6 +121,11 @@ export const accountFieldsMeta = (vm) => { el: { multiple: false, clearable: true, + disabled: { + get disabled() { + return vm.isDisabled + } + }, ajax: { url: `/api/v1/accounts/accounts/su-from-accounts/?account=${vm.account?.id || ''}&asset=${vm.asset?.id || ''}`, transformOption: (item) => { @@ -110,6 +136,11 @@ export const accountFieldsMeta = (vm) => { }, su_from_username: { label: vm.$t('UserSwitchFrom'), + el: { + get disabled() { + return vm.isDisabled + } + }, hidden: (formValue) => { return vm.platform || vm.asset || vm.addTemplate } @@ -117,6 +148,11 @@ export const accountFieldsMeta = (vm) => { password: { label: vm.$t('Password'), component: UpdateToken, + el: { + get disabled() { + return vm.isDisabled + } + }, hidden: (formValue) => { return formValue.secret_type !== 'password' || vm.addTemplate } @@ -124,33 +160,63 @@ export const accountFieldsMeta = (vm) => { ssh_key: { label: vm.$t('PrivateKey'), component: UploadSecret, + el: { + get disabled() { + return vm.isDisabled + } + }, hidden: (formValue) => formValue.secret_type !== 'ssh_key' || vm.addTemplate }, passphrase: { label: vm.$t('Passphrase'), component: UpdateToken, + el: { + get disabled() { + return vm.isDisabled + } + }, hidden: (formValue) => formValue.secret_type !== 'ssh_key' || vm.addTemplate }, token: { label: vm.$t('Token'), component: UploadSecret, + el: { + get disabled() { + return vm.isDisabled + } + }, hidden: (formValue) => formValue.secret_type !== 'token' || vm.addTemplate }, access_key: { id: 'access_key', label: vm.$t('AccessKey'), component: UploadSecret, + el: { + get disabled() { + return vm.isDisabled + } + }, hidden: (formValue) => formValue.secret_type !== 'access_key' || vm.addTemplate }, api_key: { id: 'api_key', label: vm.$t('ApiKey'), component: UploadSecret, + el: { + get disabled() { + return vm.isDisabled + } + }, hidden: (formValue) => formValue.secret_type !== 'api_key' || vm.addTemplate }, secret_type: { type: 'radio-group', options: [], + el: { + get disabled() { + return vm.isDisabled + } + }, hidden: () => { return vm.addTemplate } @@ -163,7 +229,8 @@ export const accountFieldsMeta = (vm) => { !automation.ansible_enabled || !vm.$hasPerm('accounts.push_account') || (formValue.secret_type === 'ssh_key' && vm.iPlatform.type.value === 'windows') || - vm.addTemplate + vm.addTemplate || + !formValue.secret_reset } }, params: { @@ -184,12 +251,27 @@ export const accountFieldsMeta = (vm) => { } }, is_active: { - label: vm.$t('IsActive') + label: vm.$t('IsActive'), + el: { + get disabled() { + return vm.isDisabled + } + } }, comment: { label: vm.$t('Comment'), - hidden: () => { - return vm.addTemplate + el: { + get disabled() { + return vm.isDisabled + } + } + }, + secret_reset: { + label: vm.$t('SecretReset'), + el: { + get disabled() { + return vm.isDisabled + } } } } diff --git a/src/components/Apps/AccountCreateUpdateForm/index.vue b/src/components/Apps/AccountCreateUpdateForm/index.vue index e3c138fc6..fc717ced4 100644 --- a/src/components/Apps/AccountCreateUpdateForm/index.vue +++ b/src/components/Apps/AccountCreateUpdateForm/index.vue @@ -45,6 +45,7 @@ export default { data() { return { loading: true, + isDisabled: false, usernameChanged: false, submitBtnText: this.$t('Confirm'), iPlatform: { @@ -61,11 +62,12 @@ export default { form: Object.assign({ 'on_invalid': 'error' }, this.account || {}), encryptedFields: ['secret'], fields: [ - [this.$t('AccountTemplate'), ['template']], - [this.$t('Basic'), ['assets', 'name', 'username', 'privileged', 'su_from', 'su_from_username']], + [this.$t('Basic'), ['name', 'username', 'privileged', 'su_from', 'su_from_username', 'template']], + [this.$t('Assets'), ['assets']], [this.$t('Secret'), [ 'secret_type', 'password', 'ssh_key', 'token', - 'access_key', 'passphrase', 'api_key' + 'access_key', 'passphrase', 'api_key', + 'secret_reset' ]], [this.$t('Other'), ['push_now', 'params', 'on_invalid', 'is_active', 'comment']] ], @@ -73,6 +75,16 @@ export default { hasSaveContinue: false } }, + watch: { + '$route.query': { + handler(nv, ov) { + if (nv && (nv.flag === 'move' || nv.flag === 'copy')) { + this.isDisabled = true + } + }, + immediate: true + } + }, async mounted() { try { await this.getPlatform() @@ -157,16 +169,16 @@ export default { diff --git a/src/components/Apps/AccountListTable/AccountList.vue b/src/components/Apps/AccountListTable/AccountList.vue index f5e834739..e30530d30 100644 --- a/src/components/Apps/AccountListTable/AccountList.vue +++ b/src/components/Apps/AccountListTable/AccountList.vue @@ -1,6 +1,12 @@ - diff --git a/src/components/Apps/AccountListTable/ViewSecret.vue b/src/components/Apps/AccountListTable/ViewSecret.vue index a5af2c5fb..e6bddfd1b 100644 --- a/src/components/Apps/AccountListTable/ViewSecret.vue +++ b/src/components/Apps/AccountListTable/ViewSecret.vue @@ -18,7 +18,7 @@ {{ account['username'] }} - diff --git a/src/components/Apps/AssetTreeTable/index.vue b/src/components/Apps/AssetTreeTable/index.vue index 244dd51c2..6ffb13cb6 100644 --- a/src/components/Apps/AssetTreeTable/index.vue +++ b/src/components/Apps/AssetTreeTable/index.vue @@ -142,6 +142,10 @@ export default { treeSetting.showDelete = this.$hasPerm('assets.delete_node') }, methods: { + reloadTable() { + console.log('Reload table') + this.$refs.TreeList.reloadTable() + }, setTreeUrlQuery() { let str = '' for (const key in this.treeUrlQuery) { diff --git a/src/components/Apps/BlockedIPs/BlockedIPList.vue b/src/components/Apps/BlockedIPs/BlockedIPList.vue index 633d6610f..35e808e19 100644 --- a/src/components/Apps/BlockedIPs/BlockedIPList.vue +++ b/src/components/Apps/BlockedIPs/BlockedIPList.vue @@ -3,7 +3,7 @@ diff --git a/src/components/DataActions/index.vue b/src/components/DataActions/index.vue index caa5de075..08dd8b78a 100644 --- a/src/components/DataActions/index.vue +++ b/src/components/DataActions/index.vue @@ -5,15 +5,28 @@ v-if="action.dropdown" v-show="action.dropdown.length > 0" :key="action.name" + :class="[action.name, {grouped: action.grouped }]" + :size="action.size" + :split-button="!!action.split" + :type="action.type" class="action-item" placement="bottom-start" trigger="click" + @click="handleClick(action)" @command="handleDropdownCallback" > - - - - + + {{ action.title }} + + + + {{ action.title }} @@ -29,7 +42,13 @@ > {{ option.group }} - + - - - + + {{ option.title }} @@ -51,16 +69,16 @@ - - - - - + + + + {{ action.title }} @@ -72,9 +90,13 @@ + + diff --git a/src/components/Dialog/RemoteProcessingDialog.vue b/src/components/Dialog/RemoteProcessingDialog.vue new file mode 100644 index 000000000..1f63d1fca --- /dev/null +++ b/src/components/Dialog/RemoteProcessingDialog.vue @@ -0,0 +1,69 @@ + + + + + diff --git a/src/components/Dialog/Secret.vue b/src/components/Dialog/Secret.vue new file mode 100644 index 000000000..d3b30a396 --- /dev/null +++ b/src/components/Dialog/Secret.vue @@ -0,0 +1,96 @@ + + + + + diff --git a/src/components/Dialog/index.vue b/src/components/Dialog/index.vue index 23ea0e696..cf2e81058 100644 --- a/src/components/Dialog/index.vue +++ b/src/components/Dialog/index.vue @@ -82,8 +82,7 @@ export default { } }, data() { - return { - } + return {} }, computed: { iWidth() { @@ -102,59 +101,69 @@ export default { diff --git a/src/components/Drawer/index.vue b/src/components/Drawer/index.vue new file mode 100644 index 000000000..c448ec013 --- /dev/null +++ b/src/components/Drawer/index.vue @@ -0,0 +1,289 @@ + + + + + diff --git a/src/components/Form/AutoDataForm/index.vue b/src/components/Form/AutoDataForm/index.vue index cb233523d..a63d32739 100644 --- a/src/components/Form/AutoDataForm/index.vue +++ b/src/components/Form/AutoDataForm/index.vue @@ -7,18 +7,18 @@ v-bind="$attrs" v-on="$listeners" > -
-
+ @@ -163,5 +163,6 @@ export default { return true } } + } diff --git a/src/components/Form/AutoDataForm/utils.js b/src/components/Form/AutoDataForm/utils.js index ac4b1f077..f40506ce1 100644 --- a/src/components/Form/AutoDataForm/utils.js +++ b/src/components/Form/AutoDataForm/utils.js @@ -1,7 +1,6 @@ import Vue from 'vue' import ObjectSelect2 from '@/components/Form/FormFields/NestedObjectSelect2.vue' import NestedField from '@/components/Form/AutoDataForm/components/NestedField.vue' -import Switcher from '@/components/Form/FormFields/Switcher.vue' import rules from '@/components/Form/DataForm/rules' import BasicTree from '@/components/Form/FormFields/BasicTree.vue' import JsonEditor from '@/components/Form/FormFields/JsonEditor.vue' @@ -64,8 +63,9 @@ export class FormFieldGenerator { } break case 'boolean': - type = '' - field.component = Switcher + type = 'checkbox' + // field.component = Switcher + // field.type = 'checkbox' break case 'list': type = 'input' diff --git a/src/components/Form/DataForm/components/el-form-renderer/components/render-form-item.vue b/src/components/Form/DataForm/components/el-form-renderer/components/render-form-item.vue index 93a678483..9ac153c90 100755 --- a/src/components/Form/DataForm/components/el-form-renderer/components/render-form-item.vue +++ b/src/components/Form/DataForm/components/el-form-renderer/components/render-form-item.vue @@ -8,18 +8,20 @@ v-bind="data.attrs" > -
+
+
+ +
+ diff --git a/src/components/Form/FormFields/UploadField.vue b/src/components/Form/FormFields/UploadField.vue index 2feb09afd..26aaab3b4 100644 --- a/src/components/Form/FormFields/UploadField.vue +++ b/src/components/Form/FormFields/UploadField.vue @@ -8,7 +8,7 @@
{{ tip }}
- +
diff --git a/src/components/Form/FormFields/WeekCronSelect.vue b/src/components/Form/FormFields/WeekCronSelect.vue index fd8cfa45e..f4c5e46fa 100644 --- a/src/components/Form/FormFields/WeekCronSelect.vue +++ b/src/components/Form/FormFields/WeekCronSelect.vue @@ -1,7 +1,7 @@ + + diff --git a/src/views/assets/Asset/AssetList/components/BaseList.vue b/src/views/assets/Asset/AssetList/components/BaseList.vue index 368078709..ac4062b33 100644 --- a/src/views/assets/Asset/AssetList/components/BaseList.vue +++ b/src/views/assets/Asset/AssetList/components/BaseList.vue @@ -3,8 +3,20 @@ - - + + + diff --git a/src/views/assets/Asset/AssetList/components/const.js b/src/views/assets/Asset/AssetList/components/const.js new file mode 100644 index 000000000..a1af507ef --- /dev/null +++ b/src/views/assets/Asset/AssetList/components/const.js @@ -0,0 +1,254 @@ +import { + ActionsFormatter, ArrayFormatter, ChoicesFormatter, DetailFormatter, PlatformFormatter, ProtocolsFormatter +} from '@/components/Table/TableFormatters' +import HostInfoFormatter from '@/components/Table/TableFormatters/HostInfoFormatter.vue' +import AmountFormatter from '@/components/Table/TableFormatters/AmountFormatter.vue' +import { connectivityMeta } from '@/components/Apps/AccountListTable/const' +import { openTaskPage } from '@/utils/jms' + +export function getDefaultConfig(vm) { + const onAction = async(row, action) => { + await vm.updateOrCloneAsset(row, action.toLowerCase()) + } + const extraQuery = vm.$route.params?.extraQuery || {} + const defaultHeaderActions = { + onCreate: () => { + vm.showPlatform = false + setTimeout(() => { + vm.showPlatform = true + }, 100) + }, + hasLabelSearch: true, + searchConfig: { + getUrlQuery: false + }, + hasCreate: false, + extraMoreActions: [ + { + name: 'TestSelected', + title: vm.$t('TestSelected'), + type: 'primary', + icon: 'verify', + can: ({ selectedRows }) => + vm.$hasPerm('assets.test_assetconnectivity') && + !vm.$store.getters.currentOrgIsRoot && + selectedRows.length > 0 && + selectedRows[0].auto_config?.ansible_enabled && + selectedRows[0].auto_config?.ping_enabled, + callback: function({ selectedRows }) { + const ids = selectedRows.map(v => { + return v.id + }) + vm.$axios.post( + '/api/v1/assets/assets/tasks/', + { action: 'test', assets: ids }).then(res => { + openTaskPage(res['task']) + }).catch(err => { + vm.$message.error(vm.$tc('common.bulkVerifyErrorMsg' + ' ' + err)) + }) + } + }, + { + name: 'DeactiveSelected', + title: vm.$t('DisableSelected'), + type: 'primary', + icon: 'disable', + can: ({ selectedRows }) => { + return selectedRows.length > 0 && vm.$hasPerm('assets.change_asset') + }, + callback: function({ selectedRows }) { + const ids = selectedRows.map((v) => { + return { pk: v.id, is_active: false } + }) + vm.$axios.patch(`/api/v1/assets/assets/`, ids).then(res => { + vm.$message.success(vm.$tc('UpdateSuccessMsg')) + vm.$refs.ListTable.reloadTable() + }).catch(err => { + vm.$message.error(vm.$tc('UpdateErrorMsg' + ' ' + err)) + }) + } + }, + { + name: 'ActiveSelected', + title: vm.$t('ActivateSelected'), + type: 'primary', + icon: 'activate', + can: ({ selectedRows }) => { + return selectedRows.length > 0 && vm.$hasPerm('assets.change_asset') + }, + callback: function({ selectedRows }) { + const ids = selectedRows.map((v) => { + return { pk: v.id, is_active: true } + }) + vm.$axios.patch(`/api/v1/assets/assets/`, ids).then(res => { + vm.$message.success(vm.$tc('UpdateSuccessMsg')) + vm.$refs.ListTable.reloadTable() + }).catch(err => { + vm.$message.error(vm.$tc('UpdateErrorMsg' + ' ' + err)) + }) + } + }, + { + name: 'actionUpdateSelected', + title: vm.$t('UpdateSelected'), + icon: 'batch-update', + can: ({ selectedRows }) => { + return selectedRows.length > 0 && + !vm.$store.getters.currentOrgIsRoot && + vm.$hasPerm('assets.change_asset') + }, + callback: ({ selectedRows }) => { + vm.updateSelectedDialogSetting.selectedRows = selectedRows + vm.updateSelectedDialogSetting.visible = true + } + } + ] + } + + const tableConfig = { + url: '/api/v1/assets/hosts/', + permissions: { + app: 'assets', + resource: 'asset' + }, + extraQuery: { + ...extraQuery, + ...vm.extraQuery + }, + columnsExclude: ['spec_info', 'auto_config'], + columnsShow: { + min: ['name', 'address', 'actions'], + default: vm.defaultColumns || [ + 'name', 'address', 'accounts_amount', 'platform', + 'connectivity', 'actions' + ] + }, + columnsMeta: { + type: { formatter: ChoicesFormatter, sortable: false }, + category: { formatter: ChoicesFormatter, sortable: false }, + name: { + formatter: DetailFormatter, + formatterArgs: { + route: 'AssetDetail' + }, + sortable: true + }, + platform: { + sortable: true, + formatter: PlatformFormatter + }, + protocols: { + showFullContent: true, + formatter: ProtocolsFormatter + }, + nodes_display: { + formatter: ArrayFormatter + }, + address: { + minWidth: '200px' + }, + gathered_info: { + label: vm.$t('HardwareInfo'), + formatter: HostInfoFormatter, + formatterArgs: { + info: vm?.optionInfo, + can: vm.$hasPerm('assets.refresh_assethardwareinfo'), + getRoute({ row }) { + return { + name: 'AssetMoreInformationEdit', + params: { id: row.id } + } + } + } + }, + accounts_amount: { + label: vm.$t('Accounts'), + formatter: AmountFormatter, + width: '100px', + formatterArgs: { + async: true, + getItem(item) { + return `${item.name}(${item.username})` + }, + getRoute({ row }) { + return { + name: 'AssetDetail', + params: { + id: row.id + }, + query: { + tab: 'Account' + } + } + } + } + }, + connectivity: connectivityMeta, + actions: { + formatter: ActionsFormatter, + formatterArgs: { + onUpdate: ({ row }) => onAction(row, 'Update'), + onClone: ({ row }) => onAction(row, 'Clone'), + performDelete: ({ row }) => { + const id = row.id + const url = `/api/v1/assets/assets/${id}/` + return vm.$axios.delete(url) + }, + extraActions: [ + { + name: 'Test', + title: vm.$t('Test'), + can: ({ row }) => + vm.$hasPerm('assets.test_assetconnectivity') && + !vm.$store.getters.currentOrgIsRoot && + row?.auto_config?.ansible_enabled && + row?.auto_config?.ping_enabled, + callback: ({ row }) => { + if (row.platform.name === 'Gateway') { + vm.gatewayVisible = true + const port = row.protocols.find(item => item.name === 'ssh').port + if (!port) { + return vm.$message.error(vm.$tc('BadRequestErrorMsg')) + } else { + vm.gatewayPort = port + vm.gatewayCell = row.id + } + } else { + vm.$axios.post( + `/api/v1/assets/assets/${row.id}/tasks/`, + { action: 'test' } + ).then(res => { + openTaskPage(res['task']) + }) + } + } + }, + { + name: 'AddAccount', + title: '添加账号', + divided: true + }, + { + name: 'DiscoverAccounts', + title: 'Discover accounts', + callback: ({ row }) => { + console.log('Row: ', row) + vm.discoveryDialog.asset = row.id + console.log('vm.discoveryDialog.asset: ', vm.discoveryDialog) + setTimeout(() => { + vm.discoveryDialog.visible = true + }, 200) + } + }, + ...vm.addExtraMoreColActions + ] + } + } + } + } + return { + tableConfig, + defaultHeaderActions + } +} + diff --git a/src/views/assets/Cloud/Account/AccountCreateUpdate.vue b/src/views/assets/Cloud/Account/AccountCreateUpdate.vue index 38c8a19c0..9051020f8 100644 --- a/src/views/assets/Cloud/Account/AccountCreateUpdate.vue +++ b/src/views/assets/Cloud/Account/AccountCreateUpdate.vue @@ -34,11 +34,12 @@ + diff --git a/src/views/assets/Cloud/Account/components/AccountPanel.vue b/src/views/assets/Cloud/Account/components/AccountPanel.vue deleted file mode 100644 index 54f92ca6b..000000000 --- a/src/views/assets/Cloud/Account/components/AccountPanel.vue +++ /dev/null @@ -1,205 +0,0 @@ - - - - - diff --git a/src/views/assets/Cloud/Account/components/ProviderPanel.vue b/src/views/assets/Cloud/Account/components/ProviderPanel.vue index 3d9d6d5da..75344c6c2 100644 --- a/src/views/assets/Cloud/Account/components/ProviderPanel.vue +++ b/src/views/assets/Cloud/Account/components/ProviderPanel.vue @@ -51,7 +51,6 @@ export default { } }, data() { - console.log('ProviderPanel', this.providers) return {} }, methods: { diff --git a/src/views/assets/Cloud/Account/components/TimingPanel.vue b/src/views/assets/Cloud/Account/components/TimingPanel.vue index 5f11330a4..8887396f8 100644 --- a/src/views/assets/Cloud/Account/components/TimingPanel.vue +++ b/src/views/assets/Cloud/Account/components/TimingPanel.vue @@ -3,15 +3,15 @@ ref="form" class="form" v-bind="settings" - @submitSuccess="handleSubmitSuccess" @performFinished="handlePerformFinished" + @submitSuccess="handleSubmitSuccess" /> diff --git a/src/views/assets/Domain/DomainDetail/AssetList.vue b/src/views/assets/Domain/DomainDetail/AssetList.vue index 2a2a1a1fe..a86db58b1 100644 --- a/src/views/assets/Domain/DomainDetail/AssetList.vue +++ b/src/views/assets/Domain/DomainDetail/AssetList.vue @@ -1,18 +1,22 @@ diff --git a/src/views/assets/Domain/DomainDetail/GatewayList.vue b/src/views/assets/Domain/DomainDetail/GatewayList.vue index baf6b93a7..6c66b9aa6 100644 --- a/src/views/assets/Domain/DomainDetail/GatewayList.vue +++ b/src/views/assets/Domain/DomainDetail/GatewayList.vue @@ -1,19 +1,17 @@ diff --git a/src/views/audits/OperateLog/OperateLogDetail/Detail.vue b/src/views/audits/OperateLog/OperateLogDetail/Detail.vue index 100768baa..165d841e9 100644 --- a/src/views/audits/OperateLog/OperateLogDetail/Detail.vue +++ b/src/views/audits/OperateLog/OperateLogDetail/Detail.vue @@ -1,18 +1,18 @@ @@ -21,10 +21,12 @@ import { QuickActions } from '@/components' import AutoDetailCard from '@/components/Cards/DetailCard/auto' import DiffDetail from '@/components/Dialog/DiffDetail' +import TwoCol from '@/layout/components/Page/TwoColPage.vue' export default { name: 'Detail', components: { + TwoCol, QuickActions, AutoDetailCard, DiffDetail @@ -32,7 +34,8 @@ export default { props: { object: { type: Object, - default: () => {} + default: () => { + } } }, data() { @@ -62,8 +65,7 @@ export default { ] } }, - computed: { - } + computed: {} } diff --git a/src/views/dashboard/ChangeSecret/AccountSummary.vue b/src/views/dashboard/ChangeSecret/AccountSummary.vue new file mode 100644 index 000000000..960057958 --- /dev/null +++ b/src/views/dashboard/ChangeSecret/AccountSummary.vue @@ -0,0 +1,84 @@ +