|
@@ -1,155 +0,0 @@
|
|
|
-<template>
|
|
|
- <div class="header-icon-bar hc-header-upload-file-bar">
|
|
|
- <el-tooltip :content="isUploading ? '文件正在上传时,千万不要刷新页面' : '全局文件上传'" placement="top">
|
|
|
- <div class="hc-upload-bar hc-flex" :class="[isUploading ? 'uploading' : '']" @click="uploadClick">
|
|
|
- <hc-lottie v-if="isUploading" class="hc-lottie-icon" :datas="uploadJson" />
|
|
|
- <hc-icon v-else name="upload-cloud" class="header-icon" />
|
|
|
- <span v-if="isUploading" class="text">正在上传中...</span>
|
|
|
- </div>
|
|
|
- </el-tooltip>
|
|
|
- <!-- 上传文件 -->
|
|
|
- <hc-upload-file
|
|
|
- ref="uploadRef"
|
|
|
- :params="params"
|
|
|
- :echo-params="echoParams"
|
|
|
- :options="options"
|
|
|
- @progress="uploadProgress"
|
|
|
- @error="uploadError"
|
|
|
- @cancel="uploadCancel"
|
|
|
- @item="uploadItem"
|
|
|
- @finish="uploadFinish"
|
|
|
- @success="uploadSuccess"
|
|
|
- />
|
|
|
- </div>
|
|
|
-</template>
|
|
|
-
|
|
|
-<script setup>
|
|
|
-import { onMounted, onUnmounted, ref, watch } from 'vue'
|
|
|
-import HcUpload from '~src/plugins/HcUpload'
|
|
|
-import uploadJson from '~src/assets/upload.json'
|
|
|
-import { emitter } from 'hc-vue3-ui'
|
|
|
-import { useRoute } from 'vue-router'
|
|
|
-const useRoutes = useRoute()
|
|
|
-
|
|
|
-const EVENT_KEY = 'hc-global-upload-file'
|
|
|
-
|
|
|
-//页面渲染
|
|
|
-onMounted(() => {
|
|
|
- HcUpload.router(useRoutes?.name)
|
|
|
- setEmitterData()
|
|
|
-})
|
|
|
-
|
|
|
-//监听路由变化
|
|
|
-watch(() => useRoutes?.name, (name) => {
|
|
|
- HcUpload.router(name)
|
|
|
-})
|
|
|
-
|
|
|
-//上传文件
|
|
|
-const uploadRef = ref(null)
|
|
|
-const params = ref({})
|
|
|
-const echoParams = ref({})
|
|
|
-const options = ref({})
|
|
|
-const isUploading = ref(false)
|
|
|
-
|
|
|
-//注册监听事件
|
|
|
-const setEmitterData = () => {
|
|
|
- emitter.on(EVENT_KEY, ({ key, data }) => {
|
|
|
- if (key === 'params') {
|
|
|
- params.value = data.params
|
|
|
- echoParams.value = data.echoParams
|
|
|
- options.value = data.options
|
|
|
- } else if (key === 'show') {
|
|
|
- uploadRef.value?.setModalShow(true)
|
|
|
- } else if (key === 'close') {
|
|
|
- uploadRef.value?.setModalShow(false)
|
|
|
- } else if (key === 'open') {
|
|
|
- uploadRef.value?.selectFile()
|
|
|
- } else if (key === 'clear') {
|
|
|
- uploadRef.value?.cancelUpload()
|
|
|
- } else if (key === 'cancel') {
|
|
|
- uploadRef.value?.allCancel()
|
|
|
- } else if (key === 'getUploading') {
|
|
|
- const bool = getIsUploading()
|
|
|
- emitter.emit(`${EVENT_KEY}-get-uploading`, bool)
|
|
|
- }
|
|
|
- })
|
|
|
-}
|
|
|
-
|
|
|
-//文件上传中,此事件是单个文件上传中时会触发
|
|
|
-const uploadProgress = ({ file, status }) => {
|
|
|
- isUploading.value = true
|
|
|
- emitter.emit(`${EVENT_KEY}-progress`, { file, status })
|
|
|
-}
|
|
|
-
|
|
|
-//文件上传失败 ,返回一个当前文件的数据对象
|
|
|
-const uploadError = (file) => {
|
|
|
- isUploading.value = getIsUploading()
|
|
|
- emitter.emit(`${EVENT_KEY}-error`, file)
|
|
|
-}
|
|
|
-
|
|
|
-//文件上传成功,返回一个当前文件的数据对象
|
|
|
-const uploadSuccess = (file) => {
|
|
|
- isUploading.value = getIsUploading()
|
|
|
- emitter.emit(`${EVENT_KEY}-success`, file)
|
|
|
-}
|
|
|
-
|
|
|
-//取消上传并从列表中移除
|
|
|
-const uploadCancel = ({ item, index }) => {
|
|
|
- isUploading.value = getIsUploading()
|
|
|
- emitter.emit(`${EVENT_KEY}-cancel`, { item, index })
|
|
|
-}
|
|
|
-
|
|
|
-//点击了使用此文件的事件
|
|
|
-const uploadItem = ({ item, index }) => {
|
|
|
- emitter.emit(`${EVENT_KEY}-item`, { item, index })
|
|
|
-}
|
|
|
-
|
|
|
-//全部文件上传完成
|
|
|
-const uploadFinish = (files) => {
|
|
|
- isUploading.value = getIsUploading()
|
|
|
- emitter.emit(`${EVENT_KEY}-finish`, files)
|
|
|
-}
|
|
|
-
|
|
|
-//展开上传文件
|
|
|
-const uploadClick = () => {
|
|
|
- uploadRef.value?.setModalShow(true)
|
|
|
-}
|
|
|
-
|
|
|
-//是否还有正在上传中的文件
|
|
|
-const getIsUploading = () => {
|
|
|
- return uploadRef.value?.getIsUploading()
|
|
|
-}
|
|
|
-
|
|
|
-//页面被注销,关闭监听事件
|
|
|
-onUnmounted(() => {
|
|
|
- emitter.off(EVENT_KEY)
|
|
|
- HcUpload.resetAll()
|
|
|
-})
|
|
|
-</script>
|
|
|
-
|
|
|
-<style lang="scss" scoped>
|
|
|
-.hc-header-upload-file-bar .hc-upload-bar {
|
|
|
- .hc-lottie-icon {
|
|
|
- display: none;
|
|
|
- position: relative;
|
|
|
- height: 24px;
|
|
|
- }
|
|
|
- .text {
|
|
|
- display: none;
|
|
|
- font-size: 14px;
|
|
|
- margin-left: 6px;
|
|
|
- color: var(--el-color-primary-dark-2);
|
|
|
- }
|
|
|
- &.uploading {
|
|
|
- padding: 0 10px 0 0;
|
|
|
- border-radius: 50px;
|
|
|
- background: var(--el-color-primary-light-8);
|
|
|
- .header-icon {
|
|
|
- display: none;
|
|
|
- }
|
|
|
- .hc-lottie-icon, .text {
|
|
|
- display: block;
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-</style>
|