From 5e134eb52c3b1872f61ab45165ea6ef5e5c1e9c3 Mon Sep 17 00:00:00 2001 From: peng <peng.com> Date: 星期二, 17 六月 2025 10:55:41 +0800 Subject: [PATCH] update 修改后台/销售端商品上架 --- seller/src/utils/file.js | 40 +++ seller/package.json | 1 seller/src/views/goods/goods-seller/goodsOperationFirst.vue | 29 +- seller/src/views/goods/goods-seller/goods.vue | 3 manager/src/views/goods/goods-info/goods.vue | 18 + manager/src/views/goods/goods-info/goodsApply.vue | 6 manager/src/views/health/HealthVideoList.vue | 5 manager/src/views/goods/goods-info/goodsDetail.vue | 21 + manager/src/views/kitchen/kitchenVideo.vue | 5 seller/src/api/file.js | 31 ++ seller/src/views/goods/goods-seller/goodsOperationSec.vue | 577 ++++++++++++++++++++++++++++++++----------- seller/src/libs/axios.js | 3 12 files changed, 570 insertions(+), 169 deletions(-) diff --git a/manager/src/views/goods/goods-info/goods.vue b/manager/src/views/goods/goods-info/goods.vue index 7a5f7d3..7d1d4e4 100644 --- a/manager/src/views/goods/goods-info/goods.vue +++ b/manager/src/views/goods/goods-info/goods.vue @@ -89,9 +89,12 @@ <template slot="goodsSlot" slot-scope="{ row }"> <div style="margin: 5px 0px; height: 80px; display: flex"> <div style=""> - <img + <img v-if="row.original" :src="row.original" style="height: 60px; margin-top: 1px; width: 60px" + /> + <video v-else + :src="row.goodsVideo" style="height: 60px; margin-top: 1px; width: 60px" /> </div> @@ -159,6 +162,7 @@ <script> import { getGoodsListData, upGoods, lowGoods } from "@/api/goods"; +import {getSts} from '@/api/file' import vueQr from "vue-qr"; export default { components: { @@ -376,6 +380,18 @@ this.loading = false; if (res.success) { this.data = res.result.records; + getSts().then(res => { + const endpoint = res.data.endpoint + this.data.forEach(item => { + if (item.goodsVideo != null && item.goodsVideo.indexOf('http')===-1) { + item.goodsVideo = endpoint + '/' + item.goodsVideo; + } + if (item.original !=null && item.original.indexOf('http') ===-1) { + item.original = endpoint + '/' + item.original; + } + }) + }) + this.total = res.result.total; } }); diff --git a/manager/src/views/goods/goods-info/goodsApply.vue b/manager/src/views/goods/goods-info/goodsApply.vue index 30deb6a..8b8aa08 100644 --- a/manager/src/views/goods/goods-info/goodsApply.vue +++ b/manager/src/views/goods/goods-info/goodsApply.vue @@ -42,11 +42,13 @@ <!-- 鍟嗗搧鏍忕洰鏍煎紡鍖� --> <template slot="goodsSlot" slot-scope="scope"> <div style="margin-top: 5px; height: 80px; display: flex"> - <div style=""> - <img + <div style="" > + <img v-if="scope.row.original" :src="scope.row.original" style="height: 60px; margin-top: 3px; width: 60px" /> + <video v-else :src="scope.row.goodsVideo" style="height: 60px; margin-top: 3px; width: 60px" + /> </div> <div style="margin-left: 13px"> diff --git a/manager/src/views/goods/goods-info/goodsDetail.vue b/manager/src/views/goods/goods-info/goodsDetail.vue index 60d4c41..af66491 100644 --- a/manager/src/views/goods/goods-info/goodsDetail.vue +++ b/manager/src/views/goods/goods-info/goodsDetail.vue @@ -143,6 +143,7 @@ </template> <script> import { getGoodsDetail } from "@/api/goods"; +import {getSts} from '@/api/file' export default { name: "goodsDetail", data() { @@ -193,6 +194,26 @@ initGoods(id) { getGoodsDetail(id).then((res) => { this.goods = res.result; + if (this.goods.goodsVideo != null && this.goods.goodsVideo !== '') { + getSts().then(res => { + console.log('--------------->',this.goods.goodsVideo.indexOf('http')!== -1) + if (this.goods.goodsVideo !== null && this.goods.goodsVideo.indexOf('http')=== -1) { + this.goods.goodsVideo = res.data.endpoint+'/'+this.goods.goodsVideo; + } + }) + } + if (this.goods.goodsGalleryList != null && this.goods.goodsGalleryList.length > 0) { + getSts().then(res => { + this.goods.goodsGalleryList = this.goods.goodsGalleryList.map((item) => { + if (item !== null&&item.indexOf('http')===-1) { + return res.data.endpoint+'/'+item; + }else { + return item; + } + }) + }) + } + let that = this; res.result.skuList.forEach(function (sku, index, array) { that.skuData.push({ diff --git a/manager/src/views/health/HealthVideoList.vue b/manager/src/views/health/HealthVideoList.vue index 9c87653..43ef70c 100644 --- a/manager/src/views/health/HealthVideoList.vue +++ b/manager/src/views/health/HealthVideoList.vue @@ -112,6 +112,7 @@ <FormItem label="瑙嗛"> <video style="width: 150px;height: 150px" controls + @loadedmetadata="getVideoDuration" :poster="uploadVideoForm.showCoverUrl" :autoplay="false" id="remoteVideo" :src="uploadVideoForm.showVideoUrl" @@ -671,6 +672,10 @@ this.auditingLoading = false }) }, + getVideoDuration(e){ + const duration = this.$refs.healthVideoInfo.duration; + this.uploadVideoForm.videoDuration = Math.floor(duration); + }, // 鎵撳紑缂栬緫寮圭獥 deleteHealthVideo(row) { console.log('鍒犻櫎娴嬭瘯', row) diff --git a/manager/src/views/kitchen/kitchenVideo.vue b/manager/src/views/kitchen/kitchenVideo.vue index d3e945a..40e7079 100644 --- a/manager/src/views/kitchen/kitchenVideo.vue +++ b/manager/src/views/kitchen/kitchenVideo.vue @@ -112,6 +112,7 @@ <FormItem label="瑙嗛"> <video style="width: 150px;height: 150px" controls + @loadedmetadata="getVideoDuration" :poster="uploadVideoForm.showCoverUrl" :autoplay="false" id="remoteVideo" :src="uploadVideoForm.showVideoUrl" @@ -588,6 +589,10 @@ this.$set(this.uploadVideoForm, 'temp', new Date().getTime()); console.log(this.uploadVideoForm) }, + getVideoDuration(e){ + const duration = this.$refs.healthVideoInfo.duration; + this.uploadVideoForm.videoDuration = Math.floor(duration); + }, // 瑙嗛涓婃灦 videoUp(row) { this.$Modal.confirm({ diff --git a/seller/package.json b/seller/package.json index 23f4baf..fe2ac56 100644 --- a/seller/package.json +++ b/seller/package.json @@ -13,6 +13,7 @@ "@amap/amap-jsapi-loader": "0.0.7", "@antv/g2": "^4.1.14", "axios": "^0.21.1", + "cos-js-sdk-v5": "^1.10.1", "dplayer": "^1.27.1", "js-cookie": "^2.2.1", "node-sass": "^4.14.1", diff --git a/seller/src/api/file.js b/seller/src/api/file.js new file mode 100644 index 0000000..8c1bee0 --- /dev/null +++ b/seller/src/api/file.js @@ -0,0 +1,31 @@ +import service, { + getRequest, + postRequest, + putRequest, + deleteRequest, + importRequest, + getRequestWithNoToken, + commonUrl, + postRequestWithNoForm +} from "@/libs/axios"; + + +// 鑾峰彇鏂囦欢涓存椂璁块棶url +export const getFilePreview = (fileKey) => { + return service({ + baseURL: commonUrl, + url: "/common/lmk/file/preview", + method: "POST", + data: {"fileKey": fileKey} + }) +} + +// 鑾峰彇STS璁块棶浠ょ墝 +export const getSts = () => { + return service({ + baseURL: commonUrl, + url: "/common/lmk/file/sts", + method: "GET" + }) +} + diff --git a/seller/src/libs/axios.js b/seller/src/libs/axios.js index a61bcf6..768708e 100644 --- a/seller/src/libs/axios.js +++ b/seller/src/libs/axios.js @@ -353,7 +353,8 @@ } }); }; - +// 鍘熷鐨刟xios鏆撮湶鍑哄幓鐢ㄥ嵆鍙� +export default service export const uploadFileRequest = (url, params) => { let accessToken = getStore("accessToken"); return service({ diff --git a/seller/src/utils/file.js b/seller/src/utils/file.js new file mode 100644 index 0000000..74cfa34 --- /dev/null +++ b/seller/src/utils/file.js @@ -0,0 +1,40 @@ + +/** + * 鐢熸垚fileKey + * + * @param fileName 鏂囦欢鍚� + * @returns {*} + */ +export function getFileKey (fileName) { + const extension = fileName.split('.').pop().toLowerCase(); + + const fileTypes = { + image: { name: '鍥剧墖', exts: ["jpg", "png", "jpeg", "gif", "bmp", "webp", "tiff", "svg", "ico", "psd", "raw"] }, + video: { name: '瑙嗛', exts: ["mp4", "avi", "rmvb", "mov", "wmv", "flv", "mkv", "mpeg", "mpg", "m4v", "3gp", "webm", "vob", "swf"] }, + radio: { name: '闊抽', exts: ["mp3", "wma", "wav", "mpeg-4", "cd", "m4a", "aac", "flac", "ogg", "aiff", "ape", "midi", "amr", "ra"] }, + text: { name: '鏂囨湰', exts: ["txt", "xls", "xlsx", "doc", "docx", "pdf", "ppt", "pptx", "csv", "rtf", "odt", "ods", "odp", "epub", "mobi", "pages", "numbers", "key"] }, + zip: { name: '鍘嬬缉鏂囦欢', exts: ["zip", "rar", "7z", "tar", "gz", "bz2", "xz", "iso", "dmg", "pkg", "cab", "z", "lz", "lzma", "lzo"] } + }; + + // 鑾峰彇褰撳墠鏃堕棿骞舵牸寮忓寲涓� yyyyMMddHHmmss + const now = new Date(); + const yyyyMMddHHmmss = [ + now.getFullYear(), + String(now.getMonth() + 1).padStart(2, '0'), + String(now.getDate()).padStart(2, '0'), + String(now.getHours()).padStart(2, '0'), + String(now.getMinutes()).padStart(2, '0'), + String(now.getSeconds()).padStart(2, '0') + ].join(''); + + // 鐢熸垚5浣嶉殢鏈烘暟瀛� + const random5Digits = Math.floor(10000 + Math.random() * 90000); + + // 鏌ユ壘鍖归厤鐨勬枃浠剁被鍨� + for (const [type, data] of Object.entries(fileTypes)) { + if (data.exts.includes(extension)) { + return `${type}/${yyyyMMddHHmmss}${random5Digits}` + '.' + extension; + } + } + return ''; +} diff --git a/seller/src/views/goods/goods-seller/goods.vue b/seller/src/views/goods/goods-seller/goods.vue index ed68fda..e4efb96 100644 --- a/seller/src/views/goods/goods-seller/goods.vue +++ b/seller/src/views/goods/goods-seller/goods.vue @@ -95,10 +95,11 @@ <template slot="goodsSlot" slot-scope="{ row }"> <div style="margin-top: 5px; height: 90px; display: flex"> <div style=""> - <img + <img v-if="row.original" :src="row.original" style="height: 80px; margin-top: 3px; width: 70px" /> + <video :src="row.goodsVideo" v-else style="height: 80px; margin-top: 3px; width: 70px"></video> </div> <div style="margin-left: 13px"> diff --git a/seller/src/views/goods/goods-seller/goodsOperationFirst.vue b/seller/src/views/goods/goods-seller/goodsOperationFirst.vue index 47af408..e4eef7d 100644 --- a/seller/src/views/goods/goods-seller/goodsOperationFirst.vue +++ b/seller/src/views/goods/goods-seller/goodsOperationFirst.vue @@ -109,19 +109,19 @@ type: "PHYSICAL_GOODS", check: false, }, - { - title: "铏氭嫙鍟嗗搧", - img: require("@/assets/goodsType2.png"), - desc: "铏氭嫙鏍搁獙锛屾棤闇�鐗╂祦", - type: "VIRTUAL_GOODS", - check: false, - }, - { - title: "鍟嗗搧妯℃澘瀵煎叆", - img: require("@/assets/goodsTypeTpl.png"), - desc: "鍟嗗搧妯℃澘锛屼竴閿鍏�", - check: false, - }, + // { + // title: "铏氭嫙鍟嗗搧", + // img: require("@/assets/goodsType2.png"), + // desc: "铏氭嫙鏍搁獙锛屾棤闇�鐗╂祦", + // type: "VIRTUAL_GOODS", + // check: false, + // }, + // { + // title: "鍟嗗搧妯℃澘瀵煎叆", + // img: require("@/assets/goodsTypeTpl.png"), + // desc: "鍟嗗搧妯℃澘锛屼竴閿鍏�", + // check: false, + // }, ], // 鍟嗗搧鍒嗙被閫夋嫨鏁扮粍 category: [ @@ -130,7 +130,8 @@ { name: "", id: "" }, ], // 鍟嗗搧绫诲瀷 - goodsType: "", + // goodsType: "", + goodsType: "PHYSICAL_GOODS", /** 1绾у垎绫诲垪琛�*/ categoryListLevel1: [], /** 2绾у垎绫诲垪琛�*/ diff --git a/seller/src/views/goods/goods-seller/goodsOperationSec.vue b/seller/src/views/goods/goods-seller/goodsOperationSec.vue index 0965954..ce33407 100644 --- a/seller/src/views/goods/goods-seller/goodsOperationSec.vue +++ b/seller/src/views/goods/goods-seller/goodsOperationSec.vue @@ -101,10 +101,10 @@ </div> <h4>鍟嗗搧瑙勬牸鍙婂浘鐗�</h4> <div class="form-item-view"> - <FormItem class="form-item-view-el required" label="涓诲浘" prop="goodsGalleryFiles"> + <FormItem class="form-item-view-el required" label="涓诲浘" prop="goodsGalleryFiles" v-if=" baseInfoForm.goodsVideo ==null || baseInfoForm.goodsVideo ===''"> <div style="display: flex; flex-wrap: wrap;"> - <vuedraggable :animation="200" :list="baseInfoForm.goodsGalleryFiles"> - <div v-for="(item, __index) in baseInfoForm.goodsGalleryFiles" :key="__index" + <vuedraggable :animation="200" :list="showListImages"> + <div v-for="(item, __index) in showListImages" :key="__index" class="demo-upload-list"> <template> <img :src="item"/> @@ -118,17 +118,17 @@ </div> </vuedraggable> <!--<Upload ref="upload"--> - <!--:action="uploadFileUrl" :before-upload="handleBeforeUploadGoodsPicture"--> - <!--:format="['jpg', 'jpeg', 'png', 'webp']"--> - <!--:headers="{ ...accessToken }"--> - <!--:max-size="2048" :on-error="() => { $Spin.hide(); }" :on-exceeded-size="handleMaxSize"--> - <!--:on-format-error="handleFormatError" :on-progress="() => { $Spin.show(); }"--> - <!--:on-success="handleSuccessGoodsPicture" :show-upload-list="false" multiple--> - <!--style="margin-left: 10px"--> - <!--type="drag">--> - <!--<div style="width: 148px; height: 148px; line-height: 148px">--> - <!--<Icon size="20" type="md-add"></Icon>--> - <!--</div>--> + <!--:action="uploadFileUrl" :before-upload="handleBeforeUploadGoodsPicture"--> + <!--:format="['jpg', 'jpeg', 'png', 'webp']"--> + <!--:headers="{ ...accessToken }"--> + <!--:max-size="2048" :on-error="() => { $Spin.hide(); }" :on-exceeded-size="handleMaxSize"--> + <!--:on-format-error="handleFormatError" :on-progress="() => { $Spin.show(); }"--> + <!--:on-success="handleSuccessGoodsPicture" :show-upload-list="false" multiple--> + <!--style="margin-left: 10px"--> + <!--type="drag">--> + <!--<div style="width: 148px; height: 148px; line-height: 148px">--> + <!--<Icon size="20" type="md-add"></Icon>--> + <!--</div>--> <!--</Upload>--> </div> <div style="width: 100%;display: flex;justify-content: start;margin-top: 10px;"> @@ -139,22 +139,33 @@ </Modal> </FormItem> <FormItem> - <div style="color: grey">涓诲浘浠呮敮鎸乸ng锛宩pg锛宩peg鏍煎紡锛屽楂樿嚦灏�600*600px锛屽ぇ灏�2M鍐咃紝鍙嫋鎷借皟鏁翠富鍥鹃『搴�</div> + +<!-- <div class="demo-upload-list" v-for="(item,index) in showListImages">--> +<!-- <template style="display: flex">--> +<!-- <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(index)"></Icon>--> +<!-- </div>--> +<!-- </template>--> +<!-- </div>--> + <div style="color: grey" v-if="!baseInfoForm.goodsVideo">涓诲浘浠呮敮鎸乸ng锛宩pg锛宩peg鏍煎紡锛屽楂樿嚦灏�600*600px锛屽ぇ灏�2M鍐�</div> </FormItem> - <FormItem class="form-item-view-el" label="涓诲浘瑙嗛" prop="goodsVideo"> + <FormItem class="form-item-view-el" label="瑙嗛" prop="goodsVideo" v-if="!(baseInfoForm.goodsGalleryFiles !=null &&baseInfoForm.goodsGalleryFiles.length>0)"> <div class="goods-video"> <div v-if="baseInfoForm.goodsVideo"> <div> - <video :src="baseInfoForm.goodsVideo" class="video" controls style="max-width: 300px;"/> + <video :src="baseInfoForm.showGoodsVideo" class="video" controls style="max-width: 300px;"/> </div> </div> - <Upload ref="upload" :action="uploadFileUrl" :format="['avi', 'wmv', 'mpeg', 'mp4', 'mov']" + <Upload ref="upload" action="-" :format="['avi', 'wmv', 'mpeg', 'mp4', 'mov']" :headers="{ ...accessToken }" :max-size="10240" :on-error="() => { loadingVideo = false }" :on-exceeded-size="handleVideoMaxSize" :on-format-error="handleFormatError" :on-progress="() => { loadingVideo = true }" :on-success="handleSuccessGoodsVideo" :show-upload-list="false" - multiple + :before-upload="upLoadVideo" + accept="video/*" style="margin-left: 10px" type="drag"> <Button :loading="loadingVideo" icon="ios-cloud-upload-outline" type="text"> <span v-if="!loadingVideo"> @@ -165,6 +176,9 @@ </span> </Button> </Upload> + <Button :loading="loadingVideo" v-if="baseInfoForm.goodsVideo" icon="delete" @click="removeVideo" type="text"> + <span>鍒犻櫎瑙嗛</span> + </Button> </div> </FormItem> <div class="layout" style="width: 100%"> @@ -176,7 +190,7 @@ <div v-for="(item, $index) in skuInfo" :key="$index" class="sku-item-content"> <Card :bordered="true" class="ivu-card-body"> <a slot="extra" style="margin-left: 6px"> - <Icon size="20" type="md-trash" @click="handleCloseSkuItem($index, item)"></Icon> + <Icon size="20" type="md-trash" @click="handleCloseSkuItem($index, item)"></Icon> </a> <div> <div style="display: flex;margin-bottom: 10px;font-weight: bold">瑙勬牸椤�</div> @@ -185,10 +199,13 @@ <div> <AutoComplete v-model="item.name" :filter-method="filterMethod" :maxlength="30" placeholder="璇疯緭鍏ヨ鏍奸」鍚嶇О" style="width: 150px" - @on-focus="changeSkuItem(item.name)" @on-change="editSkuItem(item.name, $index, item)"> + @on-focus="changeSkuItem(item.name)" + @on-change="editSkuItem(item.name, $index, item)"> </AutoComplete> - <iSwitch v-if="$index === 0" style="margin-left: 10px" size="small" @on-change="changeSkuOpenImage" v-model="openImage" /><span v-if="$index === 0" style="margin-left: 5px">娣诲姞瑙勬牸鍥剧墖</span> +<!-- <iSwitch v-if="$index === 0" style="margin-left: 10px" size="small"--> +<!-- @on-change="changeSkuOpenImage" v-model="openImage"/>--> +<!-- <span v-if="$index === 0" style="margin-left: 5px">娣诲姞瑙勬牸鍥剧墖</span>--> </div> </FormItem> @@ -210,7 +227,8 @@ @on-change="skuValueChange(val, index, item)"> </AutoComplete> <a style="margin-left: 6px" v-if="val.value && val.value !== ''"> - <Icon size="15" type="md-trash" @click="handleCloseSkuValue(val, index, item)"></Icon> + <Icon size="15" type="md-trash" + @click="handleCloseSkuValue(val, index, item)"></Icon> </a> </div> <div v-if="$index === 0 && openImage" style="margin-top: 10px"> @@ -225,19 +243,20 @@ style="width: 180px;height: 140px" /> <div class="sku-upload-list-cover"> - <div style="margin-top: 50px" > + <div style="margin-top: 50px"> <Icon size="25" type="md-search" @click="handleView(img)"></Icon> - <Icon size="25" type="md-trash" @click="handleRemove(val.images, __index)"></Icon> + <Icon size="25" type="md-trash" + @click="handleRemove(val.images, __index)"></Icon> </div> </div> </template> </div> </vuedraggable> - <Upload ref="uploadSku" :action="uploadFileUrl" +<!-- todo 3--> + <Upload ref="uploadSku" action="-" v-if="val.images < 1" :before-upload="handleBeforeUpload" :format="['jpg', 'jpeg', 'png', 'webp']" - :headers="{ ...accessToken }" :max-size="2048" :on-error="() => { $Spin.hide(); }" :on-exceeded-size="handleMaxSize" @@ -255,7 +274,9 @@ </div> </FormItem> - <FormItem v-if="item.spec_values.length < 10 && item.spec_values.length >= 1 && item.spec_values[0].value !== ''" class="sku-item-content-val flex" label="" style="line-height: 32px;"> + <FormItem + v-if="item.spec_values.length < 10 && item.spec_values.length >= 1 && item.spec_values[0].value !== ''" + class="sku-item-content-val flex" label="" style="line-height: 32px;"> <AutoComplete ref="input" v-model="newSkuValues[$index]" :filter-method="filterMethod" :maxlength="30" placeholder="鑷畾涔夎鏍煎��" style="width: 180px" @@ -473,8 +494,32 @@ <!--<Modal width="1200px" v-model="picModelFlag">--> <!--<ossManage @callback="callbackSelected" ref="ossManage" />--> <!--</Modal>--> - <Modal v-model="picModelFlag" width="1200px" @on-ok="confirmUrls"> - <ossManage ref="ossManage" :isComponent="true" :initialize="picModelFlag" @callback="callbackSelected" @selected="(list)=>{ selectedImage = list}"/> + <!-- todo web--> + <Modal v-model="picModelFlag" width="1200px"> + <!-- <ossManage ref="ossManage" :isComponent="true" :initialize="picModelFlag" @callback="callbackSelected" @selected="(list)=>{ selectedImage = list}"/>--> + <div class="demo-upload-list" v-for="(item,index) in showListImages"> + <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(null,index)"></Icon> + </div> + </template> + </div> + <div class="demo-upload-list"> + <Upload + :before-upload="upLoadImg" + accept="image/*" + action="-" + type="drag" + style=" display: inline-block;width: 58px" + > + <div style="width: 58px;height:58px;line-height: 58px;"> + <Icon type="ios-camera" size="20"></Icon> + </div> + </Upload> + </div> + </Modal> </div> @@ -491,6 +536,9 @@ import DPlayer from 'dplayer'; // import ossManage from "@/views/sys/oss-manage/ossManage"; import ossManage from "@/views/shop/ossManages"; +import COS from 'cos-js-sdk-v5'; +import {getFileKey} from "@/utils/file.js"; +import {getFilePreview, getSts} from "@/api/file"; export default { @@ -523,6 +571,7 @@ }, 1000); }; return { + showListImages: [], regular, openImage: false, needToloadSku: false, @@ -625,6 +674,7 @@ /** 鍟嗗搧鍒嗙被涓枃鍚� */ categoryName: [], goodsVideo: "", + showGoodsVideo: "", }, /** 琛ㄦ牸澶� */ skuTableColumn: [], @@ -703,7 +753,9 @@ methods: { // 閫夋嫨鍥剧墖modal handleCLickImg(val, index) { - this.$refs.ossManage.selectImage = true; + console.log('娴嬭瘯杈撳叆鐨勫��----------------銆�', val) + // 搴熷純鍘熸湁鐨勫浘鐗囦笂浼� + // this.$refs.ossManage.selectImage = true; this.picModelFlag = true; this.selectedFormBtnName = val; // this.picIndex = index; @@ -865,7 +917,15 @@ }, // 绉婚櫎宸查�夊浘鐗� handleRemove(item, index) { - item.splice(index, 1) + if (!item) { + this.listImages.splice(index, 1); + this.showListImages.splice(index, 1); + this.baseInfoForm.goodsGalleryFiles.splice(index, 1); + this.baseInfoForm.goodsGalleryList.splice(index, 1); + } else { + console.log('绉婚櫎娴嬭瘯',item, index); + item.splice(index, 1) + } this.previewPicture = ""; }, // 鏌ョ湅鍟嗗搧澶у浘 @@ -999,14 +1059,57 @@ } }, // sku鍥剧墖涓婁紶鍓嶉挬瀛� - handleBeforeUpload(file) { + async handleBeforeUpload(file) { const check = this.selectedSku.images !== undefined && this.selectedSku.images.length > 5; if (check) { this.$Notice.warning({title: "鍥剧墖鏁伴噺涓嶈兘澶т簬浜斿紶"}); - return false; } + 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.listImages.push(fileKey); + this.showListImages.push(sts.data.endpoint + "/" + fileKey); + this.baseInfoForm.goodsGalleryFiles.push(fileKey); + }) + + } catch (e) { + console.log("涓婁紶澶辫触", upData) + return false; + } finally { + // this.upLoadVideoLoading = false; + + } + return false; + }, /** 鏌ヨ鍟嗗搧鍝佺墝鍒楄〃 */ @@ -1086,8 +1189,34 @@ this.baseInfoForm.goodsGalleryFiles = response.result.goodsGalleryList.map((i) => { return i; - }); + }) + try { + const stsInfo = await getSts(); + const endpoint = stsInfo.data.endpoint; + this.showListImages = response.result.goodsGalleryList.map((i) => { + if (i!=null&&i.indexOf('http')===-1) + return endpoint+'/'+i; + else return i; + }) + if (response.result.goodsVideo){ + + } + } catch (e) { + console.log('缁勮璺緞鍑洪棶棰�',e); + } + } + if (response.result.goodsVideo){ + try { + const stsInfo = await getSts(); + const endpoint = stsInfo.data.endpoint; + this.baseInfoForm.goodsVideo = response.result.goodsVideo; + this.baseInfoForm.showGoodsVideo = endpoint + '/' + response.result.goodsVideo; + console.log('鏄剧ず鍟嗗搧瑙嗛------------------->', this.baseInfoForm.showGoodsVideo); + } catch (e) { + console.log('缁勮瑙嗛鍦板潃鍑洪敊浜�') + } + } if ( response.result.wholesaleList && @@ -1780,124 +1909,129 @@ }, /** 娣诲姞鍟嗗搧 **/ save() { - this.submitLoading = true; - this.$refs["baseInfoForm"].validate((valid) => { - if (valid) { - if (this.baseInfoForm.salesModel === "WHOLESALE") { - for (let i = 0; i < this.wholesaleData.length; i++) { - this.checkWholesaleNum(i); - this.checkWholesalePrice(i); - this.wholesaleData[i].goodsId = this.goodsId; - } - this.baseInfoForm.wholesaleList = this.wholesaleData; - } - this.baseInfoForm.goodsId = this.goodsId; - let submit = JSON.parse(JSON.stringify(this.baseInfoForm)); - if ( - submit.goodsGalleryFiles && - submit.goodsGalleryFiles.length <= 0 - ) { - this.submitLoading = false; - this.$Message.error("璇蜂笂浼犲晢鍝佸浘鐗�"); - return; - } - if (submit.templateId === "") submit.templateId = 0; - let flag = false; - let paramValue = ""; - - if (flag) { - this.$Message.error(paramValue + " 鍙傛暟鍊间笉鑳戒负绌�"); - this.submitLoading = false; - return; - } - - if (this.goodsUnitList && !this.goodsUnitList.find(i => i === this.baseInfoForm.goodsUnit)) { - submit.goodsUnit = "" - this.$Message.error("鍟嗗搧鍗曚綅涓嶅瓨鍦�"); - this.submitLoading = false; - return; - } - let skuInfoNames = this.skuInfo.map((n) => n.name); - submit.skuList = []; - let containEmptyImage = false; - this.skuTableData.map((sku) => { - let skuCopy = { - cost: 1, - price: sku.price, - quantity: sku.quantity, - // alertQuantity: sku.alertQuantity, - sn: sku.sn, - images: [], - }; - if (this.openImage) { - this.skuInfo[0].spec_values.forEach(item => { - if (!item.images || item.images.length === 0) { - containEmptyImage = true; - return; - } - if (item.value === sku[this.skuInfo[0].name]) { - skuCopy.images = item.images - } - }) - - } - if (sku.weight) { - skuCopy.weight = sku.weight; - } - if (this.baseInfoForm.weight) { - skuCopy.weight = this.baseInfoForm.weight; - } - if (sku.id) { - skuCopy.id = sku.id; - } - for (let skuInfoName of skuInfoNames) { - skuCopy[skuInfoName] = sku[skuInfoName]; - } - submit.skuList.push(skuCopy); - }); - if (containEmptyImage) { - this.$Message.error("寮�鍚鏍煎浘鐗囷紝鎵�鏈夎鏍煎浘鐗囦笉鑳戒负绌猴紒"); - this.submitLoading = false; - return; - } - if (submit.goodsGalleryFiles.length > 0) { - submit.goodsGalleryList = submit.goodsGalleryFiles.map( - (i) => i - ); - } - /** 鍙傛暟鏍¢獙 **/ - /* Object.keys(submit.goodsParamsList).forEach((item) => { - });*/ - submit.release ? (submit.release = true) : (submit.release = false); - submit.recommend - ? (submit.recommend = true) - : (submit.recommend = false); - if (this.goodsId) { - API_GOODS.editGoods(this.goodsId, submit).then((res) => { - if (res.success) { - this.submitLoading = false; - this.$router.go(-1); - } else { - this.submitLoading = false; + try { + this.submitLoading = true; + this.$refs["baseInfoForm"].validate((valid) => { + if (valid) { + if (this.baseInfoForm.salesModel === "WHOLESALE") { + for (let i = 0; i < this.wholesaleData.length; i++) { + this.checkWholesaleNum(i); + this.checkWholesalePrice(i); + this.wholesaleData[i].goodsId = this.goodsId; } + this.baseInfoForm.wholesaleList = this.wholesaleData; + } + this.baseInfoForm.goodsId = this.goodsId; + let submit = JSON.parse(JSON.stringify(this.baseInfoForm)); + console.log('----------------->鎻愪氦',submit); + // if ( + // (submit.goodsGalleryFiles && + // submit.goodsGalleryFiles.length <= 0) && !submit.goodsVideo + // ) { + // this.submitLoading = false; + // this.$Message.error("璇蜂笂浼犲晢鍝佸浘鐗囨垨鑰呰棰�"); + // return; + // } + if (submit.templateId === "") submit.templateId = 0; + let flag = false; + let paramValue = ""; + + if (flag) { + this.$Message.error(paramValue + " 鍙傛暟鍊间笉鑳戒负绌�"); + this.submitLoading = false; + return; + } + + if (this.goodsUnitList && !this.goodsUnitList.find(i => i === this.baseInfoForm.goodsUnit)) { + submit.goodsUnit = "" + this.$Message.error("鍟嗗搧鍗曚綅涓嶅瓨鍦�"); + this.submitLoading = false; + return; + } + let skuInfoNames = this.skuInfo.map((n) => n.name); + submit.skuList = []; + let containEmptyImage = false; + this.skuTableData.map((sku) => { + let skuCopy = { + cost: 1, + price: sku.price, + quantity: sku.quantity, + // alertQuantity: sku.alertQuantity, + sn: sku.sn, + images: [], + }; + if (this.openImage) { + this.skuInfo[0].spec_values.forEach(item => { + if (!item.images || item.images.length === 0) { + containEmptyImage = true; + return; + } + if (item.value === sku[this.skuInfo[0].name]) { + skuCopy.images = item.images + } + }) + + } + if (sku.weight) { + skuCopy.weight = sku.weight; + } + if (this.baseInfoForm.weight) { + skuCopy.weight = this.baseInfoForm.weight; + } + if (sku.id) { + skuCopy.id = sku.id; + } + for (let skuInfoName of skuInfoNames) { + skuCopy[skuInfoName] = sku[skuInfoName]; + } + submit.skuList.push(skuCopy); }); + if (containEmptyImage) { + this.$Message.error("寮�鍚鏍煎浘鐗囷紝鎵�鏈夎鏍煎浘鐗囦笉鑳戒负绌猴紒"); + this.submitLoading = false; + return; + } + if (submit.goodsGalleryFiles.length > 0) { + submit.goodsGalleryList = submit.goodsGalleryFiles.map( + (i) => i + ); + } + /** 鍙傛暟鏍¢獙 **/ + /* Object.keys(submit.goodsParamsList).forEach((item) => { + });*/ + submit.release ? (submit.release = true) : (submit.release = false); + submit.recommend + ? (submit.recommend = true) + : (submit.recommend = false); + if (this.goodsId) { + API_GOODS.editGoods(this.goodsId, submit).then((res) => { + if (res.success) { + this.submitLoading = false; + this.$router.go(-1); + } else { + this.submitLoading = false; + } + }); + } else { + API_GOODS.createGoods(submit).then((res) => { + if (res.success) { + this.submitLoading = false; + this.$parent.activestep = 2; + window.scrollTo(0, 0); + } else { + this.submitLoading = false; + } + }); + } } else { - API_GOODS.createGoods(submit).then((res) => { - if (res.success) { - this.submitLoading = false; - this.$parent.activestep = 2; - window.scrollTo(0, 0); - } else { - this.submitLoading = false; - } - }); - } - } else { - this.submitLoading = false; + this.submitLoading = false; - this.$Message.error("杩樻湁蹇呭~椤规湭鍋氬鐞嗭紝璇锋鏌ヨ〃鍗�"); - } - }); + this.$Message.error("杩樻湁蹇呭~椤规湭鍋氬鐞嗭紝璇锋鏌ヨ〃鍗�"); + } + }); + } finally { + this.submitLoading = false; + } }, /** 淇濆瓨涓烘ā鏉� */ saveToDraft() { @@ -1961,8 +2095,110 @@ } else if (type === 'localRefresh') { this.$Message.error("鍒锋柊澶辫触锛岃閲嶈瘯"); } + }).catch(reason => { + console.log("鑾峰彇妯℃澘澶辫触",reason) }); - } + }, + removeVideo(){ + this.baseInfoForm.showGoodsVideo = null; + this.baseInfoForm.goodsVideo = null; + }, + // todo 鏂囦欢涓婁紶 + async upLoadImg(file) { + console.log(file,this.count++); + if (this.listImages.length >= 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.listImages.push(fileKey); + this.showListImages.push(sts.data.endpoint + "/" + fileKey); + this.baseInfoForm.goodsGalleryFiles.push(fileKey); + }) + + } catch (e) { + console.log("涓婁紶澶辫触", upData) + return false; + } finally { + // this.upLoadVideoLoading = false; + + } + return false; + }, + async upLoadVideo(file) { + 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.baseInfoForm.goodsVideo = fileKey; + this.baseInfoForm.showGoodsVideo = sts.data.endpoint + "/" + fileKey; + this.baseInfoForm.goodsVideo = fileKey; + }) + + } catch (e) { + console.log("涓婁紶澶辫触", upData) + return false; + } finally { + // this.upLoadVideoLoading = false; + + } + return false; + }, }, mounted() { this.accessToken = { @@ -2044,4 +2280,45 @@ .refresh-icon { margin-left: 10px; } + +.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