CreateComputer.vue 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. <script lang="ts" setup>
  2. /**
  3. * @Name: CreateComputer.vue
  4. * @Description:
  5. * @Author: xinyan
  6. */
  7. import { ElMessage, FormInstance, FormRules } from 'element-plus';
  8. import { useResponse } from '/@/utils/useResponse';
  9. import * as api from '../api';
  10. const showDialog = defineModel({ default: false });
  11. const emit = defineEmits([ 'refresh' ]);
  12. const { shopOptions, userOptions } = defineProps<{
  13. shopOptions: any;
  14. userOptions: any;
  15. }>();
  16. // 图片处理
  17. const upload = ref<UploadInstance>();
  18. // 表单数据
  19. interface RuleForm {
  20. computerNumber: string;
  21. computerType: string;
  22. station: string;
  23. shop: string;
  24. user: string;
  25. macaddress: string;
  26. ipaddress: string;
  27. images: UploadFile[];
  28. }
  29. const ruleFormRef = ref<FormInstance>();
  30. const formData = reactive<RuleForm>({
  31. computerNumber: '',
  32. computerType: '',
  33. station: '',
  34. shop: '',
  35. user: '',
  36. macaddress: '',
  37. ipaddress: '',
  38. images: [],
  39. });
  40. const rules = reactive<FormRules<RuleForm>>({
  41. computerNumber: [{ required: true, message: '请输入电脑编号', trigger: 'blur' }],
  42. computerType: [{ required: true, message: '请输入电脑类型', trigger: 'blur' }],
  43. station: [{ required: true, message: '请输入工位号', trigger: 'blur' }],
  44. shop: [{ required: true, message: '请输入所属商铺', trigger: 'blur' }],
  45. user: [{ required: true, message: '请输入电脑使用人', trigger: 'blur' }],
  46. macaddress: [{ required: true, message: '请输入MAC地址', trigger: 'blur' }],
  47. ipaddress: [{ required: true, message: '请输入IP地址', trigger: 'blur' }],
  48. });
  49. // 超过图片限制时触发的回调
  50. const handleExceed: UploadProps['onExceed'] = (files) => {
  51. upload.value!.clearFiles();
  52. const file = files[0] as UploadRawFile;
  53. file.uid = genFileId();
  54. upload.value!.handleStart(file);
  55. };
  56. const submitForm = async (formEl: FormInstance | undefined) => {
  57. if (!formEl) return;
  58. await formEl.validate((valid, fields) => {
  59. if (valid) {
  60. handleSave();
  61. showDialog.value = false;
  62. emit('refresh');
  63. } else {
  64. ElMessage.error('添加失败');
  65. }
  66. });
  67. };
  68. // 保存操作
  69. async function handleSave() {
  70. const bodyData = new FormData();
  71. const fieldsToAppend = ['computerNumber', 'computerType', 'station', 'user', 'macaddress', 'ipaddress'];
  72. fieldsToAppend.forEach((field) => {
  73. bodyData.append(field, formData[field as keyof RuleForm]);
  74. });
  75. const shopValue = Array.isArray(formData.shop) ? formData.shop.join(',') : formData.shop;
  76. bodyData.append('shops', shopValue);
  77. if (formData.images.length > 0 && formData.images[0].raw) {
  78. bodyData.append('images', formData.images[0].raw);
  79. }
  80. const resp = await useResponse(bodyData, api.createComputer);
  81. if (resp.code === 2000) {
  82. ElMessage.success('添加成功');
  83. }
  84. }
  85. // 取消操作
  86. const handleCancel = () => {
  87. showDialog.value = false;
  88. };
  89. onMounted(() => {});
  90. </script>
  91. <template>
  92. <el-dialog v-model="showDialog" :close-on-click-modal="false" title="新增电脑信息" width="35%">
  93. <el-form ref="ruleFormRef" :model="formData" :rules="rules" class="computer-info-form" label-width="auto" status-icon>
  94. <el-form-item label="电脑编号:" prop="computerNumber">
  95. <el-input v-model="formData.computerNumber" placeholder="请输入电脑编号" />
  96. </el-form-item>
  97. <el-form-item label="电脑类型:" prop="computerType">
  98. <el-input v-model="formData.computerType" placeholder="请输入电脑类型" />
  99. </el-form-item>
  100. <el-form-item label="工位号:" prop="station">
  101. <el-input v-model="formData.station" placeholder="请输入工位号" />
  102. </el-form-item>
  103. <el-form-item label="所属店铺:" prop="shop">
  104. <el-select v-model="formData.shop" clearable collapse-tags filterable multiple placeholder="请选择店铺">
  105. <el-option v-for="shop in shopOptions" :key="shop.value" :label="shop.label" :value="shop.value" />
  106. </el-select>
  107. </el-form-item>
  108. <el-form-item label="电脑使用人:" prop="user">
  109. <el-select v-model="formData.user" placeholder="请选择电脑使用人">
  110. <el-option v-for="user in userOptions" :key="user.value" :label="user.label" :value="user.value" />
  111. </el-select>
  112. </el-form-item>
  113. <el-form-item label="MAC地址:" prop="macaddress">
  114. <el-input v-model="formData.macaddress" placeholder="请输入MAC地址" />
  115. </el-form-item>
  116. <el-form-item label="使用IP地址:" prop="ipaddress">
  117. <el-input v-model="formData.ipaddress" placeholder="请输入IP地址" />
  118. </el-form-item>
  119. <!-- 电脑图片上传 -->
  120. <el-form-item :key="images" label="电脑图片:">
  121. <el-upload
  122. ref="upload"
  123. v-model:file-list="formData.images"
  124. :auto-upload="false"
  125. :limit="1"
  126. :on-exceed="handleExceed"
  127. action="#"
  128. list-type="picture-card"
  129. >
  130. <el-icon>
  131. <Plus />
  132. </el-icon>
  133. </el-upload>
  134. </el-form-item>
  135. </el-form>
  136. <template #footer>
  137. <div class="dialog-footer">
  138. <el-button type="primary" @click="submitForm(ruleFormRef)">保存</el-button>
  139. <el-button @click="handleCancel">取消</el-button>
  140. </div>
  141. </template>
  142. </el-dialog>
  143. </template>
  144. <style scoped>
  145. .dialog-footer {
  146. margin-bottom: 10px;
  147. text-align: center;
  148. }
  149. </style>