index.vue 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. <template>
  2. <div class="d-flex res-topology">
  3. <div class="c-left d-flex">
  4. <res-vpc :dataSource="vpc" :class="{'invisible': idx > 0 }" />
  5. <res-wire :dataSource="dataSource" :idx="idx" :len="len" />
  6. </div>
  7. <div class="c-right" :class="{'bl-none': isEmpty(networks)}">
  8. <ul class="list">
  9. <li class="item d-flex" v-for="(network, nidx) in networks" :key="nidx">
  10. <res-ipsubnet :dataSource="network" />
  11. <div v-for="(obj, idx) in getAddress(network)" :key="idx">
  12. <res-common
  13. v-if="!obj.hidden"
  14. :type="RES_ICON_MAP[obj.owner_type]"
  15. :dataSource="obj"
  16. :isExist="isExist(networks, nidx, obj)" />
  17. </div>
  18. </li>
  19. </ul>
  20. </div>
  21. </div>
  22. </template>
  23. <script>
  24. import ResCommon from '@Network/sections/Topology/ResCommon'
  25. import { RES_ICON_MAP } from '@Network/sections/Topology/constants'
  26. import ResMixin from '@Network/sections/Topology/ResMixin'
  27. import ResVpc from '../ResVpc'
  28. import ResWire from '../ResWire'
  29. import ResIpsubnet from '../ResIpsubnet'
  30. export default {
  31. name: 'WireTopology',
  32. components: {
  33. ResVpc,
  34. ResWire,
  35. ResIpsubnet,
  36. ResCommon,
  37. },
  38. mixins: [ResMixin],
  39. props: {
  40. vpc: Object,
  41. dataSource: Object,
  42. idx: Number,
  43. len: Number,
  44. wires: Array,
  45. },
  46. data () {
  47. return {
  48. RES_ICON_MAP,
  49. }
  50. },
  51. computed: {
  52. networks () {
  53. const networks = this.dataSource?.networks || []
  54. return networks.filter(v => v.server_type === 'guest')
  55. },
  56. },
  57. methods: {
  58. getMultiple (nidx, resArr, curObj) {
  59. if (resArr[nidx + 1]) {
  60. return resArr[nidx + 1].address.some((v, i) => {
  61. if (v.owner_id === undefined || curObj.owner_id === undefined) return false
  62. if (v.owner_id === curObj.owner_id) {
  63. resArr[nidx + 1].address[i].hidden = true
  64. }
  65. return v.owner_id === curObj.owner_id
  66. })
  67. }
  68. return false
  69. },
  70. getAddress (network) {
  71. const resTypes = ['servers', 'hosts', 'loadbalancers', 'dbinstances']
  72. return network.address?.filter(v => resTypes.includes(v.owner_type)) || []
  73. },
  74. isExist (networks, nidx, addr) {
  75. let isExist = false
  76. // 同 wire 查找
  77. for (let i = nidx - 1; i >= 0; i--) {
  78. const addressArr = this.getAddress(networks[i])
  79. isExist = addressArr.some(v => v.owner_id === addr.owner_id)
  80. }
  81. // 跨 wire 查找
  82. for (let i = this.idx - 1; i >= 0; i--) {
  83. const wire = this.wires[i]
  84. if (wire.networks && wire.networks.length > 0) {
  85. for (let j = 0; j < wire.networks.length; j++) {
  86. const network = wire.networks[j]
  87. if (network && network.address) {
  88. const addressArr = this.getAddress(network)
  89. isExist = addressArr.some(v => v.owner_id === addr.owner_id)
  90. }
  91. }
  92. }
  93. }
  94. return isExist
  95. },
  96. },
  97. }
  98. </script>
  99. <style lang="scss" scoped>
  100. // @import "@Network/sections/Topology/index.scss";
  101. </style>