crud-table-modal.vue 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. <script setup>
  2. import { cloneDeep } from 'lodash'
  3. import { addApi, updateApi } from '~@/api/list/gateway-list'
  4. import { nextTick } from 'vue'
  5. const emit = defineEmits(['cancel', 'ok'])
  6. const message = useMessage()
  7. const isUpdate = ref(false)
  8. const visible = ref(false)
  9. const loading = ref(false)
  10. const continueToAdd = ref(false)
  11. const title = computed(() => {
  12. return isUpdate.value ? '编辑' : '新增'
  13. })
  14. const formRef = ref()
  15. const originalRecord = ref(null)
  16. const defaultFormData = {
  17. id: 0,
  18. name: '',
  19. hostId: 0,
  20. ruleId: 0,
  21. comment: '',
  22. operator: 1,
  23. banUdp: 0,
  24. banOverseas: 0,
  25. }
  26. const formData = ref(cloneDeep(defaultFormData))
  27. const { t } = useI18n()
  28. const labelCol = { style: { width: '100px' } }
  29. const wrapperCol = { span: 24 }
  30. function open(record) {
  31. visible.value = true
  32. isUpdate.value = !!record?.id
  33. originalRecord.value = record ? cloneDeep(record) : null
  34. formData.value = record ? cloneDeep(record) : cloneDeep(defaultFormData)
  35. continueToAdd.value = false
  36. nextTick(() => {
  37. formRef.value?.clearValidate()
  38. })
  39. }
  40. function handleReset() {
  41. if (isUpdate.value)
  42. formData.value = cloneDeep(originalRecord.value)
  43. else
  44. formData.value = cloneDeep(defaultFormData)
  45. nextTick(() => {
  46. formRef.value?.clearValidate()
  47. })
  48. }
  49. async function handleOk() {
  50. try {
  51. await formRef.value?.validate()
  52. loading.value = true
  53. const api = isUpdate.value ? updateApi : addApi
  54. await api(formData.value)
  55. message.success(isUpdate.value ? '修改成功' : '新增成功')
  56. emit('ok')
  57. if (!isUpdate.value && continueToAdd.value) {
  58. handleReset()
  59. }
  60. else {
  61. visible.value = false
  62. }
  63. }
  64. catch (errorInfo) {
  65. console.log('Form Validate Failed:', errorInfo)
  66. }
  67. finally {
  68. loading.value = false
  69. }
  70. }
  71. function handleCancel() {
  72. visible.value = false
  73. emit('cancel')
  74. }
  75. defineExpose({
  76. open,
  77. })
  78. </script>
  79. <template>
  80. <a-modal v-model:open="visible" :title="title" :confirm-loading="loading" @cancel="handleCancel">
  81. <a-form ref="formRef" :model="formData" class="w-full" :label-col="labelCol" :wrapper-col="wrapperCol">
  82. <a-form-item :label="t('gateway.group.name')" name="name" :rules="[{ required: true, message: '请输入网关组名称' }]">
  83. <a-input v-model:value="formData.name" :maxlength="50" placeholder="请输入网关组名称" />
  84. </a-form-item>
  85. <a-form-item :label="t('gateway.group.hostId')" name="hostId" :rules="[{ required: true, message: '请输入订单ID' }]">
  86. <a-input v-model:value="formData.hostId" :maxlength="50" placeholder="请输入订单ID" />
  87. </a-form-item>
  88. <a-form-item :label="t('gateway.group.ruleId')" name="ruleId" :rules="[{ required: true, message: '请输入规则ID' }]">
  89. <a-input v-model:value="formData.ruleId" :maxlength="50" placeholder="请输入规则ID" />
  90. </a-form-item>
  91. <a-form-item :label="t('gateway.group.comment')" name="comment">
  92. <a-textarea v-model:value="formData.comment" show-count :maxlength="200" placeholder="请输入备注" />
  93. </a-form-item>
  94. <a-form-item :label="t('gateway.group.banUdp')" name="banUdp">
  95. <a-radio-group v-model:value="formData.banUdp">
  96. <a-radio :value="1">
  97. </a-radio>
  98. <a-radio :value="0">
  99. </a-radio>
  100. </a-radio-group>
  101. </a-form-item>
  102. <a-form-item :label="t('gateway.group.operator')" name="operator">
  103. <a-radio-group v-model:value="formData.operator">
  104. <a-radio :value="1">
  105. {{ t('gateway.group.telecommunications') }}
  106. </a-radio>
  107. <a-radio :value="2">
  108. {{ t('gateway.group.BGP') }}
  109. </a-radio>
  110. </a-radio-group>
  111. </a-form-item>
  112. <a-form-item :label="t('gateway.group.banOverseas')" name="banOverseas">
  113. <a-radio-group v-model:value="formData.banOverseas">
  114. <a-radio :value="1">
  115. </a-radio>
  116. <a-radio :value="0">
  117. </a-radio>
  118. </a-radio-group>
  119. </a-form-item>
  120. </a-form>
  121. <template #footer>
  122. <a-checkbox v-if="!isUpdate" v-model:checked="continueToAdd" style="float: left; line-height: 32px;">
  123. 继续添加
  124. </a-checkbox>
  125. <a-button key="back" @click="handleCancel">
  126. 取消
  127. </a-button>
  128. <a-button key="reset" @click="handleReset">
  129. 重置
  130. </a-button>
  131. <a-button key="submit" type="primary" :loading="loading" @click="handleOk">
  132. 确定
  133. </a-button>
  134. </template>
  135. </a-modal>
  136. </template>