EditEmployeeInfo.vue 5.5 KB

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