From 5da038138e5629359939679936e68a65a077daca Mon Sep 17 00:00:00 2001
From: doum <doum>
Date: 星期五, 19 九月 2025 09:59:58 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'
---
admin/src/components/common/upload.vue | 146 ++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 146 insertions(+), 0 deletions(-)
diff --git a/admin/src/components/common/upload.vue b/admin/src/components/common/upload.vue
new file mode 100644
index 0000000..f941a83
--- /dev/null
+++ b/admin/src/components/common/upload.vue
@@ -0,0 +1,146 @@
+<template>
+ <div class="file">
+ <div class="file_list">
+ <div class="file_list_item" :style="{width: width, height: height}" v-for="(item, index) in list" :key="index">
+ <div class="dele" @click="deleItem(index)">
+ <i class="el-icon-close"></i>
+ </div>
+ <img :src="item.url" v-if="fileType(item.url) === 'img'" />
+ <video controls autoplay :src="item.url" v-else></video>
+ </div>
+ <div class="file_list_item" :style="{width: width, height: height, cursor: 'pointer'}" @click="$refs.file.click()">
+ <i class="el-icon-plus" style="font-size: 18px;color: #8c939d;text-align: center;margin-top: 10px"></i>
+ <i style="font-size: 12px;color: #8c939d;font-style: normal;text-align: center">{{tips}}</i>
+ </div>
+ <input type="file" ref="file" :accept="accept" @change="getFile" />
+ </div>
+ </div>
+</template>
+
+<script>
+import axios from 'axios'
+export default {
+ props: {
+ width: {
+ type: String,
+ default: '90px'
+ },
+ height: {
+ type: String,
+ default: '90px'
+ },
+ list: {
+ type: Array,
+ default: []
+ },
+ tips: {
+ type: String,
+ default: '0'
+ },
+ accept: {
+ type: String,
+ default: ''
+ },
+ folder: {
+ type: String,
+ default: ''
+ }
+ },
+ data () {
+ return {
+ uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/web/public/upload'
+ }
+ },
+
+ methods: {
+ fileType (url) {
+ if (url.indexOf('.mp4') !== -1) {
+ return 'video'
+ } else {
+ return 'img'
+ }
+ },
+ getFile (e) {
+ if (e.target && e.target.files.length > 0) {
+ this.$emit('loading')
+ const formdate = new FormData()
+ formdate.append('file', e.target.files[0])
+ formdate.append('folder', this.folder)
+ axios.post(this.uploadImgUrl, formdate)
+ .then(res => {
+ this.$emit('success', res.data.data)
+ console.log(res.data.data)
+ })
+ .catch(e => {
+ })
+ .finally(() => {
+ this.$refs.file.value = null
+ })
+ }
+ },
+ deleItem (index) {
+ this.$emit('dele', index)
+ }
+ }
+}
+</script>
+
+<style lang="scss" scoped>
+ .file {
+ /*width: 100%;*/
+ /*height: 90px;*/
+ margin: 10px 0;
+ input {
+ opacity: 0;
+ }
+ .file_list {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: center;
+ flex-wrap: wrap;
+ .file_list_item {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ overflow: hidden;
+ border-radius: 5px;
+ border: 1px solid #d5d5d5;
+ margin: 5px;
+ position: relative;
+ &:first-child {
+ margin: 0 !important;
+ }
+ .dele {
+ position: absolute;
+ right: 0;
+ top: 0;
+ width: 20px;
+ height: 20px;
+ background: red;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ z-index: 10000;
+ cursor: pointer;
+ .el-icon-close {
+ color: #ffffff;
+ font-size: 14px;
+ }
+ }
+ .el-icon-plus {
+ font-size: 30px;
+ color: black;
+ }
+ img {
+ width: 100%;
+ }
+ video {
+ width: 100%;
+ height: 100%;
+ }
+ }
+ }
+ }
+</style>
--
Gitblit v1.9.3