Commit c73313b4037800ba5171102f2c169ad64fc294d8

Authored by fengwotao
1 parent 5b2888aa

fix: DEFECT-1644 所有可以上传图片的都需要预览个删除按钮

... ... @@ -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) => {
... ...