CreateEmployee.vue 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. <script lang="ts" setup>
  2. /**
  3. * @Name: CreateEmployee.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. // 图片处理
  12. const upload = ref<UploadInstance>();
  13. // 表单数据
  14. interface RuleForm {
  15. name: string;
  16. department: string;
  17. phone: string;
  18. email: string;
  19. user: string;
  20. macaddress: string;
  21. ipaddress: string;
  22. images: UploadFile[];
  23. }
  24. const ruleFormRef = ref<FormInstance>();
  25. const formData = reactive<RuleForm>({
  26. name: '',
  27. department: '',
  28. phone: '',
  29. email: '',
  30. images: [],
  31. });
  32. const rules = reactive<FormRules<RuleForm>>({
  33. name: [{ required: true, message: '请输入姓名', trigger: 'blur' }],
  34. department: [{ required: true, message: '请输入部门', trigger: 'blur' }],
  35. phone: [{ required: true, message: '请输入电话号码', trigger: 'blur' }],
  36. email: [{ required: true, message: '请输入所属商铺', trigger: 'blur' }],
  37. });
  38. // 超过图片限制时触发的回调
  39. const handleExceed: UploadProps['onExceed'] = (files) => {
  40. upload.value!.clearFiles();
  41. const file = files[0] as UploadRawFile;
  42. file.uid = genFileId();
  43. upload.value!.handleStart(file);
  44. };
  45. const submitForm = async (formEl: FormInstance | undefined) => {
  46. if (!formEl) return
  47. await formEl.validate((valid, fields) => {
  48. if (valid) {
  49. handleSave();
  50. ElMessage.success('添加成功');
  51. } else {
  52. ElMessage.error('添加失败');
  53. }
  54. })
  55. }
  56. // 保存操作
  57. async function handleSave() {
  58. const bodyData = new FormData();
  59. const fieldsToAppend = ['name', 'department', 'phone', 'email'];
  60. fieldsToAppend.forEach((field) => {
  61. bodyData.append(field, formData[field as keyof RuleForm]);
  62. });
  63. // 处理图片文件,将每个图片文件对象添加到 FormData 中
  64. const imageFile = formData.images[0]?.raw; // 获取 raw 属性中的 File 对象
  65. if (imageFile instanceof File) {
  66. bodyData.append('images', imageFile); // 使用 'images' 作为字段名,将 File 对象添加到 FormData 中
  67. }
  68. await useResponse(bodyData, api.createEmployee);
  69. }
  70. // 取消操作
  71. const handleCancel = () => {
  72. showDialog.value = false;
  73. };
  74. onMounted(() => {
  75. })
  76. </script>
  77. <template>
  78. <el-dialog v-model="showDialog" :close-on-click-modal="false" title="新增电脑信息" width="35%">
  79. <el-form
  80. ref="ruleFormRef"
  81. :model="formData"
  82. :rules="rules"
  83. class="employee-info-form"
  84. label-width="auto"
  85. status-icon>
  86. <el-form-item label="姓名:" prop="name">
  87. <el-input v-model="formData.name" placeholder="请输入姓名" />
  88. </el-form-item>
  89. <el-form-item label="部门:" prop="department">
  90. <el-input v-model="formData.department" placeholder="请输入部门" />
  91. </el-form-item>
  92. <el-form-item label="电话号码:" prop="phone">
  93. <el-input v-model="formData.phone" placeholder="请输入电话号码" />
  94. </el-form-item>
  95. <el-form-item label="邮箱:" prop="email">
  96. <el-input v-model="formData.email" placeholder="请输入邮箱" />
  97. </el-form-item>
  98. <!-- 人员图片上传 -->
  99. <el-form-item :key="images" label="人员图片:">
  100. <el-upload
  101. ref="upload"
  102. v-model:file-list="formData.images"
  103. :auto-upload="false"
  104. :limit="1"
  105. :on-exceed="handleExceed"
  106. action="#"
  107. list-type="picture-card"
  108. >
  109. <el-icon>
  110. <Plus />
  111. </el-icon>
  112. </el-upload>
  113. </el-form-item>
  114. </el-form>
  115. <template #footer>
  116. <div class="dialog-footer">
  117. <el-button type="primary" @click="submitForm(ruleFormRef)">保存</el-button>
  118. <el-button @click="handleCancel">取消</el-button>
  119. </div>
  120. </template>
  121. </el-dialog>
  122. </template>
  123. <style scoped>
  124. .dialog-footer {
  125. margin-bottom: 10px;
  126. text-align: center;
  127. }
  128. </style>