From 1421a6bd5595378c8266f1ff383a61ecfe5d848f Mon Sep 17 00:00:00 2001
From: peng <peng.com>
Date: 星期三, 23 七月 2025 17:00:23 +0800
Subject: [PATCH] 后台视频发布
---
manager/src/views/video/VideoList.vue | 581 +++++++++++++++++++++++++++++++++++++++++++++++++++-
manager/src/api/video.js | 9
manager/src/api/videoTag.js | 16 +
seller/src/views/goods/goods-seller/goodsOperationSec.vue | 4
4 files changed, 590 insertions(+), 20 deletions(-)
diff --git a/manager/src/api/video.js b/manager/src/api/video.js
index dd4dff0..fc0b95e 100644
--- a/manager/src/api/video.js
+++ b/manager/src/api/video.js
@@ -102,3 +102,12 @@
method: "POST"
})
}
+
+// 鍙戝竷瑙嗛
+export const publish = (params) => {
+ return service({
+ url: "/lmk/video/publish",
+ method: "POST",
+ data: params
+ })
+}
diff --git a/manager/src/api/videoTag.js b/manager/src/api/videoTag.js
index fb04303..6f3d894 100644
--- a/manager/src/api/videoTag.js
+++ b/manager/src/api/videoTag.js
@@ -60,3 +60,19 @@
data: params
})
}
+// 鑾峰彇鎺ㄨ崘鏍囩
+export const recommend = (params) => {
+ return service({
+ url: "/lmk/video-tag/recommend",
+ method: "GET",
+ params: params
+ })
+}
+// 鏌ヨ鍟嗗搧
+export const videoGoodsEsPage = (params) => {
+ return service({
+ url: "/lmk/video-tag/video/es",
+ method: "GET",
+ params: params
+ })
+}
diff --git a/manager/src/views/video/VideoList.vue b/manager/src/views/video/VideoList.vue
index bc301a1..d493f41 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,194 @@
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 :gutter="24">
+ <Col span="12" v-if="uploadVideoForm.videoFileKey">
+ <FormItem :labelWidth="80">
+ <Button @click="reloadVideo" type="primary">閲嶆柊涓婁紶瑙嗛</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
+ show-elevator
+ show-sizer
+ ></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="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 +268,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 +362,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,25 +383,33 @@
>
<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="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>
</template>
</Table>
@@ -244,16 +432,81 @@
</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} 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";
+
export default {
name: "VideoList",
- components: {Editor,GoodsExpandRow},
+ components: {vuedraggable, Editor, GoodsExpandRow},
+ 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) {
+ 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 {
+ endpoint: '',
+ searchGoods: '',
+ videoTagList: [],
+ chooseTag: '',
+ videoTag: '',
+ visible: false,
+ imgName: '',
+ showVideoFlag: true,
+ showImgFlag: false,
+ showVideoProgress: false,
+ videoProgress: 0,
+ upLoadVideoShow: false,
+ uploadVideoForm: {
+ id: '',
+ title: '',
+ cover: "",
+ videoFileKey: "",
+ videoDuration: 0,
+ videoFit: "cover",
+ videoContentType: 'video',
+ videoImgs: [],
+ showListImages: [],
+ tags: [],
+ fileInfo: {},
+ goodsList: []
+
+ },
videoDownForm: {
id: '',
reason: ''
@@ -313,6 +566,13 @@
title: '', // 鏍囬
tagList: [], // 鏍囩
status: '99'
+ },
+ searchGoodsForm: {
+ // 鎼滅储妗嗗垵濮嬪寲瀵硅薄
+ pageNumber: 1, // 褰撳墠椤垫暟
+ pageSize: 10, // 椤甸潰澶у皬
+ keyword: '',
+ searchFromSelfStore: false
},
tagList: [], // 鏍囩鍒楄〃
columns: [
@@ -408,8 +668,10 @@
width: 200,
},
],
+ goodsData: [],
data: [], // 琛ㄥ崟鏁版嵁
total: 0, // 琛ㄥ崟鏁版嵁鎬绘暟
+ goodsTotal: 0, // 琛ㄥ崟鏁版嵁鎬绘暟
selectCount: 0, // 宸查�夋暟閲�
selectList: [], // 宸查�夋暟鎹垪琛�
}
@@ -419,6 +681,213 @@
this.getTags('')
},
methods: {
+ //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() {
+ this.uploadVideoForm.goodsList = this.uploadVideoForm.goodsList.filter(item => {
+ return item.goodsNum >0;
+ })
+ 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) {
+ },
+ 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 upLoadImg(file) {
+ if (this.uploadVideoForm.videoImgs >= 5) {
+ this.$Message.error("鍥剧墖涓婁紶涓嶈兘瓒呰繃5涓�");
+ return;
+ }
+ try {
+ // this.upLoadVideoLoading = 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: 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 {
+ // this.upLoadVideoLoading = false;
+
+ }
+ 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.healthVideoInfo.duration;
+ console.log('-娴嬭瘯鑾峰彇鏃堕棿淇℃伅---------------->', duration);
+ } catch (e) {
+ console.log("涓婁紶澶辫触", upData)
+ } finally {
+ this.$nextTick(() => {
+ this.showVideoProgress = false;
+ })
+ }
+ return false;
+ },
+ openUploadVideo() {
+ this.upLoadVideoShow = true;
+ this.videoTagList = []
+ 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 +1056,25 @@
this.getDataList();
},
// 鑾峰彇鍒楄〃鏁版嵁
+ getGoodsDataList() {
+ let search = 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 +1112,17 @@
this.searchForm.pageSize = v;
this.getDataList();
},
+ // 鍒嗛〉 鏀瑰彉椤电爜
+ goodsChangePage(v) {
+ this.searchForm.pageNumber = v;
+ this.getGoodsDataList();
+ },
+ // 鍒嗛〉 鏀瑰彉椤垫暟
+ goodsChangePageSize(v) {
+ this.searchForm.pageNumber = 1;
+ this.searchForm.pageSize = v;
+ this.getGoodsDataList();
+ },
}
}
</script>
@@ -634,22 +1133,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>
diff --git a/seller/src/views/goods/goods-seller/goodsOperationSec.vue b/seller/src/views/goods/goods-seller/goodsOperationSec.vue
index 2f3df7c..20d098b 100644
--- a/seller/src/views/goods/goods-seller/goodsOperationSec.vue
+++ b/seller/src/views/goods/goods-seller/goodsOperationSec.vue
@@ -401,7 +401,7 @@
</div>
<FormItem class="form-item-view-el" label="PC鍟嗗搧鎻忚堪" prop="intro" style="width: 100%">
<editor
- :show-upload="false"
+ :show-upload="true"
ref="editor"
v-model="baseInfoForm.intro"
height="800px"
@@ -415,7 +415,7 @@
<FormItem class="form-item-view-el" label="绉诲姩绔弿杩�" prop="skuList" style="width: 100%">
<editor
- :show-upload="false"
+ :show-upload="true"
ref="introEditor"
v-model="baseInfoForm.mobileIntro"
height="800px"
--
Gitblit v1.8.0