snowy/snowy-admin-web/src/components/XnFilePreview/index.vue

137 lines
3.2 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<div style="position: relative">
<a-space class="go-back-button">
<a-button :href="props.src" size="small" target="_blank">
<template #icon><download-outlined /></template>
</a-button>
<a-button type="primary" size="small" @click="emit('goBack')">
<template #icon><rollback-outlined /></template>
返回
</a-button>
</a-space>
<a-card :bordered="false" :body-style="{ padding: 0 }">
<a-spin :spinning="loading">
<vue-office-docx
v-if="fileType === 'doc' || fileType === 'docx'"
:src="props.src + '&token=' + tool.data.get('TOKEN')"
class="xn-ht82"
@rendered="renderedHandler"
/>
<vue-office-excel
v-else-if="fileType === 'xls' || fileType === 'xlsx'"
:src="props.src + '&token=' + tool.data.get('TOKEN')"
class="xn-ht82"
@rendered="renderedHandler"
@error="errorHandler"
/>
<vue-pdf-embed
v-else-if="fileType === 'pdf'"
annotation-layer
text-layer
:source="props.src + '&token=' + tool.data.get('TOKEN')"
@rendered="renderedHandler"
@renderingFailed="errorHandler"
/>
<img
v-else-if="
fileType === 'png' ||
fileType === 'jpg' ||
fileType === 'gif' ||
fileType === 'bmp' ||
fileType === 'jpeg' ||
fileType === 'ico' ||
fileType === 'svg'
"
:src="props.src + '&token=' + tool.data.get('TOKEN')"
class="xn-mwh"
/>
<a-result v-else status="warning" title="不支持预览的文件类型" />
</a-spin>
</a-card>
</div>
</template>
<script setup>
import tool from '@/utils/tool'
import { message } from 'ant-design-vue'
//引入VueOfficeDocx组件
import VueOfficeDocx from '@vue-office/docx'
//引入相关样式
import '@vue-office/docx/lib/index.css'
//引入VueOfficeExcel组件
import VueOfficeExcel from '@vue-office/excel'
//引入相关样式
import '@vue-office/excel/lib/index.css'
//引Pdf组件
// 调用组件https://github.com/hrynko/vue-pdf-embed
import VuePdfEmbed from 'vue-pdf-embed'
import 'vue-pdf-embed/dist/styles/annotationLayer.css'
import 'vue-pdf-embed/dist/styles/textLayer.css'
const loading = ref(false)
const emit = defineEmits({ goBack: null })
const props = defineProps({
src: {
type: String,
default: '',
required: true
},
// 文件类型
fileType: {
type: String,
default: 'defaults',
required: false
}
})
const fileType = ref()
watch(
() => props.src,
(newVal) => {
if (newVal) {
fileType.value = props.fileType.toLowerCase()
}
},
{ immediate: true, deep: true }
)
watch(
() => props.src,
(newVal) => {
if (newVal) {
if (
fileType.value === 'doc' ||
fileType.value === 'docx' ||
fileType.value === 'xls' ||
fileType.value === 'xlsx' ||
fileType.value === 'pdf'
) {
loading.value = true
}
}
},
{ immediate: true, deep: true }
)
// 渲染完成
const renderedHandler = () => {
loading.value = false
}
// 渲染失败
const errorHandler = () => {
message.warning('渲染失败,请尝试重新打开!')
}
</script>
<style lang="less" scoped>
.xn-mwh {
max-width: 100%;
}
.xn-ht82 {
height: 82vh;
}
.go-back-button {
position: absolute;
float: right;
right: 0;
z-index: 999;
}
</style>