Commit c73313b4037800ba5171102f2c169ad64fc294d8
1 parent
5b2888aa
fix: DEFECT-1644 所有可以上传图片的都需要预览个删除按钮
Showing
2 changed files
with
46 additions
and
67 deletions
| ... | ... | @@ -12,6 +12,9 @@ import { EventType, EventTypeColor, EventTypeName } from '../list/cpns/tabs/Even |
| 12 | 12 | |
| 13 | 13 | import { useClipboard } from '@vueuse/core'; |
| 14 | 14 | import { useMessage } from '/@/hooks/web/useMessage'; |
| 15 | +import { FileItem } from '/@/components/Form/src/components/ApiUpload.vue'; | |
| 16 | +import { createImgPreview } from '/@/components/Preview'; | |
| 17 | +import { uploadThumbnail } from '/@/api/configuration/center/configurationCenter'; | |
| 15 | 18 | |
| 16 | 19 | export enum Mode { |
| 17 | 20 | CARD = 'card', |
| ... | ... | @@ -158,8 +161,33 @@ export const step1Schemas: FormSchema[] = [ |
| 158 | 161 | { |
| 159 | 162 | field: 'image', |
| 160 | 163 | label: '上传图片', |
| 161 | - component: 'Input', | |
| 162 | - slot: 'imageSelect', | |
| 164 | + component: 'ApiUpload', | |
| 165 | + changeEvent: 'update:fileList', | |
| 166 | + valueField: 'fileList', | |
| 167 | + componentProps: () => { | |
| 168 | + return { | |
| 169 | + listType: 'picture-card', | |
| 170 | + maxFileLimit: 1, | |
| 171 | + accept: '.png,.jpg,.jpeg,.gif', | |
| 172 | + api: async (file: File) => { | |
| 173 | + try { | |
| 174 | + const formData = new FormData(); | |
| 175 | + formData.set('file', file); | |
| 176 | + const { fileStaticUri, fileName } = await uploadThumbnail(formData); | |
| 177 | + return { | |
| 178 | + uid: fileStaticUri, | |
| 179 | + name: fileName, | |
| 180 | + url: fileStaticUri, | |
| 181 | + } as FileItem; | |
| 182 | + } catch (error) { | |
| 183 | + return {}; | |
| 184 | + } | |
| 185 | + }, | |
| 186 | + onPreview: (fileList: FileItem) => { | |
| 187 | + createImgPreview({ imageList: [fileList.url!] }); | |
| 188 | + }, | |
| 189 | + }; | |
| 190 | + }, | |
| 163 | 191 | }, |
| 164 | 192 | { |
| 165 | 193 | field: 'deviceType', | ... | ... |
| 1 | 1 | <template> |
| 2 | 2 | <div class="step1"> |
| 3 | - <BasicForm @register="register"> | |
| 4 | - <template #imageSelect> | |
| 5 | - <Upload | |
| 6 | - style="width: 20vw" | |
| 7 | - name="avatar" | |
| 8 | - accept=".png,.jpg,.jpeg,.gif" | |
| 9 | - list-type="picture-card" | |
| 10 | - class="avatar-uploader" | |
| 11 | - :show-upload-list="false" | |
| 12 | - :customRequest="customUploadqrcodePic" | |
| 13 | - :before-upload="beforeUploadqrcodePic" | |
| 14 | - > | |
| 15 | - <img | |
| 16 | - v-if="deviceConfigPic" | |
| 17 | - :src="deviceConfigPic" | |
| 18 | - alt="" | |
| 19 | - style="width: 6.25rem; height: 6.25rem" | |
| 20 | - /> | |
| 21 | - <div v-else> | |
| 22 | - <LoadingOutlined v-if="loading" /> | |
| 23 | - <PlusOutlined v-else /> | |
| 24 | - <div class="ant-upload-text">图片上传</div> | |
| 25 | - </div> | |
| 26 | - </Upload> | |
| 27 | - </template> | |
| 28 | - </BasicForm> | |
| 3 | + <BasicForm @register="register" /> | |
| 29 | 4 | </div> |
| 30 | 5 | </template> |
| 31 | 6 | <script lang="ts" setup> |
| 32 | - import { ref, nextTick } from 'vue'; | |
| 7 | + import { nextTick } from 'vue'; | |
| 33 | 8 | import { BasicForm, useForm } from '/@/components/Form'; |
| 34 | 9 | import { step1Schemas } from '../device.profile.data'; |
| 35 | - import { uploadApi } from '/@/api/personal/index'; | |
| 36 | - import { Upload } from 'ant-design-vue'; | |
| 37 | - import { PlusOutlined, LoadingOutlined } from '@ant-design/icons-vue'; | |
| 38 | - import { useMessage } from '/@/hooks/web/useMessage'; | |
| 39 | - import type { FileItem } from '/@/components/Upload/src/typing'; | |
| 10 | + import { FileItem } from '/@/components/Form/src/components/ApiUpload.vue'; | |
| 11 | + import { buildUUID } from '/@/utils/uuid'; | |
| 40 | 12 | |
| 41 | 13 | const emits = defineEmits(['next', 'emitDeviceType']); |
| 42 | - const loading = ref(false); | |
| 43 | - const { createMessage } = useMessage(); | |
| 44 | - const deviceConfigPic = ref(''); | |
| 45 | 14 | const props = defineProps({ |
| 46 | 15 | ifShowBtn: { type: Boolean, default: true }, |
| 47 | 16 | }); |
| ... | ... | @@ -66,32 +35,6 @@ |
| 66 | 35 | disabled: nameStatus, |
| 67 | 36 | }, |
| 68 | 37 | }); |
| 69 | - const customUploadqrcodePic = async ({ file }) => { | |
| 70 | - if (beforeUploadqrcodePic(file)) { | |
| 71 | - deviceConfigPic.value = ''; | |
| 72 | - loading.value = true; | |
| 73 | - const formData = new FormData(); | |
| 74 | - formData.append('file', file); | |
| 75 | - const response = await uploadApi(formData); | |
| 76 | - if (response.fileStaticUri) { | |
| 77 | - deviceConfigPic.value = response.fileStaticUri; | |
| 78 | - loading.value = false; | |
| 79 | - } | |
| 80 | - } | |
| 81 | - }; | |
| 82 | - const beforeUploadqrcodePic = (file: FileItem) => { | |
| 83 | - const isJpgOrPng = | |
| 84 | - file.type === 'image/jpeg' || file.type === 'image/png' || file.type === 'image/jpg'; | |
| 85 | - if (!isJpgOrPng) { | |
| 86 | - createMessage.error('只能上传图片文件!'); | |
| 87 | - } | |
| 88 | - const isLt2M = (file.size as number) / 1024 / 1024 < 5; | |
| 89 | - if (!isLt2M) { | |
| 90 | - createMessage.error('图片大小不能超过5MB!'); | |
| 91 | - } | |
| 92 | - return isJpgOrPng && isLt2M; | |
| 93 | - }; | |
| 94 | - | |
| 95 | 38 | const setFieldsdefaultRuleChainId = async (id) => { |
| 96 | 39 | await nextTick(); |
| 97 | 40 | setFieldsValue({ defaultRuleChainId: id }); |
| ... | ... | @@ -105,20 +48,28 @@ |
| 105 | 48 | } |
| 106 | 49 | //回显数据 |
| 107 | 50 | const setFormData = (v) => { |
| 108 | - setFieldsValue(v); | |
| 109 | - deviceConfigPic.value = v.image; | |
| 51 | + if (v.image) { | |
| 52 | + setFieldsValue({ | |
| 53 | + image: [{ uid: buildUUID(), name: 'name', url: v.image } as FileItem], | |
| 54 | + }); | |
| 55 | + } | |
| 56 | + const { image, ...params } = v; | |
| 57 | + console.log(image); | |
| 58 | + setFieldsValue({ ...params }); | |
| 110 | 59 | }; |
| 111 | 60 | //获取数据 |
| 112 | 61 | async function getFormData() { |
| 113 | 62 | const values = await validate(); |
| 114 | 63 | if (!values) return; |
| 115 | - Reflect.set(values, 'image', deviceConfigPic.value); | |
| 64 | + if (Reflect.has(values, 'image')) { | |
| 65 | + const file = (values.image || []).at(0) || {}; | |
| 66 | + values.image = file.url || null; | |
| 67 | + } | |
| 116 | 68 | return values; |
| 117 | 69 | } |
| 118 | 70 | //清空数据 |
| 119 | 71 | const resetFormData = () => { |
| 120 | 72 | resetFields(); |
| 121 | - deviceConfigPic.value = ''; | |
| 122 | 73 | }; |
| 123 | 74 | |
| 124 | 75 | const editOrAddDeviceTypeStatus = (status: boolean) => { | ... | ... |