绿满眶商城微信小程序-uniapp
xiangpei
2025-07-03 f2cb18b54d5b774d046086a4b75acda16e61ce65
横向视频同步至其它视频页面
3个文件已修改
333 ■■■■■ 已修改文件
pages/health/healthVideo.vue 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/kitchen/KitchenVideo.vue 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/video/video-play.vue 109 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/health/healthVideo.vue
@@ -132,9 +132,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>
@@ -256,7 +256,8 @@
 addVideoComment, 
 thubmsUpComment, 
 cancelThubmsUpComment,
 changeThumbsUp
 changeThumbsUp,
 getGoodsSimilarlyVideos
} from "@/api/video.js";
import { changeCollect } from "@/api/collect.js";
import { saveShare, saveShareClickRecord } from "@/api/share.js";
@@ -340,6 +341,17 @@
            pageSize: 10,
            videoFrom: 'recommend'
        },
        goodsSimilarlyQuery: { // 相似视频查询
            pageNumber: 1,
            pageSize: 10,
            videoFrom: 'goodsSimilarly',
            goodsIds: [],
            currentVideoId: ''
        },
        similarlyVideoList: [], // 相似视频
        similarlyNomore: false, // 是否还有更多相似视频
        similaryVideoIndex: 0, // 相似视频的播放位置
        similarlyLoading: false, // 相似视频加载
        marginBottom: 0 // 底部安全区域
    }
  },
@@ -398,6 +410,35 @@
      }
  },
  methods: {
      // 查询当前视频的关联视频(挂了同一商品的)
      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++;
                    })
                }
      },
      topBarChange(titleObj) {
          if (titleObj.index === 'home') {
              uni.switchTab({
@@ -703,19 +744,25 @@
      this.loading = true;
      getHealthRecommendVideos(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 = 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;
          }
@@ -750,6 +797,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()
@@ -768,7 +832,7 @@
        this.touchXY.endY = e.touches[0].pageY
    },
    // 结束触摸
    handleSwiperEnd(item) {
    async handleSwiperEnd(item) {
        // 防止滑动滚动条也触发跳转
        if (this.showProcess) {
            return
@@ -780,11 +844,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);
            }
          }
        }
        // 重置坐标
pages/kitchen/KitchenVideo.vue
@@ -145,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>
@@ -277,7 +277,8 @@
  addVideoComment,
  thubmsUpComment,
  cancelThubmsUpComment,
  changeThumbsUp
  changeThumbsUp,
  getGoodsSimilarlyVideos
} from "@/api/video.js";
import {
  changeCollect
@@ -371,6 +372,17 @@
        videoFrom: 'recommend',
        videoType: 'cook'
      },
      goodsSimilarlyQuery: { // 相似视频查询
          pageNumber: 1,
          pageSize: 10,
          videoFrom: 'goodsSimilarly',
          goodsIds: [],
          currentVideoId: ''
      },
      similarlyVideoList: [], // 相似视频
      similarlyNomore: false, // 是否还有更多相似视频
      similaryVideoIndex: 0, // 相似视频的播放位置
      similarlyLoading: false, // 相似视频加载
      marginBottom: 0 // 底部安全区域
    }
  },
@@ -403,6 +415,35 @@
    this.loadVideos();
  },
  methods: {
    // 查询当前视频的关联视频(挂了同一商品的)
    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
@@ -691,19 +732,25 @@
      this.loading = true;
      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 = 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;
        }
@@ -738,6 +785,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()
@@ -756,7 +820,7 @@
        this.touchXY.endY = e.touches[0].pageY
    },
    // 结束触摸
    handleSwiperEnd(item) {
    async handleSwiperEnd(item) {
        // 防止滑动滚动条也触发跳转
        if (this.showProcess) {
            return
@@ -768,11 +832,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);
            }
          }
        }
        // 重置坐标
pages/video/video-play.vue
@@ -130,9 +130,9 @@
        <!-- 右侧互动按钮 -->
        <view class="action-buttons">
           <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>
@@ -252,6 +252,7 @@
    thubmsUpComment, 
    cancelThubmsUpComment,
    changeThumbsUp,
    getGoodsSimilarlyVideos
} from "@/api/video.js";
import { changeCollect } from "@/api/collect.js";
import { saveShare } from "@/api/share.js";
@@ -334,6 +335,17 @@
            videoFrom: '',
            keyword: ''
        },
        goodsSimilarlyQuery: { // 相似视频查询
            pageNumber: 1,
            pageSize: 10,
            videoFrom: 'goodsSimilarly',
            goodsIds: [],
            currentVideoId: ''
        },
        similarlyVideoList: [], // 相似视频
        similarlyNomore: false, // 是否还有更多相似视频
        similaryVideoIndex: 0, // 相似视频的播放位置
        similarlyLoading: false, // 相似视频加载
        marginBottom: 0, // 底部安全区域
        windowHeight: 0 // 可使用屏幕高度
    }
@@ -411,6 +423,35 @@
      }
  },
  methods: {
      // 查询当前视频的关联视频(挂了同一商品的)
      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++;
                    })
                }
      },
      // 点击商品跳转
      jumpToPay(videoId) {
              uni.navigateTo({
@@ -680,18 +721,25 @@
      this.loading = true;
      
      getRecommendVideos(this.videoQuery).then(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;
          }
@@ -725,6 +773,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()
@@ -742,7 +807,7 @@
        this.touchXY.endY = e.touches[0].pageY
    },
    // 结束触摸
    handleSwiperEnd(item) {
    async handleSwiperEnd(item) {
        // 防止滑动滚动条也触发跳转
        if (this.showProcess) {
            return
@@ -755,11 +820,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);
            }
          }
        }
        // 重置坐标