|
@@ -5,138 +5,179 @@
|
|
|
* @Author: xinyan
|
|
|
*/
|
|
|
import { ref } from 'vue';
|
|
|
-import { FormInstance, FormRules, UploadInstance, UploadProps, UploadRawFile } from 'element-plus';
|
|
|
-import { genFileId } from 'element-plus';
|
|
|
-import router from '/@/router';
|
|
|
+import { ElIcon, ElMessage, FormInstance, FormRules, genFileId, UploadInstance, UploadProps, UploadRawFile } from 'element-plus';
|
|
|
+import { Plus } from '@element-plus/icons-vue';
|
|
|
+import { useResponse } from '/@/utils/useResponse';
|
|
|
+import * as api from '../api';
|
|
|
|
|
|
const visible = defineModel({ default: false });
|
|
|
const { employeeInfo, name } = defineProps<{
|
|
|
- employeeInfo: any;
|
|
|
- name: any;
|
|
|
+ employeeInfo: any;
|
|
|
+ name: any;
|
|
|
}>();
|
|
|
|
|
|
+const emit = defineEmits(['refresh']);
|
|
|
+
|
|
|
// 图片处理
|
|
|
const upload = ref<UploadInstance>();
|
|
|
+
|
|
|
// 表单数据
|
|
|
interface RuleForm {
|
|
|
- name: string;
|
|
|
- department: string;
|
|
|
- phone: string;
|
|
|
- email: string;
|
|
|
- user: string;
|
|
|
- macaddress: string;
|
|
|
- ipaddress: string;
|
|
|
- images: UploadFile[];
|
|
|
+ name: string;
|
|
|
+ department: string;
|
|
|
+ phone: string;
|
|
|
+ email: string;
|
|
|
+ user: string;
|
|
|
+ macaddress: string;
|
|
|
+ ipaddress: string;
|
|
|
+ images: UploadFile[];
|
|
|
}
|
|
|
|
|
|
const ruleFormRef = ref<FormInstance>();
|
|
|
const formData = reactive<RuleForm>({
|
|
|
- name: '',
|
|
|
- department: '',
|
|
|
- phone: '',
|
|
|
- email: '',
|
|
|
- images: [],
|
|
|
+ name: '',
|
|
|
+ department: '',
|
|
|
+ phone: '',
|
|
|
+ email: '',
|
|
|
+ images: [],
|
|
|
});
|
|
|
|
|
|
const rules = reactive<FormRules<RuleForm>>({
|
|
|
- name: [{ required: true, message: '请输入姓名', trigger: 'blur' }],
|
|
|
- department: [{ required: true, message: '请输入部门', trigger: 'blur' }],
|
|
|
- phone: [{ required: true, message: '请输入电话号码', trigger: 'blur' }],
|
|
|
- email: [{ required: true, message: '请输入所属商铺', trigger: 'blur' }],
|
|
|
+ name: [{ required: true, message: '请输入姓名', trigger: 'blur' }],
|
|
|
+ department: [{ required: true, message: '请输入部门', trigger: 'blur' }],
|
|
|
+ phone: [{ required: true, message: '请输入电话号码', trigger: 'blur' }],
|
|
|
+ email: [{ required: true, message: '请输入所属商铺', trigger: 'blur' }],
|
|
|
});
|
|
|
|
|
|
onBeforeMount(() => {
|
|
|
- replaceCol();
|
|
|
+ replaceCol();
|
|
|
});
|
|
|
|
|
|
// 超过图片限制时触发的回调
|
|
|
const handleExceed: UploadProps['onExceed'] = (files) => {
|
|
|
- upload.value!.clearFiles();
|
|
|
- const file = files[0] as UploadRawFile;
|
|
|
- file.uid = genFileId();
|
|
|
- upload.value!.handleStart(file);
|
|
|
+ upload.value!.clearFiles();
|
|
|
+ const file = files[0] as UploadRawFile;
|
|
|
+ file.uid = genFileId();
|
|
|
+ upload.value!.handleStart(file);
|
|
|
};
|
|
|
|
|
|
-// 保存操作
|
|
|
-const handleSave = () => {
|
|
|
- console.log(formData);
|
|
|
+const submitForm = async (formEl: FormInstance | undefined) => {
|
|
|
+ if (!formEl) return;
|
|
|
+
|
|
|
+ await formEl.validate(async (valid, fields) => {
|
|
|
+ if (valid) {
|
|
|
+ const dataToUpload = new FormData();
|
|
|
+
|
|
|
+ for (const key in formData) {
|
|
|
+ if (key !== 'images' && formData.hasOwnProperty(key)) {
|
|
|
+ dataToUpload.append(key, formData[key]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (Array.isArray(formData.images)) {
|
|
|
+ formData.images.forEach((image: any) => {
|
|
|
+ if (image.raw) {
|
|
|
+ dataToUpload.append('images', image.raw);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ const resp = await useResponse({ id: employeeInfo.id, partial: 1, dataToUpload, }, api.updateEmployeeDetail);
|
|
|
+ // 检查上传结果并提示用户
|
|
|
+ if (resp.code === 2000) {
|
|
|
+ ElMessage.success('修改成功');
|
|
|
+ visible.value = false;
|
|
|
+ emit('refresh');
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ console.error('上传失败:', error);
|
|
|
+ ElMessage.error('上传失败,请重试');
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ console.log('error submit!', fields);
|
|
|
+ }
|
|
|
+ });
|
|
|
};
|
|
|
|
|
|
-// 取消操作
|
|
|
-const handleCancel = () => {
|
|
|
- router.push({
|
|
|
- path: '/employee',
|
|
|
- });
|
|
|
+const resetForm = (formEl: FormInstance | undefined) => {
|
|
|
+ if (!formEl) return;
|
|
|
+ formEl.resetFields();
|
|
|
};
|
|
|
|
|
|
function replaceCol() {
|
|
|
- const result = Object.keys(formData).reduce((acc, key) => {
|
|
|
- if (key in employeeInfo) {
|
|
|
- acc[key] = employeeInfo[key];
|
|
|
- }
|
|
|
- return acc;
|
|
|
- }, {} as { [key: string]: any });
|
|
|
- Object.assign(formData, result);
|
|
|
+ const result = Object.keys(formData).reduce((acc, key) => {
|
|
|
+ if (key in employeeInfo) {
|
|
|
+ // 如果字段是 images,则转换图片格式
|
|
|
+ if (key === 'images' && Array.isArray(employeeInfo[key])) {
|
|
|
+ acc[key] = employeeInfo[key].map((img: { image: string }) => ({
|
|
|
+ name: '已上传图片',
|
|
|
+ url: img.image_url,
|
|
|
+ }));
|
|
|
+ } else {
|
|
|
+ acc[key] = employeeInfo[key];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return acc;
|
|
|
+ }, {} as { [key: string]: any });
|
|
|
+ Object.assign(formData, result);
|
|
|
}
|
|
|
|
|
|
-onMounted(() => {
|
|
|
- console.log('visible',visible);
|
|
|
-})
|
|
|
+onMounted(() => {});
|
|
|
</script>
|
|
|
|
|
|
<template>
|
|
|
- <el-drawer :title="`人员编辑 - ${name}`" v-model="visible" size="30%">
|
|
|
- <el-form ref="ruleFormRef" :model="formData" :rules="rules" class="employee-info-form" label-width="auto">
|
|
|
- <el-form-item label="姓名:" prop="name">
|
|
|
- <el-input v-model="formData.name" placeholder="请输入姓名" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="部门:" prop="department">
|
|
|
- <el-input v-model="formData.department" placeholder="请输入部门" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="电话号码:" prop="phone">
|
|
|
- <el-input v-model="formData.phone" placeholder="请输入电话号码" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="邮箱:" prop="email">
|
|
|
- <el-input v-model="formData.email" placeholder="请输入邮箱" />
|
|
|
- </el-form-item>
|
|
|
- <!-- 电脑图片上传 -->
|
|
|
- <el-form-item :key="images" label="电脑图片:">
|
|
|
- <el-upload
|
|
|
- ref="upload"
|
|
|
- v-model:file-list="formData.images"
|
|
|
- :auto-upload="false"
|
|
|
- :limit="1"
|
|
|
- :on-exceed="handleExceed"
|
|
|
- action="#"
|
|
|
- list-type="picture-card"
|
|
|
- >
|
|
|
- <el-icon>
|
|
|
- <Plus />
|
|
|
- </el-icon>
|
|
|
- </el-upload>
|
|
|
- </el-form-item>
|
|
|
-
|
|
|
- <!-- 按钮组 -->
|
|
|
- <el-form-item class="button-group">
|
|
|
- <el-button type="primary" @click="handleSave">保存</el-button>
|
|
|
- <el-button @click="handleCancel">取消</el-button>
|
|
|
- </el-form-item>
|
|
|
- </el-form>
|
|
|
- </el-drawer>
|
|
|
+ <el-drawer v-model="visible" :title="`人员编辑 - ${name}`" size="30%">
|
|
|
+ <el-form ref="ruleFormRef" :model="formData" :rules="rules" class="employee-info-form" label-width="auto">
|
|
|
+ <el-form-item label="姓名:" prop="name">
|
|
|
+ <el-input v-model="formData.name" placeholder="请输入姓名" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="部门:" prop="department">
|
|
|
+ <el-input v-model="formData.department" placeholder="请输入部门" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="电话号码:" prop="phone">
|
|
|
+ <el-input v-model="formData.phone" placeholder="请输入电话号码" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="邮箱:" prop="email">
|
|
|
+ <el-input v-model="formData.email" placeholder="请输入邮箱" />
|
|
|
+ </el-form-item>
|
|
|
+ <!-- 电脑图片上传 -->
|
|
|
+ <el-form-item :key="images" label="电脑图片:">
|
|
|
+ <el-upload
|
|
|
+ ref="upload"
|
|
|
+ v-model:file-list="formData.images"
|
|
|
+ :auto-upload="false"
|
|
|
+ :limit="1"
|
|
|
+ :on-exceed="handleExceed"
|
|
|
+ action="#"
|
|
|
+ list-type="picture-card"
|
|
|
+ >
|
|
|
+ <el-icon>
|
|
|
+ <Plus />
|
|
|
+ </el-icon>
|
|
|
+ </el-upload>
|
|
|
+ </el-form-item>
|
|
|
+
|
|
|
+ <!-- 按钮组 -->
|
|
|
+ <el-form-item class="button-group">
|
|
|
+ <el-button type="primary" @click="submitForm(ruleFormRef)">保存</el-button>
|
|
|
+ <el-button @click="resetForm(ruleFormRef)">取消</el-button>
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ </el-drawer>
|
|
|
</template>
|
|
|
|
|
|
<style scoped>
|
|
|
.employee-info-form {
|
|
|
- padding: 20px;
|
|
|
+ padding: 20px;
|
|
|
}
|
|
|
|
|
|
.button-group {
|
|
|
- margin-top: 20px;
|
|
|
- text-align: center;
|
|
|
+ margin-top: 20px;
|
|
|
+ text-align: center;
|
|
|
}
|
|
|
|
|
|
.employee-info-form :deep(.el-form-item__label) {
|
|
|
- font-size: 14px;
|
|
|
- font-weight: 500;
|
|
|
+ font-size: 14px;
|
|
|
+ font-weight: 500;
|
|
|
}
|
|
|
</style>
|