绿满眶商城微信小程序-uniapp
zxl
2025-07-29 66c550a7021c5685e8b7dde4a92e6efd3625689f
pages/tabbar/index/home.vue
@@ -26,7 +26,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"
@@ -120,13 +120,15 @@
        <!-- 视频信息层 -->
        <view class="video-info" :style="{bottom: marginBottom + 20 + 'px'}">
        <view>
           <text class="video-author" @click="jumpToSearch">@{{item.authorName}}</text>
        <view style="width: 100%; position: relative;">
           <text class="video-author">@{{item.authorName}}</text>
           <text class="iconfont" @click="jumpToSearch" style="position: absolute;right: 45px;">&#xe64e;</text>
        </view>
          <view style="width: 100%;word-wrap: break-word;white-space: normal;overflow-wrap: break-word;">
           <text class="video-title">{{item.title}}</text>
           <text class="video-tag" v-for="(tag, index) in item.tagList" :key="tag.id">#{{tag.tagName}}</text>
        </view>
        </view>
       <!-- 右侧互动按钮 -->
@@ -365,6 +367,9 @@
     // } else {
     //      this.loadVideos();
     // }
     if (this.videoList.length < 1) {
        this.loadVideos();
     }
     // 如果视频按下暂停后切换页面再回到页面时,只算暂停时间(因为暂停时间和离开页面时间是重复的,只算一个)
     if(this.startHidenTime !== 0 && this.currentVideoIsPlaying) {
        const duration = Date.now() - this.startHidenTime
@@ -375,19 +380,43 @@
     this.startHidenTime = Date.now()
  },
  onLoad(option) {
     console.log('-----------分享出的数据---------->',option)
     //处理扫码出来的视频
     this.marginBottom = uni.getSystemInfoSync().safeAreaInsets.bottom
           // 检查是否存在q参数
         let queryParam = this.videoQuery;
           if (option.q) {
             // 双重解码:微信对URL进行了两次编码
             const decodedUrl = decodeURIComponent(decodeURIComponent(option.q));
             console.log('原始URL:', decodedUrl);
             // 解析URL中的查询参数
             const params = this.parseUrlParams(decodedUrl);
             const shareType = params.shareType;
             const videoId = params.videoId;
             queryParam.videoId = videoId
             console.log('解析参数:', { shareType, videoId });
           }
     const token = storage.getAccessToken();
     if (! token) {
        this.wxSilentLogin(() => {
           this.loadVideos();
           // 判断是不是点击分享链接进来的
           if (option.userId && option.videoId) {
              queryParam.videoId = option.videoId
              // 保存分享点击记录
              saveShareClickRecord({refId: option.videoId, shareUserId: option.userId})
           }
           console.log('------------------------>',queryParam)
           this.loadVideos(queryParam);
        })
     } else {
      this.loadVideos();
        if (option.userId && option.videoId) {
           queryParam.videoId = option.videoId
                      // 保存分享点击记录
            saveShareClickRecord({refId: option.videoId, shareUserId: option.userId})
        }
        console.log('------------------------2>',queryParam)
      this.loadVideos(queryParam);
     }
  },
  onShareAppMessage(e) {
@@ -407,10 +436,26 @@
     return {
        title: videoInfo.title,
        path: `/pages/tabbar/index/home?videoId=${videoInfo.id}&userId=${userInfo.id}`,
        imageUrl: videoInfo.coverUrl
     }
  },
  methods: {
  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();;
@@ -748,10 +793,38 @@
     },
    // 加载视频数据
    async loadVideos() {
    async loadVideos(param) {
      if (this.loading || this.videoNoMore) return;
      this.loading = true;
      if(param){
         getRecommendVideos(param).then(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(res.data.data.length < this.videoQuery.pageSize) {
                    this.videoNoMore = true;
                    return;
                 }
                 this.videoQuery.pageNumber++;
         })
      }else{
     getRecommendVideos(this.videoQuery).then(res => {
        // 新增一个字段用于循环时的key
        const data = res.data.data.map(item => {
@@ -779,6 +852,7 @@
        this.videoQuery.pageNumber++;
     })
     }
    },
    // 滑动切换视频
@@ -1116,7 +1190,7 @@
   }
   .video-info {
     width: 70%;
     width: 100%;
     position: absolute;
     bottom: 20px;
     left: 20px;