diff --git a/cmdb-ui/public/iconfont/demo_index.html b/cmdb-ui/public/iconfont/demo_index.html
index 608363b..16fe770 100644
--- a/cmdb-ui/public/iconfont/demo_index.html
+++ b/cmdb-ui/public/iconfont/demo_index.html
@@ -5196,9 +5196,9 @@
@font-face {
font-family: 'iconfont';
- src: url('iconfont.woff2?t=1719208046306') format('woff2'),
- url('iconfont.woff?t=1719208046306') format('woff'),
- url('iconfont.ttf?t=1719208046306') format('truetype');
+ src: url('iconfont.woff2?t=1719307117118') format('woff2'),
+ url('iconfont.woff?t=1719307117118') format('woff'),
+ url('iconfont.ttf?t=1719307117118') format('truetype');
}
第二步:定义使用 iconfont 的样式
diff --git a/cmdb-ui/public/iconfont/iconfont.css b/cmdb-ui/public/iconfont/iconfont.css
index 918935e..ce80e4f 100644
--- a/cmdb-ui/public/iconfont/iconfont.css
+++ b/cmdb-ui/public/iconfont/iconfont.css
@@ -1,8 +1,8 @@
@font-face {
font-family: "iconfont"; /* Project id 3857903 */
- src: url('iconfont.woff2?t=1719208046306') format('woff2'),
- url('iconfont.woff?t=1719208046306') format('woff'),
- url('iconfont.ttf?t=1719208046306') format('truetype');
+ src: url('iconfont.woff2?t=1719307117118') format('woff2'),
+ url('iconfont.woff?t=1719307117118') format('woff'),
+ url('iconfont.ttf?t=1719307117118') format('truetype');
}
.iconfont {
diff --git a/cmdb-ui/public/iconfont/iconfont.ttf b/cmdb-ui/public/iconfont/iconfont.ttf
index f166f25..bd2233b 100644
Binary files a/cmdb-ui/public/iconfont/iconfont.ttf and b/cmdb-ui/public/iconfont/iconfont.ttf differ
diff --git a/cmdb-ui/public/iconfont/iconfont.woff b/cmdb-ui/public/iconfont/iconfont.woff
index 9492660..3d84f09 100644
Binary files a/cmdb-ui/public/iconfont/iconfont.woff and b/cmdb-ui/public/iconfont/iconfont.woff differ
diff --git a/cmdb-ui/public/iconfont/iconfont.woff2 b/cmdb-ui/public/iconfont/iconfont.woff2
index cf86593..cc98eb1 100644
Binary files a/cmdb-ui/public/iconfont/iconfont.woff2 and b/cmdb-ui/public/iconfont/iconfont.woff2 differ
diff --git a/cmdb-ui/src/modules/cmdb/components/httpSnmpAD/httpADCategory.vue b/cmdb-ui/src/modules/cmdb/components/httpSnmpAD/httpADCategory.vue
index 2ea5f9f..cbd03fb 100644
--- a/cmdb-ui/src/modules/cmdb/components/httpSnmpAD/httpADCategory.vue
+++ b/cmdb-ui/src/modules/cmdb/components/httpSnmpAD/httpADCategory.vue
@@ -1,13 +1,22 @@
-
+
-
{{ category.category }}
+
+
+
+ {{ category.category }}
+
+
-
+
{{ cate }}
{
+ getHttpAttributes(this.ruleName, { resource: newVal }).then((res) => {
if (this.isEdit) {
this.formatTableData(res)
} else {
@@ -130,7 +130,7 @@ export default {
}
if (this.isCloud && ruleName) {
- getHttpCategories(this.httpMap[`${this.ruleName}`].name).then((res) => {
+ getHttpCategories(this.ruleName).then((res) => {
this.categories = res
const categoriesSelect = []
res.forEach((category) => {
diff --git a/cmdb-ui/src/modules/cmdb/lang/en.js b/cmdb-ui/src/modules/cmdb/lang/en.js
index 20e1db1..517f021 100644
--- a/cmdb-ui/src/modules/cmdb/lang/en.js
+++ b/cmdb-ui/src/modules/cmdb/lang/en.js
@@ -244,6 +244,11 @@ const cmdb_en = {
relationADTip3: 'If the value of the auto-discovered attribute is a list, multiple relationships are established with the association model',
deleteRelationAdTip: 'Cannot be deleted again',
cronTips: 'The format is the same as crontab, for example: 0 15 * * 1-5',
+ privateCloud: 'vSphere API Configuration',
+ host: 'Host',
+ account: 'Account',
+ insecure: 'Certificate Validation',
+ vcenterName: 'Platform Name',
},
components: {
unselectAttributes: 'Unselected',
@@ -651,7 +656,8 @@ if __name__ == "__main__":
confirmDeleteView: 'Are you sure you want to delete this view ?',
noInstancePerm: 'You do not have read permissions for this instance',
noPreferenceAttributes: 'This instance has no subscription attributes or no default displayed attributes',
- topoViewSearchPlaceholder: 'Please enter the node name.'
+ topoViewSearchPlaceholder: 'Please enter the node name.',
+ moreBtn: 'Show more({count})'
},
}
export default cmdb_en
diff --git a/cmdb-ui/src/modules/cmdb/lang/zh.js b/cmdb-ui/src/modules/cmdb/lang/zh.js
index 1dfbab3..8eb4975 100644
--- a/cmdb-ui/src/modules/cmdb/lang/zh.js
+++ b/cmdb-ui/src/modules/cmdb/lang/zh.js
@@ -244,6 +244,11 @@ const cmdb_zh = {
relationADTip3: '如果自动发现的属性值是列表,则会和关联模型建立多个关系',
deleteRelationAdTip: '不可再删除',
cronTips: '格式同crontab, 例如:0 15 * * 1-5',
+ privateCloud: 'vSphere API配置',
+ host: '地址',
+ account: '账号',
+ insecure: '是否证书验证',
+ vcenterName: '虚拟平台名',
},
components: {
unselectAttributes: '未选属性',
@@ -650,7 +655,8 @@ if __name__ == "__main__":
confirmDeleteView: '您确定要删除该视图吗?',
noInstancePerm: '您没有该实例的查看权限',
noPreferenceAttributes: '该实例没有订阅属性或者没有默认展示的属性',
- topoViewSearchPlaceholder: '请输入节点名字'
+ topoViewSearchPlaceholder: '请输入节点名字',
+ moreBtn: '展示更多({count})'
},
}
export default cmdb_zh
diff --git a/cmdb-ui/src/modules/cmdb/views/ci_types/attrAD.vue b/cmdb-ui/src/modules/cmdb/views/ci_types/attrAD.vue
index d5436e6..685fd41 100644
--- a/cmdb-ui/src/modules/cmdb/views/ci_types/attrAD.vue
+++ b/cmdb-ui/src/modules/cmdb/views/ci_types/attrAD.vue
@@ -273,8 +273,12 @@ export default {
const adtIndex = this.clientCITypeList.findIndex((item) => item.id === id)
this.clientCITypeList[adtIndex].extra_option.alias = value
} else {
+ const adtIndex = this.adCITypeList.findIndex((item) => item.id === id)
+ const oldExtraOption = this.adCITypeList?.[adtIndex]?.extra_option
+
const params = {
extra_option: {
+ ...(oldExtraOption || {}),
alias: value
}
}
diff --git a/cmdb-ui/src/modules/cmdb/views/ci_types/attrADTabpane.vue b/cmdb-ui/src/modules/cmdb/views/ci_types/attrADTabpane.vue
index 13510ed..9b0e620 100644
--- a/cmdb-ui/src/modules/cmdb/views/ci_types/attrADTabpane.vue
+++ b/cmdb-ui/src/modules/cmdb/views/ci_types/attrADTabpane.vue
@@ -51,7 +51,7 @@
:wrapperCol="{ span: 14 }"
class="attr-ad-form"
>
-
+
@@ -104,31 +105,33 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -141,10 +144,10 @@
:wrapperCol="{ span: 6 }"
class="attr-ad-form"
>
-
+
-
+
@@ -167,6 +170,7 @@ import { v4 as uuidv4 } from 'uuid'
import { mapState } from 'vuex'
import Vcrontab from '@/components/Crontab'
import { putCITypeDiscovery, postCITypeDiscovery } from '../../api/discovery'
+import { PRIVATE_CLOUD_NAME } from '@/modules/cmdb/views/discovery/constants.js'
import HttpSnmpAD from '../../components/httpSnmpAD'
import AttrMapTable from '@/modules/cmdb/components/attrMapTable/index.vue'
@@ -250,7 +254,9 @@ export default {
form3: this.$form.createForm(this, { name: 'snmp_form' }),
cronVisible: false,
uniqueKey: '',
- isVCenter: false,
+ isPrivateCloud: false,
+ privateCloudName: '',
+ PRIVATE_CLOUD_NAME
}
},
computed: {
@@ -262,7 +268,7 @@ export default {
return this.currentAdr?.type || ''
},
adrName() {
- return this.currentAdr?.name || ''
+ return this?.currentAdr?.option?.en || this.currentAdr?.name || ''
},
adrIsInner() {
return this.currentAdr?.is_inner || ''
@@ -287,7 +293,7 @@ export default {
]
},
labelCol() {
- const span = this.$i18n.locale === 'en' ? 4 : 2
+ const span = this.$i18n.locale === 'en' ? 5 : 3
return {
span
}
@@ -312,17 +318,21 @@ export default {
vcenterName = ''
} = _findADT?.extra_option ?? {}
- if (_find?.name === 'VCenter') {
- this.isVCenter = true
- this.privateCloudForm = {
- host,
- account,
- password,
- insecure,
- vcenterName,
+ if (_find?.option?.category === 'private_cloud') {
+ this.isPrivateCloud = true
+ this.privateCloudName = _find?.option?.en || ''
+
+ if (this.privateCloudName === PRIVATE_CLOUD_NAME.VCenter) {
+ this.privateCloudForm = {
+ host,
+ account,
+ password,
+ insecure,
+ vcenterName,
+ }
}
} else {
- this.isVCenter = false
+ this.isPrivateCloud = false
this.form2 = {
key,
secret,
@@ -389,10 +399,25 @@ export default {
handleSave() {
const { currentAdt } = this
let params
+
+ const isError = this.validateForm()
+ if (isError) {
+ return
+ }
+
if (this.adrType === 'http') {
+ let cloudOption = {}
+ if (this.isPrivateCloud) {
+ if (this.privateCloudName === PRIVATE_CLOUD_NAME.VCenter) {
+ cloudOption = this.privateCloudForm
+ }
+ } else {
+ cloudOption = this.form2
+ }
+
params = {
extra_option: {
- ...(this.isVCenter ? this.privateCloudForm : this.form2),
+ ...cloudOption,
category: this.$refs.httpSnmpAd.currentCate,
},
}
@@ -457,13 +482,14 @@ export default {
return
}
- if (currentAdt?.isClient) {
- if (currentAdt?.extra_option) {
- params.extra_option = {
- ...(params?.extra_option || {}),
- ...(currentAdt?.extra_option || {})
- }
+ if (currentAdt?.extra_option) {
+ params.extra_option = {
+ ...(currentAdt?.extra_option || {}),
+ ...(params?.extra_option || {})
}
+ }
+
+ if (currentAdt?.isClient) {
postCITypeDiscovery(this.CITypeId, params).then((res) => {
this.$message.success(this.$t('saveSuccess'))
this.$emit('handleSave', res.id)
@@ -475,6 +501,40 @@ export default {
})
}
},
+
+ validateForm() {
+ let isError = false
+
+ if (this.adrType === 'http') {
+ if (this.isPrivateCloud) {
+ if (this.privateCloudName === PRIVATE_CLOUD_NAME.VCenter) {
+ const vcenterErros = {
+ 'host': `${this.$t('placeholder1')} ${this.$t('cmdb.ciType.host')}`,
+ 'account': `${this.$t('placeholder1')} ${this.$t('cmdb.ciType.account')}`,
+ 'password': `${this.$t('placeholder1')} ${this.$t('cmdb.ciType.password')}`
+ }
+ const findError = Object.keys(this.privateCloudForm).find((key) => !this.privateCloudForm[key] && vcenterErros[key])
+ if (findError) {
+ isError = true
+ this.$message.error(this.$t(vcenterErros[findError]))
+ }
+ }
+ } else {
+ const publicCloudErros = {
+ 'key': `${this.$t('placeholder1')} key`,
+ 'secret': `${this.$t('placeholder1')} secret`
+ }
+ const findError = Object.keys(this.form2).find((key) => !this.form2[key] && publicCloudErros[key])
+ if (findError) {
+ isError = true
+ this.$message.error(this.$t(publicCloudErros[findError]))
+ }
+ }
+ }
+
+ return isError
+ },
+
handleOpenCmdb() {
this.$refs.cmdbDrawer.open()
},
diff --git a/cmdb-ui/src/modules/cmdb/views/discovery/constants.js b/cmdb-ui/src/modules/cmdb/views/discovery/constants.js
index 23554d2..c77998c 100644
--- a/cmdb-ui/src/modules/cmdb/views/discovery/constants.js
+++ b/cmdb-ui/src/modules/cmdb/views/discovery/constants.js
@@ -6,3 +6,7 @@ export const DISCOVERY_CATEGORY_TYPE = {
COMPONENT: 'components',
PRIVATE_CLOUD: 'private_cloud'
}
+
+export const PRIVATE_CLOUD_NAME = {
+ VCenter: 'vcenter'
+}
diff --git a/cmdb-ui/src/modules/cmdb/views/discovery/editDrawer.vue b/cmdb-ui/src/modules/cmdb/views/discovery/editDrawer.vue
index d895bb5..2243077 100644
--- a/cmdb-ui/src/modules/cmdb/views/discovery/editDrawer.vue
+++ b/cmdb-ui/src/modules/cmdb/views/discovery/editDrawer.vue
@@ -112,7 +112,7 @@
-
+
@@ -179,6 +179,9 @@ export default {
}
return this.$t('new')
},
+ ruleName() {
+ return this?.ruleData?.option?.en || this?.ruleData?.name || ''
+ }
},
inject: {
getDiscovery: {
diff --git a/cmdb-ui/src/modules/cmdb/views/discovery/index.vue b/cmdb-ui/src/modules/cmdb/views/discovery/index.vue
index 39984e8..6bccee8 100644
--- a/cmdb-ui/src/modules/cmdb/views/discovery/index.vue
+++ b/cmdb-ui/src/modules/cmdb/views/discovery/index.vue
@@ -299,7 +299,6 @@ export default {
align-items: center;
gap: 14px;
flex-shrink: 0;
- margin-left: 20px;
&-btn {
display: flex;
diff --git a/cmdb-ui/src/modules/cmdb/views/topology_view/index.vue b/cmdb-ui/src/modules/cmdb/views/topology_view/index.vue
index 085e62f..c65f9ca 100644
--- a/cmdb-ui/src/modules/cmdb/views/topology_view/index.vue
+++ b/cmdb-ui/src/modules/cmdb/views/topology_view/index.vue
@@ -160,7 +160,9 @@
class="relation-graph-node-icon"
/>
-
{{ node.text }}
+
+ {{ node.data.btnType === 'more' ? $t('cmdb.topo.moreBtn', { count: node.text }) : node.text }}
+
@@ -960,7 +962,7 @@ export default {
const id = uuidv4()
jsonData.nodes.set(id, {
id,
- text: `展示更多(${childs.length - showNodeCount})`,
+ text: childs.length - showNodeCount,
data: {
btnType: 'more'
},
@@ -1008,7 +1010,7 @@ export default {
if (showNodeCount === childs.length) {
moreBtnNode.isHide = true
} else {
- moreBtnNode.text = `展示更多(${childs.length - showNodeCount})`
+ moreBtnNode.text = childs.length - showNodeCount
}
}