EditComputerInfo.vue 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. <script lang="ts" setup>
  2. /**
  3. * @Name: EditComputerInfo.vue
  4. * @Description: 编辑电脑信息
  5. * @Author: xinyan
  6. */
  7. import { ref } from 'vue';
  8. import { ElMessage, FormInstance, FormRules, UploadInstance, UploadProps, UploadRawFile } from 'element-plus';
  9. import { genFileId } from 'element-plus';
  10. import { useResponse } from '/@/utils/useResponse';
  11. import * as api from '../api';
  12. import { EditPen, Picture as IconPicture, Plus, Search } from '@element-plus/icons-vue';
  13. const visible = defineModel({ default: false });
  14. const { computerInfo, computerNumber , userOptions, shopOptions } = defineProps<{
  15. computerInfo: any;
  16. computerNumber: any;
  17. userOptions: any;
  18. shopOptions: any;
  19. }>();
  20. const emit = defineEmits(['refresh']);
  21. // 图片处理
  22. const upload = ref<UploadInstance>();
  23. // 表单数据
  24. const ruleFormRef = ref<FormInstance>();
  25. const formData = reactive<RuleForm>({
  26. computerNumber: '',
  27. computerType: '',
  28. station: '',
  29. shop: '',
  30. user: '',
  31. macaddress: '',
  32. ipaddress: '',
  33. images: [],
  34. });
  35. const rules = reactive<FormRules<RuleForm>>({
  36. computerNumber: [{ required: true, message: '请输入电脑编号', trigger: 'blur' }],
  37. computerType: [{ required: true, message: '请输入电脑类型', trigger: 'blur' }],
  38. station: [{ required: true, message: '请输入所在站点', trigger: 'blur' }],
  39. shop: [{ required: true, message: '请输入所属商铺', trigger: 'blur' }],
  40. user: [{ required: true, message: '请输入使用者', trigger: 'blur' }],
  41. macaddress: [{ required: true, message: '请输入MAC地址', trigger: 'blur' }],
  42. ipaddress: [{ required: true, message: '请输入IP地址', trigger: 'blur' }],
  43. });
  44. onBeforeMount(() => {
  45. replaceCol();
  46. });
  47. // 超过图片限制时触发的回调
  48. const handleExceed: UploadProps['onExceed'] = (files) => {
  49. upload.value!.clearFiles();
  50. const file = files[0] as UploadRawFile;
  51. file.uid = genFileId();
  52. upload.value!.handleStart(file);
  53. };
  54. // 保存操作
  55. const submitForm = async (formEl: FormInstance | undefined) => {
  56. if (!formEl) return;
  57. await formEl.validate(async (valid, fields) => {
  58. if (valid) {
  59. const dataToUpload = new FormData();
  60. // for (const key in formData) {
  61. // if (key !== 'images' && formData.hasOwnProperty(key)) {
  62. // dataToUpload.append(key, formData[key]);
  63. // }
  64. // }
  65. const fieldsToAppend = ['computerNumber', 'computerType', 'station', 'user', 'macaddress', 'ipaddress'];
  66. fieldsToAppend.forEach((field) => {
  67. dataToUpload.append(field, formData[field as keyof RuleForm]);
  68. });
  69. const shopValue = Array.isArray(formData.shop) ? formData.shop.join(',') : formData.shop;
  70. dataToUpload.append('shops', shopValue);
  71. if (Array.isArray(formData.images)) {
  72. formData.images.forEach((image: any) => {
  73. if (image.raw) {
  74. dataToUpload.append('images', image.raw);
  75. }
  76. });
  77. }
  78. try {
  79. const resp = await useResponse({ id: computerInfo.id, partial: 1, dataToUpload, }, api.updateComputerDetail);
  80. // 检查上传结果并提示用户
  81. if (resp.code === 2000) {
  82. ElMessage.success('修改成功');
  83. visible.value = false;
  84. emit('refresh');
  85. }
  86. } catch (error) {
  87. console.error('上传失败:', error);
  88. ElMessage.error('上传失败,请重试');
  89. }
  90. } else {
  91. console.log('error submit!', fields);
  92. }
  93. });
  94. };
  95. const resetForm = (formEl: FormInstance | undefined) => {
  96. if (!formEl) return;
  97. formEl.resetFields();
  98. };
  99. function replaceCol() {
  100. const result = Object.keys(formData).reduce((acc, key) => {
  101. if (key in computerInfo) {
  102. if (key === 'images' && Array.isArray(computerInfo[key])) {
  103. acc[key] = computerInfo[key].map((img: { image: string }) => ({
  104. name: '已上传图片',
  105. url: img.image_url,
  106. }));
  107. } else {
  108. acc[key] = computerInfo[key];
  109. }
  110. }
  111. return acc;
  112. }, {} as { [key: string]: any });
  113. Object.assign(formData, result);
  114. console.log(formData.images[0].url);
  115. }
  116. function handleImageError(file) {
  117. // 当图片加载失败时,设置 file 对象的 error 状态为 true
  118. file.error = true;
  119. }
  120. </script>
  121. <template>
  122. <el-drawer :title="`电脑编辑 - ${computerNumber}`" v-model="visible" size="30%">
  123. <el-form ref="ruleFormRef" :model="formData" :rules="rules" class="computer-info-form" label-width="auto">
  124. <el-form-item label="电脑编号:" prop="computerNumber">
  125. <el-input v-model="formData.computerNumber" placeholder="请输入电脑编号" />
  126. </el-form-item>
  127. <el-form-item label="电脑类型:" prop="computerType">
  128. <el-input v-model="formData.computerType" placeholder="请输入电脑类型" />
  129. </el-form-item>
  130. <el-form-item label="工位号:" prop="station">
  131. <el-input v-model="formData.station" placeholder="请输入工位号" />
  132. </el-form-item>
  133. <el-form-item label="所属店铺:" prop="shop">
  134. <el-select v-model="formData.shop" clearable filterable multiple collapse-tags placeholder="请选择店铺">
  135. <el-option v-for="shop in shopOptions" :key="shop.value" :label="shop.label" :value="shop.value" />
  136. </el-select>
  137. </el-form-item>
  138. <el-form-item label="电脑使用人:" prop="user">
  139. <el-select v-model="formData.user" placeholder="请选择电脑使用人">
  140. <el-option v-for="user in userOptions" :key="user.value" :label="user.label" :value="user.value" />
  141. </el-select>
  142. </el-form-item>
  143. <el-form-item label="MAC地址:" prop="macaddress">
  144. <el-input v-model="formData.macaddress" placeholder="请输入MAC地址" />
  145. </el-form-item>
  146. <el-form-item label="使用IP地址:" prop="ipaddress">
  147. <el-input v-model="formData.ipaddress" placeholder="请输入IP地址" />
  148. </el-form-item>
  149. <!-- 电脑图片上传 -->
  150. <el-form-item :key="images" label="电脑图片:">
  151. <el-upload
  152. ref="upload"
  153. v-model:file-list="formData.images"
  154. :auto-upload="false"
  155. :limit="1"
  156. :on-exceed="handleExceed"
  157. action="#"
  158. list-type="picture-card"
  159. >
  160. <el-icon>
  161. <Plus />
  162. </el-icon>
  163. </el-upload>
  164. </el-form-item>
  165. <!-- 按钮组 -->
  166. <el-form-item class="button-group">
  167. <el-button type="primary" @click="submitForm(ruleFormRef)">保存</el-button>
  168. <el-button @click="resetForm(ruleFormRef)">取消</el-button>
  169. </el-form-item>
  170. </el-form>
  171. </el-drawer>
  172. </template>
  173. <style scoped>
  174. .computer-info-form {
  175. padding: 20px;
  176. }
  177. .button-group {
  178. margin-top: 20px;
  179. text-align: center;
  180. }
  181. .computer-info-form :deep(.el-form-item__label) {
  182. font-size: 14px;
  183. font-weight: 500;
  184. }
  185. </style>