diff --git a/src/components/Table/CardTable/index.vue b/src/components/Table/CardTable/index.vue index 5f76894cc..1327ced19 100644 --- a/src/components/Table/CardTable/index.vue +++ b/src/components/Table/CardTable/index.vue @@ -137,9 +137,10 @@ export default { return } const pageQuery = this.getPageQuery(this.page, this.paginationSize) - const query = Object.assign(this.extraQuery, pageQuery) + const query = Object.assign(this.extraQuery, pageQuery, this.tableConfig.extraQuery) const queryString = Object.keys(query).map(key => key + '=' + query[key]).join('&') - const url = `${this.tableUrl}?${queryString}` + const connector = this.tableUrl.indexOf('?') === -1 ? '?' : '&' + const url = `${this.tableUrl}${connector}${queryString}` const resp = await this.$axios.get(url, this.axiosConfig) const data = resp.data diff --git a/src/views/assets/Asset/AssetList/DatabaseList.vue b/src/views/assets/Asset/AssetList/DatabaseList.vue index ab0c940cb..fefc05c45 100644 --- a/src/views/assets/Asset/AssetList/DatabaseList.vue +++ b/src/views/assets/Asset/AssetList/DatabaseList.vue @@ -13,7 +13,20 @@ export default { return { config: { category: 'database', - url: '/api/v1/assets/databases/' + url: '/api/v1/assets/databases/', + headerActions: { + extraActions: [ + { + name: this.$t('CloudSync'), + title: this.$t('CloudSync'), + icon: 'cloud-provider', + has: () => this.$hasPerm('xpack.view_account') && this.$hasLicense(), + callback: () => this.$router.push( + { name: 'CloudAccountList', query: { category: 'database' }} + ) + } + ] + } } } } diff --git a/src/views/assets/Asset/AssetList/HostList.vue b/src/views/assets/Asset/AssetList/HostList.vue index 4f8d17fa4..399b1b8b8 100644 --- a/src/views/assets/Asset/AssetList/HostList.vue +++ b/src/views/assets/Asset/AssetList/HostList.vue @@ -37,7 +37,9 @@ export default { title: this.$t('CloudSync'), icon: 'cloud-provider', has: () => vm.$hasPerm('xpack.view_account') && vm.$hasLicense(), - callback: () => this.$router.push({ name: 'CloudAccountList' }) + callback: () => this.$router.push( + { name: 'CloudAccountList', query: { category: 'host' }} + ) } ] }, diff --git a/src/views/assets/Cloud/Account/AccountDetail/TaskSyncAssetList.vue b/src/views/assets/Cloud/Account/AccountDetail/TaskSyncAssetList.vue index 3c8920c1b..746518edf 100644 --- a/src/views/assets/Cloud/Account/AccountDetail/TaskSyncAssetList.vue +++ b/src/views/assets/Cloud/Account/AccountDetail/TaskSyncAssetList.vue @@ -82,8 +82,9 @@ export default { }, computed: { dynamicUrl() { - const baseUrl = '/api/v1/xpack/cloud/sync-instance-tasks/instances/' - return this.object ? `${baseUrl}?task_id=${this.object.task.id}` : baseUrl + const category = this.$route.query.category + const baseUrl = `/api/v1/xpack/cloud/sync-instance-tasks/instances/?category=${category}` + return this.object ? `${baseUrl}&task_id=${this.object.task.id}` : baseUrl } }, mounted() { diff --git a/src/views/assets/Cloud/Account/AccountList.vue b/src/views/assets/Cloud/Account/AccountList.vue index ef886949d..add40da30 100644 --- a/src/views/assets/Cloud/Account/AccountList.vue +++ b/src/views/assets/Cloud/Account/AccountList.vue @@ -21,7 +21,7 @@ </template> <script type="text/jsx"> -import { lan, privateCloudProviders, publicCloudProviders } from '../const' +import { lan, privateCloudProviders, publicHostProviders, publicDBProviders } from '../const' import CreateDialog from './components/CreateDialog.vue' import UpdateDialog from './components/UpdateDialog.vue' import SyncDialog from './components/SyncDialog.vue' @@ -43,11 +43,12 @@ export default { object: null, table: { tableConfig: { - url: '/api/v1/xpack/cloud/accounts/', + url: '', permissions: { app: 'xpack', resource: 'account' - } + }, + extraQuery: {} }, subComponentProps: { handleUpdate: (obj) => { @@ -102,7 +103,8 @@ export default { title: this.$t('PublicCloud'), icon: 'public-cloud', callback: () => { - this.providerConfig.providers = publicCloudProviders.map( + const providers = this.iCategory === 'host' ? publicHostProviders : publicDBProviders + this.providerConfig.providers = providers.map( (item) => ACCOUNT_PROVIDER_ATTRS_MAP[item] ) this.visible = true @@ -110,8 +112,9 @@ export default { }, { name: 'privateCloud', - icon: 'private-cloud', title: this.$t('PrivateCloud'), + icon: 'private-cloud', + has: () => this.iCategory === 'host', callback: () => { this.providerConfig.providers = privateCloudProviders.map( (item) => ACCOUNT_PROVIDER_ATTRS_MAP[item] @@ -123,6 +126,7 @@ export default { name: 'LAN', title: this.$t('LAN'), icon: 'computer', + has: () => this.iCategory === 'host', callback: () => { const providers = [lan] this.providerConfig.providers = providers.map( @@ -143,6 +147,11 @@ export default { onlineSyncVisible: false } }, + computed: { + iCategory() { + return this.$route.query.category || 'host' + } + }, watch: { visible: { handler(val) { @@ -166,6 +175,10 @@ export default { } } }, + mounted() { + this.table.tableConfig.url = '/api/v1/xpack/cloud/accounts/' + this.table.tableConfig.extraQuery = { category: this.iCategory } + }, methods: { valid(status) { if (status !== 200) { diff --git a/src/views/assets/Cloud/Account/components/AuthPanel.vue b/src/views/assets/Cloud/Account/components/AuthPanel.vue index 4218f4b16..5ad77ab39 100644 --- a/src/views/assets/Cloud/Account/components/AuthPanel.vue +++ b/src/views/assets/Cloud/Account/components/AuthPanel.vue @@ -169,6 +169,7 @@ export default { const newValues = JSON.parse(JSON.stringify(values)) newValues['attrs'] = encryptAttrsField(newValues.attrs) newValues['provider'] = vm.provider + newValues['category'] = this.$route.query.category || 'host' return newValues }, addContinue: true diff --git a/src/views/assets/Cloud/Strategy/StrategyList.vue b/src/views/assets/Cloud/Strategy/StrategyList.vue index a1e1d05ad..4f7d6711b 100644 --- a/src/views/assets/Cloud/Strategy/StrategyList.vue +++ b/src/views/assets/Cloud/Strategy/StrategyList.vue @@ -21,7 +21,7 @@ export default { createDrawer: () => import('@/views/assets/Cloud/Strategy/StrategyCreateUpdate.vue'), detailDrawer: () => import('@/views/assets/Cloud/Strategy/StrategyDetail/index.vue'), tableConfig: { - url: '/api/v1/xpack/cloud/strategies/', + url: '', permissions: { app: 'xpack', resource: 'strategy' @@ -70,8 +70,15 @@ export default { } } }, + computed: { + iCategory() { + return this.$route.query.category || 'host' + } + }, + mounted() { + this.tableConfig.url = `/api/v1/xpack/cloud/strategies/?category=${this.iCategory}` + }, methods: {} - } </script> diff --git a/src/views/assets/Cloud/const.js b/src/views/assets/Cloud/const.js index 5a64ef6ee..bee3e7851 100644 --- a/src/views/assets/Cloud/const.js +++ b/src/views/assets/Cloud/const.js @@ -29,13 +29,15 @@ export const scp = 'scp' export const apsara_stack = 'apsara_stack' export const lan = 'lan' -export const publicCloudProviders = [ +export const publicHostProviders = [ aliyun, qcloud, qcloud_lighthouse, huaweicloud, baiducloud, jdcloud, kingsoftcloud, aws_china, aws_international, azure, azure_international, gcp, ucloud, volcengine ] +export const publicDBProviders = [aliyun] + export const privateCloudProviders = [ vmware, qingcloud_private, huaweicloud_private, ctyun_private, openstack, zstack, nutanix, fc, scp, apsara_stack diff --git a/src/views/assets/Cloud/index.vue b/src/views/assets/Cloud/index.vue index 21c3a7831..ccdbc80f7 100644 --- a/src/views/assets/Cloud/index.vue +++ b/src/views/assets/Cloud/index.vue @@ -13,6 +13,7 @@ export default { data() { return { config: { + title: '', activeMenu: 'CloudAccountList', submenu: [ { @@ -39,6 +40,11 @@ export default { } } } + }, + mounted() { + const category = this.$route.query.category || 'host' + const display = category === 'host' ? this.$t('Host') : this.$t('Database') + this.config.title = `${display} - ${this.$t('CloudSync')}` } } </script>