Commit 56387946 authored by 刘斌's avatar 刘斌

fix: 完善图片上传

parent 32f8f25c
...@@ -6,5 +6,7 @@ ...@@ -6,5 +6,7 @@
// biome-ignore lint: disable // biome-ignore lint: disable
export {} export {}
declare global { declare global {
const showFailToast: typeof import('vant/es').showFailToast
const showSuccessToast: typeof import('vant/es').showSuccessToast
const showToast: typeof import('vant/es').showToast
} }
...@@ -12,11 +12,9 @@ export default defineConfig({ ...@@ -12,11 +12,9 @@ export default defineConfig({
rspack: { rspack: {
plugins: [ plugins: [
AutoImport({ AutoImport({
dts: 'auto-imports.d.ts',
resolvers: [VantResolver()], resolvers: [VantResolver()],
}), }),
Components({ Components({
dts: 'components.d.ts',
resolvers: [VantResolver()], resolvers: [VantResolver()],
}), }),
], ],
...@@ -26,7 +24,7 @@ export default defineConfig({ ...@@ -26,7 +24,7 @@ export default defineConfig({
proxy: { proxy: {
// http://localhost:3000/api -> http://localhost:3000/api // http://localhost:3000/api -> http://localhost:3000/api
// http://localhost:3000/api/foo -> http://localhost:3000/api/foo // http://localhost:3000/api/foo -> http://localhost:3000/api/foo
'/api': 'http://localhost:9000/api', '/api': 'http://localhost:9000',
}, },
}, },
}); });
...@@ -77,7 +77,13 @@ ...@@ -77,7 +77,13 @@
/> />
<van-field name="photo" label="照片"> <van-field name="photo" label="照片">
<template #input> <template #input>
<van-uploader v-model="form.photoList" :max-count="1" /> <van-uploader
v-model="form.photoList"
:max-count="1"
:max-size="20 * 1024 * 1024"
:after-read="afterRead"
@oversize="onOversize"
/>
</template> </template>
</van-field> </van-field>
<van-field <van-field
...@@ -149,6 +155,8 @@ ...@@ -149,6 +155,8 @@
<van-date-picker <van-date-picker
v-model="birthValues" v-model="birthValues"
title="选择日期" title="选择日期"
:min-date="minDate"
:max-date="maxDate"
@confirm="onBirthConfirm" @confirm="onBirthConfirm"
@cancel="showBirthPicker = false" @cancel="showBirthPicker = false"
/> />
...@@ -159,14 +167,15 @@ ...@@ -159,14 +167,15 @@
<script setup lang="ts"> <script setup lang="ts">
import { reactive, ref, watch } from 'vue'; import { reactive, ref, watch } from 'vue';
import axios from 'axios'; import axios from 'axios';
import { showSuccessToast, showFailToast } from 'vant'; import type {UploaderFileListItem} from 'vant';
const form = reactive({ const form = reactive({
name: '', name: '',
phoneNumber: '', phoneNumber: '',
gender: '0', gender: '0',
genderText: '男', genderText: '男',
photoList: [] as unknown[], photoList: [] as UploaderFileListItem[],
ossId: 0,
idCardNumber: '', idCardNumber: '',
birthDate: '', birthDate: '',
age: '' as number | '', age: '' as number | '',
...@@ -181,6 +190,8 @@ const form = reactive({ ...@@ -181,6 +190,8 @@ const form = reactive({
emergencyContactPhone: '', emergencyContactPhone: '',
householdRegistrationAddress: '', householdRegistrationAddress: '',
}); });
const minDate = new Date(1960, 0, 1);
const maxDate = new Date(2025, 0, 1);
const phoneRules = [ const phoneRules = [
{ required: true, message: '请填写手机号码' }, { required: true, message: '请填写手机号码' },
...@@ -198,6 +209,51 @@ const ageRules = [{ pattern: /^\d{1,3}$/, message: '年龄格式错误' }]; ...@@ -198,6 +209,51 @@ const ageRules = [{ pattern: /^\d{1,3}$/, message: '年龄格式错误' }];
const showPoliticalPicker = ref(false); const showPoliticalPicker = ref(false);
const showBirthPicker = ref(false); const showBirthPicker = ref(false);
const submitting = ref(false); const submitting = ref(false);
const submitSuccess = ref(false);
// function beforeRead(file: File | File[]) {
// const files = Array.isArray(file) ? file : [file];
// const limit = 20 * 1024 * 1024;
// const ok = files.every((f) => f.size <= limit);
// if (!ok) {
// showFailToast('文件大小不能超过20MB');
// }
// return ok;
// }
async function afterRead(item: UploaderFileListItem) {
// const items = Array.isArray(file) ? file : [file];
// for (const item of items) {
try {
const fd = new FormData();
fd.append('file', item.file as File);
const { data: responseData, status } = await axios.post('/api/employee/info/photo/upload', fd, {
headers: { 'Content-Type': 'multipart/form-data' },
timeout: 60_000,
});
if (status >= 200 && status < 300) {
if (responseData.success) {
const data = responseData.data;
console.log('[data]', data);
const url = data.url;
if (url) {
form.ossId = data.ossId;
item.url = url;
}
// submitSuccess.value = true;
// showSuccessToast({message: '提交成功', duration: 5000});
} else {
showFailToast('提交失败');
}
} else {
showFailToast('提交失败');
}
} catch (e) {
showFailToast('图片上传失败');
}
// }
}
function onOversize() {
showFailToast('文件大小不能超过20MB');
}
const politicalOptions = [ const politicalOptions = [
{ value: '1', text: '党员' }, { value: '1', text: '党员' },
...@@ -219,7 +275,7 @@ const politicalOptions = [ ...@@ -219,7 +275,7 @@ const politicalOptions = [
// value: o.key, // value: o.key,
// })); // }));
const birthValues = ref<string[]>([]); const birthValues = ref<string[]>(['2000', '01', '01']);
void [ageRules, politicalOptions, birthValues]; void [ageRules, politicalOptions, birthValues];
...@@ -258,6 +314,10 @@ watch( ...@@ -258,6 +314,10 @@ watch(
); );
async function onSubmit() { async function onSubmit() {
if (submitSuccess.value) {
showToast('您已提交\n无需再次提交');
return;
}
if (submitting.value) return; if (submitting.value) return;
submitting.value = true; submitting.value = true;
try { try {
...@@ -276,14 +336,18 @@ async function onSubmit() { ...@@ -276,14 +336,18 @@ async function onSubmit() {
emergencyContact: form.emergencyContact, emergencyContact: form.emergencyContact,
emergencyContactPhone: form.emergencyContactPhone, emergencyContactPhone: form.emergencyContactPhone,
householdRegistrationAddress: form.householdRegistrationAddress, householdRegistrationAddress: form.householdRegistrationAddress,
photo: Array.isArray(form.photoList) ossId: form.ossId,
? form.photoList.map((i: any) => i.url || i.content || '') // photo:
: [], // Array.isArray(form.photoList) && form.photoList.length
// ? ((form.photoList[0] as { url?: string;}).url ||
// '')
// : '',
}; };
const { data: responseData, status } = await axios.post('/api/employee/baseInfo', payload); const { data: responseData, status } = await axios.post('/api/employee/baseInfo', payload);
if (status >= 200 && status < 300) { if (status >= 200 && status < 300) {
if (responseData.success) { if (responseData.success) {
showSuccessToast('提交成功'); submitSuccess.value = true;
showSuccessToast({message: '提交成功', duration: 5000});
} else { } else {
showFailToast('提交失败'); showFailToast('提交失败');
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment