index.vue 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. <template>
  2. <div>
  3. <page-header :title="$t('network.create_nat')" />
  4. <page-body needMarginBottom>
  5. <a-form
  6. class="mt-3"
  7. v-bind="formItemLayout"
  8. :form="form.fc"
  9. hideRequiredMark>
  10. <a-form-item :label="$t('network.text_205', [$t('dictionary.domain')])" v-if="$store.getters.isAdminMode">
  11. <domain-select v-decorator="decorators.project_domain" @change="handleDomainChange" />
  12. </a-form-item>
  13. <a-form-item :label="$t('network.text_21')" v-bind="formItemLayout">
  14. <a-input v-decorator="decorators.name" :placeholder="$t('network.text_44')" />
  15. </a-form-item>
  16. <a-form-item :label="$t('common.description')" v-bind="formItemLayout">
  17. <a-textarea :auto-size="{ minRows: 1, maxRows: 3 }" v-decorator="decorators.description" :placeholder="$t('common_367')" />
  18. </a-form-item>
  19. <!-- 计费方式 -->
  20. <clearing-radios v-bind="formItemLayout" :auto_renew="false" />
  21. <a-form-item :label="$t('network.expired_release')" v-if="form.fd.billing_type !== 'prepaid'">
  22. <duration :decorators="decorators.duration" :form="form" />
  23. </a-form-item>
  24. <area-selects
  25. class="mb-0"
  26. ref="areaSelects"
  27. :wrapperCol="formItemLayout.wrapperCol"
  28. :labelCol="formItemLayout.labelCol"
  29. :names="areaselectsName"
  30. :providerParams="providerParams"
  31. :cloudregionParams="regionParams"
  32. :isRequired="true"
  33. filterBrandResource="nat"
  34. @change="handleRegionChange" />
  35. <!-- 套餐 -->
  36. <s-k-u ref="REF_SKU" />
  37. <!-- 网络 -->
  38. <template>
  39. <network-selects
  40. ref="REF_NETWORK"
  41. :label="$t('network.text_16')"
  42. :isDefaultFetch="false"
  43. :vpcFormat="vpcFormat"
  44. :vpcParams="vpcParams"
  45. :networkParams="netParams"
  46. v-bind="formItemLayout" />
  47. </template>
  48. <template>
  49. <eip-config v-if="form.getFieldValue('provider') !== 'Huawei'"
  50. :decorators="decorators.eip"
  51. :eip-params="eipParams"
  52. :hypervisor="hypervisor"
  53. :showBind="false"
  54. :isServertemplate="false"
  55. :cloud-env="cloudEnv"
  56. :form="form"
  57. :hasPublicIp="false"
  58. :formItemLayout="formItemLayout" />
  59. </template>
  60. <a-form-item :label="$t('common.text00012')" class="mb-0" v-bind="formItemLayout">
  61. <tag
  62. v-decorator="decorators.__meta__" />
  63. </a-form-item>
  64. </a-form>
  65. <bottom-bar :values="form.fc.getFieldsValue()" :cloudAccountId="cloudAccountId" />
  66. </page-body>
  67. </div>
  68. </template>
  69. <script>
  70. import * as R from 'ramda'
  71. import { mapGetters } from 'vuex'
  72. import DomainSelect from '@/sections/DomainSelect'
  73. import { DECORATORS } from '@Network/views/nats/constants'
  74. import Duration from '@Compute/sections/Duration'
  75. import NetworkSelects from '@/sections/NetworkSelects'
  76. import { PROVIDER_MAP } from '@/constants'
  77. import AreaSelects from '@/sections/AreaSelects'
  78. import EipConfig from '@Compute/sections/EipConfig'
  79. import Tag from '@/sections/Tag'
  80. import changeMinxin from './changeMinxin'
  81. import BottomBar from './components/BottomBar'
  82. import SKU from './components/SKU'
  83. export default {
  84. name: 'NatCreate',
  85. components: {
  86. DomainSelect,
  87. Duration,
  88. AreaSelects,
  89. SKU,
  90. NetworkSelects,
  91. EipConfig,
  92. BottomBar,
  93. Tag,
  94. },
  95. mixins: [changeMinxin],
  96. data () {
  97. return {
  98. loading: false,
  99. decorators: DECORATORS,
  100. selectedRegionItem: {},
  101. formItemLayout: {
  102. wrapperCol: {
  103. md: { span: 17 },
  104. xl: { span: 19 },
  105. xxl: { span: 21 },
  106. },
  107. labelCol: {
  108. md: { span: 7 },
  109. xl: { span: 5 },
  110. xxl: { span: 3 },
  111. },
  112. },
  113. tailFormItemLayout: {
  114. wrapperCol: {
  115. lg: { span: 18, offset: 6 },
  116. xl: { span: 20, offset: 4 },
  117. xxl: { span: 21, offset: 3 },
  118. },
  119. },
  120. vpcList: [],
  121. }
  122. },
  123. computed: {
  124. ...mapGetters(['isAdminMode', 'scope', 'userInfo']),
  125. areaselectsName () {
  126. return ['provider', 'cloudregion']
  127. },
  128. cloudEnv () {
  129. return 'public'
  130. },
  131. hypervisor () {
  132. if (R.is(Object, this.form.fd.sku)) {
  133. const { provider } = this.form.fd.sku
  134. if (provider) {
  135. return PROVIDER_MAP[provider].hypervisor
  136. }
  137. }
  138. return ''
  139. },
  140. cloudAccountId () {
  141. const values = this.form.getFieldsValue()
  142. const currentVpc = this.vpcList.filter(item => item.id === values.vpc)
  143. if (currentVpc[0]) {
  144. return currentVpc[0].account_id
  145. }
  146. return ''
  147. },
  148. },
  149. created () {
  150. this.$nextTick(() => {
  151. this.form.fc.setFieldsValue({ project_domain: this.$store.getters.userInfo.projectDomainId })
  152. })
  153. },
  154. methods: {
  155. vpcFormat (vpc) {
  156. const { name, manager } = vpc
  157. return (
  158. <div class='d-flex'>
  159. <span class='text-truncate flex-fill mr-2' title={ name }>{ name }</span>
  160. <span style="color: #8492a6; font-size: 13px">{ this.$t('network.manager', [manager]) }</span>
  161. </div>
  162. )
  163. },
  164. fetchVpc () {
  165. this.$refs.REF_NETWORK.fetchVpc(this.vpcListChange)
  166. },
  167. vpcListChange ({ vpcList }) {
  168. this.vpcList = vpcList
  169. },
  170. handleDomainChange (val) {
  171. this.project_domain = val
  172. this.$refs.areaSelects.fetchs(this.areaselectsName)
  173. },
  174. providerParams () {
  175. const params = {
  176. limit: 0,
  177. enabled: 1,
  178. // cloud_env: 'public',
  179. scope: this.scope,
  180. provider: this.$store.getters.capability.nat_brands.filter(v => v !== 'Aws'),
  181. }
  182. if (!this.$store.getters.capability.nat_brands || this.$store.getters.capability.nat_brands.length === 0) {
  183. params.provider = 'Other'
  184. }
  185. if (this.isAdminMode) {
  186. params.admin = true
  187. params.project_domain = this.project_domain
  188. delete params.scope
  189. }
  190. return params
  191. },
  192. regionParams () {
  193. const params = {
  194. usable: true,
  195. show_emulated: true,
  196. }
  197. if (this.isAdminMode) {
  198. params.admin = true
  199. params.project_domain = this.project_domain
  200. delete params.scope
  201. }
  202. return params
  203. },
  204. vpcParams () {
  205. const params = {
  206. cloudregion_id: this.form.fd.cloudregion_id || this.form.fd.cloudregion,
  207. scope: this.scope,
  208. }
  209. return params
  210. },
  211. netParams () {
  212. const { fd } = this.form
  213. const params = {
  214. cloudregion_id: fd.cloudregion_id || fd.cloudregion,
  215. scope: this.scope,
  216. }
  217. const zoneStr = this.$refs.REF_SKU.getZone()
  218. if (zoneStr) {
  219. const zoneArr = zoneStr.split(',')
  220. if (zoneArr && zoneArr.length > 0) {
  221. params.zones = zoneArr
  222. }
  223. }
  224. return params
  225. },
  226. eipParams () {
  227. const cloudregion_id = this.$refs.REF_SKU.getCloudregionId()
  228. const params = {
  229. cloudregion_id: cloudregion_id,
  230. }
  231. return params
  232. },
  233. },
  234. }
  235. </script>