Files
x_admin/admin/src/components/material/file.vue

73 lines
1.9 KiB
Vue

<template>
<div>
<div class="file-item relative" :style="{ height: fileSize, width: fileSize }">
<el-image class="image" v-if="type == 'image'" fit="contain" lazy :src="uri"></el-image>
<video class="video" v-else-if="type == 'video'" :src="uri"></video>
<div
v-if="type == 'video'"
class="absolute left-1/2 top-1/2 translate-x-[-50%] translate-y-[-50%] rounded-full w-5 h-5 flex justify-center items-center bg-[rgba(0,0,0,0.3)]"
>
<icon name="el-icon-CaretRight" :size="18" color="#fff" />
</div>
<slot></slot>
</div>
</div>
</template>
<script lang="ts">
import { defineComponent } from 'vue'
export default defineComponent({
props: {
// 图片地址
uri: {
type: String
},
// 图片尺寸
fileSize: {
type: String,
default: '100px'
},
// 文件类型
ext: {
type: String,
default: ''
}
},
emits: ['close'],
computed: {
type() {
const imageExt = ['jpg', 'jpeg', 'png', 'gif', 'bmp']
const videoExt = ['mp4', 'avi', 'mov']
if (imageExt.includes(this.ext)) {
return 'image'
}
if (videoExt.includes(this.ext)) {
return 'video'
}
return 'file'
}
}
})
</script>
<style scoped lang="scss">
.file-item {
box-sizing: border-box;
position: relative;
border-radius: 4px;
overflow: hidden;
background-color: var(--el-border-color-extra-light);
border-width: 1px;
border-color: var(--el-border-color-extra-light);
.image,
.video {
display: block;
box-sizing: border-box;
width: 100%;
height: 100%;
}
}
</style>