EditEmployeeInfo.vue 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. <script lang="ts" setup>
  2. /**
  3. * @Name: EditEmployeeInfo.vue
  4. * @Description: 编辑电脑信息
  5. * @Author: xinyan
  6. */
  7. import { ref } from 'vue';
  8. import { ElIcon, ElMessage, FormInstance, FormRules, genFileId, UploadInstance, UploadProps, UploadRawFile } from 'element-plus';
  9. import { Plus } from '@element-plus/icons-vue';
  10. import { useResponse } from '/@/utils/useResponse';
  11. import * as api from '../api';
  12. const visible = defineModel({ default: false });
  13. const { employeeOverview, name } = defineProps<{
  14. employeeOverview: any;
  15. name: any;
  16. }>();
  17. const emit = defineEmits(['refresh']);
  18. // 图片处理
  19. const upload = ref<UploadInstance>();
  20. // 表单数据
  21. interface RuleForm {
  22. name: string;
  23. department: string;
  24. phone: string;
  25. email: string;
  26. user: string;
  27. macaddress: string;
  28. ipaddress: string;
  29. images: UploadFile[];
  30. }
  31. const ruleFormRef = ref<FormInstance>();
  32. const formData = reactive<RuleForm>({
  33. name: '',
  34. department: '',
  35. phone: '',
  36. email: '',
  37. images: [],
  38. });
  39. const rules = reactive<FormRules<RuleForm>>({
  40. name: [{ required: true, message: '请输入姓名', trigger: 'blur' }],
  41. department: [{ required: true, message: '请输入部门', trigger: 'blur' }],
  42. phone: [{ required: true, message: '请输入电话号码', trigger: 'blur' },
  43. { pattern: /^[0-9]{11}$/, message: '请输入正确的手机号码', trigger: 'blur' },
  44. ],
  45. email: [{ required: true, message: '请输入邮箱', trigger: 'blur' },
  46. { type: 'email', message: '请输入正确的邮箱格式', trigger: 'blur' }],
  47. });
  48. const previewVisible = ref(false); // 控制预览对话框的显示
  49. const previewImage = ref('');
  50. onBeforeMount(() => {
  51. replaceCol();
  52. });
  53. // 超过图片限制时触发的回调
  54. const handleExceed: UploadProps['onExceed'] = (files) => {
  55. upload.value!.clearFiles();
  56. const file = files[0] as UploadRawFile;
  57. file.uid = genFileId();
  58. upload.value!.handleStart(file);
  59. };
  60. const handlePreview = (file) => {
  61. previewImage.value = file.url || URL.createObjectURL(file.raw); // 获取图片 URL
  62. previewVisible.value = true; // 显示对话框
  63. };
  64. const submitForm = async (formEl: FormInstance | undefined) => {
  65. if (!formEl) return;
  66. await formEl.validate(async (valid, fields) => {
  67. if (valid) {
  68. const dataToUpload = new FormData();
  69. for (const key in formData) {
  70. if (key !== 'images' && formData.hasOwnProperty(key)) {
  71. dataToUpload.append(key, formData[key]);
  72. }
  73. }
  74. if (Array.isArray(formData.images)) {
  75. formData.images.forEach((image: any) => {
  76. if (image.raw) {
  77. dataToUpload.append('images', image.raw);
  78. }
  79. });
  80. }
  81. try {
  82. const resp = await useResponse({ id: employeeOverview.id, partial: 1, dataToUpload, }, api.updateEmployeeDetail);
  83. // 检查上传结果并提示用户
  84. if (resp.code === 2000) {
  85. ElMessage.success('修改成功');
  86. visible.value = false;
  87. emit('refresh');
  88. }
  89. } catch (error) {
  90. console.error('上传失败:', error);
  91. ElMessage.error('上传失败,请重试');
  92. }
  93. } else {
  94. console.log('error submit!', fields);
  95. }
  96. });
  97. };
  98. const resetForm = (formEl: FormInstance | undefined) => {
  99. if (!formEl) return;
  100. visible.value = false;
  101. formEl.resetFields();
  102. };
  103. function replaceCol() {
  104. const result = Object.keys(formData).reduce((acc, key) => {
  105. if (key in employeeOverview) {
  106. // 如果字段是 images,则转换图片格式
  107. if (key === 'images' && Array.isArray(employeeOverview[key])) {
  108. acc[key] = employeeOverview[key].map((img: { image: string }) => ({
  109. name: '已上传图片',
  110. url: img.image_url,
  111. }));
  112. } else {
  113. acc[key] = employeeOverview[key];
  114. }
  115. }
  116. return acc;
  117. }, {} as { [key: string]: any });
  118. Object.assign(formData, result);
  119. }
  120. onMounted(() => {});
  121. </script>
  122. <template>
  123. <el-drawer v-model="visible" :title="`人员编辑 - ${name}`" size="30%">
  124. <el-form ref="ruleFormRef" :model="formData" :rules="rules" class="employee-info-form" label-width="auto">
  125. <el-form-item label="姓名:" prop="name">
  126. <el-input v-model="formData.name" placeholder="请输入姓名" />
  127. </el-form-item>
  128. <el-form-item label="部门:" prop="department">
  129. <el-input v-model="formData.department" placeholder="请输入部门" />
  130. </el-form-item>
  131. <el-form-item label="电话号码:" prop="phone">
  132. <el-input v-model="formData.phone" placeholder="请输入电话号码" />
  133. </el-form-item>
  134. <el-form-item label="邮箱:" prop="email">
  135. <el-input v-model="formData.email" placeholder="请输入邮箱" />
  136. </el-form-item>
  137. <!-- 电脑图片上传 -->
  138. <el-form-item :key="images" label="电脑图片:">
  139. <el-upload
  140. ref="upload"
  141. v-model:file-list="formData.images"
  142. :auto-upload="false"
  143. :limit="1"
  144. :on-exceed="handleExceed"
  145. action="#"
  146. list-type="picture-card"
  147. accept="image/*"
  148. :on-preview="handlePreview"
  149. >
  150. <el-icon>
  151. <Plus />
  152. </el-icon>
  153. </el-upload>
  154. </el-form-item>
  155. <!-- 按钮组 -->
  156. <el-form-item class="button-group">
  157. <el-button type="primary" @click="submitForm(ruleFormRef)">保存</el-button>
  158. <el-button @click="resetForm(ruleFormRef)">取消</el-button>
  159. </el-form-item>
  160. </el-form>
  161. <!-- 预览对话框 -->
  162. <el-dialog v-model="previewVisible" width="30%" height="30%">
  163. <img :src="previewImage" alt="预览图" style="width: 100%; height: auto;" />
  164. </el-dialog>
  165. </el-drawer>
  166. </template>
  167. <style scoped>
  168. .employee-info-form {
  169. padding: 20px;
  170. }
  171. .button-group {
  172. margin-top: 20px;
  173. text-align: center;
  174. }
  175. .employee-info-form :deep(.el-form-item__label) {
  176. font-size: 14px;
  177. font-weight: 500;
  178. }
  179. </style>