PrepareNets.vue 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. <script>
  2. import * as R from 'ramda'
  3. import { isWithinRange } from '@/utils/validate'
  4. export default {
  5. name: 'CreatePrepareNets',
  6. props: {
  7. type: {
  8. type: String,
  9. default: 'host',
  10. },
  11. prepareNetData: {
  12. type: Object,
  13. required: true,
  14. },
  15. },
  16. computed: {
  17. nets () {
  18. return this.prepareNetData[`${this.type}s`] || []
  19. },
  20. suggestedNets () {
  21. return this.prepareNetData[`${this.type}_suggested_networks`] || []
  22. },
  23. listData () {
  24. const _ = this.nets
  25. const networks = this.suggestedNets
  26. const _listData = []
  27. if (!_ || _.length === 0) return []
  28. const formatIps = (row) => {
  29. if (row.ip_nets && row.ip_nets.length > 0) {
  30. return row.ip_nets.map(item => item.ip)
  31. }
  32. return row.ip ? [row.ip] : []
  33. }
  34. const formatSuitable = (row) => {
  35. const { ips } = row
  36. // ip为空 默认为true
  37. if (!ips || !ips.length) return true
  38. for (let i = 0; i < networks.length; i++) {
  39. const { guest_ip_start, guest_ip_end } = networks[i]
  40. for (let p = 0; p < ips.length; p++) {
  41. const ip = ips[p]
  42. if (isWithinRange(ip, guest_ip_start, guest_ip_end)) {
  43. return true
  44. }
  45. }
  46. }
  47. return false
  48. }
  49. let items = []
  50. let j = 0
  51. for (let i = 0; i < _.length; i++) {
  52. const row = _[i]
  53. row.ips = formatIps(row)
  54. const { ip_nets } = row
  55. let isSuitableNetwork = false
  56. if (ip_nets && ip_nets.length) {
  57. isSuitableNetwork = ip_nets.every(o => o.suitable_network)
  58. }
  59. this.$set(row, 'isSuitable', isSuitableNetwork || !!row.suitable_network || formatSuitable(row))
  60. items.push(_[i])
  61. if (_.length === 1) {
  62. _listData.push(items)
  63. return _listData
  64. }
  65. // 最后一个
  66. if (i === _.length - 1) {
  67. _listData.push(items)
  68. break
  69. }
  70. if (j >= 1) {
  71. _listData.push(items)
  72. items = []
  73. j = 0
  74. } else {
  75. ++j
  76. }
  77. }
  78. return _listData
  79. },
  80. },
  81. methods: {
  82. // formatStatus (status) {
  83. // return (
  84. // <div style="display: inline-block;">
  85. // {status
  86. // ? <a-icon class="success-color" type="check-circle" style="font-size: 19px" />
  87. // : <a-icon class="error-color" type="close-circle" style="font-size: 19px" />
  88. // }
  89. // </div>
  90. // )
  91. // },
  92. },
  93. // render () {
  94. // const Thead = () => {
  95. // const tds = [<td>序号</td>, <td> 名称 </td>, <td> { this.type === 'host' ? this.$t('cloudenv.text_171') : this.$t('cloudenv.text_172') }</td>, <td>网络是否满足</td>]
  96. // return (
  97. // <tr class="thead">
  98. // { (this.listData && this.listData.length > 0) ? this.listData[0].map(() => tds) : null }
  99. // </tr>
  100. // )
  101. // }
  102. // const Tbody = () => {
  103. // let index = 0
  104. // const trs = this.listData.map(rows => {
  105. // return <tr>
  106. // {
  107. // rows.map(row => {
  108. // const tds = []
  109. // const o = {
  110. // index: ++index,
  111. // name: row.name,
  112. // ips: row.ips,
  113. // status: this.formatStatus(row.isSuitable),
  114. // }
  115. // Object.keys(o).forEach(k => {
  116. // if (k === 'ips') {
  117. // tds.push(
  118. // <td>{ o.ips && o.ips.length > 0 ? o.ips.map(ip => ip).join('、') : '-'}</td>,
  119. // )
  120. // } else {
  121. // tds.push(
  122. // <td>
  123. // {o[k]}
  124. // </td>,
  125. // )
  126. // }
  127. // })
  128. // return tds
  129. // })
  130. // }
  131. // </tr>
  132. // })
  133. // return trs
  134. // }
  135. // return (
  136. // <div class="prepare-content">
  137. // {
  138. // (this.nets && this.nets.length > 0)
  139. // ? <table class="prepare-table">
  140. // <tbody>
  141. // <Thead />
  142. // <Tbody />
  143. // </tbody>
  144. // </table>
  145. // : <a-alert show-icon message={this.type === 'host' ? this.$t('cloudenv.text_173') : this.$t('cloudenv.text_174')} type="error" class="mt-4" />
  146. // }
  147. // </div>
  148. // )
  149. // },
  150. render () {
  151. let index = 0
  152. const columns = [
  153. {
  154. field: 'index0',
  155. title: this.$t('cloudenv.text_496'),
  156. formatter: ({ row }) => {
  157. if (row[0] && row[0].name) {
  158. return ++index
  159. }
  160. return '-'
  161. },
  162. },
  163. {
  164. field: 'name0',
  165. title: this.$t('table.title.name'),
  166. formatter: ({ row }) => {
  167. return (row[0] && row[0].name) || '-'
  168. },
  169. },
  170. {
  171. field: 'ips0',
  172. title: this.type === 'host' ? this.$t('cloudenv.text_171') : this.$t('cloudenv.text_172'),
  173. formatter: ({ row }) => {
  174. return row[0] && row[0].ips && row[0].ips.length > 0 ? row[0].ips.map(ip => ip).join('、') : '-'
  175. },
  176. },
  177. {
  178. field: 'isSuitable0',
  179. title: this.$t('cloudenv.text_495'),
  180. slots: {
  181. default: ({ row }) => {
  182. if (!R.isNil(row[0] && row[0].isSuitable)) {
  183. return row[0] && row[0].isSuitable ? [<a-icon class="success-color" type="check-circle" style="font-size: 19px" />] : [<a-icon class="error-color" type="close-circle" style="font-size: 19px" />]
  184. }
  185. return '-'
  186. },
  187. },
  188. },
  189. {
  190. field: 'index1',
  191. title: this.$t('cloudenv.text_496'),
  192. formatter: ({ row }) => {
  193. if (row[1] && row[1].name) {
  194. return ++index
  195. }
  196. return '-'
  197. },
  198. },
  199. {
  200. field: 'name1',
  201. title: this.$t('table.title.name'),
  202. formatter: ({ row }) => {
  203. return (row[1] && row[1].name) || '-'
  204. },
  205. },
  206. {
  207. field: 'ips1',
  208. title: this.type === 'host' ? this.$t('cloudenv.text_171') : this.$t('cloudenv.text_172'),
  209. formatter: ({ row }) => {
  210. return row[1] && row[1].ips && row[1].ips.length > 0 ? row[1].ips.map(ip => ip).join('、') : '-'
  211. },
  212. },
  213. {
  214. field: 'isSuitable1',
  215. title: this.$t('cloudenv.text_495'),
  216. slots: {
  217. default: ({ row }) => {
  218. if (!R.isNil(row[1] && row[1].isSuitable)) {
  219. return row[1] && row[1].isSuitable ? [<a-icon class="success-color" type="check-circle" style="font-size: 19px" />] : [<a-icon class="error-color" type="close-circle" style="font-size: 19px" />]
  220. }
  221. return '-'
  222. },
  223. },
  224. },
  225. ]
  226. return (
  227. <div class='prepare-content'>
  228. {
  229. (this.nets && this.nets.length > 0)
  230. ? <vxe-grid border show-overflow='title' height='300' size='mini' scroll-y={{ gt: 10 }} highlight-hover-row data={ this.listData } columns={ columns } />
  231. : <a-alert show-icon message={this.type === 'host' ? this.$t('cloudenv.text_173') : this.$t('cloudenv.text_174')} type='error' class='mt-4' />
  232. }
  233. </div>
  234. )
  235. },
  236. }
  237. </script>
  238. <style lang="less" scoped>
  239. // .prepare-content{
  240. // max-height: 300px;
  241. // overflow: auto;
  242. // }
  243. // .prepare-table{
  244. // width: 100%;
  245. // margin-top: 30px;
  246. // .thead{
  247. // background-color: #f8f8f9;
  248. // td {
  249. // padding: 5px;
  250. // font-weight: 500;
  251. // }
  252. // }
  253. // td {
  254. // font-size: 12px;
  255. // color: #60626E;
  256. // padding: 7px;
  257. // border: 1px solid #e8eaec;
  258. // text-align: center
  259. // }
  260. // }
  261. </style>