| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- <template>
- <div class="upload">
- <el-upload
- ref="uploadRefs"
- :action="action"
- :multiple="multiple"
- :limit="limit"
- :show-file-list="false"
- :headers="headers"
- :data="uploadData"
- :on-progress="handleProgress"
- :on-success="handleSuccess"
- :on-exceed="handleExceed"
- :on-error="handleError"
- :before-upload="beforeUpload"
- :accept="getAccept"
- >
- <slot></slot>
- </el-upload>
- <el-dialog
- v-if="showProgress && fileList.length"
- v-model="visible"
- title="上传进度"
- :close-on-click-modal="false"
- width="500px"
- :modal="false"
- @close="handleClose"
- >
- <div class="file-list p-4">
- <template v-for="(item, index) in fileList" :key="index">
- <div class="mb-5">
- <div>{{ item.name }}</div>
- <div class="flex-1">
- <el-progress :percentage="parseInt(item.percentage)"></el-progress>
- </div>
- </div>
- </template>
- </div>
- </el-dialog>
- </div>
- </template>
- <script lang="ts">
- import { computed, defineComponent, ref, shallowRef } from 'vue'
- import useUserStore from '@/stores/modules/user'
- import config from '@/config'
- import feedback from '@/utils/feedback'
- import type { ElUpload, UploadProps, UploadRawFile } from 'element-plus'
- import { RequestCodeEnum } from '@/enums/requestEnums'
- import ImageCompressor from 'image-compressor.js'
- import {getToken, getUserId, getBrandId, getHouseId, getShopId} from '@/utils/auth'
- export default defineComponent({
- components: {},
- props: {
- // 上传文件类型
- type: {
- type: String,
- default: 'image'
- },
- // 是否支持多选
- multiple: {
- type: Boolean,
- default: true
- },
- // 多选时最多选择几条
- limit: {
- type: Number,
- default: 10
- },
- // 上传时的额外参数
- data: {
- type: Object,
- default: () => ({})
- },
- // 是否显示上传进度
- showProgress: {
- type: Boolean,
- default: false
- }
- },
- emits: ['change', 'error'],
- setup(props, { emit }) {
- const userStore = useUserStore()
- const uploadRefs = shallowRef<InstanceType<typeof ElUpload>>()
- const action = ref(`${config.baseUrl}${config.urlPrefix}/upload/${props.type}`)
- const userId = getUserId();
- const brandId = getBrandId();
- const houseId = getHouseId();
- const token = getToken();
- const shopId = getShopId();
- const headers = computed(() => ({
- ['like-admin']: userStore.token,
- version: config.version,
- token: token,
- userId: userId,
- brandId: brandId,
- houseId: houseId,
- }))
- const visible = ref(false)
- const fileList = ref<any[]>([])
- // 定义响应式的上传参数
- const uploadData = ref(props.data)
- const beforeUpload: UploadProps['beforeUpload'] = (rawFile: UploadRawFile) => {
- // 更新上传参数
- uploadData.value = {
- ...props.data,
- fileName: rawFile.name,
- shopId: shopId
- }
- if(props.type === 'image'){
- let q = 0.5
- if (rawFile.size > 1000000 && rawFile.size < 5000000) {
- q = 0.5
- } else if (rawFile.size >= 5000000 && rawFile.size < 10000000) {
- q = 0.25
- } else if (rawFile.size >= 10000000) {
- q = 0.1
- } else {
- return true
- }
- return new Promise((resolve) => {
- new ImageCompressor(rawFile, {
- quality: q, //压缩质量
- checkOrientation: false, //图片翻转,默认为false
- success(result: any) {
- console.log(result)
- resolve(result)
- }
- })
- })
- }
- }
- const handleProgress = (event: any, file: any, fileLists: any[]) => {
- visible.value = true
- fileList.value = toRaw(fileLists)
- }
- const handleSuccess = (response: any, file: any, fileLists: any[]) => {
- const allSuccess = fileLists.every((item) => item.status == 'success')
- if (allSuccess) {
- uploadRefs.value?.clearFiles()
- visible.value = false
- emit('change')
- }
- if (response.code == RequestCodeEnum.FAILED && response.msg) {
- feedback.msgError(response.msg)
- }
- }
- const handleError = (event: any, file: any) => {
- feedback.msgError(`${file.name}文件上传失败`)
- uploadRefs.value?.abort(file)
- visible.value = false
- emit('change')
- emit('error')
- }
- const handleExceed = () => {
- feedback.msgError(`超出上传上限${props.limit},请重新上传`)
- }
- const handleClose = () => {
- uploadRefs.value?.clearFiles()
- visible.value = false
- }
- const getAccept = computed(() => {
- switch (props.type) {
- case 'image':
- return '.jpg,.png,.gif,.jpeg,.ico,.bmp'
- case 'video':
- return '.wmv,.avi,.mov,.mp4,.flv,.rmvb'
- default:
- return '*'
- }
- })
- return {
- uploadRefs,
- action,
- headers,
- visible,
- fileList,
- getAccept,
- handleProgress,
- handleSuccess,
- handleError,
- handleExceed,
- handleClose,
- beforeUpload,
- uploadData
- }
- }
- })
- </script>
- <style lang="scss"></style>
|