From c1e567ddda7f65651179a8a73ca849b07b066b14 Mon Sep 17 00:00:00 2001
From: zxl <763096477@qq.com>
Date: 星期四, 19 六月 2025 19:58:42 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev' into dev
---
manager/src/api/kitchen-video.js | 33
manager/src/views/video/VideoList.vue | 67 +
manager/src/api/kitchen.js | 48
seller/src/views/goods/goods-seller/goodsOperation.vue | 6
manager/src/views/goods/goods-info/goods.vue | 18
manager/src/views/goods/goods-info/goodsApply.vue | 6
manager/src/views/goods/goods-info/goodsDetail.vue | 21
manager/src/views/kitchen/kitchenVideo.vue | 975 +++++++++++++++++
manager/package.json | 5
seller/src/api/file.js | 31
manager/src/api/file.js | 9
seller/src/libs/axios.js | 3
manager/src/views/video/GoodsExpandRow.vue | 35
manager/src/api/health-video.js | 33
seller/src/utils/file.js | 40
seller/package.json | 1
seller/src/views/goods/goods-seller/goodsOperationFirst.vue | 48
seller/src/views/goods/goods-seller/goods.vue | 3
manager/src/views/health/HealthVideoList.vue | 929 ++++++++++++++++
manager/src/views/kitchen/kitchenType.vue | 370 ++++++
manager/src/utils/file.js | 40
seller/src/views/goods/goods-seller/goodsOperationSec.vue | 618 ++++++++--
22 files changed, 3,139 insertions(+), 200 deletions(-)
diff --git a/manager/package.json b/manager/package.json
index 7090251..8de4220 100644
--- a/manager/package.json
+++ b/manager/package.json
@@ -14,9 +14,11 @@
"@antv/g2": "^4.1.12",
"axios": "^0.21.1",
"core-js": "^3.6.5",
+ "cos-js-sdk-v5": "^1.10.1",
"dplayer": "^1.26.0",
"js-cookie": "^2.2.1",
"node-sass": "^4.14.1",
+ "price-color": "1.0.2",
"sass-loader": "^8.0.2",
"sockjs-client": "^1.4.0",
"swiper": "^6.3.5",
@@ -31,8 +33,7 @@
"vue-router": "^3.1.3",
"vuedraggable": "^2.23.2",
"vuex": "^3.4.0",
- "xss": "^1.0.7",
- "price-color": "1.0.2"
+ "xss": "^1.0.7"
},
"devDependencies": {
"@vue/cli-plugin-babel": "^4.4.4",
diff --git a/manager/src/api/file.js b/manager/src/api/file.js
index 8cdbd88..2d866b6 100644
--- a/manager/src/api/file.js
+++ b/manager/src/api/file.js
@@ -12,3 +12,12 @@
})
}
+// 鑾峰彇STS璁块棶浠ょ墝
+export const getSts = () => {
+ return service({
+ baseURL: commonUrl,
+ url: "/common/lmk/file/sts",
+ method: "GET"
+ })
+}
+
diff --git a/manager/src/api/health-video.js b/manager/src/api/health-video.js
new file mode 100644
index 0000000..76adb3c
--- /dev/null
+++ b/manager/src/api/health-video.js
@@ -0,0 +1,33 @@
+import service from "@/libs/axios";
+
+// 瑙嗛鍙戝竷
+export const healthVideo = (data) => {
+ return service({
+ url: "/lkm/health/healthVideo",
+ method: "POST",
+ data: data
+ })
+}
+// 瑙嗛淇敼
+export const updateHealthVideo = (data) => {
+ return service({
+ url: "/lkm/health/updateHealthVideo",
+ method: "POST",
+ data: data
+ })
+}
+// 瑙嗛鏌ヨ
+export const getHealthVideos = (data) => {
+ return service({
+ url: "/lkm/health/page",
+ method: "POST",
+ data: data
+ })
+}
+// 瑙嗛鏌ヨ
+export const delHealth = (id) => {
+ return service({
+ url: "/lkm/health/del/" + id,
+ method: "POST"
+ })
+}
diff --git a/manager/src/api/kitchen-video.js b/manager/src/api/kitchen-video.js
new file mode 100644
index 0000000..5f1fb28
--- /dev/null
+++ b/manager/src/api/kitchen-video.js
@@ -0,0 +1,33 @@
+import service from "@/libs/axios";
+
+// 鍘ㄧ瑙嗛鍙戝竷
+export const addKitchenVideo = (data) => {
+ return service({
+ url: "/lmk/kitchen-video/addKitchenVideo",
+ method: "POST",
+ data: data
+ })
+}
+// 瑙嗛淇敼
+export const updateKitchenVideo = (data) => {
+ return service({
+ url: "/lmk/kitchen-video/updateKitchenVideo",
+ method: "POST",
+ data: data
+ })
+}
+// 瑙嗛鏌ヨ
+export const getKitchenVideos = (data) => {
+ return service({
+ url: "/lmk/kitchen-video/page",
+ method: "POST",
+ data: data
+ })
+}
+// 鍒犻櫎瑙嗛
+export const delKitchen = (id) => {
+ return service({
+ url: "/lmk/kitchen-video/del/" + id,
+ method: "POST"
+ })
+}
diff --git a/manager/src/api/kitchen.js b/manager/src/api/kitchen.js
new file mode 100644
index 0000000..855cfe4
--- /dev/null
+++ b/manager/src/api/kitchen.js
@@ -0,0 +1,48 @@
+import service from "@/libs/axios";
+
+// 绁炲帹鍒嗛〉
+export const getKitchenType = (data) => {
+ return service({
+ url: "/lmk/kitchen-type/page",
+ method: "GET",
+ params: data
+ })
+}
+// 绁炲帹鍒嗙被涓嶅垎椤�
+export const getKitchenTypeAllList = () => {
+ return service({
+ url: "/lmk/kitchen-type/list",
+ method: "GET",
+ })
+}
+// 娣诲姞绁炲帹鏍囩
+export const addKitchenType = (data) => {
+ return service({
+ url: "/lmk/kitchen-type",
+ method: "POST",
+ data: data
+ })
+}
+// 娣诲姞绁炲帹鏍囩
+export const editKitchenType = (data) => {
+ return service({
+ url: "/lmk/kitchen-type",
+ method: "PUT",
+ data: data
+ })
+}
+// 鍒犻櫎绁炲帹鏍囩
+export const delKitchenType = (id) => {
+ return service({
+ url: "/lmk/kitchen-type/"+id,
+ method: "DELETE",
+ })
+}
+// 鎵归噺鍒犻櫎绁炲帹鏍囩
+export const deleteBatch = (data) => {
+ return service({
+ url: "/lmk/kitchen-type/batch",
+ method: "DELETE",
+ data: data
+ })
+}
diff --git a/manager/src/utils/file.js b/manager/src/utils/file.js
new file mode 100644
index 0000000..74cfa34
--- /dev/null
+++ b/manager/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/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
new file mode 100644
index 0000000..43ef70c
--- /dev/null
+++ b/manager/src/views/health/HealthVideoList.vue
@@ -0,0 +1,929 @@
+<template>
+ <div>
+ <Card>
+ <Form
+ ref="searchForm"
+ @keydown.enter.native="handleSearch"
+ :model="searchForm"
+ inline
+ :label-width="70"
+ class="search-form"
+ >
+ <Form-item label="鏍囬" prop="title">
+ <Input
+ type="text"
+ v-model="searchForm.title"
+ clearable
+ @on-clear="handleSearch"
+ @on-change="handleSearch"
+ style="width: 160px"
+ />
+ </Form-item>
+<!-- todo 鏆傛椂闅愯棌澶у仴搴蜂竴鏈熸病瀹氫箟鏍囩-->
+ <Form-item v-if="false" label="鏍囩" prop="tagList">
+ <Select
+ v-model="searchForm.tagList"
+ clearable
+ filterable
+ multiple
+ @on-clear="handleSearch"
+ @on-change="handleSearch"
+ style="width: 160px"
+ >
+ <Option v-for="tag in tagList" :key="tag.id" :value="tag.id">{{ tag.tagName }}</Option>
+ </Select>
+ </Form-item>
+ <Form-item label="瑙嗛鐘舵��" prop="status">
+ <Select
+ v-model="searchForm.status"
+ clearable
+ @on-clear="handleSearch"
+ @on-change="handleSearch"
+ style="width: 160px"
+ >
+ <Option value="99">寰呭鏍�</Option>
+ <Option value="1">宸插彂甯�</Option>
+ <Option value="0">宸蹭笅鏋�</Option>
+ <Option value="-1">瀹℃牳鏈�氳繃</Option>
+ </Select>
+ </Form-item>
+ <Button
+ @click="handleSearch"
+ type="primary"
+ icon="ios-search"
+ class="search-btn"
+ >鎼滅储
+ </Button
+ >
+ <Button
+ @click="handleVideoUpLoad"
+ type="primary"
+ icon="md-arrow-up"
+ class="search-btn"
+ >涓婁紶瑙嗛
+ </Button
+ >
+ </Form>
+ <!-- 澶у仴搴疯棰戜笂浼�-->
+ <Modal
+ v-model="upLoadVideoShow"
+ :title="uploadVideoForm.id?'缂栬緫澶у仴搴疯棰�':'涓婁紶澶у仴搴疯棰�'"
+ width="800"
+ :mask-closable="false"
+ >
+
+ <Form
+ :model="uploadVideoForm"
+ ref="uploadVideoForm"
+ :rules="uploadVideoFileRule"
+ >
+ <Row :gutter="24">
+ <Col span="24">
+ <Spin size="large" fix v-if="upLoadVideoLoading"> 鏂囦欢涓婁紶涓�...</Spin>
+ </Col>
+ <Col span="12">
+ <FormItem label="鏍囬" prop="title">
+ <Input placeholder="璇疯緭鍏ユ爣棰�" v-model="uploadVideoForm.title"
+ style="width: 200px"
+ />
+ </FormItem>
+ </Col>
+ <Col span="24">
+ <FormItem label="鍒锋柊dom浣跨敤" prop="title" v-show="false">
+ <Input placeholder="璇疯緭鍏ユ爣棰�" v-model="uploadVideoForm.temp"
+ style="width: 200px"
+ />
+ </FormItem>
+ </Col>
+ <Col span="12" v-if="!uploadVideoForm.videoFileKey">
+ <FormItem label="涓婁紶瑙嗛" prop="videoFileKey">
+ <Upload
+ :multiple="true"
+ :before-upload="upLoadVideo"
+ accept="video/*"
+ action=""
+ >
+ <Button icon="ios-cloud-upload-outline">閫夋嫨瑙嗛</Button>
+ </Upload>
+ </FormItem>
+ </Col>
+
+ <Col span="24" v-else>
+ <FormItem label="瑙嗛">
+ <video style="width: 150px;height: 150px"
+ controls
+ @loadedmetadata="getVideoDuration"
+ :poster="uploadVideoForm.showCoverUrl"
+ :autoplay="false"
+ id="remoteVideo" :src="uploadVideoForm.showVideoUrl"
+ ref="healthVideoInfo"
+ ></video>
+ </FormItem>
+ </Col>
+
+ <Col span="12" v-show="uploadVideoForm.videoFileKey && !uploadVideoForm.coverUrl">
+ <FormItem label="涓婁紶灏侀潰" prop="coverUrl">
+ <Upload
+ :multiple="true"
+ :before-upload="upLoadImg"
+ accept="image/*"
+ action=""
+ >
+ <Button icon="ios-cloud-upload-outline">閫夋嫨灏侀潰</Button>
+ </Upload>
+ </FormItem>
+ </Col>
+ <Col span="24">
+ <div>
+ <Button type="primary" @click="clearCoverImage" v-show="uploadVideoForm.coverUrl">閲嶆柊涓婁紶灏侀潰</Button>
+ <Button type="primary" @click="clearVideo" style="margin-left: 20px"
+ v-show="uploadVideoForm.videoFileKey">閲嶆柊涓婁紶瑙嗛
+ </Button>
+ </div>
+ </Col>
+ <!-- <Col span="24" v-else>-->
+ <!-- <FormItem label="灏侀潰">-->
+ <!-- <div class="showCoverImg" style="width: 150px;height: 150px;">-->
+ <!-- <img :src="uploadVideoForm.showCoverUrl" style="width: 150px;height: 150px" class="coverImg"/>-->
+ <!-- <Icon type="ios-close" size="24" class="coverImgRemove" color="red"-->
+ <!-- style="border-radius: 50%;background: #fff;cursor: pointer"-->
+ <!-- @click="removeCover"-->
+ <!-- />-->
+ <!-- </div>-->
+ <!-- </FormItem>-->
+ <!-- </Col>-->
+ </Row>
+
+ </Form>
+ <div slot="footer">
+ <Button type="text" @click="closeHealthVideo">鍏抽棴</Button>
+ <Button type="primary" @click="submitHealthVideo">纭</Button>
+ </div>
+ </Modal>
+ <Modal
+ v-model="playVideoShow"
+ :title="playVideoTitle"
+ width="800"
+ :mask-closable="false"
+ >
+ <div class="video-warp">
+ <video :src="playVideoUrl" autoplay controls style="width: 768px;height: 432px"/>
+ </div>
+ <div slot="footer">
+ <Button type="text" @click="playVideoClose">鍏抽棴</Button>
+ </div>
+ </Modal>
+
+ <Modal
+ v-model="auditingShow"
+ title="瑙嗛瀹℃牳"
+ width="800"
+ :loading="auditingLoading"
+ :mask-closable="false"
+ >
+
+ <Form
+ ref="auditingForm"
+ :model="auditingForm"
+ :label-width="70"
+ :rules="auditingRule"
+ >
+ <Form-item label="鏍囬锛�">
+ <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>
+ </div>
+ </div>
+ </Form-item>
+ <Form-item label="瑙嗛鏃堕暱锛�" :label-width="72">
+ <div>{{ formatSeconds(detail.videoDuration) }}</div>
+ </Form-item>
+ <Form-item class="video-warp" :label-width="0">
+ <video :src="detail.videoUrl" autoplay controls style="width: 768px;height: 432px"/>
+ </Form-item>
+ <Form-item label="瀹℃牳缁撴灉锛�" :label-width="100" prop="result">
+ <RadioGroup v-model="auditingForm.result">
+ <Radio :label="1">閫氳繃</Radio>
+ <Radio :label="0">涓嶉�氳繃</Radio>
+ </RadioGroup>
+ </Form-item>
+ <Form-item v-show="auditingForm.result === 0" label="涓嶉�氳繃鍘熷洜锛�" :label-width="100" prop="reason">
+ <Input
+ type="textarea"
+ v-model="auditingForm.reason"
+ clearable
+ style="width: 100%"
+ />
+ </Form-item>
+ </Form>
+ <div slot="footer">
+ <Button type="text" @click="closeAuditing">鍏抽棴</Button>
+ <Button type="primary" @click="submitAuditing">纭</Button>
+ </div>
+ </Modal>
+
+ <Modal
+ v-model="videoDownShow"
+ title="瑙嗛涓嬫灦"
+ width="800"
+ :mask-closable="false"
+ >
+ <Form :model="videoDownForm" :rules="videoDownRule" ref="videoDownForm">
+ <FormItem label="涓嬫灦鍘熷洜锛�" :labelWidth="100" prop="reason">
+ <editor ref="editor" @input="getReason"/>
+ </FormItem>
+ </Form>
+ <div slot="footer">
+ <Button type="text" @click="closeVideoDown">鍏抽棴</Button>
+ <Button type="primary" @click="videoDown">纭</Button>
+ </div>
+ </Modal>
+
+ <Table
+ :loading="loading"
+ border
+ :columns="columns"
+ :data="data"
+ ref="table"
+ sortable="custom"
+ @on-sort-change="changeSort"
+ @on-selection-change="showSelect"
+ >
+ <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>
+ </div>
+ </template>
+ <template slot-scope="{ row, index }" slot="videoFileKey">
+ <div class="play-text" @click="playVideo(row.videoFileKey, row.title)">鐐瑰嚮鎾斁</div>
+ </template>
+ <template slot-scope="{ row, index }" slot="videoDuration">
+ <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) }}
+ </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="success" size="small" style="margin-right: 5px"
+ @click="handleVideoUpLoad(row)">缂栬緫
+ </Button>
+ <Button type="success" size="small" style="margin-right: 5px"
+ @click="deleteHealthVideo(row)">鍒犻櫎
+ </Button>
+ </template>
+ </Table>
+
+ <Row type="flex" justify="end" class="mt_10">
+ <Page
+ :current="searchForm.pageNumber"
+ :total="total"
+ :page-size="searchForm.pageSize"
+ @on-change="changePage"
+ @on-page-size-change="changePageSize"
+ :page-size-opts="[10, 20, 50]"
+ size="small"
+ show-total
+ show-elevator
+ show-sizer
+ ></Page>
+ </Row>
+ </Card>
+ </div>
+</template>
+
+<script>
+import {recommendSet, getVideoById, auditingVideo, up, down} from "@/api/video";
+import {healthVideo, getHealthVideos, updateHealthVideo,delHealth} from "@/api/health-video";
+import {getVideoTagList} from "@/api/videoTag";
+import {getFilePreview, getSts} from "@/api/file";
+import Editor from '@/components/editor/index.vue'
+import COS from 'cos-js-sdk-v5';
+import {getFileKey} from "@/utils/file.js";
+
+export default {
+ name: "VideoList",
+ components: {Editor},
+ data() {
+ return {
+ videoDownForm: {
+ id: '',
+ reason: ''
+ },
+ videoDownRule: {
+ reason: [
+ {
+ require: true,
+ message: '璇疯緭鍏ヤ笅鏋跺師鍥�',
+ trigger: 'blur',
+ validator: (rule, value, callback) => {
+ if (value === null || value === '') {
+ callback(new Error('璇疯緭鍏ヤ笅鏋跺師鍥�'));
+ } else {
+ callback();
+ }
+ }
+ }
+ ]
+ },
+ videoDownShow: false, // 瑙嗛涓嬫灦
+ videoDownMsg: '', // 涓嬫灦鎻愮ず淇℃伅
+ auditingForm: { // 瀹℃牳琛ㄥ崟
+ id: null,
+ result: null,
+ reason: ''
+ },
+ auditingRule: {
+ result: [
+ {
+ required: true,
+ message: '璇烽�夋嫨瑙嗛瀹℃牳缁撴灉',
+ trigger: 'change',
+ validator: (rule, value, callback) => {
+ if (value === null || value === undefined) {
+ callback(new Error('璇烽�夋嫨瑙嗛瀹℃牳缁撴灉'));
+ } else {
+ callback();
+ }
+ }
+ }
+ ],
+ },
+ uploadVideoFileRule: {
+ coverUrl: [
+ {
+ required: true,
+ message: '璇蜂笂浼犲皝闈�',
+ trigger: 'blur',
+ validator: (rule, value, callback) => {
+ if (value === null || value === undefined) {
+ callback(new Error('璇蜂笂浼犲皝闈�'));
+ } else {
+ callback();
+ }
+ }
+ }
+ ],
+ title: [
+ {
+ required: true,
+ message: '璇疯緭鍏ユ爣棰�',
+ trigger: 'blur',
+ validator: (rule, value, callback) => {
+ console.log('楠岃瘉鍊�:-------------->', value, '绫诲瀷:', typeof value);
+ if (value === null || value === undefined) {
+ callback(new Error('璇疯緭鍏ユ爣棰�'));
+ } else {
+ callback();
+ }
+ }
+ }
+ ],
+ },
+ detail: {}, // 瑙嗛璇︽儏淇℃伅
+ auditingShow: false, // 瀹℃牳寮圭獥
+ upLoadVideoShow: false,//鏂囦欢涓婁紶寮圭獥
+ auditingLoading: false, // 瀹℃牳寮圭獥
+ upLoadVideoLoading: false,//涓婁紶瑙嗛
+ playVideoShow: false, // 瑙嗛鎾斁寮圭獥
+ playVideoTitle: '', // 瑙嗛鎾斁鏍囬
+ playVideoUrl: '', // 褰撳墠姝e湪鎾斁鐨勮棰戝湴鍧�
+ modelShow: false, // 寮圭獥鏄鹃殣
+ modelTitle: '', // 寮圭獥title
+ loading: false, // 琛ㄥ崟鍔犺浇鐘舵��
+ searchForm: {
+ // 鎼滅储妗嗗垵濮嬪寲瀵硅薄
+ pageNumber: 1, // 褰撳墠椤垫暟
+ pageSize: 10, // 椤甸潰澶у皬
+ title: '', // 鏍囬
+ tagList: [], // 鏍囩
+ status: '99'
+ },
+ tagList: [], // 鏍囩鍒楄〃
+ columns: [
+ {
+ type: 'selection',
+ width: 60,
+ align: 'center'
+ },
+ {
+ title: "鏍囬",
+ key: "title",
+ minWidth: 240,
+ tooltip: true,
+ },
+ // {
+ // title: "浣滆��",
+ // key: "authorName",
+ // width: 130,
+ // tooltip: true,
+ // },
+ // {
+ // title: "瑙嗛鏍囩",
+ // key: "tagList",
+ // width: 180,
+ // slot: "tagList",
+ // },
+ {
+ title: "瑙嗛鍐呭",
+ key: "videoFileKey",
+ width: 170,
+ slot: "videoFileKey"
+ },
+ {
+ title: "鏃堕暱",
+ key: "videoDuration",
+ width: 80,
+ align: 'center',
+ slot: "videoDuration",
+ },
+ {
+ title: "鎾斁閲�",
+ key: "playNum",
+ width: 80,
+ align: 'center'
+ },
+ {
+ title: "鏀惰棌鏁�",
+ key: "collectNum",
+ width: 80,
+ align: 'center'
+ },
+ {
+ title: "璇勮鏁�",
+ key: "commentNum",
+ width: 80,
+ align: 'center'
+ },
+ {
+ title: "棣栭〉鎺ㄨ崘",
+ key: "recommend",
+ slot: "recommend",
+ width: 100,
+ align: 'center'
+ },
+ {
+ title: "鏉冮噸",
+ key: "weight",
+ width: 170,
+ },
+ {
+ title: "鐘舵��",
+ key: "status",
+ slot: "status",
+ width: 120,
+ align: 'center'
+ },
+ {
+ title: "鎿嶄綔",
+ key: "action",
+ slot: "action",
+ align: "center",
+ width: 200,
+ },
+ ],
+ data: [], // 琛ㄥ崟鏁版嵁
+ total: 0, // 琛ㄥ崟鏁版嵁鎬绘暟
+ selectCount: 0, // 宸查�夋暟閲�
+ selectList: [], // 宸查�夋暟鎹垪琛�
+ uploadVideoForm: {
+ id: null,
+ coverUrl: null,
+ videoFileKey: null,
+ videoFit: null,
+ videoDuration: null,
+ title: null,
+ videoContentType: null,
+ videoType: null,
+ showCoverUrl: null,
+ showVideoUrl: null,
+ temp: null
+
+ },
+ }
+ },
+ created() {
+ this.getDataList();
+ this.getTags('')
+ },
+ methods: {
+ // 绉掕浆x鍒唜绉�
+ formatSeconds(seconds) {
+ if (isNaN(seconds) || seconds < 0) return '0绉�';
+
+ const mins = Math.floor(seconds / 60);
+ const secs = seconds % 60;
+
+ if (mins === 0) return `${secs}绉抈;
+ if (secs === 0) return `${mins}鍒哷;
+
+ return `${mins}鍒�${secs}绉抈;
+ },
+ // 鑾峰彇鏍囩鍒楄〃
+ getTags(tagName) {
+ let params = {
+ 'tagName': tagName
+ }
+ getVideoTagList(params).then(res => {
+ this.tagList = res.data
+ })
+ },
+ // 鑾峰彇瀵屾枃鏈紪杈戝櫒鐨勫唴瀹�
+ getReason(content) {
+ this.videoDownForm.reason = content
+ },
+ //閲嶆柊涓婁紶灏侀潰
+ clearCoverImage() {
+ this.$set(this.uploadVideoForm, 'coverUrl', '');
+ this.$set(this.uploadVideoForm, 'showCoverUrl', '');
+ this.$set(this.uploadVideoForm, 'temp', new Date().getTime());
+ },
+ //閲嶆柊涓婁紶瑙嗛
+ clearVideo() {
+ this.clearCoverImage();
+ this.$set(this.uploadVideoForm, 'videoFileKey', '');
+ this.$set(this.uploadVideoForm, 'showVideoUrl', '');
+ this.$set(this.uploadVideoForm, 'temp', new Date().getTime());
+ console.log(this.uploadVideoForm)
+ },
+ // 瑙嗛涓婃灦
+ videoUp(row) {
+ this.$Modal.confirm({
+ title: "鎿嶄綔纭",
+ content: "鎮ㄧ‘璁よ涓婃灦瑙嗛銆� " + row.title + "銆戝悧?",
+ loading: true,
+ onOk: () => {
+ up(row.id).then(res => {
+ this.$Modal.remove();
+ if (res.code == 200) {
+ this.$Message.success("瑙嗛涓婃灦鎴愬姛");
+ this.getDataList();
+ }
+ });
+ }
+ });
+ },
+ // 瑙嗛涓嬫灦
+ videoDown() {
+ this.$refs.videoDownForm.validate((valid) => {
+ if (valid) {
+ down(this.videoDownForm).then(res => {
+ this.$Message.success("涓嬫灦鎴愬姛")
+ this.closeVideoDown()
+ this.getDataList()
+ })
+ }
+ })
+ },
+ // 鍏抽棴瑙嗛涓嬫灦
+ closeVideoDown() {
+ this.videoDownShow = false
+ this.videoDownForm = {
+ id: '',
+ reason: ''
+ }
+ this.$refs.editor.setContent('')
+ },
+ // 瑙嗛涓嬫灦
+ openVideoDown(row) {
+ this.videoDownForm.id = row.id
+ this.videoDownShow = true
+ },
+ // 瑙嗛鍙戝竷/淇敼
+ submitHealthVideo() {
+ try {
+ this.upLoadVideoLoading = true
+ this.$refs.uploadVideoForm.validate((valid) => {
+ if (valid) {
+ // 淇敼
+ if (this.uploadVideoForm.id) {
+ updateHealthVideo(this.uploadVideoForm).then(res => {
+ this.$Message.success("淇敼瀹屾垚")
+ this.closeHealthVideo()
+ this.getDataList()
+ })
+ } else {
+ healthVideo(this.uploadVideoForm).then(res => {
+ this.$Message.success("娣诲姞瀹屾垚")
+ this.closeHealthVideo()
+ this.getDataList()
+ })
+ }
+ }
+ })
+ } finally {
+ this.upLoadVideoLoading = false
+ }
+ },
+ // 鍏抽棴绐楀彛
+ closeHealthVideo() {
+ //
+ this.uploadVideoForm = {};
+ this.upLoadVideoShow = false;
+ },
+ // 鎻愪氦瀹℃牳缁撴灉
+ submitAuditing() {
+ console.log(this.auditingForm, "sb")
+ this.$refs.auditingForm.validate((valid) => {
+ if (valid) {
+ auditingVideo(this.auditingForm).then(res => {
+ this.$Message.success("瀹℃牳瀹屾垚")
+ this.closeAuditing()
+ this.getDataList()
+ })
+ }
+ })
+ },
+ // 瀹℃牳缁撴灉鍙樺寲
+ resultChange(selected) {
+ this.auditingForm.result = selected === '閫氳繃' ? 1 : 0
+ console.log(this.auditingForm.result)
+ },
+ closeAuditing() {
+ this.auditingForm = {
+ id: null,
+ result: null,
+ reason: ''
+ }
+ this.detail = {}
+ this.auditingShow = false
+ },
+ // 鎵撳紑瀹℃牳寮圭獥
+ openAuditing(row) {
+ this.auditingShow = true
+ this.auditingLoading = true
+ this.auditingForm.id = row.id
+ getVideoById(row.id).then(res => {
+ this.detail = res.data
+ this.auditingLoading = false
+ })
+ },
+ getVideoDuration(e){
+ const duration = this.$refs.healthVideoInfo.duration;
+ this.uploadVideoForm.videoDuration = Math.floor(duration);
+ },
+ // 鎵撳紑缂栬緫寮圭獥
+ deleteHealthVideo(row) {
+ console.log('鍒犻櫎娴嬭瘯', row)
+ this.$Modal.confirm({
+ title: "鎿嶄綔纭",
+ content: "鎮ㄧ‘璁よ鍒犻櫎瑙嗛銆� " + row.title + "銆戝悧?",
+ loading: true,
+ onOk: () => {
+ delHealth(row.id).then(res => {
+ this.$Modal.remove();
+ if (res.code === 200) {
+ this.$Message.success("瑙嗛鍒犻櫎鎴愬姛");
+ this.getDataList();
+ }
+ });
+ }
+ });
+ },
+ // 缈昏瘧鐘舵��
+ transStatus(status) {
+ switch (status) {
+ case '99':
+ return '寰呭鏍�'
+ case '1':
+ return '宸插彂甯�'
+ case '0':
+ return '宸蹭笅鏋�'
+ case '-1':
+ return '瀹℃牳鏈�氳繃'
+ default:
+ return '鏈煡'
+ }
+ },
+ // 寮�鍚垨鍏抽棴鎺ㄨ崘鐨勬柟娉�
+ handleBeforeChange(row) {
+ let content = ""
+ if (row.recommend) {
+ content = '纭瑕佸叧闂椤垫帹鑽愬悧锛�'
+ } else {
+ content = '纭瑕佸紑鍚椤垫帹鑽愬悧锛�'
+ }
+ return new Promise((resolve) => {
+ this.$Modal.confirm({
+ title: '鎿嶄綔鎻愰啋',
+ content: content,
+ onOk: () => {
+ recommendSet({id: row.id, recommend: !row.recommend}).then(res => {
+ this.$Message.success(res.msg);
+ resolve();
+ })
+ }
+ });
+ });
+ },
+ // 鍏抽棴瑙嗛鎾斁
+ playVideoClose() {
+ this.playVideoTitle = '';
+ this.playVideoUrl = '';
+ this.playVideoShow = false
+ },
+ // 鐐瑰嚮鎾斁瑙嗛
+ playVideo(fileKey, title) {
+ this.playVideoTitle = title;
+
+ getFilePreview(fileKey).then(res => {
+ this.playVideoUrl = res.data
+ this.playVideoShow = true
+ })
+ },
+ // 鎼滅储
+ handleSearch() {
+ this.searchForm.pageNumber = 1;
+ this.searchForm.pageSize = 10;
+ this.getDataList();
+ },
+ // 鑾峰彇鍒楄〃鏁版嵁
+ getDataList() {
+ this.loading = true;
+ getHealthVideos(this.searchForm).then((res) => {
+ console.log(res)
+ this.loading = false;
+ if (res.code === 200) {
+ this.data = res.data;
+ this.total = res.total;
+ }
+ });
+ this.total = this.data.length;
+ this.loading = false;
+ },
+ showSelect(e) {
+ this.selectList = e.map(d => d.id);
+ this.selectCount = e.length;
+ },
+ // 鎺掑簭
+ changeSort(e) {
+ this.searchForm.sort = e.key;
+ this.searchForm.order = e.order;
+ if (e.order == "normal") {
+ this.searchForm.order = "";
+ }
+ this.getDataList();
+ },
+ // 鍒嗛〉 鏀瑰彉椤电爜
+ changePage(v) {
+ this.searchForm.pageNumber = v;
+ this.getDataList();
+ },
+ // 鍒嗛〉 鏀瑰彉椤垫暟
+ changePageSize(v) {
+ this.searchForm.pageNumber = 1;
+ this.searchForm.pageSize = v;
+ this.getDataList();
+ },
+ handleVideoUpLoad(row) {
+ this.uploadVideoForm = {};
+ this.upLoadVideoShow = true;
+ if (row.id) {
+ this.uploadVideoForm.id = row.id;
+ this.uploadVideoForm.showVideoUrl = row.videoUrl
+ this.uploadVideoForm.videoFileKey = row.videoFileKey;
+ this.uploadVideoForm.coverUrl = row.coverUrl;
+ this.uploadVideoForm.showCoverUrl = row.coverShowUrl;
+ this.uploadVideoForm.title = row.title;
+ }
+ },
+ async upLoadVideo(file) {
+ try {
+ this.$nextTick(() => {
+ 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(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.upLoadVideoLoading = false;
+ })
+ }
+ return false;
+ },
+ async upLoadImg(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.uploadVideoForm.coverUrl = fileKey;
+ this.uploadVideoForm.showCoverUrl = sts.data.endpoint + "/" + fileKey;
+ })
+
+ } catch (e) {
+ console.log("涓婁紶澶辫触", upData)
+ } finally {
+ this.upLoadVideoLoading = false;
+ }
+ return false;
+ }
+ }
+}
+</script>
+
+<style scoped>
+.play-text {
+ width: 100%;
+ text-align: center;
+ color: #2d8cf0;
+}
+
+.play-text:hover {
+ cursor: pointer;
+}
+
+.video-warp {
+ width: 786px;
+ height: 432px;
+}
+
+.data-item {
+ display: flex;
+ align-items: center;
+}
+
+.showCoverImg {
+ position: relative;
+}
+
+.coverImgRemove {
+ position: absolute;
+ top: 15px;
+ right: -15px;
+}
+</style>
diff --git a/manager/src/views/kitchen/kitchenType.vue b/manager/src/views/kitchen/kitchenType.vue
new file mode 100644
index 0000000..7123251
--- /dev/null
+++ b/manager/src/views/kitchen/kitchenType.vue
@@ -0,0 +1,370 @@
+<template>
+ <div>
+ <Card>
+ <Form
+ ref="searchForm"
+ @keydown.enter.native="handleSearch"
+ :model="searchForm"
+ inline
+ :label-width="70"
+ class="search-form"
+ >
+ <Form-item label="鏍囩鍚嶇О" prop="typeName">
+ <Input
+ type="text"
+ v-model="searchForm.typeName"
+ clearable
+ @on-clear="handleSearch"
+ @on-change="handleSearch"
+ style="width: 160px"
+ />
+ </Form-item>
+ <Button
+ @click="handleSearch"
+ type="primary"
+ icon="ios-search"
+ class="search-btn"
+ >鎼滅储</Button
+ >
+ </Form>
+
+ <Row class="operation padding-row">
+ <Button @click="openAdd" type="info">娣诲姞</Button>
+ <Button @click="delBatch" type="error">鎵归噺鍒犻櫎</Button>
+ </Row>
+
+ <Modal
+ v-model="modelShow"
+ :title="modelTitle"
+ >
+ <Form ref="form" :model="form" :label-width="70" :rules="rules">
+ <Row :gutter="24">
+ <Col span="12">
+ <FormItem label="鏍囩鍚嶇О" prop="typeName">
+ <Input v-model="form.typeName" autocomplete="off"/>
+ </FormItem>
+ </Col>
+ <Col span="12">
+ <FormItem label="鎺掑簭" prop="sortNum">
+ <Input v-model="form.sortNum" autocomplete="off"/>
+ </FormItem>
+ </Col>
+ </Row>
+ </Form>
+ <div slot="footer">
+ <Button type="text" @click="modelClose">鍙栨秷</Button>
+ <Button type="primary" :loading="submitLoading" @click="saveOrUpdate">鎻愪氦</Button>
+ </div>
+ </Modal>
+
+ <Table
+ :loading="loading"
+ border
+ :columns="columns"
+ :data="data"
+ ref="table"
+ sortable="custom"
+ @on-sort-change="changeSort"
+ @on-selection-change="showSelect"
+ >
+ <template slot-scope="{ row, index }" slot="action">
+ <Button type="info" size="small" style="margin-right: 5px" @click="openEdit(row)">缂栬緫</Button>
+ <Button type="error" size="small" @click="delById(row)">鍒犻櫎</Button>
+ </template>
+ </Table>
+
+ <Row type="flex" justify="end" class="mt_10">
+ <Page
+ :current="searchForm.pageNumber"
+ :total="total"
+ :page-size="searchForm.pageSize"
+ @on-change="changePage"
+ @on-page-size-change="changePageSize"
+ :page-size-opts="[10, 20, 50]"
+ size="small"
+ show-total
+ show-elevator
+ show-sizer
+ ></Page>
+ </Row>
+ </Card>
+ </div>
+</template>
+
+<script>
+import JsonExcel from "vue-json-excel";
+import {deleteVideoTagById, getVideoTags, editVideoTag, addVideoTag, deleteVideoTagByIds} from "@/api/videoTag";
+import {addKitchenType, deleteBatch, delKitchenType, editKitchenType, getKitchenType} from "@/api/kitchen";
+export default {
+ name: "VideoTagList",
+ components: {
+ "download-excel": JsonExcel,
+ },
+ data() {
+ return {
+ // 淇濆瓨鍔犺浇
+ submitLoading: false,
+ // 鏂板淇敼琛ㄥ崟
+ form: {
+ id: '',
+ typeName: '',
+ sortNum: '',
+ },
+ rules: {
+ typeName: [
+ {required: true, message: "鏍囩鍚嶇О涓嶈兘涓虹┖", trigger: "blur",
+ validator: (rule, value, callback) => {
+ if (value === null || value === '') {
+ callback(new Error('鏍囩鍚嶇О涓嶈兘涓虹┖'));
+ } else {
+ callback();
+ }
+ }
+ }
+ ],
+ sortNum : [
+ {required: true, message: "搴忓彿涓嶈兘涓虹┖", trigger: "blur",
+ validator: (rule, value, callback) => {
+ if (value === null || value === '') {
+ callback(new Error('搴忓彿涓嶈兘涓虹┖'));
+ } else {
+ callback();
+ }
+ }}
+ ],
+ },
+ modelShow: false, // 寮圭獥鏄鹃殣
+ modelTitle: '', // 寮圭獥title
+ // 琛ㄦ牸鐨勮〃澶翠互鍙婂唴瀹�
+ fields: {
+ 绫诲瀷: "tagName",
+ 寮曠敤娆℃暟: "useNum",
+ 鎺掑簭: "sort_num",
+ 鎿嶄綔: "action"
+ },
+ loading: true, // 琛ㄥ崟鍔犺浇鐘舵��
+ searchForm: {
+ // 鎼滅储妗嗗垵濮嬪寲瀵硅薄
+ pageNumber: 1, // 褰撳墠椤垫暟
+ pageSize: 10, // 椤甸潰澶у皬
+ typeName: '', // 鏍囩鍚嶇О
+ },
+ selectDate: null,
+ columns: [
+ {
+ type: 'selection',
+ width: 60,
+ align: 'center'
+ },
+ {
+ title: "鏍囩",
+ key: "typeName",
+ minWidth: 170,
+ tooltip: true,
+ },
+ // {
+ // title: "寮曠敤娆℃暟",
+ // key: "useNum",
+ // width: 170,
+ // sortable: true
+ // },
+ {
+ title: "鎺掑簭",
+ key: "sortNum",
+ width: 400,
+ },
+ {
+ title: "鎿嶄綔",
+ key: "action",
+ slot: "action",
+ align: "center",
+ width: 400,
+ },
+ ],
+ data: [], // 琛ㄥ崟鏁版嵁
+ total: 0, // 琛ㄥ崟鏁版嵁鎬绘暟
+ selectCount: 0, // 宸查�夋暟閲�
+ selectList: [], // 宸查�夋暟鎹垪琛�
+ };
+ },
+ methods: {
+ showSelect(e) {
+ this.selectList = e.map(d => d.id);
+ this.selectCount = e.length;
+ },
+ // 鎺掑簭
+ changeSort(e) {
+ this.searchForm.sort = e.key;
+ this.searchForm.order = e.order;
+ if (e.order == "normal") {
+ this.searchForm.order = "";
+ }
+ this.getDataList();
+ },
+ // 鎵归噺鍒犻櫎
+ delBatch() {
+ if (this.selectCount <= 0) {
+ this.$Message.warning("鎮ㄨ繕鏈�夋嫨瑕佸垹闄ょ殑鏁版嵁");
+ return;
+ }
+ this.$Modal.confirm({
+ title: "纭鍒犻櫎",
+ content: "鎮ㄧ‘璁よ鍒犻櫎鎵�閫夌殑 " + this.selectCount + " 鏉℃暟鎹�?",
+ loading: true,
+ onOk: () => {
+ deleteBatch(this.selectList).then(res => {
+ this.$Modal.remove();
+ if (res.code == 200) {
+ this.$Message.success("鍒犻櫎鎴愬姛");
+ this.selectList = [];
+ this.selectCount = 0;
+ this.getDataList();
+ }
+ });
+ }
+ });
+ },
+ // id鍒犻櫎
+ delById(row) {
+ this.$Modal.confirm({
+ title: "纭鍒犻櫎",
+ content: "鎮ㄧ‘璁よ鍒犻櫎鏍囩锛� " + row.typeName + " ?",
+ loading: true,
+ onOk: () => {
+ delKitchenType(row.id).then(res => {
+ this.$Modal.remove();
+ if (res.code == 200) {
+ this.$Message.success("鍒犻櫎鎴愬姛");
+ this.getDataList();
+ }
+ });
+ }
+ });
+ },
+ // 鎵撳紑鏂板
+ openAdd() {
+ this.modelTitle = "鏂板鏍囩"
+ this.modelShow = true
+ this.form ={}
+ },
+ // 鎵撳紑淇敼
+ openEdit(row) {
+ this.modelTitle = "淇敼鏍囩"
+ this.form = {};
+ this.form.id = row.id
+ this.form.typeName = row.typeName
+ this.form.sortNum = row.sortNum
+ this.modelShow = true
+ console.log(this.form)
+ },
+ // 鏂板鎴栦慨鏀�
+ saveOrUpdate() {
+ this.$refs.form.validate(valid => {
+ try {
+ if (valid) {
+ this.submitLoading = true
+ if (this.form.id) {
+ // 淇敼
+ editKitchenType(this.form).then(res => {
+ if (res.code == 200) {
+ this.$Message.success("淇敼鎴愬姛");
+ this.modelClose()
+ this.getDataList()
+ }
+ })
+ } else {
+ // 鏂板
+ addKitchenType(this.form).then(res => {
+ if (res.code == 200) {
+ this.$Message.success("娣诲姞鎴愬姛");
+ this.modelClose()
+ this.getDataList()
+ }
+ })
+ }
+ }
+ }finally {
+ this.submitLoading = false
+ }
+ });
+ },
+ // 鍏抽棴寮圭獥
+ modelClose() {
+ this.submitLoading = false
+ this.modelShow = false
+ },
+ // 鍒濆鍖栨暟鎹�
+ init() {
+ this.getDataList();
+ },
+ // 鍒嗛〉 鏀瑰彉椤电爜
+ changePage(v) {
+ this.searchForm.pageNumber = v;
+ this.getDataList();
+ },
+ // 鍒嗛〉 鏀瑰彉椤垫暟
+ changePageSize(v) {
+ this.searchForm.pageNumber = 1;
+ this.searchForm.pageSize = v;
+ this.getDataList();
+ },
+ // 鎼滅储
+ handleSearch() {
+ this.searchForm.pageNumber = 1;
+ this.searchForm.pageSize = 10;
+ this.getDataList();
+ },
+ // 璧锋鏃堕棿浠庢柊璧嬪��
+ selectDateRange(v) {
+ if (v) {
+ this.searchForm.startDate = v[0];
+ this.searchForm.endDate = v[1];
+ }
+ },
+ // 鑾峰彇鍒楄〃鏁版嵁
+ getDataList() {
+ this.loading = true;
+ getKitchenType(this.searchForm).then((res) => {
+ console.log(res)
+ this.loading = false;
+ if (res.code == 200) {
+ this.data = res.data;
+ this.total = res.total;
+ }
+ });
+ this.total = this.data.length;
+ this.loading = false;
+ },
+ },
+ mounted() {
+ this.init();
+ },
+};
+</script>
+<style lang="scss" scoped>
+.export {
+ margin: 10px 20px 10px 0;
+}
+.export-excel-wrapper {
+ display: inline;
+}
+.order-tab {
+ width: 950px;
+ height: 36px;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ background-color: #f0f0f0;
+ padding: 0 10px;
+ margin-bottom: 10px;
+ div {
+ text-align: center;
+ padding: 4px 12px;
+ border-radius: 4px;
+ cursor: pointer;
+ }
+ .current {
+ background-color: #ffffff;
+ }
+}
+</style>
diff --git a/manager/src/views/kitchen/kitchenVideo.vue b/manager/src/views/kitchen/kitchenVideo.vue
new file mode 100644
index 0000000..40e7079
--- /dev/null
+++ b/manager/src/views/kitchen/kitchenVideo.vue
@@ -0,0 +1,975 @@
+<template>
+ <div>
+ <Card>
+ <Form
+ ref="searchForm"
+ @keydown.enter.native="handleSearch"
+ :model="searchForm"
+ inline
+ :label-width="70"
+ class="search-form"
+ >
+ <Form-item label="鏍囬" prop="title">
+ <Input
+ type="text"
+ v-model="searchForm.title"
+ clearable
+ @on-clear="handleSearch"
+ @on-change="handleSearch"
+ style="width: 160px"
+ />
+ </Form-item>
+ <Form-item label="鍒嗙被" prop="typeList">
+ <Select
+ v-model="searchForm.typeList"
+ clearable
+ filterable
+ multiple
+ @on-clear="handleSearch"
+ @on-change="handleSearch"
+ style="width: 160px"
+ >
+ <Option v-for="type in typeList" :key="type.id" :value="type.id">{{ type.typeName }}</Option>
+ </Select>
+ </Form-item>
+ <Form-item label="瑙嗛鐘舵��" prop="status">
+ <Select
+ v-model="searchForm.status"
+ clearable
+ @on-clear="handleSearch"
+ @on-change="handleSearch"
+ style="width: 160px"
+ >
+ <Option value="99">寰呭鏍�</Option>
+ <Option value="1">宸插彂甯�</Option>
+ <Option value="0">宸蹭笅鏋�</Option>
+ <Option value="-1">瀹℃牳鏈�氳繃</Option>
+ </Select>
+ </Form-item>
+ <Button
+ @click="handleSearch"
+ type="primary"
+ icon="ios-search"
+ class="search-btn"
+ >鎼滅储
+ </Button
+ >
+ <Button
+ @click="handleVideoUpLoad"
+ type="primary"
+ icon="md-arrow-up"
+ class="search-btn"
+ >涓婁紶瑙嗛
+ </Button
+ >
+ </Form>
+ <!-- 鍘ㄧ瑙嗛涓婁紶-->
+ <Modal
+ v-model="upLoadVideoShow"
+ :title="uploadVideoForm.id?'缂栬緫鍘ㄧ瑙嗛':'涓婁紶鍘ㄧ瑙嗛'"
+ width="800"
+ :mask-closable="false"
+ >
+
+ <Form
+ :model="uploadVideoForm"
+ ref="uploadVideoForm"
+ :rules="uploadVideoFileRule"
+ >
+ <Row :gutter="24">
+ <Col span="24">
+ <Spin size="large" fix v-if="upLoadVideoLoading"> 鏂囦欢涓婁紶涓�...</Spin>
+ </Col>
+ <Col span="12">
+ <FormItem label="鏍囬" prop="title">
+ <Input placeholder="璇疯緭鍏ユ爣棰�" v-model="uploadVideoForm.title"
+ style="width: 200px"
+ />
+ </FormItem>
+ </Col>
+<!-- 鍒锋柊dom浣跨敤-->
+ <Col span="24">
+ <FormItem label="鍒锋柊dom浣跨敤" prop="title" v-show="false">
+ <Input placeholder="璇疯緭鍏ユ爣棰�" v-model="uploadVideoForm.temp"
+ style="width: 200px"
+ />
+ </FormItem>
+ </Col>
+ <Col span="12" v-if="!uploadVideoForm.videoFileKey">
+ <FormItem label="涓婁紶瑙嗛" prop="videoFileKey">
+ <Upload
+ :multiple="true"
+ :before-upload="upLoadVideo"
+ accept="video/*"
+ action=""
+ >
+ <Button icon="ios-cloud-upload-outline">閫夋嫨瑙嗛</Button>
+ </Upload>
+ </FormItem>
+ </Col>
+
+ <Col span="24" v-else>
+ <FormItem label="瑙嗛">
+ <video style="width: 150px;height: 150px"
+ controls
+ @loadedmetadata="getVideoDuration"
+ :poster="uploadVideoForm.showCoverUrl"
+ :autoplay="false"
+ id="remoteVideo" :src="uploadVideoForm.showVideoUrl"
+ ref="healthVideoInfo"
+ ></video>
+ </FormItem>
+ </Col>
+
+ <Col span="12" v-show="uploadVideoForm.videoFileKey && !uploadVideoForm.coverUrl">
+ <FormItem label="涓婁紶灏侀潰" prop="coverUrl">
+ <Upload
+ :multiple="true"
+ :before-upload="upLoadImg"
+ accept="image/*"
+ action=""
+ >
+ <Button icon="ios-cloud-upload-outline">閫夋嫨灏侀潰</Button>
+ </Upload>
+ </FormItem>
+ </Col>
+ <Col span="24" style="padding-right:10px">
+ <FormItem label="鍘ㄧ鏍囩" prop="checkKitchenType">
+ <Select filterable multiple
+ style="width: 600px"
+ v-model="uploadVideoForm.checkKitchenType"
+ >
+ <Option v-for="item in kitchenType" :value="item.id" :key="item.id">{{ item.typeName }}</Option>
+ </Select>
+ </FormItem>
+ </Col>
+ <Col span="24">
+ <div>
+ <Button type="primary" @click="clearCoverImage" v-show="uploadVideoForm.coverUrl">閲嶆柊涓婁紶灏侀潰</Button>
+ <Button type="primary" @click="clearVideo" style="margin-left: 20px"
+ v-show="uploadVideoForm.videoFileKey">閲嶆柊涓婁紶瑙嗛
+ </Button>
+ </div>
+ </Col>
+ </Row>
+
+ </Form>
+ <div slot="footer">
+ <Button type="text" @click="closeHealthVideo">鍏抽棴</Button>
+ <Button type="primary" @click="submitHealthVideo">纭</Button>
+ </div>
+ </Modal>
+ <Modal
+ v-model="playVideoShow"
+ :title="playVideoTitle"
+ width="800"
+ :mask-closable="false"
+ >
+ <div class="video-warp">
+ <video :src="playVideoUrl" autoplay controls style="width: 768px;height: 432px"/>
+ </div>
+ <div slot="footer">
+ <Button type="text" @click="playVideoClose">鍏抽棴</Button>
+ </div>
+ </Modal>
+
+ <Modal
+ v-model="auditingShow"
+ title="瑙嗛瀹℃牳"
+ width="800"
+ :loading="auditingLoading"
+ :mask-closable="false"
+ >
+
+ <Form
+ ref="auditingForm"
+ :model="auditingForm"
+ :label-width="70"
+ :rules="auditingRule"
+ >
+ <Form-item label="鏍囬锛�">
+ <div>{{ detail.title }}</div>
+ </Form-item>
+ <Form-item label="鏍囩锛�">
+ <div style="display: flex;flex-wrap: wrap">
+ <div v-for="(tag, index) in detail.typeList" :key="'tag' + index" style="margin-right: 5px">
+ <Tag color="red">{{ tag.tagName }}</Tag>
+ </div>
+ </div>
+ </Form-item>
+ <Form-item label="瑙嗛鏃堕暱锛�" :label-width="72">
+ <div>{{ formatSeconds(detail.videoDuration) }}</div>
+ </Form-item>
+ <Form-item class="video-warp" :label-width="0">
+ <video :src="detail.videoUrl" autoplay controls style="width: 768px;height: 432px"/>
+ </Form-item>
+ <Form-item label="瀹℃牳缁撴灉锛�" :label-width="100" prop="result">
+ <RadioGroup v-model="auditingForm.result">
+ <Radio :label="1">閫氳繃</Radio>
+ <Radio :label="0">涓嶉�氳繃</Radio>
+ </RadioGroup>
+ </Form-item>
+ <Form-item v-show="auditingForm.result === 0" label="涓嶉�氳繃鍘熷洜锛�" :label-width="100" prop="reason">
+ <Input
+ type="textarea"
+ v-model="auditingForm.reason"
+ clearable
+ style="width: 100%"
+ />
+ </Form-item>
+ </Form>
+ <div slot="footer">
+ <Button type="text" @click="closeAuditing">鍏抽棴</Button>
+ <Button type="primary" @click="submitAuditing">纭</Button>
+ </div>
+ </Modal>
+
+ <Modal
+ v-model="videoDownShow"
+ title="瑙嗛涓嬫灦"
+ width="800"
+ :mask-closable="false"
+ >
+ <Form :model="videoDownForm" :rules="videoDownRule" ref="videoDownForm">
+ <FormItem label="涓嬫灦鍘熷洜锛�" :labelWidth="100" prop="reason">
+ <editor ref="editor" @input="getReason"/>
+ </FormItem>
+ </Form>
+ <div slot="footer">
+ <Button type="text" @click="closeVideoDown">鍏抽棴</Button>
+ <Button type="primary" @click="videoDown">纭</Button>
+ </div>
+ </Modal>
+
+ <Table
+ :loading="loading"
+ border
+ :columns="columns"
+ :data="data"
+ ref="table"
+ sortable="custom"
+ @on-sort-change="changeSort"
+ @on-selection-change="showSelect"
+ >
+ <template slot-scope="{ row, index }" slot="typeList">
+ <div v-for="(tag, index) in row.typeList" :key="'tag' + index" style="margin-top: 5px">
+ <Tag color="red">{{ tag.typeName }}</Tag>
+ </div>
+ </template>
+ <template slot-scope="{ row, index }" slot="videoFileKey">
+ <div class="play-text" @click="playVideo(row.videoFileKey, row.title)">鐐瑰嚮鎾斁</div>
+ </template>
+ <template slot-scope="{ row, index }" slot="videoDuration">
+ <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) }}
+ </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="success" size="small" style="margin-right: 5px"
+ @click="handleVideoUpLoad(row)">缂栬緫
+ </Button>
+ <Button type="success" size="small" style="margin-right: 5px"
+ @click="deleteHealthVideo(row)">鍒犻櫎
+ </Button>
+ </template>
+ </Table>
+
+ <Row type="flex" justify="end" class="mt_10">
+ <Page
+ :current="searchForm.pageNumber"
+ :total="total"
+ :page-size="searchForm.pageSize"
+ @on-change="changePage"
+ @on-page-size-change="changePageSize"
+ :page-size-opts="[10, 20, 50]"
+ size="small"
+ show-total
+ show-elevator
+ show-sizer
+ ></Page>
+ </Row>
+ </Card>
+ </div>
+</template>
+
+<script>
+import {recommendSet, getVideoById, auditingVideo, up, down} from "@/api/video";
+import {addKitchenVideo, delKitchen, getKitchenVideos, updateKitchenVideo} from "@/api/kitchen-video";
+import {getFilePreview, getSts} from "@/api/file";
+import Editor from '@/components/editor/index.vue'
+import COS from 'cos-js-sdk-v5';
+import {getFileKey} from "@/utils/file.js";
+import {getKitchenTypeAllList} from "@/api/kitchen";
+
+export default {
+ name: "VideoList",
+ components: {Editor},
+ data() {
+ return {
+ videoDownForm: {
+ id: '',
+ reason: ''
+ },
+ videoDownRule: {
+ reason: [
+ {
+ require: true,
+ message: '璇疯緭鍏ヤ笅鏋跺師鍥�',
+ trigger: 'blur',
+ validator: (rule, value, callback) => {
+ if (value === null || value === '') {
+ callback(new Error('璇疯緭鍏ヤ笅鏋跺師鍥�'));
+ } else {
+ callback();
+ }
+ }
+ }
+ ]
+ },
+ videoDownShow: false, // 瑙嗛涓嬫灦
+ videoDownMsg: '', // 涓嬫灦鎻愮ず淇℃伅
+ auditingForm: { // 瀹℃牳琛ㄥ崟
+ id: null,
+ result: null,
+ reason: ''
+ },
+ auditingRule: {
+ result: [
+ {
+ required: true,
+ message: '璇烽�夋嫨瑙嗛瀹℃牳缁撴灉',
+ trigger: 'change',
+ validator: (rule, value, callback) => {
+ if (value === null || value === undefined) {
+ callback(new Error('璇烽�夋嫨瑙嗛瀹℃牳缁撴灉'));
+ } else {
+ callback();
+ }
+ }
+ }
+ ],
+ },
+ uploadVideoFileRule: {
+ coverUrl: [
+ {
+ required: true,
+ message: '璇蜂笂浼犲皝闈�',
+ trigger: 'blur',
+ validator: (rule, value, callback) => {
+ if (value === null || value === undefined || value === '') {
+ callback(new Error('璇蜂笂浼犲皝闈�'));
+ } else {
+ callback();
+ }
+ }
+ }
+ ],
+ videoFileKey: [
+ {
+ required: true,
+ message: '璇蜂笂浼犲皝闈�',
+ trigger: 'blur',
+ validator: (rule, value, callback) => {
+ if (value === null || value === undefined || value === '') {
+ callback(new Error('璇蜂笂浼犲皝闈�'));
+ } else {
+ callback();
+ }
+ }
+ }
+ ],
+ checkKitchenType: [
+ {
+ required: true,
+ message: '璇烽�夋嫨鍘ㄧ鏍囩',
+ trigger: 'blur',
+ validator: (rule, value, callback) => {
+ console.log('楠岃瘉鍊�:-------------->', value, '绫诲瀷:', typeof value);
+ if (value === null || value === undefined||value.length >5) {
+ callback(new Error('璇烽�夋嫨鍘ㄧ鏍囩涓斾笉鑳借秴杩�5涓�'));
+ } else {
+ callback();
+ }
+ }
+ }
+ ],
+ title: [
+ {
+ required: true,
+ message: '璇疯緭鍏ユ爣棰�',
+ trigger: 'blur',
+ validator: (rule, value, callback) => {
+ if (value === null || value === undefined) {
+ callback(new Error('璇疯緭鍏ユ爣棰�'));
+ } else {
+ callback();
+ }
+ }
+ }
+ ],
+ },
+ detail: {}, // 瑙嗛璇︽儏淇℃伅
+ auditingShow: false, // 瀹℃牳寮圭獥
+ upLoadVideoShow: false,//鏂囦欢涓婁紶寮圭獥
+ auditingLoading: false, // 瀹℃牳寮圭獥
+ upLoadVideoLoading: false,//涓婁紶瑙嗛
+ playVideoShow: false, // 瑙嗛鎾斁寮圭獥
+ playVideoTitle: '', // 瑙嗛鎾斁鏍囬
+ playVideoUrl: '', // 褰撳墠姝e湪鎾斁鐨勮棰戝湴鍧�
+ modelShow: false, // 寮圭獥鏄鹃殣
+ modelTitle: '', // 寮圭獥title
+ loading: false, // 琛ㄥ崟鍔犺浇鐘舵��
+ searchForm: {
+ // 鎼滅储妗嗗垵濮嬪寲瀵硅薄
+ pageNumber: 1, // 褰撳墠椤垫暟
+ pageSize: 10, // 椤甸潰澶у皬
+ title: '', // 鏍囬
+ typeList: [], // 鏍囩
+ status: '99'
+ },
+ typeList: [], // 鏍囩鍒楄〃
+ columns: [
+ {
+ type: 'selection',
+ width: 60,
+ align: 'center'
+ },
+ {
+ title: "鏍囬",
+ key: "title",
+ minWidth: 240,
+ tooltip: true,
+ },
+ {
+ title: "浣滆��",
+ key: "authorName",
+ width: 130,
+ tooltip: true,
+ },
+ {
+ title: "瑙嗛鍒嗙被",
+ key: "typeList",
+ width: 180,
+ slot: "typeList",
+ },
+ {
+ title: "瑙嗛鍐呭",
+ key: "videoFileKey",
+ width: 170,
+ slot: "videoFileKey"
+ },
+ {
+ title: "鏃堕暱",
+ key: "videoDuration",
+ width: 80,
+ align: 'center',
+ slot: "videoDuration",
+ },
+ {
+ title: "鎾斁閲�",
+ key: "playNum",
+ width: 80,
+ align: 'center'
+ },
+ {
+ title: "鏀惰棌鏁�",
+ key: "collectNum",
+ width: 80,
+ align: 'center'
+ },
+ {
+ title: "璇勮鏁�",
+ key: "commentNum",
+ width: 80,
+ align: 'center'
+ },
+ {
+ title: "棣栭〉鎺ㄨ崘",
+ key: "recommend",
+ slot: "recommend",
+ width: 100,
+ align: 'center'
+ },
+ {
+ title: "鏉冮噸",
+ key: "weight",
+ width: 170,
+ },
+ {
+ title: "鐘舵��",
+ key: "status",
+ slot: "status",
+ width: 120,
+ align: 'center'
+ },
+ {
+ title: "鎿嶄綔",
+ key: "action",
+ slot: "action",
+ align: "center",
+ width: 200,
+ },
+ ],
+ data: [], // 琛ㄥ崟鏁版嵁
+ kitchenType: [], // 鍘ㄧ鍒嗙被
+ total: 0, // 琛ㄥ崟鏁版嵁鎬绘暟
+ selectCount: 0, // 宸查�夋暟閲�
+ selectList: [], // 宸查�夋暟鎹垪琛�
+ uploadVideoForm: {
+ id: null,
+ checkKitchenType:[],
+ coverUrl: null,
+ videoFileKey: null,
+ videoFit: null,
+ videoDuration: null,
+ title: null,
+ videoContentType: null,
+ videoType: null,
+ showCoverUrl: null,
+ showVideoUrl: null,
+ temp: null
+
+ },
+ }
+ },
+ created() {
+ this.getDataList();
+ this.getTypes('')
+ },
+ methods: {
+ // 绉掕浆x鍒唜绉�
+ formatSeconds(seconds) {
+ if (isNaN(seconds) || seconds < 0) return '0绉�';
+
+ const mins = Math.floor(seconds / 60);
+ const secs = seconds % 60;
+
+ if (mins === 0) return `${secs}绉抈;
+ if (secs === 0) return `${mins}鍒哷;
+
+ return `${mins}鍒�${secs}绉抈;
+ },
+ // 鑾峰彇鍒嗙被鍒楄〃
+ getTypes(typeName) {
+ let params = {
+ 'typeName': typeName
+ }
+ getKitchenTypeAllList(params).then(res => {
+ this.typeList = res.data
+ })
+ },
+ // 鑾峰彇瀵屾枃鏈紪杈戝櫒鐨勫唴瀹�
+ getReason(content) {
+ this.videoDownForm.reason = content
+ },
+ //閲嶆柊涓婁紶灏侀潰
+ clearCoverImage() {
+ this.$set(this.uploadVideoForm, 'coverUrl', '');
+ this.$set(this.uploadVideoForm, 'showCoverUrl', '');
+ this.$set(this.uploadVideoForm, 'temp', new Date().getTime());
+ },
+ //閲嶆柊涓婁紶瑙嗛
+ clearVideo() {
+ this.clearCoverImage();
+ this.$set(this.uploadVideoForm, 'videoFileKey', '');
+ this.$set(this.uploadVideoForm, 'showVideoUrl', '');
+ 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({
+ title: "鎿嶄綔纭",
+ content: "鎮ㄧ‘璁よ涓婃灦瑙嗛銆� " + row.title + "銆戝悧?",
+ loading: true,
+ onOk: () => {
+ up(row.id).then(res => {
+ this.$Modal.remove();
+ if (res.code == 200) {
+ this.$Message.success("瑙嗛涓婃灦鎴愬姛");
+ this.getDataList();
+ }
+ });
+ }
+ });
+ },
+ // 瑙嗛涓嬫灦
+ videoDown() {
+ this.$refs.videoDownForm.validate((valid) => {
+ if (valid) {
+ down(this.videoDownForm).then(res => {
+ this.$Message.success("涓嬫灦鎴愬姛")
+ this.closeVideoDown()
+ this.getDataList()
+ })
+ }
+ })
+ },
+ // 鍏抽棴瑙嗛涓嬫灦
+ closeVideoDown() {
+ this.videoDownShow = false
+ this.videoDownForm = {
+ id: '',
+ reason: ''
+ }
+ this.$refs.editor.setContent('')
+ },
+ // 瑙嗛涓嬫灦
+ openVideoDown(row) {
+ this.videoDownForm.id = row.id
+ this.videoDownShow = true
+ },
+ // 瑙嗛鍙戝竷/淇敼
+ //todo 1
+ submitHealthVideo() {
+ console.log(this.uploadVideoForm)
+ try {
+ this.upLoadVideoLoading = true
+ this.$refs.uploadVideoForm.validate((valid) => {
+ if (valid) {
+ // 淇敼
+ if (this.uploadVideoForm.id) {
+ console.log(this.uploadVideoForm)
+ updateKitchenVideo(this.uploadVideoForm).then(res => {
+ this.$Message.success("淇敼瀹屾垚")
+ this.closeHealthVideo()
+ this.getDataList()
+ })
+ } else {
+ addKitchenVideo(this.uploadVideoForm).then(res => {
+ this.$Message.success("娣诲姞瀹屾垚")
+ this.closeHealthVideo()
+ this.getDataList()
+ })
+ }
+ }
+ })
+ } finally {
+ this.upLoadVideoLoading = false
+ }
+ },
+ //鑾峰彇鏍囩
+ getKitchenTypeList(e){
+ const typeParam = {typeName:e}
+ getKitchenTypeAllList(typeParam).then(res => {
+ this.kitchenType = res.data
+ })
+
+ },
+
+ // 鍏抽棴绐楀彛
+ closeHealthVideo() {
+ //
+ this.uploadVideoForm = {};
+ this.upLoadVideoShow = false;
+ },
+ // 鎻愪氦瀹℃牳缁撴灉
+ submitAuditing() {
+ console.log(this.auditingForm, "sb")
+ this.$refs.auditingForm.validate((valid) => {
+ if (valid) {
+ auditingVideo(this.auditingForm).then(res => {
+ this.$Message.success("瀹℃牳瀹屾垚")
+ this.closeAuditing()
+ this.getDataList()
+ })
+ }
+ })
+ },
+ // 瀹℃牳缁撴灉鍙樺寲
+ resultChange(selected) {
+ this.auditingForm.result = selected === '閫氳繃' ? 1 : 0
+ console.log(this.auditingForm.result)
+ },
+ closeAuditing() {
+ this.auditingForm = {
+ id: null,
+ result: null,
+ reason: ''
+ }
+ this.detail = {}
+ this.auditingShow = false
+ },
+ // 鎵撳紑瀹℃牳寮圭獥
+ openAuditing(row) {
+ this.auditingShow = true
+ this.auditingLoading = true
+ this.auditingForm.id = row.id
+ getVideoById(row.id).then(res => {
+ this.detail = res.data
+ this.auditingLoading = false
+ })
+ },
+ // 鎵撳紑缂栬緫寮圭獥
+ deleteHealthVideo(row) {
+ console.log('鍒犻櫎娴嬭瘯', row)
+ this.$Modal.confirm({
+ title: "鎿嶄綔纭",
+ content: "鎮ㄧ‘璁よ鍒犻櫎瑙嗛銆� " + row.title + "銆戝悧?",
+ loading: true,
+ onOk: () => {
+ delKitchen(row.id).then(res => {
+ this.$Modal.remove();
+ if (res.code === 200) {
+ this.$Message.success("瑙嗛鍒犻櫎鎴愬姛");
+ this.getDataList();
+ }
+ });
+ }
+ });
+ },
+ // 缈昏瘧鐘舵��
+ transStatus(status) {
+ switch (status) {
+ case '99':
+ return '寰呭鏍�'
+ case '1':
+ return '宸插彂甯�'
+ case '0':
+ return '宸蹭笅鏋�'
+ case '-1':
+ return '瀹℃牳鏈�氳繃'
+ default:
+ return '鏈煡'
+ }
+ },
+ // 寮�鍚垨鍏抽棴鎺ㄨ崘鐨勬柟娉�
+ handleBeforeChange(row) {
+ let content = ""
+ if (row.recommend) {
+ content = '纭瑕佸叧闂椤垫帹鑽愬悧锛�'
+ } else {
+ content = '纭瑕佸紑鍚椤垫帹鑽愬悧锛�'
+ }
+ return new Promise((resolve) => {
+ this.$Modal.confirm({
+ title: '鎿嶄綔鎻愰啋',
+ content: content,
+ onOk: () => {
+ recommendSet({id: row.id, recommend: !row.recommend}).then(res => {
+ this.$Message.success(res.msg);
+ resolve();
+ })
+ }
+ });
+ });
+ },
+ // 鍏抽棴瑙嗛鎾斁
+ playVideoClose() {
+ this.playVideoTitle = '';
+ this.playVideoUrl = '';
+ this.playVideoShow = false
+ },
+ // 鐐瑰嚮鎾斁瑙嗛
+ playVideo(fileKey, title) {
+ this.playVideoTitle = title;
+
+ getFilePreview(fileKey).then(res => {
+ this.playVideoUrl = res.data
+ this.playVideoShow = true
+ })
+ },
+ // 鎼滅储
+ handleSearch() {
+ this.searchForm.pageNumber = 1;
+ this.searchForm.pageSize = 10;
+ this.getDataList();
+ },
+ // 鑾峰彇鍒楄〃鏁版嵁
+ getDataList() {
+ this.loading = true;
+ getKitchenVideos(this.searchForm).then((res) => {
+ console.log(res)
+ this.loading = false;
+ if (res.code === 200) {
+ this.data = res.data;
+ this.total = res.total;
+ }
+ });
+ this.total = this.data.length;
+ this.loading = false;
+ },
+ showSelect(e) {
+ this.selectList = e.map(d => d.id);
+ this.selectCount = e.length;
+ },
+ // 鎺掑簭
+ changeSort(e) {
+ this.searchForm.sort = e.key;
+ this.searchForm.order = e.order;
+ if (e.order == "normal") {
+ this.searchForm.order = "";
+ }
+ this.getDataList();
+ },
+ // 鍒嗛〉 鏀瑰彉椤电爜
+ changePage(v) {
+ this.searchForm.pageNumber = v;
+ this.getDataList();
+ },
+
+ // 鍒嗛〉 鏀瑰彉椤垫暟
+ changePageSize(v) {
+ this.searchForm.pageNumber = 1;
+ this.searchForm.pageSize = v;
+ this.getDataList();
+ },
+
+ handleVideoUpLoad(row) {
+ this.uploadVideoForm = {};
+ this.upLoadVideoShow = true;
+ console.log(row)
+ if (row.id) {
+ this.uploadVideoForm.id = row.id;
+ this.uploadVideoForm.showVideoUrl = row.videoUrl
+ this.uploadVideoForm.videoFileKey = row.videoFileKey;
+ this.uploadVideoForm.coverUrl = row.coverUrl;
+ this.uploadVideoForm.showCoverUrl = row.coverShowUrl;
+ this.uploadVideoForm.title = row.title;
+ this.uploadVideoForm.checkKitchenType = row.typeList.map(item => {return item.id});
+ }
+ this.getKitchenTypeList();
+ },
+ async upLoadVideo(file) {
+ try {
+ this.$nextTick(() => {
+ 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(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.upLoadVideoLoading = false;
+ })
+ }
+ return false;
+ },
+ async upLoadImg(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.uploadVideoForm.coverUrl = fileKey;
+ this.uploadVideoForm.showCoverUrl = sts.data.endpoint + "/" + fileKey;
+ })
+
+ } catch (e) {
+ console.log("涓婁紶澶辫触", upData)
+ } finally {
+ this.upLoadVideoLoading = false;
+ }
+ return false;
+ }
+ }
+}
+</script>
+
+<style scoped>
+.play-text {
+ width: 100%;
+ text-align: center;
+ color: #2d8cf0;
+}
+
+.play-text:hover {
+ cursor: pointer;
+}
+
+.video-warp {
+ width: 786px;
+ height: 432px;
+}
+
+.data-item {
+ display: flex;
+ align-items: center;
+}
+
+.showCoverImg {
+ position: relative;
+}
+
+.coverImgRemove {
+ position: absolute;
+ top: 15px;
+ right: -15px;
+}
+</style>
diff --git a/manager/src/views/video/GoodsExpandRow.vue b/manager/src/views/video/GoodsExpandRow.vue
new file mode 100644
index 0000000..d81e691
--- /dev/null
+++ b/manager/src/views/video/GoodsExpandRow.vue
@@ -0,0 +1,35 @@
+<template>
+ <div>
+ <Row v-for="goods in goodsList" :key="goods.goodsId">
+ <Row style="width:100%;align-items: center">
+ <Col span="6">
+ <img :src="goods.thumbnail" style="width: 150px;height: 150px"/>
+ </Col>
+ <Col span="6">
+ <p>鍟嗗搧鍚嶇О: {{ goods.goodsName }}</p>
+ </Col>
+ <Col span="6">
+ <p>鍟嗗搧鍗曚环: 锟{ goods.price }}</p>
+ </Col>
+ <Col span="6">
+ <p>鍟嗗搧鏁伴噺: {{ goods.goodsNum }}</p>
+ </Col>
+ </Row>
+ </Row>
+ </div>
+</template>
+
+<script>
+export default {
+ name: "GoodsExpandRow",
+ props: {
+ goodsList: {
+ type: Array
+ }
+ }
+}
+</script>
+
+<style scoped>
+
+</style>
diff --git a/manager/src/views/video/VideoList.vue b/manager/src/views/video/VideoList.vue
index 8e2e6b0..f017ac9 100644
--- a/manager/src/views/video/VideoList.vue
+++ b/manager/src/views/video/VideoList.vue
@@ -72,7 +72,7 @@
<Modal
v-model="auditingShow"
title="瑙嗛瀹℃牳"
- width="800"
+ width="1200"
:loading="auditingLoading"
:mask-closable="false"
>
@@ -92,11 +92,45 @@
</div>
</div>
</Form-item>
- <Form-item label="瑙嗛鏃堕暱锛�" :label-width="72">
+ <Form-item v-if="detail.videoContentType === 'video'" label="瑙嗛鏃堕暱锛�" :label-width="72">
<div>{{formatSeconds(detail.videoDuration)}}</div>
</Form-item>
- <Form-item class="video-warp" :label-width="0">
- <video :src="detail.videoUrl" autoplay controls style="width: 768px;height: 432px"/>
+ <Form-item v-if="detail.videoContentType === 'img'" label="鍥剧墖寮犳暟锛�" :label-width="72">
+ <div>{{detail.imgs.length}}</div>
+ </Form-item>
+ <Form-item v-if="detail.videoContentType === 'video'" class="video-warp" :label-width="0">
+ <Row>
+ <Col span="11">
+ <video :src="detail.videoUrl" autoplay controls style="width: 500px;height: 300px"/>
+ </Col>
+ <Col span="13" style="max-height: 300px;overflow-y: scroll">
+ <Row v-for="goods in detail.goodsList" :key="goods.goodsId" style="width: 100%">
+ <Row style="width:100%;align-items: center">
+ <Col span="6">
+ <img :src="goods.thumbnail" style="width: 100px;height: 100px"/>
+ </Col>
+ <Col span="10">
+ <p>鍟嗗搧鍚嶇О: {{ goods.goodsName }}</p>
+ </Col>
+ <Col span="4">
+ <p>鍟嗗搧鍗曚环: 锟{ goods.price }}</p>
+ </Col>
+ <Col span="4">
+ <p>鍟嗗搧鏁伴噺: {{ goods.goodsNum }}</p>
+ </Col>
+ </Row>
+ </Row>
+ </Col>
+ </Row>
+
+ </Form-item>
+ <Form-item v-if="detail.videoContentType === 'img'" :label-width="0">
+ <div style="display: flex;flex-direction: row;flex-wrap: wrap">
+ <div v-for="img in detail.imgs" :key="img" class="img-warp">
+ <img :src="img" class="image">
+ </div>
+ </div>
+
</Form-item>
<Form-item label="瀹℃牳缁撴灉锛�" :label-width="100" prop="result">
<RadioGroup v-model="auditingForm.result">
@@ -193,9 +227,10 @@
import {getVideoTagList} from "@/api/videoTag";
import {getFilePreview} from "@/api/file";
import Editor from '@/components/editor/index.vue'
+import GoodsExpandRow from '@/views/video/GoodsExpandRow'
export default {
name: "VideoList",
- components: {Editor},
+ components: {Editor,GoodsExpandRow},
data() {
return {
videoDownForm: {
@@ -264,6 +299,17 @@
type: 'selection',
width: 60,
align: 'center'
+ },
+ {
+ width: 60,
+ type: 'expand',
+ render: (h, params) => {
+ return h(GoodsExpandRow, {
+ props: {
+ goodsList: params.row.goodsList
+ }
+ })
+ }
},
{
title: "鏍囬",
@@ -566,11 +612,18 @@
cursor: pointer;
}
.video-warp {
- width: 786px;
- height: 432px;
+ width: 100%;
+ height: 350px;
}
.data-item {
display: flex;
align-items: center;
}
+.img-warp {
+ padding: 10px;
+}
+.image {
+ width: 150px;
+ height: 200px;
+}
</style>
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/goodsOperation.vue b/seller/src/views/goods/goods-seller/goodsOperation.vue
index 77c41ec..d689a13 100644
--- a/seller/src/views/goods/goods-seller/goodsOperation.vue
+++ b/seller/src/views/goods/goods-seller/goodsOperation.vue
@@ -13,8 +13,8 @@
<second-step ref='second' :firstData="firstData" v-if="activestep === 1"></second-step>
<!-- 绗笁姝� 鍙戝竷瀹屾垚 -->
<third-step ref='third' v-if="activestep === 2"></third-step>
-
-
+
+
</div>
</template>
<script>
@@ -51,7 +51,7 @@
this.activestep = 0
this.$refs.first.selectGoodsType = true;
}
-
+
}
};
</script>
diff --git a/seller/src/views/goods/goods-seller/goodsOperationFirst.vue b/seller/src/views/goods/goods-seller/goodsOperationFirst.vue
index 47af408..db69887 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绾у垎绫诲垪琛�*/
@@ -230,10 +231,13 @@
if (!this.category[0].name) {
this.$Message.error("璇烽�夋嫨鍟嗗搧鍒嗙被");
return;
- } else if (!this.category[2].name) {
- this.$Message.error("蹇呴』閫夋嫨鍒颁笁绾у垎绫�");
- return;
- } else if (this.category[2].name) {
+ }
+ //鍏抽棴蹇呴』閫夋嫨3涓祦绋嬬殑閫夐」
+ // else if (!this.category[2].name) {
+ // this.$Message.error("蹇呴』閫夋嫨鍒颁笁绾у垎绫�");
+ // return;
+ // }
+ else if (this.category[2].name) {
let params = {
category: this.category,
goodsType: this.goodsType,
@@ -245,6 +249,14 @@
this.$emit("change", params);
}
}
+ //娴佺▼璋冩暣
+ else {
+ let params = {
+ category: this.category,
+ goodsType: this.goodsType,
+ };
+ this.$emit("change", params);
+ }
},
},
mounted() {
diff --git a/seller/src/views/goods/goods-seller/goodsOperationSec.vue b/seller/src/views/goods/goods-seller/goodsOperationSec.vue
index 0965954..a2e8262 100644
--- a/seller/src/views/goods/goods-seller/goodsOperationSec.vue
+++ b/seller/src/views/goods/goods-seller/goodsOperationSec.vue
@@ -26,13 +26,13 @@
<FormItem label="鍟嗗搧鍗栫偣" prop="sellingPoint">
<Input v-model="baseInfoForm.sellingPoint" :rows="4" style="width: 260px" type="textarea"/>
</FormItem>
- <FormItem label="鍟嗗搧鍝佺墝" prop="brandId">
- <Select v-model="baseInfoForm.brandId" filterable style="width: 200px">
- <Option v-for="item in brandList" :key="item.id" :label="item.name" :value="item.id"></Option>
- </Select>
- <Button class="refresh-icon" icon="md-refresh" shape="circle" type="text"
- @click="refresh('brand')"></Button>
- </FormItem>
+<!-- <FormItem label="鍟嗗搧鍝佺墝" prop="brandId">-->
+<!-- <Select v-model="baseInfoForm.brandId" filterable style="width: 200px">-->
+<!-- <Option v-for="item in brandList" :key="item.id" :label="item.name" :value="item.id"></Option>-->
+<!-- </Select>-->
+<!-- <Button class="refresh-icon" icon="md-refresh" shape="circle" type="text"-->
+<!-- @click="refresh('brand')"></Button>-->
+<!-- </FormItem>-->
</div>
<h4>鍟嗗搧浜ゆ槗淇℃伅</h4>
<div class="form-item-view">
@@ -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="ossManRage" :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: [],
@@ -698,12 +748,19 @@
if (val) {
this.initVideo();
}
+ },
+ showListImages(newValue){
+ this.baseInfoForm.goodsGalleryFiles = newValue.map(item => {
+ return item.split('/').slice(-2).join('/')
+ })
}
},
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 +922,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 +1064,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 +1194,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 &&
@@ -1105,7 +1239,8 @@
this.renderGoodsDetailSku(response.result.skuList);
/** 鏌ヨ鍝佺墝鍒楄〃 */
- this.getGoodsBrandList();
+ //todo 绉婚櫎鍝佺墝姒傚康
+ // this.getGoodsBrandList();
/** 鏌ヨ搴楅摵鍟嗗搧鍒嗙被 */
this.GET_ShopGoodsLabel();
@@ -1125,7 +1260,7 @@
this.firstData.goodsType &&
(this.baseInfoForm.goodsType = this.firstData.goodsType);
/** 鏌ヨ鍟嗗搧鍙傛暟 */
- this.GET_GoodsParams();
+ // this.GET_GoodsParams();
},
// 娓叉煋sku鏁版嵁
renderGoodsDetailSku(skuList) {
@@ -1780,124 +1915,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 +2101,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 = {
@@ -1988,12 +2230,17 @@
this.baseInfoForm.goodsType = this.firstData.goodsType;
- /** 鑾峰彇璇ュ晢鍩庡垎绫讳笅 鍟嗗搧鍙傛暟淇℃伅 */
- this.GET_GoodsParams();
- /** 鏌ヨ鍝佺墝鍒楄〃 */
- this.getGoodsBrandList();
- /** 鏌ヨ鍒嗙被缁戝畾鐨勮鏍间俊鎭� */
- this.Get_SkuInfoByCategory(this.categoryId);
+
+
+ if (this.categoryId!=null && this.categoryId!=='') {
+ /** 鑾峰彇璇ュ晢鍩庡垎绫讳笅 鍟嗗搧鍙傛暟淇℃伅 */
+ this.GET_GoodsParams();
+ console.log('鍒嗙被id------------------>',this.categoryId);
+ /** 鏌ヨ鍒嗙被缁戝畾鐨勮鏍间俊鎭� */
+ this.Get_SkuInfoByCategory(this.categoryId);
+ /** 鏌ヨ鍝佺墝鍒楄〃 */
+ this.getGoodsBrandList();
+ }
// 鑾峰彇鍟嗗搧鍗曚綅
this.GET_GoodsUnit();
// 鑾峰彇褰撳墠搴楅摵鍒嗙被
@@ -2044,4 +2291,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