绿满眶商城微信小程序-uniapp
peng
1 天以前 89efee9a2e20fc04b4537d859917b47cf68a814c
pages/kitchen/KitchenVideo.vue
@@ -1,5 +1,15 @@
<template>
  <view class="video-container">
     <view class="choosePlatType" :style="{top: menueButton + 'px'}">
        <view class="platTypeItem" v-for="item in choosePlat" :key="item.type" @click="chooseType=item.type">
           <view class="platTypeItenName">
            {{item.name}}
         </view>
         <view class="platTypeItemChoose" v-if="chooseType===item.type" >
         </view>
        </view>
     </view>
    <!-- 视频加载 -->
    <zero-loading v-show="videoLoading" type="circle" color="#0ebd57" text=""></zero-loading>
    <view class="showLeft" @click="showDrawer('showLeft')" v-if="!showLeft" :style="{top: buttonHeight+'px'}">
@@ -29,7 +39,7 @@
              @click="togglePlay(index)"
              v-show="!currentVideoIsPlaying"
          >
            <image src="/static/video/play.png" style="width: 45px;height: 45px" mode="aspectFit"></image>
            <image src="/pages/subComponents/static/video/play.png" style="width: 45px;height: 45px" mode="aspectFit"></image>
          </view>
          <video
              v-if="index >= currentIndex - videoLiveOffset && index <= currentIndex + videoLiveOffset"
@@ -135,9 +145,9 @@
        <!-- 右侧互动按钮 -->
        <view class="action-buttons" v-if="false">
         <view class="avatar-container">
            <image class="avatar" @click="jumpToHomePage(item.authorId)" :src="item.authorAvatar" mode="aspectFill"></image>
            <image class="avatar" @click="jumpToHomePage(item.authorId)" @touchend.stop :src="item.authorAvatar" mode="aspectFill"></image>
            <!-- 关注图标 - 使用绝对定位 -->
            <view v-if="!item.subscribeThisAuthor" class="follow-icon" @click="subscribeAuth(index, item.authorId)">
            <view v-if="!item.subscribeThisAuthor" class="follow-icon" @touchend.stop @click="subscribeAuth(index, item.authorId)">
             <text class="iconfont">&#xe629;</text>
            </view>
         </view>
@@ -242,7 +252,7 @@
        </view>
      </view>
    </uni-popup>
    <uni-drawer ref="showLeft" mode="left" width="120" :cus-style="true" height="80vh"
    <uni-drawer v-if="leftHeight" ref="showLeft" mode="left" width="120" :cus-style="true" :height="`${leftHeight}px`"
                @change="change($event,'showLeft')" class="navigationLeft" :drawerTop="buttonHeight">
      <scroll-view class="typeNavigation" :scroll-y="true" :show-scrollbar="false">
        <view class="typeNavigationItem" :class="{typeNavigationItemCheck:currentCategort ==item.id}"
@@ -267,11 +277,15 @@
  addVideoComment,
  thubmsUpComment,
  cancelThubmsUpComment,
  changeThumbsUp
  changeThumbsUp,
  getGoodsSimilarlyVideos
} from "@/api/video.js";
import {
  changeCollect
} from "@/api/collect.js";
import { saveShare, saveShareClickRecord } from "@/api/share.js";
import storage from "@/utils/storage.js";
import { getSessionId, userAction } from "@/api/userAction.js";
export default {
  computed: {
    hasPlayTime() {
@@ -280,6 +294,13 @@
  },
  data() {
    return {
      choosePlat:[
         {type:'platForm',name:'平台'},
         {type:'custom',name:'用户'}
      ],
      chooseType:'platForm',
     leftHeight:null,
     menueButton:0,
     buttonHeight:0,
      showLeft:false,
      currentCategort: '',
@@ -349,16 +370,46 @@
      },
      loading: false, // 是否正在加载
      videoQuery: {
      source: 'system',
        pageNumber: 1,
        pageSize: 6,
        videoFrom: 'recommend',
        videoType: 'cook'
      },
     marginBottom: 0 // 底部安全区域
     goodsSimilarlyQuery: { // 相似视频查询
        pageNumber: 1,
        pageSize: 10,
        videoFrom: 'goodsSimilarly',
        goodsIds: [],
        currentVideoId: ''
     },
     similarlyVideoList: [], // 相似视频
     similarlyNomore: false, // 是否还有更多相似视频
     similaryVideoIndex: 0, // 相似视频的播放位置
     similarlyLoading: false, // 相似视频加载
     marginBottom: 0 ,// 底部安全区域
     pageSessionNo:"",
     actionParam:{
      sessionId:'',
      actionType:"PAGE",
      joinType:"SELF",
      pageCode:"KITCHEN_VIDEO",
      pageParams:"{}",
      pageStatus:"JOIN",
      pageType:"LIST"
      }
    }
  },
  onShow() {
    this.showDrawer('showLeft')
     getSessionId().then(res=>{
           this.pageSessionNo = res.data.data
           if(this.pageSessionNo){
           let   param = this.actionParam;
              param.sessionId = this.pageSessionNo
              userAction(param)
           }
     })
    // this.showDrawer('showLeft')
    this.loadVideos()
    // 如果视频按下暂停后切换页面再回到页面时,只算暂停时间(因为暂停时间和离开页面时间是重复的,只算一个)
    if (this.startHidenTime !== 0 && this.currentVideoIsPlaying) {
@@ -366,18 +417,143 @@
      this.totalHidenTime += duration
    }
  },
  onUnload() {
    let   param = this.actionParam;
    if (this.sendOnShow)return
    param.pageStatus = "LEAVE"
    userAction(param)
  },
  onHide() {
    this.startHidenTime = Date.now()
    let   param = this.actionParam;
    this.sendOnShow = true;
    param.pageStatus = "LEAVE"
    userAction(param)
  },
  onLoad() {
   this.marginBottom = uni.getSystemInfoSync().safeAreaInsets.bottom
   // 获取状态栏高度
   const systemInfo = uni.getSystemInfoSync();
   this.buttonHeight = systemInfo.statusBarHeight;
   this.getKitchenTypeList();
   this.loadVideos();
  onLoad(option) {
      this.marginBottom = uni.getSystemInfoSync().safeAreaInsets.bottom;
      // 获取状态栏高度
       const systemInfo = uni.getSystemInfoSync();
       console.log('systemInfo------------------------>',systemInfo.windowHeight)
       const menuButtonInfo =  uni.getMenuButtonBoundingClientRect()
       console.log('menuButtonInfo--------------------------->',menuButtonInfo)
       const {top,height} = menuButtonInfo
       this.buttonHeight = systemInfo.statusBarHeight+height;
       this.menueButton = top;
       console.log('systemInfo.safeAreaInsets.bottom>',systemInfo.safeAreaInsets.bottom)
       this.leftHeight = systemInfo.windowHeight - top -50 - systemInfo.safeAreaInsets.bottom -22;
       console.log('-------------leftHeight------------------------>',this.leftHeight)
      let queryParam = this.videoQuery;
      if(option.q){
         const decodedUrl = decodeURIComponent(decodeURIComponent(option.q));
         console.log('原始URL:', decodedUrl);
         // 解析URL中的查询参数
         const params = this.parseUrlParams(decodedUrl);
         const shareType = params.shareType;
         const videoId = params.videoId;
         const source = params.source;
         queryParam.videoId = videoId
         queryParam.shareType = shareType
         queryParam.source = source
         console.log('解析参数:', { shareType, videoId,source });
         this.actionParam.pageParams = JSON.stringify(params)
         this.actionParam.joinType = 'SHARE'
      }
      const token = storage.getAccessToken();
      if(!token){
         this.wxSilentLogin(() => {
            // 判断是不是点击分享链接进来的
            if (option.userId && option.videoId) {
               this.actionParam.pageParams = JSON.stringify(option)
               this.actionParam.joinType = 'SCAN'
               queryParam.videoId = option.videoId
               // 保存分享点击记录
               saveShareClickRecord({refId: option.videoId, shareUserId: option.userId})
            }
               this.getKitchenTypeList();
               this.loadVideos(queryParam);
         })
      }else{
         if (option.userId && option.videoId) {
            queryParam.videoId = option.videoId
            // 保存分享点击记录
            saveShareClickRecord({refId: option.videoId, shareUserId: option.userId})
      }
      this.getKitchenTypeList();
      this.loadVideos(queryParam);
   }
  },
   onShareAppMessage(e) {
   const userInfo = storage.getUserInfo();
   if(!userInfo) {
      console.log("未登录不能分享");
      return
   }
   const videoInfo = e.target.dataset.obj;
   // 保存分享记录
   const data = {
      shareType: 'video',
      refId: videoInfo.id,
      shareUser: userInfo.id
   }
   saveShare(data)
     return {
        title: videoInfo.title,
        path: `/pages/tabbar/index/home?videoId=${videoInfo.id}&userId=${userInfo.id}`,
        imageUrl: videoInfo.coverUrl
     }
  },
  methods: {
     // 解析URL参数
     parseUrlParams(url) {
       const params = {};
       // 处理可能存在的hash(如果有的话)
       const cleanUrl = url.split('#')[0];
       const queryStr = cleanUrl.split('?')[1] || '';
       queryStr.split('&').forEach(pair => {
         const [key, value] = pair.split('=');
         if (key) {
           // 如果值存在,则解码,否则设为空字符串
           params[key] = value ? decodeURIComponent(value) : '';
         }
       });
       return params;
     },
   // 查询当前视频的关联视频(挂了同一商品的)
   async getGoodsSimilarly() {
           if (this.similarlyLoading || this.similarlyNomore) return Promise.resolve();;
           const video = this.videoList[this.currentIndex];
           if (video.goodsList && video.goodsList.length > 0) {
              this.goodsSimilarlyQuery.goodsIds = video.goodsList.map(goods => goods.goodsId);
              this.goodsSimilarlyQuery.currentVideoId = video.id;
              if (this.similarlyVideoList.length < 1) {
                 this.similarlyVideoList.push(video); // 确保原视频是横向视频的第一个元素
              }
              this.similarlyLoading = true;
              return getGoodsSimilarlyVideos(this.goodsSimilarlyQuery).then(res => {
                         this.similarlyVideoList = [
                           ...this.similarlyVideoList,
                           ...res.data.data.filter(
                            (newItem) => !this.similarlyVideoList.some((oldItem) => oldItem.id === newItem.id)
                           ),
                         ];
                         this.similarlyLoading = false;
                         if(res.data.data.length < this.goodsSimilarlyQuery.pageSize) {
                            this.similarlyNomore = true;
                            return;
                         }
                         this.goodsSimilarlyQuery.pageNumber++;
              })
           }
   },
    async chooseCategory(id) {
      if (this.currentCategort === id) return
      this.currentCategort = id
@@ -658,33 +834,74 @@
      })
    },
    // 加载视频数据
    async loadVideos() {
    async loadVideos(param) {
      console.log(this.loading, this.videoNoMore,this.videoQuery)
      if (this.videoQuery.pageNumber == 1) {
      } else if (this.loading || this.videoNoMore) return;
      this.loading = true;
      if(param){
         console.log("二维码扫码数据执行在此处1")
         console.log(this.videoQuery)
         getkitchenVideoList(this.videoQuery).then(res => {
            console.log(res)
           // 新增一个字段用于循环时的key
           const data = res.data.data.map(item => {
              return {
                 ...item,
                 updateKey: item.id
              }
           })
           if (this.videoQuery.pageNumber === 1) {
             this.videoList = data;
           } else {
             this.videoList = [
               ...this.videoList,
               ...data.filter(
                   (newItem) => !this.videoList.some((oldItem) => oldItem.id === newItem.id)
               ),
             ];
           }
           this.loading = false;
           if (data.length < this.videoQuery.pageSize) {
             this.videoNoMore = true;
             return;
           }
           this.videoQuery.pageNumber++;
         })
      }else{
      console.log("二维码扫码数据执行在此处2")
      console.log(this.videoQuery)
      getkitchenVideoList(this.videoQuery).then(res => {
        console.log(res, "视频数据");
        console.log(res)
        // 新增一个字段用于循环时的key
        const data = res.data.data.map(item => {
           return {
              ...item,
              updateKey: item.id
           }
        })
        if (this.videoQuery.pageNumber === 1) {
          this.videoList = res.data.data;
          this.videoList = data;
        } else {
          this.videoList = [
            ...this.videoList,
            ...res.data.data.filter(
            ...data.filter(
                (newItem) => !this.videoList.some((oldItem) => oldItem.id === newItem.id)
            ),
          ];
        }
        this.loading = false;
        if (res.data.data.length < this.videoQuery.pageSize) {
        if (data.length < this.videoQuery.pageSize) {
          this.videoNoMore = true;
          return;
        }
        this.videoQuery.pageNumber++;
      })
     }
    },
    // 滑动切换视频
@@ -713,6 +930,23 @@
      // 播放当前视频
      const videoContext1 = uni.createVideoContext(`video${this.currentIndex}`, this);
      videoContext1.play()
     // 下滑时,需要将上一个视频重置为原始视频(如果横向滑动了相关视频)
     if (this.similaryVideoIndex !== 0) {
        this.videoList[oldIndex] = this.similarlyVideoList[0]
     }
     this.similarlyVideoList = [];
     this.similaryVideoIndex = 0;
     this.similarlyNomore = false;
     this.similarlyLoading = false;
     this.goodsSimilarlyQuery = {
        pageNumber: 1,
        pageSize: 6,
        videoFrom: 'goodsSimilarly',
        goodsIds: [],
        currentVideoId: ''
     }
     // 如果剩余视频不足,触发请求获取更多视频
     if (this.videoList.length - 1 < this.currentIndex + this.videoLiveOffset) {
        this.loadVideos()
@@ -731,7 +965,7 @@
       this.touchXY.endY = e.touches[0].pageY
   },
   // 结束触摸
   handleSwiperEnd(item) {
   async handleSwiperEnd(item) {
      // 防止滑动滚动条也触发跳转
      if (this.showProcess) {
         return
@@ -743,11 +977,37 @@
       if (Math.abs(diffX) > Math.abs(diffY)) {
         if (diffX > 0) {
           console.log('右滑')
         if (item.goodsList && item.goodsList.length > 0) {
            this.jumpToPay(item.id)
         }
          if (this.similaryVideoIndex !== 0) {
             // 如果滑动了横向视频,那么右滑就做视频切换而不是跳转商品页
             // 切换下一个视频
             const oldIndex = this.similaryVideoIndex;
             this.similaryVideoIndex = Math.max(this.similaryVideoIndex - 1, 0);
             if (this.similaryVideoIndex < oldIndex) {
                // 把竖向视频的当前播放位置替换为横向视频的当前索引元素
                const video = this.similarlyVideoList[this.similaryVideoIndex];
                video["updateKey"] = video.id + this.similaryVideoIndex
                this.videoList.splice(this.currentIndex, 1, video);
                // this.videoList[this.currentIndex] = video
             }
          }
          else if (item.goodsList && item.goodsList.length > 0) {
             this.jumpToPay(item.id)
          }
         } else {
           console.log('左滑')
          if (this.similarlyVideoList.length < 1 || this.similarlyVideoList.length - this.similaryVideoIndex - 1 <= 3) {
             // 相关视频为空或者剩余视频不足,触发加载相关视频
             await this.getGoodsSimilarly()
          }
          // 切换下一个视频
          const oldIndex = this.similaryVideoIndex;
          this.similaryVideoIndex = Math.min(this.similaryVideoIndex + 1, this.similarlyVideoList.length - 1);
          if (this.similaryVideoIndex > oldIndex) {
             // 把竖向视频的当前播放位置替换为横向视频的当前索引元素
             const video = this.similarlyVideoList[this.similaryVideoIndex];
             video["updateKey"] = video.id + this.similaryVideoIndex
             this.videoList.splice(this.currentIndex, 1, video);
          }
         }
       }
       // 重置坐标
@@ -954,7 +1214,42 @@
::v-deep .custom-tabbar {
  border-top: none !important;
}
.choosePlatType{
   display: flex;
   align-items: center;
   justify-content: center;
   position: fixed;
   z-index: 9999;
   left: 0;
   right: 0;
}
.platTypeItem{
   width: 80rpx;
   display: flex;
   align-items: center;
   flex-direction: column;
   height: 60rpx;
}
.platTypeItem:nth-child(n+1){
   margin-left: 32rpx;
}
.platTypeItemChoose{
   margin-top: 15rpx;
   width: 40%;
   display: flex;
   align-items: center;
   justify-content: center;
   background-color: #fff;
   height: 4rpx;
   border-radius: 5rpx;
}
.platTypeItenName{
   color: #fff;
   font-weight: bold;
   font-size: 32rpx;
}
.video-container {
  position: relative;
  width: 100%;
@@ -970,7 +1265,7 @@
  background-color: #b6b6b6;
  opacity: 0.8;
  position: fixed;
  z-index: 999;
  z-index: 99999;
  height: 70rpx;
  width: 50rpx;
  border-radius: 0 50% 50% 0;