| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # æ¬å°æä»¶ä¸ä¼ README |
| | | |
| | | æ¬ææ¡£åºäºä»¥ä¸å®ç°æ´çï¼ |
| | | |
| | | - `src/components/AttachmentUpload/file/index.vue` |
| | | - `src/components/AttachmentUpload/image/index.vue` |
| | | - `src/components/AttachmentPreview/image/index.vue` |
| | | - `src/components/Dialog/FileList.vue` |
| | | - `src/api/basicData/common.js` |
| | | - `src/api/publicApi/commonFile.js` |
| | | |
| | | ç¸å
³ç»ä»¶å·²å¨ `src/main.js` 䏿³¨å为å
¨å±ç»ä»¶ï¼å¯ç´æ¥å¨é¡µé¢ä¸ä½¿ç¨ï¼ |
| | | |
| | | - `FileUpload` |
| | | - `ImageUpload` |
| | | - `ImagePreview` |
| | | - `FileListDialog` |
| | | |
| | | ## 1. åè½æ¦è§ |
| | | |
| | | å½åè¿å¥ä¸ä¼ è½å主è¦å为 4 é¨åï¼ |
| | | |
| | | 1. `FileUpload`ï¼æ®éæä»¶ä¸ä¼ ï¼æ¯æææ½ãæ¹éä¸ä¼ ãé¢è§ãå é¤ |
| | | 2. `ImageUpload`ï¼å¾çä¸ä¼ ï¼æ¯æå¾çå¢å±ç¤ºãé¢è§ãå é¤ |
| | | 3. `ImagePreview`ï¼å¾çå表é¢è§å±ç¤º |
| | | 4. `FileListDialog`ï¼ä¸å¡éä»¶å¼¹çªï¼æ¯ææ¥è¯¢ãä¸ä¼ ãå é¤ãä¸è½½ |
| | | |
| | | ä¸ä¼ åºå±ç»ä¸èµ°æ¥å£ï¼ |
| | | |
| | | - `POST /common/upload` |
| | | |
| | | å¯¹åºæ¹æ³å¨ `src/api/basicData/common.js`ï¼ |
| | | |
| | | ```js |
| | | uploadFile(data) |
| | | ``` |
| | | |
| | | ## 2. ä¸ä¼ æ¥å£è¯´æ |
| | | |
| | | ### 2.1 éç¨ä¸ä¼ æ¥å£ |
| | | |
| | | æä»¶ä¸ä¼ ç»ä»¶åå¾çä¸ä¼ ç»ä»¶é½è°ç¨äºï¼ |
| | | |
| | | ```js |
| | | import { uploadFile } from '@/api/basicData/common' |
| | | ``` |
| | | |
| | | æ¥å£ç¹å¾ï¼ |
| | | |
| | | - è¯·æ±æ¹å¼ï¼`POST` |
| | | - å°åï¼`/common/upload` |
| | | - 请æ±ç±»åï¼`multipart/form-data` |
| | | - æ¯æ `FormData` æ¹éä¸ä¼ |
| | | - é»è®¤å段åï¼`files` |
| | | |
| | | ç»ä»¶å
é¨ä¼è¿æ ·ç»è£
åæ°ï¼ |
| | | |
| | | ```js |
| | | const formData = new FormData() |
| | | validFiles.forEach((file) => { |
| | | formData.append(props.uploadFieldName, file.raw) |
| | | }) |
| | | ``` |
| | | |
| | | ### 2.2 ä¸ä¼ è¿åå¼è¦æ± |
| | | |
| | | ä¸ä¼ æååï¼ç»ä»¶ä¼å°è¯ä»ä»¥ä¸ç»æä¸æåæ°ç»ï¼ |
| | | |
| | | - `response` |
| | | - `response.data` |
| | | - `response.data.data` |
| | | - `response.payload` |
| | | - `response.payload.data` |
| | | - `response.rows` |
| | | - `response.result` |
| | | |
| | | å æ¤å端è¿åæ°ç»æ¶ï¼ä¸é¢ä»»æä¸ç§ç»æé½å¯ä»¥è¢«è¯å«ã |
| | | |
| | | ç»ä»¶å±ç¤ºæ¶å¸¸ç¨å°çåæ®µæï¼ |
| | | |
| | | - æä»¶åï¼`name` / `originalFilename` / `fileName` / `uidFilename` |
| | | - æä»¶å°åï¼`url` / `downloadURL` |
| | | - å¾çå°åï¼`url` / `previewURL` / `previewUrl` |
| | | - 主é®ï¼`id` |
| | | |
| | | 建议ä¸ä¼ æ¥å£è¿åçå项对象尽éå
å«ï¼ |
| | | |
| | | ```js |
| | | { |
| | | id: 1, |
| | | originalFilename: 'demo.pdf', |
| | | downloadURL: 'https://xxx/demo.pdf', |
| | | previewURL: 'https://xxx/demo.png' |
| | | } |
| | | ``` |
| | | |
| | | ## 3. FileUpload æä»¶ä¸ä¼ ç»ä»¶ |
| | | |
| | | ç»ä»¶è·¯å¾ï¼ |
| | | |
| | | `src/components/AttachmentUpload/file/index.vue` |
| | | |
| | | ### 3.1 åºç¡ç¨æ³ |
| | | |
| | | ```vue |
| | | <template> |
| | | <FileUpload v-model:file-list="fileList" /> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref } from 'vue' |
| | | |
| | | const fileList = ref([]) |
| | | </script> |
| | | ``` |
| | | |
| | | ### 3.2 常ç¨å±æ§ |
| | | |
| | | | 屿§ | 说æ | ç±»å | é»è®¤å¼ | |
| | | | --- | --- | --- | --- | |
| | | | `fileList` | ç»å®æä»¶å表 | `Array` | `[]` | |
| | | | `limit` | æå¤§ä¸ä¼ æ°é | `Number` | `10` | |
| | | | `fileSize` | å个æä»¶å¤§å°éå¶ï¼åä½ MB | `Number` | `50` | |
| | | | `fileType` | å
许ä¸ä¼ çæä»¶ç±»åï¼å¦ `['pdf', 'docx']` | `Array` | `[]` | |
| | | | `buttonText` | ä¸ä¼ æç¤ºææ¡ | `String` | `åå»éæ©æä»¶` | |
| | | | `disabled` | æ¯å¦ç¦ç¨ | `Boolean` | `false` | |
| | | | `uploadFieldName` | `FormData` åæ®µå | `String` | `files` | |
| | | | `index` | è¡¨æ ¼/åè¡¨è¡æ¨¡å¼ä¸çå½åè¡ç´¢å¼ | `Number` | `-1` | |
| | | | `childrenKey` | è¡å
æè½½å段å | `String` | `files` | |
| | | |
| | | ### 3.3 äºä»¶ |
| | | |
| | | | äºä»¶ | 说æ | |
| | | | --- | --- | |
| | | | `update:fileList` | æä»¶å表ååæ¶è§¦å | |
| | | | `change` | æä»¶å表ååæ¶è§¦åï¼è¿åææ°å表 | |
| | | |
| | | ### 3.4 éå¶è§å |
| | | |
| | | ç»ä»¶å
å·²å®ç°ï¼ |
| | | |
| | | - æä»¶æ°ééå¶ |
| | | - æä»¶å¤§å°éå¶ |
| | | - æä»¶ç±»åæ ¡éª |
| | | - ä¸ä¼ ä¸ç¶æéå® |
| | | - 失败åèªå¨æ¸
空å½åéæ©éå |
| | | |
| | | ä¾å¦éå¶ PDF/Wordï¼ |
| | | |
| | | ```vue |
| | | <FileUpload |
| | | v-model:file-list="fileList" |
| | | :limit="5" |
| | | :file-size="20" |
| | | :file-type="['pdf', 'doc', 'docx']" |
| | | /> |
| | | ``` |
| | | |
| | | ### 3.5 è¿åæ°æ®æ ¼å¼å»ºè®® |
| | | |
| | | `FileUpload` æ´é忥æ¶è¿æ ·çåè¡¨ï¼ |
| | | |
| | | ```js |
| | | [ |
| | | { |
| | | id: 1, |
| | | originalFilename: 'åå.pdf', |
| | | downloadURL: 'https://xxx/contract.pdf' |
| | | } |
| | | ] |
| | | ``` |
| | | |
| | | å 为ç»ä»¶æå¼æä»¶æ¶ä¼ä¼å
读åï¼ |
| | | |
| | | ```js |
| | | url || downloadURL || previewURL || previewUrl |
| | | ``` |
| | | |
| | | ### 3.6 è¡å
åµå¥æ¨¡å¼ |
| | | |
| | | 妿ä¸ä¼ ç»ä»¶æ¾å¨è¡¨æ ¼æä¸è¡ä¸ï¼å¯é
å `index` å `childrenKey` 使ç¨ï¼ |
| | | |
| | | ```vue |
| | | <FileUpload |
| | | v-model:file-list="tableData" |
| | | :index="scope.$index" |
| | | children-key="files" |
| | | /> |
| | | ``` |
| | | |
| | | æ¤æ¶ç»ä»¶ä¼èªå¨è¯»åï¼ |
| | | |
| | | ```js |
| | | tableData[scope.$index].files |
| | | ``` |
| | | |
| | | ## 4. ImageUpload å¾çä¸ä¼ ç»ä»¶ |
| | | |
| | | ç»ä»¶è·¯å¾ï¼ |
| | | |
| | | `src/components/AttachmentUpload/image/index.vue` |
| | | |
| | | ### 4.1 åºç¡ç¨æ³ |
| | | |
| | | ```vue |
| | | <template> |
| | | <ImageUpload v-model:file-list="imageList" /> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref } from 'vue' |
| | | |
| | | const imageList = ref([]) |
| | | </script> |
| | | ``` |
| | | |
| | | ### 4.2 é»è®¤è¡ä¸º |
| | | |
| | | å¾çä¸ä¼ ç»ä»¶é»è®¤ï¼ |
| | | |
| | | - æå¤ä¸ä¼ `10` å¼ |
| | | - åå¼ ä¸è¶
è¿ `10MB` |
| | | - é»è®¤æ¯ææ ¼å¼ï¼`png / jpg / jpeg / webp` |
| | | - ä½¿ç¨ `picture-card` 飿 ¼å±ç¤º |
| | | - ç¹å»ç¼©ç¥å¾å¯é¢è§å¤§å¾ |
| | | |
| | | ### 4.3 常ç¨ç¤ºä¾ |
| | | |
| | | ```vue |
| | | <ImageUpload |
| | | v-model:file-list="imageList" |
| | | :limit="9" |
| | | :file-size="5" |
| | | :file-type="['png', 'jpg', 'jpeg']" |
| | | button-text="ä¸ä¼ å¾ç" |
| | | /> |
| | | ``` |
| | | |
| | | ### 4.4 è¿åæ°æ®æ ¼å¼å»ºè®® |
| | | |
| | | `ImageUpload` å±ç¤ºå¾çæ¶ä¼å
读åï¼ |
| | | |
| | | ```js |
| | | url || previewURL || previewUrl |
| | | ``` |
| | | |
| | | 建议å端è¿åï¼ |
| | | |
| | | ```js |
| | | [ |
| | | { |
| | | id: 1, |
| | | originalFilename: 'ç°åºå¾ç.jpg', |
| | | previewURL: 'https://xxx/image.jpg' |
| | | } |
| | | ] |
| | | ``` |
| | | |
| | | ### 4.5 è¡å
åµå¥æ¨¡å¼ |
| | | |
| | | å¾çç»ä»¶åæ ·æ¯æè¡å
åæ®µååï¼ |
| | | |
| | | ```vue |
| | | <ImageUpload |
| | | v-model:file-list="tableData" |
| | | :index="scope.$index" |
| | | children-key="images" |
| | | /> |
| | | ``` |
| | | |
| | | é»è®¤åååæ®µä¸º `images`ã |
| | | |
| | | ## 5. ImagePreview å¾çé¢è§ç»ä»¶ |
| | | |
| | | ç»ä»¶è·¯å¾ï¼ |
| | | |
| | | `src/components/AttachmentPreview/image/index.vue` |
| | | |
| | | ### 5.1 åºç¡ç¨æ³ |
| | | |
| | | ```vue |
| | | <ImagePreview :file-list="imageList" /> |
| | | ``` |
| | | |
| | | ### 5.2 å¯é
置项 |
| | | |
| | | | 屿§ | 说æ | ç±»å | é»è®¤å¼ | |
| | | | --- | --- | --- | --- | |
| | | | `fileList` | å¾çå表 | `Array` | `[]` | |
| | | | `thumbSize` | 缩ç¥å¾å¤§å° | `Number` | `72` | |
| | | | `gap` | 缩ç¥å¾é´è· | `Number` | `10` | |
| | | |
| | | ### 5.3 æ°æ®è¦æ± |
| | | |
| | | ç»ä»¶ä¼è¿æ»¤æ²¡æ `previewURL` ç项ï¼å æ¤å¦æè¦æ£å¸¸æ¾ç¤ºï¼å»ºè®®è³å°å
å«ï¼ |
| | | |
| | | ```js |
| | | [ |
| | | { |
| | | previewURL: 'https://xxx/image.jpg', |
| | | originalFilename: 'å¾ç1.jpg' |
| | | } |
| | | ] |
| | | ``` |
| | | |
| | | 妿å表为空ï¼ç»ä»¶æ¾ç¤ºâææ å¾çâã |
| | | |
| | | ## 6. FileListDialog éä»¶å¼¹çªç»ä»¶ |
| | | |
| | | ç»ä»¶è·¯å¾ï¼ |
| | | |
| | | `src/components/Dialog/FileList.vue` |
| | | |
| | | è¿ä¸ªç»ä»¶éåä¸å¡è¡¨åæè¯¦æ
页éçâé件管çâåºæ¯ï¼è½åå
æ¬ï¼ |
| | | |
| | | - æ ¹æ®ä¸å¡ä¸»é®æ¥è¯¢éä»¶å表 |
| | | - æå¼å¼¹çªæ¥çéä»¶ |
| | | - å¨å¼¹çªä¸ç»§ç»ä¸ä¼ éä»¶ |
| | | - å é¤éä»¶ |
| | | - ä¸è½½éä»¶ |
| | | |
| | | ### 6.1 ç»ä»¶å±æ§ |
| | | |
| | | | 屿§ | 说æ | ç±»å | é»è®¤å¼ | |
| | | | --- | --- | --- | --- | |
| | | | `visible` | æ¯å¦æ¾ç¤ºå¼¹çª | `Boolean` | å¿
ä¼ | |
| | | | `recordType` | ä¸å¡ç±»å | `String` | `''` | |
| | | | `recordId` | ä¸å¡ä¸»é® | `Number` | `0` | |
| | | | `title` | å¼¹çªæ é¢ | `String` | `éä»¶` | |
| | | | `width` | å¼¹çªå®½åº¦ | `String` | `50%` | |
| | | | `showActions` | æ¯å¦æ¾ç¤ºä¸è½½/å 餿ä½å | `Boolean` | `true` | |
| | | |
| | | ### 6.2 åºç¡ç¨æ³ |
| | | |
| | | ```vue |
| | | <template> |
| | | <el-button @click="visible = true">æ¥çéä»¶</el-button> |
| | | |
| | | <FileListDialog |
| | | v-model:visible="visible" |
| | | record-type="salesLedger" |
| | | :record-id="rowId" |
| | | title="éä»¶å表" |
| | | /> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref } from 'vue' |
| | | |
| | | const visible = ref(false) |
| | | const rowId = ref(1001) |
| | | </script> |
| | | ``` |
| | | |
| | | ### 6.3 ç»ä»¶å
é¨ä¾èµçæ¥å£ |
| | | |
| | | `FileListDialog` æ¬èº«ä¸ç´æ¥è°ç¨ `commonFile.js`ï¼èæ¯ä¾èµï¼ |
| | | |
| | | - `attachmentList` |
| | | - `createAttachment` |
| | | - `deleteAttachment` |
| | | |
| | | å¤çé»è¾ä¸ºï¼ |
| | | |
| | | 1. æå¼å¼¹çªåæ ¹æ® `recordType + recordId` æ¥è¯¢éä»¶ |
| | | 2. ç¹å»âä¸ä¼ éä»¶âåï¼å
é¨ä½¿ç¨ `AttachmentUpload/file` å
ä¸ä¼ å° `/common/upload` |
| | | 3. ä¸ä¼ æååï¼å°è¿åçæä»¶å¯¹è±¡åå·²æå表ä¸èµ·æäº¤ç» `createAttachment` |
| | | 4. å 餿¶è°ç¨ `deleteAttachment` |
| | | 5. ä¸è½½æ¶ç´æ¥ `window.open(downloadURL, '_blank')` |
| | | |
| | | å æ¤è¿éè¦ç¹å«æ³¨æï¼ |
| | | |
| | | - `recordType` å `recordId` å¿
é¡»æ¯ææä¸å¡æ è¯ |
| | | - ä¸ä¼ æåè¿åçæ°æ®ï¼éè¦è½è¢« `createAttachment` ç´æ¥æ¥æ¶ |
| | | - å表ä¸çä¸è½½å°ååæ®µåºä¸º `downloadURL` |
| | | |
| | | ## 7. commonFile.js 说æ |
| | | |
| | | æä»¶è·¯å¾ï¼ |
| | | |
| | | `src/api/publicApi/commonFile.js` |
| | | |
| | | å½åæä»¶æä¾çæ¯å
Œ
±æä»¶å 餿¥å£ï¼ |
| | | |
| | | ```js |
| | | delCommonFile(ids) |
| | | delCommonFileInvoiceLedger(ids) |
| | | ``` |
| | | |
| | | å¯¹åºæ¥å£ï¼ |
| | | |
| | | - `/commonFile/delCommonFile` |
| | | - `/invoiceLedger/delFile` |
| | | |
| | | è¿ä¸¤ä¸ªæ¹æ³æ´éåå·²ç»åå
·ä½ä¸å¡ç»å®åçâå é¤å·²ä¿åéä»¶âåºæ¯ï¼ä¸è´è´£ä¸ä¼ æä»¶æ¬èº«ã |
| | | |
| | | 示ä¾ï¼ |
| | | |
| | | ```js |
| | | import { delCommonFile } from '@/api/publicApi/commonFile' |
| | | |
| | | await delCommonFile([1, 2, 3]) |
| | | ``` |
| | | |
| | | ## 8. æ¨èä½¿ç¨æ¹å¼ |
| | | |
| | | ### 8.1 æ®éä¸å¡è¡¨åä¸ä¼ éä»¶ |
| | | |
| | | ```vue |
| | | <FileUpload v-model:file-list="form.storageBlobDTOs" /> |
| | | ``` |
| | | |
| | | æäº¤è¡¨åæ¶ç´æ¥å¸¦ä¸ï¼ |
| | | |
| | | ```js |
| | | { |
| | | ...form, |
| | | storageBlobDTOs: form.storageBlobDTOs |
| | | } |
| | | ``` |
| | | |
| | | ### 8.2 å¾çç±»ä¸å¡ |
| | | |
| | | ```vue |
| | | <ImageUpload v-model:file-list="form.images" /> |
| | | <ImagePreview :file-list="form.images" /> |
| | | ``` |
| | | |
| | | ### 8.3 å·²è½åºé件管ç |
| | | |
| | | ```vue |
| | | <FileListDialog |
| | | v-model:visible="dialogVisible" |
| | | :record-type="recordType" |
| | | :record-id="recordId" |
| | | /> |
| | | ``` |
| | | |
| | | éå详æ
页ã审æ¹é¡µãå°è´¦é¡µè¿ç±»âæ¥çå¹¶ç»´æ¤å½åä¸å¡éä»¶âçåºæ¯ã |
| | | |
| | | ## 9. 注æäºé¡¹ |
| | | |
| | | 1. `FileUpload` å `ImageUpload` åªæ¯è´è´£ææä»¶å
ä¼ å° `/common/upload`ï¼ä¸çäºå·²ç»åä¸å¡æ°æ®ç»å®ã |
| | | 2. 妿ä¸å¡éè¦æä¹
åéä»¶å
³ç³»ï¼ä»éè¦å¨ä¿åè¡¨åæ¶æè¿åçæä»¶å¯¹è±¡æäº¤ç»ä¸å¡æ¥å£ã |
| | | 3. `ImagePreview` å½ååªè¯å« `previewURL`ï¼å¦æå端åªè¿å `url`ï¼é¢è§ç»ä»¶å°ä¸ä¼å±ç¤ºï¼æå¥½ç»ä¸è¡¥é½ `previewURL`ã |
| | | 4. `FileListDialog` ä¾èµ `recordType`ã`recordId` æ¥è¯¢åä¿åéä»¶å
³ç³»ï¼æ°å¢ä¸å¡æ¶è¦å
确认å端å
³èæ¥å£å¯ç¨ã |
| | | 5. å 餿¬å°å表项åå é¤å·²ä¿åéä»¶æ¯ä¸¤ä»¶äºï¼ |
| | | - ä¸ä¼ ç»ä»¶éçå é¤ï¼åªä¼ä»å½åå端ç»å®æ°ç»ä¸ç§»é¤ |
| | | - `commonFile.js` / `deleteAttachment`ï¼ææ¯çæ£è°ç¨å端å é¤ |
| | | |
| | | ## 10. ä¸å¥æå¸¸è§ç页é¢åæ³ |
| | | |
| | | ```vue |
| | | <template> |
| | | <el-form :model="form"> |
| | | <el-form-item label="éä»¶"> |
| | | <FileUpload v-model:file-list="form.storageBlobDTOs" :limit="5" /> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="ç°åºå¾ç"> |
| | | <ImageUpload v-model:file-list="form.images" :limit="9" /> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="å¾çé¢è§"> |
| | | <ImagePreview :file-list="form.images" /> |
| | | </el-form-item> |
| | | </el-form> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref } from 'vue' |
| | | |
| | | const form = ref({ |
| | | storageBlobDTOs: [], |
| | | images: [], |
| | | }) |
| | | </script> |
| | | ``` |
| | | |
| | | å¦æä½ çç®æ æ¯âå
ä¸ä¼ ï¼åè·ä¸å¡ä¸èµ·ä¿åâï¼è¿å¥åæ³å¯ä»¥ç´æ¥ä½ä¸ºåºç¡æ¨¡æ¿ä½¿ç¨ã |