绿满眶商城微信小程序-uniapp
xiangpei
2025-07-03 dcb2bf9882dd4c6b1108d7bfccef431d0c555d2c
横向视频
4个文件已修改
158 ■■■■ 已修改文件
api/video.js 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/tabbar/index/home.vue 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/video/home-page.vue 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/video/video-edit.vue 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
api/video.js
@@ -36,6 +36,20 @@
}
/**
 * 根据商品获取相关视频
 *
 * @param params
 */
 export async function getGoodsSimilarlyVideos(params) {
  return http.request({
    url: "/lmk/video/goods/similarly",
    method: Method.POST,
    needToken: true,
    data: params
  });
}
/**
 * 获取大健康推荐视频
 * 
 * @param params
pages/tabbar/index/home.vue
@@ -14,7 +14,7 @@
    >
      <swiper-item
        v-for="(item, index) in videoList"
        :key="item.id"
        :key="item.updateKey"
        @touchstart="handleSwiperStart"
        @touchmove="handleSwiperMove"
        @touchend="handleSwiperEnd(item)"
@@ -132,9 +132,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" @click="subscribeAuth(index, item.authorId)" @touchend.stop>
                 <text class="iconfont">&#xe629;</text>
               </view>
           </view>
@@ -256,6 +256,7 @@
    thubmsUpComment, 
    cancelThubmsUpComment,
    changeThumbsUp,
    getGoodsSimilarlyVideos
} from "@/api/video.js";
import { changeCollect } from "@/api/collect.js";
import { saveShare, saveShareClickRecord } from "@/api/share.js";
@@ -341,6 +342,17 @@
            pageSize: 10,
            videoFrom: 'recommend'
        },
        goodsSimilarlyQuery: { // 相似视频查询
            pageNumber: 1,
            pageSize: 10,
            videoFrom: 'goodsSimilarly',
            goodsIds: [],
            currentVideoId: ''
        },
        similarlyVideoList: [], // 相似视频
        similarlyNomore: false, // 是否还有更多相似视频
        similaryVideoIndex: 0, // 相似视频的播放位置
        similarlyLoading: false, // 相似视频加载
        marginBottom: 0 // 底部安全区域
    }
  },
@@ -399,6 +411,36 @@
      }
  },
  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++;
              })
          }
      },
      // 跳转到搜索页
      jumpToSearch() {
          uni.navigateTo({
              url: '/pages/video/video-search'
@@ -467,6 +509,7 @@
      },
        // 跳转个人主页
        jumpToHomePage(authorId) {
            console.log("作者id", authorId);
            uni.navigateTo({
                url: "/pages/video/home-page?authorId=" + authorId
            })
@@ -710,16 +753,23 @@
      this.loading = true;
      getRecommendVideos(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) {
@@ -757,10 +807,28 @@
        // 播放当前视频
        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()
        }
    },
    // 开始触摸
@@ -775,7 +843,7 @@
        this.touchXY.endY = e.touches[0].pageY
    },
    // 结束触摸
    handleSwiperEnd(item) {
    async handleSwiperEnd(item) {
        // 防止滑动滚动条也触发跳转
        if (this.showProcess) {
            return
@@ -787,11 +855,37 @@
        if (Math.abs(diffX) > Math.abs(diffY)) {
          if (diffX > 0) {
            console.log('右滑')
            if (item.goodsList && item.goodsList.length > 0) {
            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/home-page.vue
@@ -222,22 +222,25 @@
    }
  },
  onShow() {
     this.getAuthorInfo();
     if (this.currentTab === 'works') {
        this.videoQuery.pageNumber = 1
        this.nomoreVideo = false
        this.getAuthorVideoPage();
     } else if (this.currentTab === 'collect') {
         this.collectVideoQuery.pageNumber = 1
         this.nomoreCollectVideo = false
         this.getAuthorCollectVideoPage()
     } else if (this.currentTab === 'likes') {
         this.likeVideoQuery.pageNumber = 1
         this.nomoreLikeVideo = false
         this.getAuthorLikeVideoPage()
     if (this.authorId) {
         this.getAuthorInfo();
         if (this.currentTab === 'works') {
                 this.videoQuery.pageNumber = 1
                 this.nomoreVideo = false
                 this.getAuthorVideoPage();
         } else if (this.currentTab === 'collect') {
                  this.collectVideoQuery.pageNumber = 1
                  this.nomoreCollectVideo = false
                  this.getAuthorCollectVideoPage()
         } else if (this.currentTab === 'likes') {
                  this.likeVideoQuery.pageNumber = 1
                  this.nomoreLikeVideo = false
                  this.getAuthorLikeVideoPage()
         }
     }
  },
  onLoad(option) {
      console.log("收到参数", option);
    this.authorId = option.authorId;
    this.getAuthorInfo();
    this.getAuthorVideoPage();
pages/video/video-edit.vue
@@ -666,7 +666,10 @@
          this.loading = true;
          this.formData.fileInfo = this.videoInfo;
          this.formData["goodsList"] = this.selectedGoodsList.map(item => {return {goodsId: item.goodsId, goodsSkuId: item.id, goodsNum: item.goodsNum}});
          updateVideo(this.formData).then(res => {
          if (this.formData.videoContentType === 'img') {
              this.formData.videoImgs = JSON.parse(this.formData.videoImgs)
          }
          updateVideo(this.formData).then(res => {
              uni.showToast({
                title: '视频已提交审核~',
                icon: 'success'