Create.vue 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. <template>
  2. <base-dialog @cancel="cancelDialog" :width="1000">
  3. <div slot="header">{{params.title}}</div>
  4. <div slot="body">
  5. <a-form-model
  6. :model="form"
  7. ref="form">
  8. <a-form-model-item :label="$t('network.text_21')" prop="name" :rules="rules.name" v-bind="formItemLayout">
  9. <a-input v-model="form.name" :placeholder="$t('validator.resourceName')" />
  10. </a-form-model-item>
  11. <a-form-model-item v-if="form.backends.length" class="mb-0" :label="$t('network.text_140')" prop="backends" :rules="rules.backends" v-bind="formItemLayout">
  12. <div v-for="(backend, idx) in form.backends" :key="idx" class="d-flex">
  13. <a-form-model-item style="flex: 0 0 30%" :prop="`backends[${idx}].name`" :rules="rules.lname">
  14. <a-input v-model="backend.name" :placeholder="$t('common.name')" />
  15. </a-form-model-item>
  16. <a-form-model-item class="ml-2" style="flex: 0 0 30%" :prop="`backends[${idx}].address`" :rules="rules.address">
  17. <a-input v-model="backend.address" :placeholder="$t('network.ip_or_domain')" />
  18. </a-form-model-item>
  19. <a-form-model-item class="ml-2" style="width:100%;flex: 0 0 15%" :prop="`backends[${idx}].port`" :rules="rules.port">
  20. <a-input v-model="backend.port" :placeholder="$t('network.text_165')" />
  21. </a-form-model-item>
  22. <a-form-model-item class="ml-2" style="width:100%;flex: 0 0 15%" :prop="`backends[${idx}].weight`" :rules="rules.weight">
  23. <a-input-number style="width:100%" v-model="backend.weight" :min="1" :max="100" :placeholder="$t('network.text_166')" />
  24. </a-form-model-item>
  25. <a-form-model-item class="ml-2">
  26. <a-button @click="handleRemove(idx)" shape="circle" icon="minus" size="small" class="mt-2 ml-2" :disabled="form.backends.length === 1 && isCloudflare" />
  27. </a-form-model-item>
  28. </div>
  29. </a-form-model-item>
  30. <a-button type="link" @click="addRule">{{ $t('network.add_backend_server') }}</a-button>
  31. <a-form-model-item class="mt-2" v-if="isCloudflare" :label="$t('network.enable_health_check')" prop="enable_health_check" v-bind="formItemLayout">
  32. <a-switch v-model="form.enable_health_check" />
  33. </a-form-model-item>
  34. <a-form-model-item v-if="form.enable_health_check" :label="$t('network.health_check')" prop="health_check" :rules="rules.health_check" v-bind="formItemLayout">
  35. <base-select v-model="form.health_check" resource="loadbalancer_health_checks" isDefaultSelect :params="healthCheckParams" />
  36. </a-form-model-item>
  37. </a-form-model>
  38. </div>
  39. <div slot="footer">
  40. <a-button type="primary" @click="handleConfirm" :loading="loading">{{ $t('dialog.ok') }}</a-button>
  41. <a-button @click="cancelDialog">{{ $t('dialog.cancel') }}</a-button>
  42. </div>
  43. </base-dialog>
  44. </template>
  45. <script>
  46. import DialogMixin from '@/mixins/dialog'
  47. import WindowsMixin from '@/mixins/windows'
  48. import regexp from '@/utils/regexp'
  49. import { validateModelForm } from '@/utils/validate'
  50. export default {
  51. name: 'LoadbalancerbackendgroupsCreateDialog',
  52. mixins: [DialogMixin, WindowsMixin],
  53. data () {
  54. return {
  55. loading: false,
  56. form: {
  57. name: undefined,
  58. backends: [
  59. {
  60. name: undefined,
  61. address: undefined,
  62. port: undefined,
  63. weight: 1,
  64. },
  65. ],
  66. enable_health_check: false,
  67. health_check: undefined,
  68. },
  69. rules: {
  70. name: [
  71. { required: true, validator: this.$validate('resourceName') },
  72. ],
  73. backends: [
  74. { required: true, message: this.$t('network.text_141') },
  75. ],
  76. lname: [
  77. { required: true, validator: this.$validate('resourceName') },
  78. ],
  79. address: [
  80. {
  81. required: true,
  82. validator: (rule, value, callback) => {
  83. if (!value) {
  84. callback(new Error(this.$t('common.tips.input', [this.$t('network.ip_or_domain')])))
  85. }
  86. if (!regexp.isIPOrDomain(value)) {
  87. callback(new Error(this.$t('common.tips.input', [this.$t('network.ip_or_domain')])))
  88. }
  89. callback()
  90. },
  91. },
  92. ],
  93. port: [
  94. { required: true, message: this.$t('network.text_165') },
  95. ],
  96. weight: [
  97. { required: true, message: this.$t('network.text_166') },
  98. ],
  99. health_check: [
  100. { required: true, message: this.$t('network.health_check') },
  101. ],
  102. },
  103. formItemLayout: {
  104. wrapperCol: {
  105. span: 21,
  106. },
  107. labelCol: {
  108. span: 3,
  109. },
  110. },
  111. }
  112. },
  113. computed: {
  114. isCloudflare () {
  115. return this.params.lbData.provider === 'Cloudflare'
  116. },
  117. healthCheckParams () {
  118. return {
  119. scope: this.$store.getters.scope,
  120. limit: 20,
  121. provider: this.params.lbData.provider,
  122. }
  123. },
  124. },
  125. methods: {
  126. addRule () {
  127. this.form.backends.push({
  128. name: undefined,
  129. address: undefined,
  130. port: undefined,
  131. weight: 1,
  132. })
  133. },
  134. handleRemove (idx) {
  135. this.form.backends = this.form.backends.filter((_, i) => i !== idx)
  136. },
  137. async doCreate () {
  138. const data = {
  139. name: this.form.name,
  140. loadbalancer: this.params.loadbalancer,
  141. }
  142. if (this.form.backends.length) {
  143. data.backends = this.form.backends.map(backend => ({
  144. name: backend.name,
  145. address: backend.address,
  146. port: backend.port,
  147. weight: backend.weight,
  148. backend_type: 'address',
  149. }))
  150. }
  151. if (this.form.enable_health_check && this.form.health_check) {
  152. data.loadbalancer_health_check_id = this.form.health_check
  153. }
  154. await new this.$Manager('loadbalancerbackendgroups').create({
  155. data,
  156. })
  157. },
  158. async handleConfirm () {
  159. this.loading = true
  160. try {
  161. await validateModelForm(this.$refs.form)
  162. await this.doCreate()
  163. this.loading = false
  164. this.cancelDialog()
  165. this.params.refresh()
  166. } catch (error) {
  167. this.loading = false
  168. }
  169. },
  170. },
  171. }
  172. </script>