From 934654b44fb2670a7ce08aafa3d1d85fe783ae26 Mon Sep 17 00:00:00 2001 From: zxl <763096477@qq.com> Date: 星期三, 13 八月 2025 16:35:32 +0800 Subject: [PATCH] 封面必传问题 --- manager/src/views/video/VideoList.vue | 811 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 792 insertions(+), 19 deletions(-) diff --git a/manager/src/views/video/VideoList.vue b/manager/src/views/video/VideoList.vue index bc301a1..79c7676 100644 --- a/manager/src/views/video/VideoList.vue +++ b/manager/src/views/video/VideoList.vue @@ -29,7 +29,7 @@ @on-change="handleSearch" style="width: 160px" > - <Option v-for="tag in tagList" :key="tag.id" :value="tag.id">{{tag.tagName}}</Option> + <Option v-for="tag in tagList" :key="tag.id" :value="tag.id">{{ tag.tagName }}</Option> </Select> </Form-item> <Form-item label="瑙嗛鐘舵��" prop="status"> @@ -51,14 +51,209 @@ type="primary" icon="ios-search" class="search-btn" - >鎼滅储</Button + >鎼滅储 + </Button > </Form> <Row class="operation padding-row"> <Button @click="recreateEsIndex" type="primary">閲嶆柊鏋勫缓es绱㈠紩</Button> + <Button @click="openUploadVideo" type="primary" icon="md-arrow-up"> 涓婁紶瑙嗛</Button> </Row> + <Modal + v-model="upLoadVideoShow" + :title="uploadVideoForm.id?'缂栬緫涓婚〉瑙嗛':'涓婁紶涓婚〉瑙嗛'" + width="800" + :mask-closable="false" + > + <Form + ref="searchForm" + @keydown.enter.native="handleSearch" + :model="uploadVideoForm" + inline + > + <Row :gutter="24" class="operation padding-row" style="width: 100%;"> + <Col span="12"> + <FormItem label="鏍囬:" :label-width="80"> + <Input v-model="uploadVideoForm.title" placeholder="璇疯緭鍏ユ爣棰�"></Input> + </FormItem> + </Col> + <Col span="12"> + <FormItem label="涓婁紶绫诲瀷:" :label-width="80" prpo="videoContentType"> + <Select v-model="uploadVideoForm.videoContentType" style="width:200px"> + <Option value="img">鍥剧墖</Option> + <Option value="video">瑙嗛</Option> + </Select> + </FormItem> + </Col> + </Row> + <Row> + <Col span="12" v-if="!uploadVideoForm.videoFileKey&&showVideoFlag"> + <FormItem :label-width="80" label="涓婁紶瑙嗛" prop="videoFileKey"> + <Upload + :multiple="true" + :before-upload="upLoadVideo" + accept="video/*" + action="" + > + <Button icon="ios-cloud-upload-outline">閫夋嫨瑙嗛</Button> + </Upload> + <Progress :percent="videoProgress" v-if="showVideoProgress" status="active"/> + </FormItem> + </Col> + <Col span="12" v-else-if="uploadVideoForm.videoFileKey"> + <FormItem :labelWidth="80" label="瑙嗛"> + <video style="width: 150px;height: 150px" + controls + @loadedmetadata="getVideoDuration" + :poster="uploadVideoForm.showCoverUrl" + :autoplay="false" + id="remoteVideo" :src="uploadVideoForm.showVideoUrl" + ref="videoInfo" + ></video> + </FormItem> + </Col> + </Row> + <Row> + <Col span="24" v-show="uploadVideoForm.videoFileKey && !uploadVideoForm.coverUrl"> + <FormItem label="涓婁紶灏侀潰" prop="coverUrl" :label-width="80"> + <Upload + :multiple="true" + :before-upload="upLoadImagCover" + accept="image/*" + action="" + > + <Button icon="ios-cloud-upload-outline">閫夋嫨灏侀潰</Button> + </Upload> + </FormItem> + </Col> + </Row> + <Row :gutter="24"> + <Col span="12" v-if="uploadVideoForm.videoFileKey"> + <FormItem :labelWidth="80"> + <Button @click="reloadVideo" type="primary" >閲嶆柊涓婁紶瑙嗛</Button> + <Button type="primary" @click="clearCoverImage" v-show="uploadVideoForm.coverUrl" style="margin-left: 20px">閲嶆柊涓婁紶灏侀潰</Button> + </FormItem> + </Col> + </Row> + <Row :gutter="24" v-if="uploadVideoForm.videoImgs&&showImgFlag"> + <Col span="12"> + <FormItem :labelWidth="80" label="涓婁紶鍥剧墖"> + <template> + <div class="demo-upload-list" v-for="item in uploadVideoForm.showListImages" :key="item"> + <template> + <img :src="item"> + <div class="demo-upload-list-cover"> + <Icon type="ios-eye-outline" @click.native="handleView(item)"></Icon> + <Icon type="ios-trash-outline" @click.native="handleRemove(item)"></Icon> + </div> + </template> + <!-- <template v-else>--> + <!-- <Progress v-if="item.showProgress" :percent="item.percentage" hide-info></Progress>--> + <!-- </template>--> + </div> + <Upload + ref="upload" + :show-upload-list="false" + :format="['jpg','jpeg','png']" + :max-size="2048" + :before-upload="upLoadImg" + multiple + type="drag" + action="-" + style="display: inline-block;width:58px;"> + <div style="width: 58px;height:58px;line-height: 58px;"> + <Icon type="ios-camera" size="20"></Icon> + </div> + </Upload> + <Modal title="鍥剧墖棰勮" v-model="visible"> + <img :src="imgName" v-if="visible" style="width: 100%"> + </Modal> + </template> + </FormItem> + </Col> + </Row> + <Row :gutter="24"> + <Col span="24"> + <FormItem label="鏍囩" :label-width="80" style="width: 100%"> + <Select v-model="chooseTag" filterable multiple allow-create @on-create="createVideoTag"> + <Option v-for="item in videoTagList" :value="item.tagName" :key="item.id">{{ item.tagName }}</Option> + </Select> + </FormItem> + </Col> + </Row> + <Row :gutter="24"> + <Col span="24"> + <FormItem label="閫変腑鍟嗗搧" :label-width="80"> + </FormItem> + </Col> + </Row> + <Row :gutter="24"> + <Col span="12"> + <FormItem label="鍟嗗搧鍒楄〃" :label-width="80"> + <Input v-model="searchGoodsForm.keyword" style="width:200px" @on-change="searchGoodsList"></Input> + <div style="height: 400px;overflow: auto;"> + <div v-for="item in goodsData" :key="item.id" style="display: flex; + align-items: center;justify-content: flex-start;border: 1px solid gray;margin-top: 10px; + padding: 10px;border-radius: 20px" @click="chooseGoods(item.id)"> + <div> + <img :src="endpoint+'/'+item.thumbnail" style="width: 80px;height: 80px"> + </div> + <div style="display: flex;flex-direction: column;margin-left: 20px"> + <div style="font-size: 1.5em;font-weight: bold">{{ item.goodsName }}</div> + <div style="color: #ff6f6f"> + 锟{ item.price }} + </div> + </div> + </div> + </div> + <Page + :current="searchGoodsForm.pageNumber" + :total="goodsTotal" + :page-size="searchGoodsForm.pageSize" + @on-change="goodsChangePage" + @on-page-size-change="goodsChangePageSize" + :page-size-opts="[10, 20, 50]" + size="small" + show-total + ></Page> + </FormItem> + </Col> + <Col span="12"> + <FormItem label="閫変腑鍟嗗搧" :label-width="80"> + <div style="height: 400px;overflow: auto;"> + <div v-for="(item,index) in uploadVideoForm.goodsList" :key="item.id" style="display: flex; + align-items: center;justify-content: flex-start;border: 1px solid gray;margin-top: 10px; + padding: 10px;border-radius: 20px"> + <div> + <img :src="item.thumbnail.includes('http') ? item.thumbnail : endpoint + '/' + item.thumbnail" + style="width: 80px;height: 80px"> + </div> + <div style="display: flex;flex-direction: column;margin-left: 20px"> + <div style="font-size: 1.5em;font-weight: bold">{{ item.goodsName }}</div> + <div style="color: #ff6f6f;display: flex;align-content: center;justify-content: flex-start"> + <div> 锟{ item.price }}</div> + <div style="margin-left: 10px"> + <InputNumber v-model="item.goodsNum" :min="0" :max="99" controls-outside + @on-change="changeGoodsNum(item.goodsSkuId,index,item.goodsNum)" + style="vertical-align: center;width: 100px"></InputNumber> + </div> + </div> + </div> + </div> + </div> + </FormItem> + </Col> + + </Row> + + </Form> + <div slot="footer"> + <Button type="text" @click="closeVideoUpload">鍏抽棴</Button> + <Button type="primary" @click="submitVideoUpload">纭</Button> + </div> + </Modal> <Modal v-model="playVideoShow" :title="playVideoTitle" @@ -88,20 +283,20 @@ :rules="auditingRule" > <Form-item label="鏍囬锛�"> - <div>{{detail.title}}</div> + <div>{{ detail.title }}</div> </Form-item> <Form-item label="鏍囩锛�"> <div style="display: flex;flex-wrap: wrap"> <div v-for="(tag, index) in detail.tagList" :key="'tag' + index" style="margin-right: 5px"> - <Tag color="red">{{tag.tagName}}</Tag> + <Tag color="red">{{ tag.tagName }}</Tag> </div> </div> </Form-item> <Form-item v-if="detail.videoContentType === 'video'" label="瑙嗛鏃堕暱锛�" :label-width="72"> - <div>{{formatSeconds(detail.videoDuration)}}</div> + <div>{{ formatSeconds(detail.videoDuration) }}</div> </Form-item> <Form-item v-if="detail.videoContentType === 'img'" label="鍥剧墖寮犳暟锛�" :label-width="72"> - <div>{{detail.imgs.length}}</div> + <div>{{ detail.imgs.length }}</div> </Form-item> <Form-item v-if="detail.videoContentType === 'video'" class="video-warp" :label-width="0"> <Row> @@ -182,7 +377,7 @@ > <Form :model="videoDownForm" :rules="videoDownRule" ref="videoDownForm"> <FormItem label="涓嬫灦鍘熷洜锛�" :labelWidth="100" prop="reason"> - <editor ref="editor" @input="getReason" /> + <editor ref="editor" @input="getReason"/> </FormItem> </Form> <div slot="footer"> @@ -203,28 +398,59 @@ > <template slot-scope="{ row, index }" slot="tagList"> <div v-for="(tag, index) in row.tagList" :key="'tag' + index" style="margin-top: 5px"> - <Tag color="red">{{tag.tagName}}</Tag> + <Tag color="red">{{ tag.tagName }}</Tag> </div> </template> <template slot-scope="{ row, index }" slot="videoFileKey"> - <div v-if="row.videoContentType === 'video'" class="play-text" @click="playVideo(row.videoFileKey, row.title)">鐐瑰嚮鎾斁</div> + <div v-if="row.videoContentType === 'video'" class="play-text" + @click="playVideo(row.videoFileKey, row.title)">鐐瑰嚮鎾斁 + </div> </template> <template slot-scope="{ row, index }" slot="videoDuration"> - <div>{{formatSeconds(row.videoDuration)}}</div> + <div>{{ formatSeconds(row.videoDuration) }}</div> </template> <template slot-scope="{ row, index }" slot="recommend"> <i-switch v-model="row.recommend" :before-change="() => handleBeforeChange(row)" true-color="#13ce66"/> </template> <template slot-scope="{ row, index }" slot="status"> - {{transStatus(row.status)}} + {{ transStatus(row.status) }} </template> <template slot-scope="{ row, index }" slot="action"> - <Button type="primary" size="small" style="margin-right: 5px" v-if="row.status === '99'" @click="openAuditing(row)">瀹℃牳</Button> - <Button type="error" size="small" style="margin-right: 5px" v-if="row.status === '1'" @click="openVideoDown(row)">涓嬫灦</Button> - <Button type="success" size="small" style="margin-right: 5px" v-else-if="row.status === '0'" @click="videoUp(row)">涓婃灦</Button> + <Button type="primary" size="small" style="margin-right: 5px" v-if="row.status === '99'" + @click="openAuditing(row)">瀹℃牳 + </Button> + <Button type="primary" size="small" style="margin-right: 5px" + @click="editVideo(row)">缂栬緫 + </Button> + <Button type="error" size="small" style="margin-right: 5px" v-if="row.status === '1'" + @click="openVideoDown(row)">涓嬫灦 + </Button> + <Button type="error" size="small" style="margin-right: 5px" v-if="row.status === '1'" + @click="generalQrCode(row)">鐢熸垚浜岀淮鐮� + </Button> + <Button type="success" size="small" style="margin-right: 5px" v-else-if="row.status === '0'" + @click="videoUp(row)">涓婃灦 + </Button> </template> </Table> - + <Modal + v-model="showGeneralQrCode" + title="浜岀淮鐮�" + width="800" + :mask-closable="false" + > + <vue-qr + :text="QRCodeUrl" + :margin="0" + colorDark="#000" + colorLight="#fff" + :size="150" + ></vue-qr> + <div slot="footer"> + <Button type="text" @click="closeGeneralQrCode">鍏抽棴</Button> + <!-- <Button type="primary" @click="generalQrCode">纭</Button>--> + </div> + </Modal> <Row type="flex" justify="end" class="mt_10"> <Page :current="searchForm.pageNumber" @@ -244,16 +470,105 @@ </template> <script> -import {getVideos, recommendSet, getVideoById, auditingVideo, up, down, recreateIndex} from "@/api/video"; -import {getVideoTagList} from "@/api/videoTag"; -import {getFilePreview} from "@/api/file"; +import { + getVideos, + recommendSet, + getVideoById, + auditingVideo, + up, + down, + recreateIndex, + publish, + updatePublish +} from "@/api/video"; +import {getVideoTagList, recommend, videoGoodsEsPage} from "@/api/videoTag"; +import {getFilePreview, getSts} from "@/api/file"; import Editor from '@/components/editor/index.vue' import GoodsExpandRow from '@/views/video/GoodsExpandRow' +import COS from "cos-js-sdk-v5"; +import {getFileKey} from "@/utils/file"; +import vuedraggable from "vuedraggable"; +import vueQr from "vue-qr"; +import uploadImage from "../../components/editor/upload-image.vue"; + export default { name: "VideoList", - components: {Editor,GoodsExpandRow}, + computed: { + uploadImage() { + return uploadImage + } + }, + components: {vuedraggable, Editor, GoodsExpandRow, "vue-qr": vueQr}, + watch: { + 'uploadVideoForm.videoContentType'(newValue, oldValue) { + if (newValue === 'video') { + this.showVideoFlag = true; + this.showImgFlag = false; + this.uploadVideoForm.videoImgs = [] + this.uploadVideoForm.showListImages = [] + } else { + this.uploadVideoForm.videoFileKey = ''; + this.showVideoFlag = false; + this.showImgFlag = true; + this.videoProgress = 0; + } + }, + chooseTag(newValue, oldValue) { + console.log('瑙﹀彂鏂板�煎彉鍖�',newValue); + this.uploadVideoForm.tags = newValue.map(item => { + const findTag = this.videoTagList.find(tagItem => { + return tagItem.tagName === item + }) + if (findTag) { + return { + id: findTag.id, + tagName: findTag.tagName + } + } else { + return { + id: "", + tagName: item, + } + } + }) + console.log('------------------------------this.uploadVideoForm.tags>', this.uploadVideoForm.tags) + } + }, data() { return { + // https://myk.9village.cn/scanpage/recommend?shareType=videoRecommend&videoId=1948284811844190209 + baseQRCodeUrl: this.QRcodeBaseUrl + '/scanpage/recommend', + QRCodeUrl: '', + showGeneralQrCode: false, + endpoint: '', + searchGoods: '', + videoTagList: [], + chooseTag: [], + videoTag: '', + visible: false, + imgName: '', + showVideoFlag: true, + showImgFlag: false, + showVideoProgress: false, + videoProgress: 0, + upLoadVideoShow: false, + uploadVideoForm: { + coverUrl:null, + showCoverUrl:null, + id: '', + title: '', + cover: "", + videoFileKey: "", + videoDuration: 0, + videoFit: "cover", + videoContentType: 'video', + videoImgs: [], + showListImages: [], + tags: [], + fileInfo: {}, + goodsList: [] + + }, videoDownForm: { id: '', reason: '' @@ -313,6 +628,13 @@ title: '', // 鏍囬 tagList: [], // 鏍囩 status: '99' + }, + searchGoodsForm: { + // 鎼滅储妗嗗垵濮嬪寲瀵硅薄 + pageNumber: 1, // 褰撳墠椤垫暟 + pageSize: 10, // 椤甸潰澶у皬 + keyword: '', + searchFromSelfStore: false }, tagList: [], // 鏍囩鍒楄〃 columns: [ @@ -406,10 +728,13 @@ slot: "action", align: "center", width: 200, + fixed: "right" }, ], + goodsData: [], data: [], // 琛ㄥ崟鏁版嵁 total: 0, // 琛ㄥ崟鏁版嵁鎬绘暟 + goodsTotal: 0, // 琛ㄥ崟鏁版嵁鎬绘暟 selectCount: 0, // 宸查�夋暟閲� selectList: [], // 宸查�夋暟鎹垪琛� } @@ -419,6 +744,376 @@ this.getTags('') }, methods: { + async editVideo(row) { + // this.uploadVideoForm = {}; + // this.uploadVideoForm = row; + // this.showUploadVideoShow = true; + this.videoTagList = [] + await recommend({ + searchType: "HOT" + }).then(res => { + this.videoTagList = res.data; + }) + this.upLoadVideoShow = true; + this.chooseTag = row.tagList.map(item => { + return item.tagName + }) + console.log('閫変腑鍒楄〃---銆�',row.goodsList) + row.goodsList.forEach(item => { + item.goodsSkuId = item.id + }) + this.uploadVideoForm = { + id: '', + title: '', + cover: "", + videoFileKey: "", + videoDuration: 0, + videoFit: "cover", + videoContentType: 'video', + videoImgs: [], + showListImages: [], + tags: [], + fileInfo: {}, + goodsList: [] + } + + + // 閬嶅巻宸查�夋嫨鐨勬爣绛� + row.tagList.forEach(tag => { + // 妫�鏌ユ爣绛炬槸鍚﹀凡瀛樺湪浜巚ideoTagList涓� + const exists = this.videoTagList.some(item => item.tagName === tag.tagName); + // 濡傛灉涓嶅瓨鍦紝鍒欐坊鍔犲埌閫夐」鍒楄〃 + if (!exists) { + this.videoTagList.push({ + id: tag.id, // 鐢熸垚涓存椂ID + tagName: tag.tagName + }); + } + }); + this.uploadVideoForm = row + console.log("鎵撳嵃鍊�",this.uploadVideoForm) + this.uploadVideoForm.fileInfo= {}; + this.uploadVideoForm.videoImgs = JSON.parse(this.uploadVideoForm.videoImgs) + const sts = await getSts(); + if (this.uploadVideoForm.videoContentType === 'video') { + this.uploadVideoForm.showVideoUrl = sts.data.endpoint + '/' + this.uploadVideoForm.videoFileKey + + if (this.uploadVideoForm.coverUrl !== '' && this.uploadVideoForm.coverUrl != null) { + this.uploadVideoForm.showCoverUrl = this.uploadVideoForm.coverUrl + } + } else if (this.uploadVideoForm.videoContentType === 'img') { + this.uploadVideoForm.showListImages = this.uploadVideoForm.videoImgs.map(item => { + return sts.data.endpoint + '/' + item + }) + } + console.log("澶勭悊杩囧悗",this.uploadVideoForm) + + this.searchGoodsList(); + }, + closeGeneralQrCode() { + this.showGeneralQrCode = false; + this.QRCodeUrl = ''; + }, + generalQrCode(row) { + this.showGeneralQrCode = true + console.log('-------------------->', row); + this.QRCodeUrl = this.baseQRCodeUrl + '?shareType=videoRecommend' + '&videoId=' + row.id; + console.log(this.QRCodeUrl) + }, + //todo 淇濈暀鍚庣画鍙兘浼氫娇鐢� + changeGoodsNum(id, index, goodsNum) { + console.log('-------------------->', id, index, goodsNum) + }, + chooseGoods(id) { + const goods = this.goodsData.find(item => { + return item.id === id; + }) + const existingItem = this.uploadVideoForm.goodsList.find(item => item.goodsSkuId === id); + if (existingItem) { + existingItem.goodsNum = existingItem.goodsNum + 1; + } else { + this.uploadVideoForm.goodsList.push({ + goodsId: goods.goodsId, + goodsSkuId: goods.id, + goodsNum: 1, + goodsName: goods.goodsName, + thumbnail: goods.thumbnail, + price: goods.price, + + }) + } + // this.uploadVideoForm.goodsList.forEach(item => { + // if (item.goodsSkuId === id) { + // item.goodsNum = item.goodsNum+1; + // } + // }) + console.log('------------------------>', this.uploadVideoForm.goodsList) + + + }, + searchGoodsList() { + this.searchGoodsForm.pageNumber = 1; + this.getGoodsDataList(); + }, + closeVideoUpload() { + this.upLoadVideoShow = false; + }, + submitVideoUpload() { + console.log(this.uploadVideoForm.coverUrl) + if (this.uploadVideoForm.coverUrl === null || this.uploadVideoForm.coverUrl === undefined) { + this.$Message.error('鏍囬涓嶈兘涓虹┖'); + return; + } + this.uploadVideoForm.goodsList = this.uploadVideoForm.goodsList.filter(item => { + return item.goodsNum > 0; + }) + if (!this.uploadVideoForm.title) { + this.$Message.error('鏍囬涓嶈兘涓虹┖'); + return; + } + //琛ㄥ崟鏍¢獙 + if (this.uploadVideoForm.videoContentType === 'video') { + if (!this.uploadVideoForm.videoFileKey) { + this.$Message.error('瑙嗛涓嶈兘涓虹┖'); + return; + } + } + if (this.uploadVideoForm.videoContentType === 'img') { + if (this.uploadVideoForm.videoImgs < 1) { + this.$Message.error('鍥剧墖涓嶈兘涓虹┖'); + return; + } + } + console.log('鎻愪氦琛ㄥ崟--------------->', this.uploadVideoForm) + if (this.uploadVideoForm.id) { + updatePublish(this.uploadVideoForm).then(response => { + if (response.code == 200) { + this.$Message.success("瑙嗛淇敼鎴愬姛"); + this.upLoadVideoShow = false; + this.getDataList(); + } + }).then(error => { + this.$Message.success(error); + }) + + } else { + publish(this.uploadVideoForm).then(response => { + if (response.code == 200) { + this.$Message.success("瑙嗛鍙戝竷鎴愬姛"); + this.upLoadVideoShow = false; + this.getDataList(); + } + }).then(error => { + this.$Message.success(error); + }) + } + + }, + //todo 鍚庣画鍙兘浼氫娇鐢ㄩ鐣� + createVideoTag(e) { + console.log('------------>',e) + }, + handleRemove(file) { + const fileList2 = this.uploadVideoForm.showListImages; + this.uploadVideoForm.videoImgs.splice(fileList2.indexOf(file), 1); + this.uploadVideoForm.showListImages.splice(fileList2.indexOf(file), 1); + }, + handleView(name) { + this.imgName = name; + this.visible = true; + }, + async upLoadImagCover(file) { + try { + // 鑾峰彇鏂囦欢涓婁紶涓存椂瀵嗛挜 + const sts = await getSts(); + const cos = new COS({ + getAuthorization: async function (options, callback) { + callback({ + TmpSecretId: sts.data.tmpSecretId, + TmpSecretKey: sts.data.tmpSecretKey, + SecurityToken: sts.data.sessionToken, + // 寤鸿杩斿洖鏈嶅姟鍣ㄦ椂闂翠綔涓虹鍚嶇殑寮�濮嬫椂闂达紝閬垮厤瀹㈡埛绔湰鍦版椂闂村亸宸繃澶у鑷寸鍚嶉敊璇� + StartTime: sts.data.stsStartTime, // 鏃堕棿鎴筹紝鍗曚綅绉掞紝濡傦細1580000000 + ExpiredTime: sts.data.stsEndTime,// 鏃堕棿鎴筹紝鍗曚綅绉掞紝濡傦細1580000000 + ScopeLimit: true, // 缁嗙矑搴︽帶鍒舵潈闄愰渶瑕佽涓� true锛屼細闄愬埗瀵嗛挜鍙湪鐩稿悓璇锋眰鏃堕噸澶嶄娇鐢� + }); + } + }) + const fileKey = getFileKey(file.name) + const upData = await cos.uploadFile({ + Bucket: sts.data.bucket, + Region: sts.data.region, + Key: fileKey, + Body: file, // 瑕佷笂浼犵殑鏂囦欢瀵硅薄銆俢over + SliceSize: 1024 * 1024 * 5, + onProgress: function (progressData) { + console.log('涓婁紶杩涘害锛�', progressData); + }, + }); + this.$set(this.uploadVideoForm, 'coverUrl', fileKey); + this.$set(this.uploadVideoForm, 'showCoverUrl', `${sts.data.endpoint}/${fileKey}`); + this.uploadVideoForm.cover = fileKey; + if (this.$refs.videoInfo) { + this.$refs.videoInfo.poster = this.uploadVideoForm.showCoverUrl; + this.$refs.videoInfo.load(); // 閲嶆柊鍔犺浇瑙嗛 + } + console.log(this.uploadVideoForm) + + } catch (e) { + console.log("涓婁紶澶辫触", upData) + } finally { + + } + return false; + }, + clearCoverImage(){ + this.$set(this.uploadVideoForm, 'coverUrl', ''); + this.$set(this.uploadVideoForm, 'showCoverUrl', ''); + this.$set(this.uploadVideoForm, 'temp', new Date().getTime()); + }, + + async upLoadImg(file) { + if (this.uploadVideoForm.videoImgs >= 5) { + this.$Message.error("鍥剧墖涓婁紶涓嶈兘瓒呰繃5涓�"); + return; + } + try { + // 鑾峰彇鏂囦欢涓婁紶涓存椂瀵嗛挜 + const sts = await getSts(); + const cos = new COS({ + getAuthorization: async function (options, callback) { + callback({ + TmpSecretId: sts.data.tmpSecretId, + TmpSecretKey: sts.data.tmpSecretKey, + SecurityToken: sts.data.sessionToken, + // 寤鸿杩斿洖鏈嶅姟鍣ㄦ椂闂翠綔涓虹鍚嶇殑寮�濮嬫椂闂达紝閬垮厤瀹㈡埛绔湰鍦版椂闂村亸宸繃澶у鑷寸鍚嶉敊璇� + StartTime: sts.data.stsStartTime, // 鏃堕棿鎴筹紝鍗曚綅绉掞紝濡傦細1580000000 + ExpiredTime: sts.data.stsEndTime,// 鏃堕棿鎴筹紝鍗曚綅绉掞紝濡傦細1580000000 + ScopeLimit: true, // 缁嗙矑搴︽帶鍒舵潈闄愰渶瑕佽涓� true锛屼細闄愬埗瀵嗛挜鍙湪鐩稿悓璇锋眰鏃堕噸澶嶄娇鐢� + }); + } + }) + const fileKey = getFileKey(file.name) + const upData = await cos.uploadFile({ + Bucket: sts.data.bucket, + Region: sts.data.region, + Key: fileKey, + Body: file, // 瑕佷笂浼犵殑鏂囦欢瀵硅薄銆� + SliceSize: 1024 * 1024 * 5, + onProgress: function (progressData) { + console.log('涓婁紶杩涘害锛�', progressData); + }, + }); + console.log("涓婁紶鎴愬姛", upData) + this.$nextTick(() => { + this.uploadVideoForm.videoImgs.push(fileKey); + this.uploadVideoForm.showListImages.push(sts.data.endpoint + "/" + fileKey); + }) + + } catch (e) { + console.log("涓婁紶澶辫触", upData) + return false; + } finally { + + } + return false; + }, + reloadVideo() { + this.uploadVideoForm.videoFileKey = ''; + this.uploadVideoForm.showVideoUrl = ''; + }, + calculateVideoFit(width, height) { + const videoRatio = width / height; + // 瑙勫垯2锛氱珫灞忚棰戯紙濡�9:16锛� + if (videoRatio < 0.8) return 'cover'; + return 'contain'; + }, + getVideoDuration(e) { + const duration = this.$refs.videoInfo.duration; + const videoWidth = this.$refs.videoInfo.videoWidth; + const videoHeight = this.$refs.videoInfo.videoHeight; + // 鏍规嵁瀹介珮姣旈�夋嫨瑙嗛濉厖妯″紡 + const fitType = this.calculateVideoFit(videoWidth, videoHeight) + this.uploadVideoForm.videoFit = fitType + console.log('------瑙嗛淇℃伅3------------>', videoWidth, videoHeight, fitType) + + this.uploadVideoForm.videoDuration = Math.floor(duration); + }, + async upLoadVideo(file) { + try { + this.$nextTick(() => { + this.showVideoProgress = true; + }) + // 鑾峰彇鏂囦欢涓婁紶涓存椂瀵嗛挜 + const sts = await getSts(); + const cos = new COS({ + getAuthorization: async function (options, callback) { + callback({ + TmpSecretId: sts.data.tmpSecretId, + TmpSecretKey: sts.data.tmpSecretKey, + SecurityToken: sts.data.sessionToken, + // 寤鸿杩斿洖鏈嶅姟鍣ㄦ椂闂翠綔涓虹鍚嶇殑寮�濮嬫椂闂达紝閬垮厤瀹㈡埛绔湰鍦版椂闂村亸宸繃澶у鑷寸鍚嶉敊璇� + StartTime: sts.data.stsStartTime, // 鏃堕棿鎴筹紝鍗曚綅绉掞紝濡傦細1580000000 + ExpiredTime: sts.data.stsEndTime,// 鏃堕棿鎴筹紝鍗曚綅绉掞紝濡傦細1580000000 + ScopeLimit: true, // 缁嗙矑搴︽帶鍒舵潈闄愰渶瑕佽涓� true锛屼細闄愬埗瀵嗛挜鍙湪鐩稿悓璇锋眰鏃堕噸澶嶄娇鐢� + }); + } + }) + const fileKey = getFileKey(file.name) + const upData = await cos.uploadFile({ + Bucket: sts.data.bucket, + Region: sts.data.region, + Key: fileKey, + Body: file, // 瑕佷笂浼犵殑鏂囦欢瀵硅薄銆� + SliceSize: 1024 * 1024 * 5, + onProgress: (progressData) => { + console.log('涓婁紶杩涘害锛�', progressData); + this.videoProgress = Math.floor(progressData.percent * 100); + }, + }); + + console.log(this.uploadVideoForm) + this.$nextTick(() => { + this.uploadVideoForm.videoFileKey = fileKey; + this.uploadVideoForm.showVideoUrl = sts.data.endpoint + "/" + fileKey; + }) + console.log("涓婁紶鎴愬姛", upData) + const duration = this.$refs.videoInfo.duration; + console.log('-娴嬭瘯鑾峰彇鏃堕棿淇℃伅---------------->', duration); + } catch (e) { + console.log("涓婁紶澶辫触", upData) + } finally { + this.$nextTick(() => { + this.showVideoProgress = false; + }) + } + return false; + }, + openUploadVideo() { + this.upLoadVideoShow = true; + this.videoTagList = [] + this.chooseTag = [] + this.uploadVideoForm = { + id: '', + title: '', + cover: "", + videoFileKey: "", + videoDuration: 0, + videoFit: "cover", + videoContentType: 'video', + videoImgs: [], + showListImages: [], + tags: [], + fileInfo: {}, + goodsList: [] + } + recommend({ + searchType: "HOT" + }).then(res => { + this.videoTagList = res.data; + }) + this.searchGoodsList(); + }, recreateEsIndex() { recreateIndex().then(res => { this.$Message.success(res.msg) @@ -587,6 +1282,26 @@ this.getDataList(); }, // 鑾峰彇鍒楄〃鏁版嵁 + getGoodsDataList() { + let search = this.searchGoodsForm; + console.log('-------------------------->', this.searchGoodsForm) + if (search.pageNumber > 0) { + search.pageNumber = search.pageNumber - 1; + } + videoGoodsEsPage(search).then((res) => { + console.log(res) + this.loading = false; + if (res.code == 200) { + this.goodsData = res.data; + getSts().then(res => { + this.endpoint = res.data.endpoint + }) + this.goodsTotal = res.total; + } + }); + this.total = this.data.length; + }, + // 鑾峰彇鍒楄〃鏁版嵁 getDataList() { this.loading = true; getVideos(this.searchForm).then((res) => { @@ -624,6 +1339,18 @@ this.searchForm.pageSize = v; this.getDataList(); }, + // 鍒嗛〉 鏀瑰彉椤电爜 + goodsChangePage(v) { + console.log('-------------------------->鍒嗛〉', v); + this.searchGoodsForm.pageNumber = v; + this.getGoodsDataList(); + }, + // 鍒嗛〉 鏀瑰彉椤垫暟 + goodsChangePageSize(v) { + this.searchGoodsForm.pageNumber = 1; + this.searchGoodsForm.pageSize = v; + this.getGoodsDataList(); + }, } } </script> @@ -634,22 +1361,68 @@ text-align: center; color: #2d8cf0; } + .play-text:hover { cursor: pointer; } + .video-warp { width: 100%; height: 440px; } + .data-item { display: flex; align-items: center; } + .img-warp { padding: 10px; } + .image { width: 150px; height: 200px; } + +.demo-upload-list { + display: inline-block; + width: 60px; + height: 60px; + text-align: center; + line-height: 60px; + border: 1px solid transparent; + border-radius: 4px; + overflow: hidden; + background: #fff; + position: relative; + box-shadow: 0 1px 1px rgba(0, 0, 0, .2); + margin-right: 4px; +} + +.demo-upload-list img { + width: 100%; + height: 100%; +} + +.demo-upload-list-cover { + display: none; + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + background: rgba(0, 0, 0, .6); +} + +.demo-upload-list:hover .demo-upload-list-cover { + display: block; +} + +.demo-upload-list-cover i { + color: #fff; + font-size: 20px; + cursor: pointer; + margin: 0 2px; +} </style> -- Gitblit v1.8.0