index.vue 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. <template>
  2. <div ref="mod">
  3. <a-modal
  4. :get-container="() => $refs.mod"
  5. :open="open"
  6. :title="title"
  7. :mask-closable="false"
  8. @cancel="cancel"
  9. :footer="null"
  10. >
  11. <a-form ref="formRef" :model="formState" :label-col="{ style: { width: '80px' } }">
  12. <a-form-item
  13. label="设备ID"
  14. name="deviceId"
  15. :rules="[
  16. {
  17. required: true,
  18. validator: deviceIdValidator,
  19. trigger: ['blur'],
  20. },
  21. ]"
  22. >
  23. <a-input
  24. v-model:value="formState.deviceId"
  25. placeholder="请输入设备ID"
  26. :maxlength="12"
  27. show-count
  28. allow-clear
  29. />
  30. </a-form-item>
  31. <a-form-item
  32. label="设备类型"
  33. name="deviceType"
  34. :rules="[{ required: true, message: '请选择设备类型' }]"
  35. >
  36. <a-select v-model:value="formState.deviceType" placeholder="请选择设备类型">
  37. <a-select-option value="1">LNA</a-select-option>
  38. <a-select-option value="2">LNB</a-select-option>
  39. </a-select>
  40. </a-form-item>
  41. <a-form-item
  42. label="固件版本"
  43. name="firmwareVersion"
  44. :rules="[{ required: true, message: '请输入固件版本' }]"
  45. >
  46. <a-input v-model:value="formState.firmwareVersion" placeholder="请输入固件版本" />
  47. </a-form-item>
  48. <a-form-item label="归属租户" name="tenantId">
  49. <a-select
  50. v-model:value="formState.tenantId"
  51. placeholder="请选择归属租户"
  52. :options="props.options"
  53. >
  54. </a-select>
  55. </a-form-item>
  56. </a-form>
  57. <div class="footer">
  58. <a-space>
  59. <a-button @click="cancel">取消</a-button>
  60. <a-button type="primary" :loading="submitLoading" @click="submit">确定</a-button>
  61. </a-space>
  62. </div>
  63. </a-modal>
  64. </div>
  65. </template>
  66. <script setup lang="ts">
  67. import { ref, reactive } from 'vue'
  68. import { message, type FormInstance } from 'ant-design-vue'
  69. import * as deviceApi from '@/api/device'
  70. import type { Rule } from 'ant-design-vue/es/form'
  71. defineOptions({
  72. name: 'addDevice',
  73. })
  74. const formRef = ref<FormInstance>()
  75. type Props = {
  76. open: boolean
  77. title: string
  78. options?: {
  79. value: string
  80. label: string
  81. }[]
  82. }
  83. const emit = defineEmits<{
  84. (e: 'update:open', value: boolean): void
  85. (e: 'success', value: void): void
  86. }>()
  87. const props = withDefaults(defineProps<Props>(), {
  88. open: false,
  89. title: '',
  90. options: () => [],
  91. })
  92. const formState = reactive({
  93. deviceId: '',
  94. deviceType: 'LNA',
  95. softVersion: '',
  96. firmwareVersion: '',
  97. tenantId: null as null | string,
  98. })
  99. const cancel = () => {
  100. formRef?.value?.resetFields()
  101. emit('update:open', false)
  102. }
  103. // 设备ID校验,16进制12个字符
  104. const deviceIdValidator = async (_rule: Rule, value: string) => {
  105. if (!value) {
  106. return Promise.reject(new Error('请输入设备ID'))
  107. }
  108. if (!/^[0-9a-fA-F]{12}$/.test(value)) {
  109. return Promise.reject(new Error('设备ID不合法,须为12位十六进制字符(0-9,a-f或A-F)'))
  110. }
  111. return Promise.resolve()
  112. }
  113. const submitLoading = ref(false)
  114. // 确定
  115. const submit = () => {
  116. formRef?.value
  117. ?.validate()
  118. .then(() => {
  119. console.log('校验通过', formState)
  120. submitLoading.value = true
  121. deviceApi
  122. .addDevice({
  123. clientId: formState.deviceId,
  124. devType: formState.deviceType,
  125. hardware: formState.firmwareVersion,
  126. tenantId: formState.tenantId,
  127. })
  128. .then((res) => {
  129. console.log('添加成功', res)
  130. submitLoading.value = false
  131. message.success('添加成功')
  132. emit('success')
  133. cancel()
  134. })
  135. .catch(() => {
  136. submitLoading.value = false
  137. })
  138. })
  139. .catch((err) => {
  140. console.log('校验失败', err)
  141. })
  142. }
  143. </script>
  144. <style scoped lang="less">
  145. :deep(.ant-modal) {
  146. .footer {
  147. text-align: right;
  148. }
  149. }
  150. </style>