From 226c543d57ef46fcd0cd1f71fb9ceb2b715cab97 Mon Sep 17 00:00:00 2001
From: zxl <763096477@qq.com>
Date: 星期四, 21 八月 2025 18:14:12 +0800
Subject: [PATCH] 抽奖活动,奖品

---
 manager/src/views/video/VideoList.vue | 1038 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 1,018 insertions(+), 20 deletions(-)

diff --git a/manager/src/views/video/VideoList.vue b/manager/src/views/video/VideoList.vue
index f017ac9..ef36837 100644
--- a/manager/src/views/video/VideoList.vue
+++ b/manager/src/views/video/VideoList.vue
@@ -29,7 +29,7 @@
             @on-change="handleSearch"
             style="width: 160px"
           >
-            <Option v-for="tag in tagList" :key="tag.id" :value="tag.id">{{tag.tagName}}</Option>
+            <Option v-for="tag in tagList" :key="tag.id" :value="tag.id">{{ tag.tagName }}</Option>
           </Select>
         </Form-item>
         <Form-item label="瑙嗛鐘舵��" prop="status">
@@ -51,15 +51,215 @@
           type="primary"
           icon="ios-search"
           class="search-btn"
-        >鎼滅储</Button
+        >鎼滅储
+        </Button
         >
       </Form>
 
+      <Row class="operation padding-row">
+        <Button @click="recreateEsIndex" type="primary">閲嶆柊鏋勫缓es绱㈠紩</Button>
+        <Button @click="openUploadVideo" type="primary" icon="md-arrow-up"> 涓婁紶瑙嗛</Button>
+      </Row>
+
+      <Modal
+        v-model="upLoadVideoShow"
+        :title="uploadVideoForm.id?'缂栬緫涓婚〉瑙嗛':'涓婁紶涓婚〉瑙嗛'"
+        width="800"
+        :mask-closable="false"
+      >
+        <Form
+          ref="searchForm"
+          @keydown.enter.native="handleSearch"
+          :model="uploadVideoForm"
+          inline
+        >
+          <Row :gutter="24" class="operation padding-row" style="width: 100%;">
+            <Col span="12">
+              <FormItem label="鏍囬:" :label-width="80">
+                <Input v-model="uploadVideoForm.title" placeholder="璇疯緭鍏ユ爣棰�"></Input>
+              </FormItem>
+            </Col>
+            <Col span="12">
+              <FormItem label="涓婁紶绫诲瀷:" :label-width="80" prpo="videoContentType">
+                <Select v-model="uploadVideoForm.videoContentType" style="width:200px">
+                  <Option value="img">鍥剧墖</Option>
+                  <Option value="video">瑙嗛</Option>
+                </Select>
+              </FormItem>
+            </Col>
+          </Row>
+          <Row>
+            <Col span="12" v-if="!uploadVideoForm.videoFileKey&&showVideoFlag">
+              <FormItem :label-width="80" label="涓婁紶瑙嗛" prop="videoFileKey">
+                <Upload
+                  :multiple="true"
+                  :before-upload="upLoadVideo"
+                  accept="video/*"
+                  action=""
+                >
+                  <Button icon="ios-cloud-upload-outline">閫夋嫨瑙嗛</Button>
+                </Upload>
+                <Progress :percent="videoProgress" v-if="showVideoProgress" status="active"/>
+              </FormItem>
+            </Col>
+            <Col span="12" v-else-if="uploadVideoForm.videoFileKey">
+              <FormItem :labelWidth="80" label="瑙嗛">
+                <video style="width: 150px;height: 150px"
+                       controls
+                       @loadedmetadata="getVideoDuration"
+                       :poster="uploadVideoForm.showCoverUrl"
+                       :autoplay="false"
+                       id="remoteVideo" :src="uploadVideoForm.showVideoUrl"
+                       ref="videoInfo"
+                ></video>
+              </FormItem>
+            </Col>
+          </Row>
+          <Row>
+            <Col span="24" v-show="uploadVideoForm.videoFileKey && !uploadVideoForm.coverUrl">
+              <FormItem label="涓婁紶灏侀潰" prop="coverUrl" :label-width="80">
+                <Upload
+                  :multiple="true"
+                  :before-upload="upLoadImagCover"
+                  accept="image/*"
+                  action=""
+                >
+                  <Button icon="ios-cloud-upload-outline">閫夋嫨灏侀潰</Button>
+                </Upload>
+              </FormItem>
+            </Col>
+          </Row>
+          <Row :gutter="24">
+            <Col span="12" v-if="uploadVideoForm.videoFileKey">
+              <FormItem :labelWidth="80">
+                <Button @click="reloadVideo" type="primary" >閲嶆柊涓婁紶瑙嗛</Button>
+                <Button type="primary" @click="clearCoverImage" v-show="uploadVideoForm.coverUrl" style="margin-left: 20px">閲嶆柊涓婁紶灏侀潰</Button>
+              </FormItem>
+            </Col>
+          </Row>
+          <Row :gutter="24" v-if="uploadVideoForm.videoImgs&&showImgFlag">
+            <Col span="12">
+              <FormItem :labelWidth="80" label="涓婁紶鍥剧墖">
+                <template>
+                  <div class="demo-upload-list" v-for="item in uploadVideoForm.showListImages" :key="item">
+                    <template>
+                      <img :src="item">
+                      <div class="demo-upload-list-cover">
+                        <Icon type="ios-eye-outline" @click.native="handleView(item)"></Icon>
+                        <Icon type="ios-trash-outline" @click.native="handleRemove(item)"></Icon>
+                      </div>
+                    </template>
+                    <!--                      <template v-else>-->
+                    <!--                        <Progress v-if="item.showProgress" :percent="item.percentage" hide-info></Progress>-->
+                    <!--                      </template>-->
+                  </div>
+                  <Upload
+                    ref="upload"
+                    :show-upload-list="false"
+                    :format="['jpg','jpeg','png']"
+                    :max-size="2048"
+                    :before-upload="upLoadImg"
+                    multiple
+                    type="drag"
+                    action="-"
+                    style="display: inline-block;width:58px;">
+                    <div style="width: 58px;height:58px;line-height: 58px;">
+                      <Icon type="ios-camera" size="20"></Icon>
+                    </div>
+                  </Upload>
+                  <Modal title="鍥剧墖棰勮" v-model="visible">
+                    <img :src="imgName" v-if="visible" style="width: 100%">
+                  </Modal>
+                </template>
+              </FormItem>
+            </Col>
+          </Row>
+          <Row :gutter="24">
+            <Col span="24">
+              <FormItem label="鏍囩" :label-width="80" style="width: 100%">
+                <Select v-model="chooseTag" filterable multiple allow-create @on-create="createVideoTag">
+                  <Option v-for="item in videoTagList" :value="item.tagName" :key="item.id">{{ item.tagName }}</Option>
+                </Select>
+              </FormItem>
+            </Col>
+          </Row>
+          <Row :gutter="24">
+            <Col span="24">
+              <FormItem label="閫変腑鍟嗗搧" :label-width="80">
+              </FormItem>
+            </Col>
+          </Row>
+          <Row :gutter="24">
+            <Col span="12">
+              <FormItem label="鍟嗗搧鍒楄〃" :label-width="80">
+                <Input v-model="searchGoodsForm.keyword" style="width:200px" @on-change="searchGoodsList"></Input>
+                <div style="height: 400px;overflow: auto;">
+                  <div v-for="item in goodsData" :key="item.id" style="display: flex;
+                          align-items: center;justify-content: flex-start;border: 1px solid gray;margin-top: 10px;
+                          padding: 10px;border-radius: 20px" @click="chooseGoods(item.id)">
+                    <div>
+                      <img :src="endpoint+'/'+item.thumbnail" style="width: 80px;height: 80px">
+                    </div>
+                    <div style="display: flex;flex-direction: column;margin-left: 20px">
+                      <div style="font-size: 1.5em;font-weight: bold">{{ item.goodsName }}</div>
+                      <div style="color: #ff6f6f">
+                        锟{ item.price }}
+                      </div>
+                    </div>
+                  </div>
+                </div>
+                <Page
+                  :current="searchGoodsForm.pageNumber"
+                  :total="goodsTotal"
+                  :page-size="searchGoodsForm.pageSize"
+                  @on-change="goodsChangePage"
+                  @on-page-size-change="goodsChangePageSize"
+                  :page-size-opts="[10, 20, 50]"
+                  size="small"
+                  show-total
+                ></Page>
+              </FormItem>
+            </Col>
+            <Col span="12">
+              <FormItem label="閫変腑鍟嗗搧" :label-width="80">
+                <div style="height: 400px;overflow: auto;">
+                  <div v-for="(item,index) in uploadVideoForm.goodsList" :key="item.id" style="display: flex;
+                          align-items: center;justify-content: flex-start;border: 1px solid gray;margin-top: 10px;
+                          padding: 10px;border-radius: 20px">
+                    <div>
+                      <img :src="item.thumbnail.includes('http') ? item.thumbnail : endpoint + '/' + item.thumbnail"
+                           style="width: 80px;height: 80px">
+                    </div>
+                    <div style="display: flex;flex-direction: column;margin-left: 20px">
+                      <div style="font-size: 1.5em;font-weight: bold">{{ item.goodsName }}</div>
+                      <div style="color: #ff6f6f;display: flex;align-content: center;justify-content: flex-start">
+                        <div> 锟{ item.price }}</div>
+                        <div style="margin-left: 10px">
+                          <InputNumber v-model="item.goodsNum" :min="0" :max="99" controls-outside
+                                       @on-change="changeGoodsNum(item.goodsSkuId,index,item.goodsNum)"
+                                       style="vertical-align: center;width: 100px"></InputNumber>
+                        </div>
+                      </div>
+                    </div>
+                  </div>
+                </div>
+              </FormItem>
+            </Col>
+
+          </Row>
+
+        </Form>
+        <div slot="footer">
+          <Button type="text" @click="closeVideoUpload">鍏抽棴</Button>
+          <Button type="primary" @click="submitVideoUpload">纭</Button>
+        </div>
+      </Modal>
       <Modal
         v-model="playVideoShow"
         :title="playVideoTitle"
         width="800"
         :mask-closable="false"
+        @close="playVideoClose"
       >
         <div class="video-warp">
           <video :src="playVideoUrl" autoplay controls style="width: 768px;height: 432px"/>
@@ -83,20 +283,20 @@
           :rules="auditingRule"
         >
           <Form-item label="鏍囬锛�">
-            <div>{{detail.title}}</div>
+            <div>{{ detail.title }}</div>
           </Form-item>
           <Form-item label="鏍囩锛�">
             <div style="display: flex;flex-wrap: wrap">
               <div v-for="(tag, index) in detail.tagList" :key="'tag' + index" style="margin-right: 5px">
-                <Tag color="red">{{tag.tagName}}</Tag>
+                <Tag color="red">{{ tag.tagName }}</Tag>
               </div>
             </div>
           </Form-item>
           <Form-item v-if="detail.videoContentType === 'video'" label="瑙嗛鏃堕暱锛�" :label-width="72">
-            <div>{{formatSeconds(detail.videoDuration)}}</div>
+            <div>{{ formatSeconds(detail.videoDuration) }}</div>
           </Form-item>
           <Form-item v-if="detail.videoContentType === 'img'" label="鍥剧墖寮犳暟锛�" :label-width="72">
-            <div>{{detail.imgs.length}}</div>
+            <div>{{ detail.imgs.length }}</div>
           </Form-item>
           <Form-item v-if="detail.videoContentType === 'video'" class="video-warp" :label-width="0">
             <Row>
@@ -129,6 +329,22 @@
               <div v-for="img in detail.imgs" :key="img" class="img-warp">
                 <img :src="img" class="image">
               </div>
+              <Row v-for="goods in detail.goodsList" :key="goods.goodsId" style="width: 100%">
+                <Row style="width:100%;align-items: center; padding: 5px 10px">
+                  <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>
             </div>
 
           </Form-item>
@@ -161,7 +377,7 @@
       >
         <Form :model="videoDownForm" :rules="videoDownRule" ref="videoDownForm">
           <FormItem label="涓嬫灦鍘熷洜锛�" :labelWidth="100" prop="reason">
-            <editor ref="editor" @input="getReason" />
+            <editor ref="editor" @input="getReason"/>
           </FormItem>
         </Form>
         <div slot="footer">
@@ -182,28 +398,148 @@
       >
         <template slot-scope="{ row, index }" slot="tagList">
           <div v-for="(tag, index) in row.tagList" :key="'tag' + index" style="margin-top: 5px">
-            <Tag color="red">{{tag.tagName}}</Tag>
+            <Tag color="red">{{ tag.tagName }}</Tag>
           </div>
         </template>
         <template slot-scope="{ row, index }" slot="videoFileKey">
-          <div class="play-text" @click="playVideo(row.videoFileKey, row.title)">鐐瑰嚮鎾斁</div>
+          <div v-if="row.videoContentType === 'video'" class="play-text"
+               @click="playVideo(row.videoFileKey, row.title)">鐐瑰嚮鎾斁
+          </div>
         </template>
         <template slot-scope="{ row, index }" slot="videoDuration">
-          <div>{{formatSeconds(row.videoDuration)}}</div>
+          <div>{{ formatSeconds(row.videoDuration) }}</div>
         </template>
         <template slot-scope="{ row, index }" slot="recommend">
           <i-switch v-model="row.recommend" :before-change="() => handleBeforeChange(row)" true-color="#13ce66"/>
         </template>
         <template slot-scope="{ row, index }" slot="status">
-          {{transStatus(row.status)}}
+          {{ transStatus(row.status) }}
         </template>
         <template slot-scope="{ row, index }" slot="action">
-          <Button type="primary" size="small" style="margin-right: 5px" v-if="row.status === '99'" @click="openAuditing(row)">瀹℃牳</Button>
-          <Button type="error" size="small" style="margin-right: 5px" v-if="row.status === '1'" @click="openVideoDown(row)">涓嬫灦</Button>
-          <Button type="success" size="small" style="margin-right: 5px" v-else-if="row.status === '0'" @click="videoUp(row)">涓婃灦</Button>
+          <Button type="primary" size="small" style="margin-right: 5px" v-if="row.status === '99'"
+                  @click="openAuditing(row)">瀹℃牳
+          </Button>
+          <Button type="primary" size="small" style="margin-right: 5px"
+                  @click="editVideo(row)">缂栬緫
+          </Button>
+          <Button type="error" size="small" style="margin-right: 5px" v-if="row.status === '1'"
+                  @click="openVideoDown(row)">涓嬫灦
+          </Button>
+          <Button type="error" size="small" style="margin-right: 5px" v-if="row.status === '1'"
+                  @click="generalQrCode(row)">鐢熸垚浜岀淮鐮�
+          </Button>
+          <Button type="success" size="small" style="margin-right: 5px" v-else-if="row.status === '0'"
+                  @click="videoUp(row)">涓婃灦
+          </Button>
+          <Button type="error" size="small" style="margin-right: 5px"
+                  @click="openComment(row)">
+            鏌ョ湅璇勮
+          </Button>
         </template>
       </Table>
+      <Modal
+        v-model="showVideoComment"
+        title="瑙嗛璇勮"
+        width="1000"
+        :mask-closable="false">
+        <Form :model="commentForm" ref="commentForm">
+          <Row type="flex" :gutter="16">
+            <Col>
+              <FormItem :label-width="70" label="鍐呭锛�" prop="commentContent">
+                <Input style="width: 120px"
+                       v-model="commentForm.commentContent" placeholder="璇疯緭鍏ュ唴瀹�"
+                       @on-clear="commentHandleSearch"
+                       @on-change="commentHandleSearch"></Input>
+              </FormItem>
+            </Col>
+            <Col>
+              <FormItem :label-width="70" label="鐢ㄦ埛鏄电О锛�" prop="nickName">
+                <Input style="width: 120px" v-model="commentForm.nickName" placeholder="璇疯緭鍏ュ唴瀹�"
+                       @on-clear="commentHandleSearch"
+                       @on-change="commentHandleSearch"></Input>
+              </FormItem>
+            </Col>
+            <Col>
+              <FormItem :label-width="70" label="寮�濮嬫椂闂达細" prop="startTime">
+                <DatePicker
+                  :v-model="commentForm.startTime"
+                  type="datetime"
+                  placeholder="閫夋嫨寮�濮嬫椂闂�"
+                  style="width: 120px"
+                  @on-change="commentHandleSearch($event)"
+                  @on-clear="commentHandleSearch"
+                ></DatePicker>
+              </FormItem>
+            </Col>
+            <Col>
+              <FormItem :label-width="70" label="缁撴潫鏃堕棿锛�" prop="endTime">
+                <DatePicker
+                  :v-model="commentForm.endTime"
+                  type="datetime"
+                  placeholder="閫夋嫨缁撴潫鏃堕棿"
+                  style="width: 120px"
+                  @on-change="commentHandleSearch($event)"
+                  @on-clear="commentHandleSearch"
+                ></DatePicker>
+              </FormItem>
+            </Col>
+          </Row>
+        </Form>
 
+      <div slot="footer">
+        <Button type="text" @click="closeVideoDown">鍏抽棴</Button>
+        <Button type="primary" @click="videoDown">纭</Button>
+      </div>
+          <Table
+            :loading="commentLoading"
+            border
+            :columns="commentColumns"
+            :data="commentData"
+            ref="commentTable"
+            sortable="custom"
+            >
+           <template slot-scope="{ row, index }" slot="action">
+              <Button type="error" size="small"
+              @click="removeComment(row)">鍒犻櫎</Button>
+           </template>
+          </Table>
+        <Row type="flex" justify="end" class="page-footer">
+          <Page
+            :current="commentForm.pageNumber"
+            :total="commentTotal"
+            :page-size="commentForm.pageSize"
+            @on-change="commentChangePage"
+            @on-page-size-change="commentChangePageSize"
+            :page-size-opts="[10, 20, 50]"
+            size="small"
+            show-total
+            show-elevator
+            show-sizer
+          ></Page>
+        </Row>
+        <div slot="footer">
+
+        </div>
+      </Modal>
+
+      <Modal
+        v-model="showGeneralQrCode"
+        title="浜岀淮鐮�"
+        width="800"
+        :mask-closable="false"
+      >
+        <vue-qr
+          :text="QRCodeUrl"
+          :margin="0"
+          colorDark="#000"
+          colorLight="#fff"
+          :size="150"
+        ></vue-qr>
+        <div slot="footer">
+          <Button type="text" @click="closeGeneralQrCode">鍏抽棴</Button>
+          <!--          <Button type="primary" @click="generalQrCode">纭</Button>-->
+        </div>
+      </Modal>
       <Row type="flex" justify="end" class="mt_10">
         <Page
           :current="searchForm.pageNumber"
@@ -223,16 +559,151 @@
 </template>
 
 <script>
-import {getVideos, recommendSet, getVideoById, auditingVideo, up, down} from "@/api/video";
-import {getVideoTagList} from "@/api/videoTag";
-import {getFilePreview} from "@/api/file";
+import {
+  getVideos,
+  recommendSet,
+  getVideoById,
+  auditingVideo,
+  up,
+  down,
+  recreateIndex,
+  publish,
+  updatePublish,
+  getCommentPage,
+  removeById
+} from "@/api/video";
+import {getVideoTagList, recommend, videoGoodsEsPage} from "@/api/videoTag";
+import {getFilePreview, getSts} from "@/api/file";
 import Editor from '@/components/editor/index.vue'
 import GoodsExpandRow from '@/views/video/GoodsExpandRow'
+import COS from "cos-js-sdk-v5";
+import {getFileKey} from "@/utils/file";
+import vuedraggable from "vuedraggable";
+import vueQr from "vue-qr";
+import uploadImage from "../../components/editor/upload-image.vue";
+
 export default {
   name: "VideoList",
-  components: {Editor,GoodsExpandRow},
+  computed: {
+    uploadImage() {
+      return uploadImage
+    }
+  },
+  components: {vuedraggable, Editor, GoodsExpandRow, "vue-qr": vueQr},
+  watch: {
+    'uploadVideoForm.videoContentType'(newValue, oldValue) {
+      if (newValue === 'video') {
+        this.showVideoFlag = true;
+        this.showImgFlag = false;
+        this.uploadVideoForm.videoImgs = []
+        this.uploadVideoForm.showListImages = []
+      } else {
+        this.uploadVideoForm.videoFileKey = '';
+        this.showVideoFlag = false;
+        this.showImgFlag = true;
+        this.videoProgress = 0;
+      }
+    },
+    chooseTag(newValue, oldValue) {
+      console.log('瑙﹀彂鏂板�煎彉鍖�',newValue);
+      this.uploadVideoForm.tags = newValue.map(item => {
+        const findTag = this.videoTagList.find(tagItem => {
+          return tagItem.tagName === item
+        })
+        if (findTag) {
+          return {
+            id: findTag.id,
+            tagName: findTag.tagName
+          }
+        } else {
+          return {
+            id: "",
+            tagName: item,
+          }
+        }
+      })
+      console.log('------------------------------this.uploadVideoForm.tags>', this.uploadVideoForm.tags)
+    }
+  },
   data() {
     return {
+      commentTotal:0,
+      commentForm:{
+        commentContent:'',
+        videoId:'',
+        nikeName:'',
+        startTime:'',
+        endTime:'',
+        pageNumber:1,
+        pageSize:10
+      },
+      commentColumns:[
+        // {
+        //   type: 'selection',
+        //   width: 60,
+        //   align: 'center'
+        // },
+        {
+          title: "鐢ㄦ埛鍚�",
+          key: "userNickname",
+          minWidth: 240,
+          tooltip: true,
+        },{
+          title: "鍐呭",
+          key: "commentContent",
+          minWidth: 240,
+          tooltip: true,
+        },{
+          title: "璇勮鏃堕棿",
+          key: "createTime",
+          minWidth: 240,
+          tooltip: true,
+        },{
+          title: "鎿嶄綔",
+          key: "action",
+          slot: "action",
+          align: "center",
+          width: 200,
+          fixed: "right"
+        }
+      ],
+      commentData:[],
+      showVideoComment:false,
+      commentLoading:false,
+
+      // https://myk.9village.cn/scanpage/recommend?shareType=videoRecommend&videoId=1948284811844190209
+      baseQRCodeUrl: this.QRcodeBaseUrl + '/scanpage/recommend',
+      QRCodeUrl: '',
+      showGeneralQrCode: false,
+      endpoint: '',
+      searchGoods: '',
+      videoTagList: [],
+      chooseTag: [],
+      videoTag: '',
+      visible: false,
+      imgName: '',
+      showVideoFlag: true,
+      showImgFlag: false,
+      showVideoProgress: false,
+      videoProgress: 0,
+      upLoadVideoShow: false,
+      uploadVideoForm: {
+        coverUrl:null,
+        showCoverUrl:null,
+        id: '',
+        title: '',
+        cover: "",
+        videoFileKey: "",
+        videoDuration: 0,
+        videoFit: "cover",
+        videoContentType: 'video',
+        videoImgs: [],
+        showListImages: [],
+        tags: [],
+        fileInfo: {},
+        goodsList: []
+
+      },
       videoDownForm: {
         id: '',
         reason: ''
@@ -292,6 +763,13 @@
         title: '', // 鏍囬
         tagList: [], // 鏍囩
         status: '99'
+      },
+      searchGoodsForm: {
+        // 鎼滅储妗嗗垵濮嬪寲瀵硅薄
+        pageNumber: 1, // 褰撳墠椤垫暟
+        pageSize: 10, // 椤甸潰澶у皬
+        keyword: '',
+        searchFromSelfStore: false
       },
       tagList: [], // 鏍囩鍒楄〃
       columns: [
@@ -370,7 +848,7 @@
         {
           title: "鏉冮噸",
           key: "weight",
-          width: 170,
+          width: 80,
         },
         {
           title: "鐘舵��",
@@ -385,10 +863,13 @@
           slot: "action",
           align: "center",
           width: 200,
+          fixed: "right"
         },
       ],
+      goodsData: [],
       data: [], // 琛ㄥ崟鏁版嵁
       total: 0, // 琛ㄥ崟鏁版嵁鎬绘暟
+      goodsTotal: 0, // 琛ㄥ崟鏁版嵁鎬绘暟
       selectCount: 0, // 宸查�夋暟閲�
       selectList: [], // 宸查�夋暟鎹垪琛�
     }
@@ -398,6 +879,445 @@
     this.getTags('')
   },
   methods: {
+    commentChangePage(page) {
+      this.commentForm.pageNumber = page
+      this.commentPage()
+    },
+
+    // 鏀瑰彉鎶ュ悕浜哄憳姣忛〉鏉℃暟
+    commentChangePageSize(pageSize) {
+      this.commentForm.pageNumber = 1
+      this.commentForm.pageSize = pageSize
+      this.commentPage()
+    },
+    commentPage(){
+      this.commentLoading = true;
+      getCommentPage(this.commentForm).then(res =>{
+        this.commentLoading = false;
+        if (res.code === 200){
+          this.commentData = res.data;
+          this.commentData.forEach(item =>{
+            item.createTime = this.formatDate(item.createTime);
+          })
+
+        }
+      })
+    },
+    commentHandleSearch(){
+      this.commentPage();
+    },
+    removeComment(row){
+      removeById(row.id).then(res=>{
+        if (res.code === 200){
+          this.$Message.success(res.msg);
+        }else {
+          this.$Message.error(res.msg);
+        }
+        this.commentPage();
+      })
+
+    },
+    formatDate(date, format = 'yyyy-MM-dd HH:mm:ss') {
+      if (!date) return '';
+
+      const d = new Date(date);
+      if (isNaN(d.getTime())) return date; // 鏃犳晥鏃ユ湡鐩存帴杩斿洖鍘熷��
+
+      const padZero = (num) => (num < 10 ? `0${num}` : num.toString());
+
+      return format
+        .replace('yyyy', d.getFullYear())
+        .replace('MM', padZero(d.getMonth() + 1))
+        .replace('dd', padZero(d.getDate()))
+        .replace('HH', padZero(d.getHours()))
+        .replace('mm', padZero(d.getMinutes()))
+        .replace('ss', padZero(d.getSeconds()));
+    },
+    commentShowSelect(){
+      // this.selectList = selection.map(item => item.id)
+      // this.selectCount = selection.length
+    },
+    openComment(row){
+      console.log(row)
+      this.commentForm.videoId = row.id;
+      this.showVideoComment = true;
+      this.commentPage();
+    },
+    async editVideo(row) {
+      // this.uploadVideoForm = {};
+      // this.uploadVideoForm = row;
+      // this.showUploadVideoShow = true;
+      this.videoTagList = []
+     await recommend({
+        searchType: "HOT"
+      }).then(res => {
+        this.videoTagList = res.data;
+      })
+      this.upLoadVideoShow = true;
+      this.chooseTag = row.tagList.map(item => {
+        return item.tagName
+      })
+      console.log('閫変腑鍒楄〃---銆�',row.goodsList)
+      row.goodsList.forEach(item => {
+        item.goodsSkuId = item.id
+      })
+      this.uploadVideoForm = {
+        id: '',
+        title: '',
+        cover: "",
+        videoFileKey: "",
+        videoDuration: 0,
+        videoFit: "cover",
+        videoContentType: 'video',
+        videoImgs: [],
+        showListImages: [],
+        tags: [],
+        fileInfo: {},
+        goodsList: []
+      }
+
+
+      // 閬嶅巻宸查�夋嫨鐨勬爣绛�
+      row.tagList.forEach(tag => {
+        // 妫�鏌ユ爣绛炬槸鍚﹀凡瀛樺湪浜巚ideoTagList涓�
+        const exists = this.videoTagList.some(item => item.tagName === tag.tagName);
+        // 濡傛灉涓嶅瓨鍦紝鍒欐坊鍔犲埌閫夐」鍒楄〃
+        if (!exists) {
+          this.videoTagList.push({
+            id: tag.id, // 鐢熸垚涓存椂ID
+            tagName: tag.tagName
+          });
+        }
+      });
+      this.uploadVideoForm = row
+      console.log("鎵撳嵃鍊�",this.uploadVideoForm)
+      this.uploadVideoForm.fileInfo= {};
+      this.uploadVideoForm.videoImgs = JSON.parse(this.uploadVideoForm.videoImgs)
+      const sts = await getSts();
+      if (this.uploadVideoForm.videoContentType === 'video') {
+        this.uploadVideoForm.showVideoUrl = sts.data.endpoint + '/' + this.uploadVideoForm.videoFileKey
+
+        if (this.uploadVideoForm.coverUrl !== '' && this.uploadVideoForm.coverUrl != null) {
+          this.uploadVideoForm.showCoverUrl =  this.uploadVideoForm.coverUrl
+        }
+      } else if (this.uploadVideoForm.videoContentType === 'img') {
+        this.uploadVideoForm.showListImages = this.uploadVideoForm.videoImgs.map(item => {
+          return sts.data.endpoint + '/' + item
+        })
+      }
+      console.log("澶勭悊杩囧悗",this.uploadVideoForm)
+
+      this.searchGoodsList();
+    },
+    closeGeneralQrCode() {
+      this.showGeneralQrCode = false;
+      this.QRCodeUrl = '';
+    },
+    generalQrCode(row) {
+      this.showGeneralQrCode = true
+      console.log('-------------------->', row);
+      this.QRCodeUrl = this.baseQRCodeUrl + '?shareType=videoRecommend' + '&videoId=' + row.id;
+      console.log(this.QRCodeUrl)
+    },
+    //todo 淇濈暀鍚庣画鍙兘浼氫娇鐢�
+    changeGoodsNum(id, index, goodsNum) {
+      console.log('-------------------->', id, index, goodsNum)
+    },
+    chooseGoods(id) {
+      const goods = this.goodsData.find(item => {
+        return item.id === id;
+      })
+      const existingItem = this.uploadVideoForm.goodsList.find(item => item.goodsSkuId === id);
+      if (existingItem) {
+        existingItem.goodsNum = existingItem.goodsNum + 1;
+      } else {
+        this.uploadVideoForm.goodsList.push({
+          goodsId: goods.goodsId,
+          goodsSkuId: goods.id,
+          goodsNum: 1,
+          goodsName: goods.goodsName,
+          thumbnail: goods.thumbnail,
+          price: goods.price,
+
+        })
+      }
+      // this.uploadVideoForm.goodsList.forEach(item => {
+      //   if (item.goodsSkuId === id) {
+      //     item.goodsNum = item.goodsNum+1;
+      //   }
+      // })
+      console.log('------------------------>', this.uploadVideoForm.goodsList)
+
+
+    },
+    searchGoodsList() {
+      this.searchGoodsForm.pageNumber = 1;
+      this.getGoodsDataList();
+    },
+    closeVideoUpload() {
+      this.upLoadVideoShow = false;
+    },
+    submitVideoUpload() {
+      console.log(this.uploadVideoForm.coverUrl)
+      if (this.uploadVideoForm.coverUrl === null || this.uploadVideoForm.coverUrl === undefined) {
+        this.$Message.error('鏍囬涓嶈兘涓虹┖');
+        return;
+      }
+      this.uploadVideoForm.goodsList = this.uploadVideoForm.goodsList.filter(item => {
+        return item.goodsNum > 0;
+      })
+      if (!this.uploadVideoForm.title) {
+        this.$Message.error('鏍囬涓嶈兘涓虹┖');
+        return;
+      }
+      //琛ㄥ崟鏍¢獙
+      if (this.uploadVideoForm.videoContentType === 'video') {
+        if (!this.uploadVideoForm.videoFileKey) {
+          this.$Message.error('瑙嗛涓嶈兘涓虹┖');
+          return;
+        }
+      }
+      if (this.uploadVideoForm.videoContentType === 'img') {
+        if (this.uploadVideoForm.videoImgs < 1) {
+          this.$Message.error('鍥剧墖涓嶈兘涓虹┖');
+          return;
+        }
+      }
+      console.log('鎻愪氦琛ㄥ崟--------------->', this.uploadVideoForm)
+      if (this.uploadVideoForm.id) {
+        updatePublish(this.uploadVideoForm).then(response => {
+          if (response.code == 200) {
+            this.$Message.success("瑙嗛淇敼鎴愬姛");
+            this.upLoadVideoShow = false;
+            this.getDataList();
+          }
+        }).then(error => {
+          this.$Message.success(error);
+        })
+
+      } else {
+        publish(this.uploadVideoForm).then(response => {
+          if (response.code == 200) {
+            this.$Message.success("瑙嗛鍙戝竷鎴愬姛");
+            this.upLoadVideoShow = false;
+            this.getDataList();
+          }
+        }).then(error => {
+          this.$Message.success(error);
+        })
+      }
+
+    },
+    //todo 鍚庣画鍙兘浼氫娇鐢ㄩ鐣�
+    createVideoTag(e) {
+      console.log('------------>',e)
+    },
+    handleRemove(file) {
+      const fileList2 = this.uploadVideoForm.showListImages;
+      this.uploadVideoForm.videoImgs.splice(fileList2.indexOf(file), 1);
+      this.uploadVideoForm.showListImages.splice(fileList2.indexOf(file), 1);
+    },
+    handleView(name) {
+      this.imgName = name;
+      this.visible = true;
+    },
+    async upLoadImagCover(file) {
+      try {
+        // 鑾峰彇鏂囦欢涓婁紶涓存椂瀵嗛挜
+        const sts = await getSts();
+        const cos = new COS({
+          getAuthorization: async function (options, callback) {
+            callback({
+              TmpSecretId: sts.data.tmpSecretId,
+              TmpSecretKey: sts.data.tmpSecretKey,
+              SecurityToken: sts.data.sessionToken,
+              // 寤鸿杩斿洖鏈嶅姟鍣ㄦ椂闂翠綔涓虹鍚嶇殑寮�濮嬫椂闂达紝閬垮厤瀹㈡埛绔湰鍦版椂闂村亸宸繃澶у鑷寸鍚嶉敊璇�
+              StartTime: sts.data.stsStartTime, // 鏃堕棿鎴筹紝鍗曚綅绉掞紝濡傦細1580000000
+              ExpiredTime: sts.data.stsEndTime,// 鏃堕棿鎴筹紝鍗曚綅绉掞紝濡傦細1580000000
+              ScopeLimit: true, // 缁嗙矑搴︽帶鍒舵潈闄愰渶瑕佽涓� true锛屼細闄愬埗瀵嗛挜鍙湪鐩稿悓璇锋眰鏃堕噸澶嶄娇鐢�
+            });
+          }
+        })
+        const fileKey = getFileKey(file.name)
+        const upData = await cos.uploadFile({
+          Bucket: sts.data.bucket,
+          Region: sts.data.region,
+          Key: fileKey,
+          Body: file, // 瑕佷笂浼犵殑鏂囦欢瀵硅薄銆俢over
+          SliceSize: 1024 * 1024 * 5,
+          onProgress: function (progressData) {
+            console.log('涓婁紶杩涘害锛�', progressData);
+          },
+        });
+        this.$set(this.uploadVideoForm, 'coverUrl', fileKey);
+        this.$set(this.uploadVideoForm, 'showCoverUrl', `${sts.data.endpoint}/${fileKey}`);
+        this.uploadVideoForm.cover = fileKey;
+        if (this.$refs.videoInfo) {
+          this.$refs.videoInfo.poster = this.uploadVideoForm.showCoverUrl;
+          this.$refs.videoInfo.load(); // 閲嶆柊鍔犺浇瑙嗛
+        }
+        console.log(this.uploadVideoForm)
+
+      } catch (e) {
+        console.log("涓婁紶澶辫触", upData)
+      } finally {
+
+      }
+      return false;
+    },
+    clearCoverImage(){
+      this.$set(this.uploadVideoForm, 'coverUrl', '');
+      this.$set(this.uploadVideoForm, 'showCoverUrl', '');
+      this.$set(this.uploadVideoForm, 'temp', new Date().getTime());
+    },
+
+    async upLoadImg(file) {
+      if (this.uploadVideoForm.videoImgs >= 5) {
+        this.$Message.error("鍥剧墖涓婁紶涓嶈兘瓒呰繃5涓�");
+        return;
+      }
+      try {
+        // 鑾峰彇鏂囦欢涓婁紶涓存椂瀵嗛挜
+        const sts = await getSts();
+        const cos = new COS({
+          getAuthorization: async function (options, callback) {
+            callback({
+              TmpSecretId: sts.data.tmpSecretId,
+              TmpSecretKey: sts.data.tmpSecretKey,
+              SecurityToken: sts.data.sessionToken,
+              // 寤鸿杩斿洖鏈嶅姟鍣ㄦ椂闂翠綔涓虹鍚嶇殑寮�濮嬫椂闂达紝閬垮厤瀹㈡埛绔湰鍦版椂闂村亸宸繃澶у鑷寸鍚嶉敊璇�
+              StartTime: sts.data.stsStartTime, // 鏃堕棿鎴筹紝鍗曚綅绉掞紝濡傦細1580000000
+              ExpiredTime: sts.data.stsEndTime,// 鏃堕棿鎴筹紝鍗曚綅绉掞紝濡傦細1580000000
+              ScopeLimit: true, // 缁嗙矑搴︽帶鍒舵潈闄愰渶瑕佽涓� true锛屼細闄愬埗瀵嗛挜鍙湪鐩稿悓璇锋眰鏃堕噸澶嶄娇鐢�
+            });
+          }
+        })
+        const fileKey = getFileKey(file.name)
+        const upData = await cos.uploadFile({
+          Bucket: sts.data.bucket,
+          Region: sts.data.region,
+          Key: fileKey,
+          Body: file, // 瑕佷笂浼犵殑鏂囦欢瀵硅薄銆�
+          SliceSize: 1024 * 1024 * 5,
+          onProgress: function (progressData) {
+            console.log('涓婁紶杩涘害锛�', progressData);
+          },
+        });
+        console.log("涓婁紶鎴愬姛", upData)
+        this.$nextTick(() => {
+          this.uploadVideoForm.videoImgs.push(fileKey);
+          this.uploadVideoForm.showListImages.push(sts.data.endpoint + "/" + fileKey);
+        })
+
+      } catch (e) {
+        console.log("涓婁紶澶辫触", upData)
+        return false;
+      } finally {
+
+      }
+      return false;
+    },
+    reloadVideo() {
+      this.uploadVideoForm.videoFileKey = '';
+      this.uploadVideoForm.showVideoUrl = '';
+    },
+    calculateVideoFit(width, height) {
+      const videoRatio = width / height;
+      // 瑙勫垯2锛氱珫灞忚棰戯紙濡�9:16锛�
+      if (videoRatio < 0.8) return 'cover';
+      return 'contain';
+    },
+    getVideoDuration(e) {
+      const duration = this.$refs.videoInfo.duration;
+      const videoWidth = this.$refs.videoInfo.videoWidth;
+      const videoHeight = this.$refs.videoInfo.videoHeight;
+      // 鏍规嵁瀹介珮姣旈�夋嫨瑙嗛濉厖妯″紡
+      const fitType = this.calculateVideoFit(videoWidth, videoHeight)
+      this.uploadVideoForm.videoFit = fitType
+      console.log('------瑙嗛淇℃伅3------------>', videoWidth, videoHeight, fitType)
+
+      this.uploadVideoForm.videoDuration = Math.floor(duration);
+    },
+    async upLoadVideo(file) {
+      try {
+        this.$nextTick(() => {
+          this.showVideoProgress = true;
+        })
+        // 鑾峰彇鏂囦欢涓婁紶涓存椂瀵嗛挜
+        const sts = await getSts();
+        const cos = new COS({
+          getAuthorization: async function (options, callback) {
+            callback({
+              TmpSecretId: sts.data.tmpSecretId,
+              TmpSecretKey: sts.data.tmpSecretKey,
+              SecurityToken: sts.data.sessionToken,
+              // 寤鸿杩斿洖鏈嶅姟鍣ㄦ椂闂翠綔涓虹鍚嶇殑寮�濮嬫椂闂达紝閬垮厤瀹㈡埛绔湰鍦版椂闂村亸宸繃澶у鑷寸鍚嶉敊璇�
+              StartTime: sts.data.stsStartTime, // 鏃堕棿鎴筹紝鍗曚綅绉掞紝濡傦細1580000000
+              ExpiredTime: sts.data.stsEndTime,// 鏃堕棿鎴筹紝鍗曚綅绉掞紝濡傦細1580000000
+              ScopeLimit: true, // 缁嗙矑搴︽帶鍒舵潈闄愰渶瑕佽涓� true锛屼細闄愬埗瀵嗛挜鍙湪鐩稿悓璇锋眰鏃堕噸澶嶄娇鐢�
+            });
+          }
+        })
+        const fileKey = getFileKey(file.name)
+        const upData = await cos.uploadFile({
+          Bucket: sts.data.bucket,
+          Region: sts.data.region,
+          Key: fileKey,
+          Body: file, // 瑕佷笂浼犵殑鏂囦欢瀵硅薄銆�
+          SliceSize: 1024 * 1024 * 5,
+          onProgress: (progressData) => {
+            console.log('涓婁紶杩涘害锛�', progressData);
+            this.videoProgress = Math.floor(progressData.percent * 100);
+          },
+        });
+
+        console.log(this.uploadVideoForm)
+        this.$nextTick(() => {
+          this.uploadVideoForm.videoFileKey = fileKey;
+          this.uploadVideoForm.showVideoUrl = sts.data.endpoint + "/" + fileKey;
+        })
+        console.log("涓婁紶鎴愬姛", upData)
+        const duration = this.$refs.videoInfo.duration;
+        console.log('-娴嬭瘯鑾峰彇鏃堕棿淇℃伅---------------->', duration);
+      } catch (e) {
+        console.log("涓婁紶澶辫触", upData)
+      } finally {
+        this.$nextTick(() => {
+          this.showVideoProgress = false;
+        })
+      }
+      return false;
+    },
+    openUploadVideo() {
+      this.upLoadVideoShow = true;
+      this.videoTagList = []
+      this.chooseTag = []
+      this.uploadVideoForm = {
+        id: '',
+        title: '',
+        cover: "",
+        videoFileKey: "",
+        videoDuration: 0,
+        videoFit: "cover",
+        videoContentType: 'video',
+        videoImgs: [],
+        showListImages: [],
+        tags: [],
+        fileInfo: {},
+        goodsList: []
+      }
+      recommend({
+        searchType: "HOT"
+      }).then(res => {
+        this.videoTagList = res.data;
+      })
+      this.searchGoodsList();
+    },
+    recreateEsIndex() {
+      recreateIndex().then(res => {
+        this.$Message.success(res.msg)
+      })
+    },
     // 绉掕浆x鍒唜绉�
     formatSeconds(seconds) {
       if (isNaN(seconds) || seconds < 0) return '0绉�';
@@ -561,6 +1481,26 @@
       this.getDataList();
     },
     // 鑾峰彇鍒楄〃鏁版嵁
+    getGoodsDataList() {
+      let search = this.searchGoodsForm;
+      console.log('-------------------------->', this.searchGoodsForm)
+      if (search.pageNumber > 0) {
+        search.pageNumber = search.pageNumber - 1;
+      }
+      videoGoodsEsPage(search).then((res) => {
+        console.log(res)
+        this.loading = false;
+        if (res.code == 200) {
+          this.goodsData = res.data;
+          getSts().then(res => {
+            this.endpoint = res.data.endpoint
+          })
+          this.goodsTotal = res.total;
+        }
+      });
+      this.total = this.data.length;
+    },
+    // 鑾峰彇鍒楄〃鏁版嵁
     getDataList() {
       this.loading = true;
       getVideos(this.searchForm).then((res) => {
@@ -598,6 +1538,18 @@
       this.searchForm.pageSize = v;
       this.getDataList();
     },
+    // 鍒嗛〉 鏀瑰彉椤电爜
+    goodsChangePage(v) {
+      console.log('-------------------------->鍒嗛〉', v);
+      this.searchGoodsForm.pageNumber = v;
+      this.getGoodsDataList();
+    },
+    // 鍒嗛〉 鏀瑰彉椤垫暟
+    goodsChangePageSize(v) {
+      this.searchGoodsForm.pageNumber = 1;
+      this.searchGoodsForm.pageSize = v;
+      this.getGoodsDataList();
+    },
   }
 }
 </script>
@@ -608,22 +1560,68 @@
   text-align: center;
   color: #2d8cf0;
 }
+
 .play-text:hover {
   cursor: pointer;
 }
+
 .video-warp {
   width: 100%;
-  height: 350px;
+  height: 440px;
 }
+
 .data-item {
   display: flex;
   align-items: center;
 }
+
 .img-warp {
   padding: 10px;
 }
+
 .image {
   width: 150px;
   height: 200px;
 }
+
+.demo-upload-list {
+  display: inline-block;
+  width: 60px;
+  height: 60px;
+  text-align: center;
+  line-height: 60px;
+  border: 1px solid transparent;
+  border-radius: 4px;
+  overflow: hidden;
+  background: #fff;
+  position: relative;
+  box-shadow: 0 1px 1px rgba(0, 0, 0, .2);
+  margin-right: 4px;
+}
+
+.demo-upload-list img {
+  width: 100%;
+  height: 100%;
+}
+
+.demo-upload-list-cover {
+  display: none;
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  background: rgba(0, 0, 0, .6);
+}
+
+.demo-upload-list:hover .demo-upload-list-cover {
+  display: block;
+}
+
+.demo-upload-list-cover i {
+  color: #fff;
+  font-size: 20px;
+  cursor: pointer;
+  margin: 0 2px;
+}
 </style>

--
Gitblit v1.8.0