CreateEmployee.vue 4.1 KB

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