tremble 3 лет назад
Родитель
Сommit
20eb9fc23f

+ 4 - 1
.env.bendi

@@ -1,14 +1,17 @@
 
 # 场景资源地址
-VUE_APP_RESOURCE_URL=https://4dkk.4dage.com/
+VUE_APP_RESOURCE_URL=https://testeurs3.4dkankan.com/
+
 # 静态资源地址
 VUE_APP_CDN_URL=https://4dkk.4dage.com/v4/www/
 # sdk文件地址
 VUE_APP_SDK_DIR=https://eurs3.4dkankan.com/v4/cdfg/sdk-new
 
+
 # socket地址
 VUE_APP_SOCKET_URL=https://vr-admin.cdfmembers.com/
 
+
 # 热点地址
 VUE_APP_HOT_URL=https://glp-vr.cdfmembers.com/
 

+ 1 - 2
.env.prod

@@ -22,5 +22,4 @@ VUE_APP_STATIC_DIR=viewer
 VUE_APP_REGION_URL=aws
 
 # 接口请求地址
-VUE_APP_APIS_URL=https://vr.cdfmembers.com/
-
+VUE_APP_APIS_URL=https://zhongmian.4dage.com/

+ 1 - 1
package.json

@@ -5,7 +5,7 @@
   "scripts": {
     "serve": "vue-cli-service serve",
     "serve-prod": "vue-cli-service serve --mode prod",
-    "serve-bendi": "vue-cli-service serve --mode bendi",
+    "serve-HK": "vue-cli-service serve --mode bendi",
     "build": "vue-cli-service build --mode prod",
     "lint": "vue-cli-service lint"
   },

+ 3 - 3
public/index.html

@@ -8,11 +8,11 @@
     <link rel="stylesheet" href="//at.alicdn.com/t/font_2596172_ejg30arrayu.css" />
     <link rel="stylesheet" href="//at.alicdn.com/t/font_3423899_m7c62apktz.css" />
     <link rel="stylesheet" href="<%= BASE_URL %><%= VUE_APP_STATIC_DIR %>/static/lib/animate/animate.min.css" />
-    <link rel="stylesheet" href="<%= BASE_URL %><%= VUE_APP_STATIC_DIR %>/static/lib/swiper/swiper-bundle.min.css" />
+    <link rel="stylesheet" href="<%= BASE_URL %><%= VUE_APP_STATIC_DIR %>/static/lib/swiper/swiper.min.css" />
 
     <script src="<%= BASE_URL %><%= VUE_APP_STATIC_DIR %>/static/lib/mobile-detect.js"></script>
     <script src="<%= BASE_URL %><%= VUE_APP_STATIC_DIR %>/static/lib/flexible.min.js"></script>
-    <title>cdf澳門上葡京店</title>
+    <title>Duty Zero by cdf</title>
   </head>
 
   <body>
@@ -22,7 +22,7 @@
     <div id="app"></div>
     <script src="<%= BASE_URL %><%= VUE_APP_STATIC_DIR %>/static/lib/flv.min.js"></script>
     <script src="<%= BASE_URL %><%= VUE_APP_STATIC_DIR %>/static/lib/vconsole.js"></script>
-    <script src="<%= BASE_URL %><%= VUE_APP_STATIC_DIR %>/static/lib/swiper/swiper-bundle.min.js"></script>
+    <script src="<%= BASE_URL %><%= VUE_APP_STATIC_DIR %>/static/lib/swiper/swiper.min.js"></script>
     <script src="<%= BASE_URL %><%= VUE_APP_STATIC_DIR %>/static/lib/socket.io.min.js"></script>
     <script src="<%= BASE_URL %><%= VUE_APP_STATIC_DIR %>/static/lib/zmjm.min.js"></script>
 

Разница между файлами не показана из-за своего большого размера
+ 5 - 5
public/viewer/static/lib/swiper/swiper.min.css


Разница между файлами не показана из-за своего большого размера
+ 6 - 6
public/viewer/static/lib/swiper/swiper.min.js


+ 13 - 8
src/app.vue

@@ -183,8 +183,8 @@ watch(
           } else {
             $minmap.classList.remove('gudieDisabled');
             // wxShare({
-            //   title: `cdf澳門上葡京店~`,
-            //   desc: "cdf澳門上葡京店~",
+            //   title: `Duty Zero by cdf~`,
+            //   desc: "Duty Zero by cdf~",
             //   link: window.location.href.split("#")[0],
             //   imgUrl: "https://glp-vr.cdfmembers.com/cdf/file/91dd5305525f463286f03a31abd1c154.jpg",
             // });
@@ -355,14 +355,18 @@ onMounted(async () => {
                       </div>
                   `;
         } else if (data.type == 'commodity') {
-      
+          let arr = data.products.map((item) => item.price);
+          let priceMin = isFinite(Math.min.apply(null, arr)) ? Math.min.apply(null, arr) : 0;
+          let priceMax = isFinite(Math.max.apply(null, arr)) ? Math.max.apply(null, arr) : 0;
+          let price = priceMin == priceMax ? priceMax : `${priceMin}-${priceMax}`;
+          let range = price==0?'':`${data.products[0] ? data.products[0].symbol : 'MOP$'} ${price} |`;
           return `<span class="tag-icon animate" style="background-image:url({{icon}})"></span>
                       <div class="tag-body">
                         <div data-id="${data.sid}" class="tag-commodity">
                           <div  style="background-image:url(${data.products[0] ? data.products[0].pic : ''})" class='tag-avatar'>
                           </div>
                           <p class="tag-title">${data.title}</p>
-                          <p class="tag-info">${t('common.view')} ></p>
+                          <p class="tag-info"> ${range} ${t('common.view')} ></p>
                         </div>
                       </div>
                   `;
@@ -382,6 +386,7 @@ onMounted(async () => {
                 return;
               }
               document.querySelector(`[data-tag-id="${tag.sid}"] .tag-icon`).style.display = 'none';
+              document.querySelector(`[data-tag-id="${tag.sid}"]`).style.pointerEvents = 'none';
               let hotcontent = typeof tag.hotContent == 'string' ? JSON.parse(tag.hotContent) : tag.hotContent;
               browser.openLink(hotcontent.couponLink)
 
@@ -460,16 +465,16 @@ onMounted(async () => {
   app.Scene.on('error', (data) => {
     switch (data.code) {
       case 5033:
-        Dialog.alert(t('common.calculation'));
+        Dialog.alert(t('errorcode.5033'));
         break;
       case 5034:
-        Dialog.alert(t('common.title'));
+        Dialog.alert(t('errorcode.5034'));
         break;
       case 5009:
-        Dialog.alert(t('common.title'));
+        Dialog.alert(t('errorcode.5009'));
         break;
       case 5005:
-        Dialog.alert(t('common.title'));
+        Dialog.alert(t('errorcode.5005'));
         break;
     }
   });

BIN
src/assets/images/icon/logo.png


BIN
src/assets/images/icon/top5.png


+ 17 - 13
src/components/Controls/Panel/Main.vue

@@ -4,7 +4,7 @@
       <div @click="toggleOpen" class="menu color">
         <div class="logo">
           <img :src="require('@/assets/images/icon/logo.png')" alt="" />
-          <p v-if="player.lang != 'en'">{{$t('common.title') }}</p>
+          <p>{{$t('common.title') }}</p>
         </div>
         <div class="vline"></div>
         <ul :class="player.lang" @touchmove.stop>
@@ -31,7 +31,7 @@
             <div>{{ $t('common.mode') }}</div>
           </li>
 
-          <li>
+          <!-- <li>
             <ui-icon
               type="shopping"
               @click.stop="
@@ -43,7 +43,7 @@
               "
             ></ui-icon>
             <div>{{ $t('common.shopping') }}</div>
-          </li>
+          </li> -->
         </ul>
       </div>
 
@@ -199,11 +199,11 @@ const menulist = computed(() => {
       id: 'help',
       name: t('common.help'),
     },
-    {
-      icon: 'customer_service',
-      id: 'kefu',
-      name: t('common.kefu'),
-    },
+    // {
+    //   icon: 'customer_service',
+    //   id: 'kefu',
+    //   name: t('common.kefu'),
+    // },
   ];
 
   if (!browser.isMobile()) {
@@ -230,11 +230,15 @@ const brandScroll = () => {
         grid: {
           rows: 2,
         },
+        observer:true,
         on: {
           touchMove(swiper, e) {
             e.stopPropagation();
             e.preventDefault();
           },
+          observerUpdate(swiper, e) {
+            swiper.slideTo(0)
+          }, 
         },
       });
 
@@ -246,7 +250,7 @@ const brandScroll = () => {
           touchMove(swiper, e) {
             e.stopPropagation();
             e.preventDefault();
-          },
+          }
         },
       });
     }, 100);
@@ -347,9 +351,9 @@ onMounted(() => {
   padding: 0 12px;
   text-align: center;
   .logo {
-    width: 90px;
+    width: 120px;
     transform: translateY(-24%);
-    min-width: 90px;
+    min-width: 120px;
     flex-shrink: 0;
     > img {
       width: 100%;
@@ -384,8 +388,8 @@ onMounted(() => {
   }
 
   .en{
-    justify-content: flex-start;
-    width: calc(100% - 100px);
+    // justify-content: flex-start;
+    // width: calc(100% - 160px);
   }
 }
 

+ 824 - 0
src/components/Information/View.Mobile copy.vue

@@ -0,0 +1,824 @@
+<template>
+  <div class="header" @touchmove.prevent>
+    <div class="left" :class="{ show: showMusic }">
+      <div class="music" @click.stop="onMenuClick('music')">
+        <img :src="require(`@/assets/images/icon/${showMusicPlaying ? 'music_on@2x' : 'music_off@2x'}.png`)" alt="" />
+      </div>
+
+      <!-- <div v-show="mode != 'panorama' && !isApp && player.showWidgets" class="back-pano" @click="onChangeMode">
+              <ui-icon type="show_back"></ui-icon>
+          </div>
+          <div v-show="mode == 'panorama'" class="back" @click="onBack">
+              <ui-icon type="_back"></ui-icon>
+          </div> -->
+    </div>
+    <div class="title" :class="{ up: player.showDescription, drak: mode != 'panorama', empty: !description }"
+      @click="onShowDescription" v-show="player.showWidgets">
+      <div>
+        <span>
+          {{ metadata.title }}
+          <i class="iconfont icon-pull-down"></i>
+        </span>
+      </div>
+    </div>
+    <div class="right" v-show="player.showWidgets" @click="onShowMore">
+      <i class="iconfont icon-show_more_share"></i>
+    </div>
+    <transition appear name="custom-classes-transition" enter-active-class="animated fadeInUp short faster"
+      leave-active-class="animated fadeOutDown short faster">
+      <div class="content" :class="{ drak: mode != 'panorama' }" v-if="player.showDescription"
+        @click="onShowDescription">
+        <div>
+          <div v-html="description"></div>
+        </div>
+      </div>
+    </transition>
+    <template v-if="isApp">
+      <transition appear name="custom-classes-transition" enter-active-class="animated slideInUp faster"
+        leave-active-class="animated slideOutDown faster">
+        <div class="app-share" v-if="showShare">
+          <ul :class="{ flex: player.lang == 'zh' }">
+            <li @click="onShare('weixin')">
+              <i class="iconfont icon_wechat"></i>
+              <div>微信</div>
+            </li>
+            <li @click="onShare('weixinFriend')">
+              <i class="iconfont icon_friend"></i>
+              <div>朋友圈</div>
+            </li>
+            <li @click="onShare('qq')">
+              <i class="iconfont icon_qq"></i>
+              <div>QQ</div>
+            </li>
+            <li v-if="player.lang != 'zh'" @click="onShare('faceBook')">
+              <i class="iconfont iconicon_share_facebook"></i>
+              <div>Facebook</div>
+            </li>
+            <li v-if="player.lang != 'zh'" @click="onShare('whatsApp')">
+              <i class="iconfont iconicon_share_whatsapp"></i>
+              <div>WhatsApp</div>
+            </li>
+            <li @click="onShare('copy')">
+              <i class="iconfont iconlink"></i>
+              <div>複製鏈接</div>
+            </li>
+          </ul>
+          <div @click="showShare = false">取消</div>
+        </div>
+      </transition>
+    </template>
+    <div class="url-share" v-show="showCopy">
+      <div>
+        <div class="tips">
+          <h4>分享鏈接給好友</h4>
+          <i class="iconfont iconshow_cancel" @click="showCopy = false"></i>
+        </div>
+        <div class="url">{{ copyLink }}</div>
+        <div class="btns">
+          <ui-button class="cancel" @click="showCopy = false">取消</ui-button>
+          <ui-button class="primary" :data-clipboard-text="copyLink" ref="copy$">一鍵複製</ui-button>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script setup>
+import ClipboardJS from 'clipboard'
+import browser from '@/utils/browser'
+import { useStore } from 'vuex'
+import { Dialog } from '@/global_components/'
+import { IsApp, MessageToApp, NotchHeight } from '@/utils/platform'
+import { useMusicPlayer } from '@/utils/sound'
+import { onMounted, watch, computed, ref, nextTick } from 'vue'
+import { useApp, getApp } from '@/app'
+
+let share_url = browser.getURLParam('share_url')
+if (share_url) {
+  share_url = decodeURIComponent(share_url)
+} else {
+  share_url = `${location.origin}${location.pathname}?m=${browser.getURLParam('m')}&pose=${browser.getURLParam('pose')}`
+}
+const musicPlayer = useMusicPlayer()
+const store = useStore()
+const metadata = computed(() => store.getters['scene/metadata'])
+const controls = computed(() => {
+  return metadata.value.controls
+})
+const showMusicPlaying = ref(false)
+const showMusic = computed(() => store.getters['scene/metadata'].music)
+const player = computed(() => store.getters['player'])
+
+const copy$ = ref(null)
+const copyLink = ref(share_url)
+const isApp = ref(IsApp)
+const showCopy = ref(false)
+const showShare = ref(false)
+const isMusicPlaying = ref(false)
+
+const mode = computed(() => store.getters['mode'])
+const description = computed(() => metadata.value.description)
+watch(
+  () => showCopy.value,
+  (val, old) => {
+    store.commit('SetPlayerOptions', {
+      showMap: !showCopy.value,
+      showToolbar: !showCopy.value,
+    })
+  },
+  {
+    deep: true,
+  }
+)
+watch(
+  () => showShare.value,
+  (val, old) => {
+    store.commit('SetPlayerOptions', {
+      showMap: !showShare.value,
+      showToolbar: !showShare.value,
+    })
+  },
+  {
+    deep: true,
+  }
+)
+
+onMounted(() => {
+  new ClipboardJS(copy$.value.$el).on('success', function (e) {
+    e.clearSelection()
+    showCopy.value = false
+    Dialog.toast({ content: '場景鏈接複製成功', type: 'success' })
+  })
+
+  nextTick(() => {
+    document.querySelector('.player').addEventListener('touchstart', () => {
+      if (player.value.showMore) {
+        store.commit('SetPlayerOptions', {
+          showMore: false,
+          showMap: true,
+          showToolbar: true,
+        })
+      } else if (player.value.showDescription) {
+        store.commit('SetPlayerOptions', {
+          showDescription: false,
+          showMap: true,
+          showToolbar: true,
+        })
+      }
+    })
+
+    window.Back = () => {
+      onBack()
+    }
+    musicPlayer.on('play', () => (showMusicPlaying.value = true))
+    musicPlayer.on('pause', () => (showMusicPlaying.value = false))
+  })
+})
+const onBack = () => {
+  player.value.showVR && store.commit('showVR')
+}
+const onShowMore = () => {
+  showCopy.value = true
+  // let show = !player.value.showMore
+  // store.commit('SetPlayerOptions', {
+  //     showMore: show,
+  //     showMap: show == false,
+  //     showToolbar: show == false,
+  //     showDescription: false,
+  // })
+}
+const onShowDescription = () => {
+  let show = !player.value.showDescription
+  store.commit('SetPlayerOptions', {
+    showMore: false,
+    showMap: show == false,
+    showToolbar: show == false,
+    showDescription: show,
+  })
+}
+const onMusicClick = () => {
+  showMusicPlaying.value ? musicPlayer.pause() : musicPlayer.play()
+}
+const onMenuClick = name => {
+  // store.commit('SetPlayerOptions', {
+  //     showMore: false,
+  //     showDescription: false,
+  //     showMap: true,
+  //     showToolbar: true,
+  // })
+
+  nextTick(() => {
+    if (name == 'music') {
+      onMusicClick()
+      // if (isMusicPlaying.value) {
+      //     musicPlayer.pause()
+      // } else {
+      //     musicPlayer.play()
+      // }
+    }
+
+    // else if (name == 'share') {
+    //     if (isApp.value) {
+    //         showShare.value = true
+    //     } else {
+    //         showCopy.value = true
+    //     }
+    // } else if (name === 'measure') {
+    //     this.$bus.emit('measure/Handle', 'start')
+    // } else if (name == 'vr') {
+    //     store.commit('showVR')
+    // }
+  })
+}
+const onShare = name => {
+  if (name == 'copy') {
+    showShare.value = false
+    this.$nextTick(() => {
+      showCopy.value = true
+    })
+  } else {
+    MessageToApp(`Share-${name}`)
+    showCopy.value = false
+    showShare.value = false
+  }
+}
+const onChangeMode = () => {
+  store.commit('setMode', 'panorama')
+}
+</script>
+
+<style lang="scss" scoped>
+.disable {
+  opacity: 1;
+}
+
+.header {
+  position: absolute;
+  top: 0.3rem;
+  left: 0;
+  height: 40px;
+  width: 100%;
+  z-index: 101;
+  color: #fff;
+  display: flex;
+  align-items: center;
+  text-shadow: 0px 0px 4px rgba(0, 0, 0, 0.4);
+
+  &.app {
+    top: 1rem;
+  }
+
+  .left {
+    width: 1.28rem;
+    height: 100%;
+    display: flex;
+    align-items: center;
+    justify-content: flex-end;
+    pointer-events: none;
+
+    &.show {
+      visibility: visible;
+      pointer-events: auto;
+
+      .music {
+        visibility: visible;
+      }
+    }
+
+    .music {
+      width: 0.50rem;
+      height: 0.50rem;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      visibility: hidden;
+      position: relative;
+
+      >img {
+        width: 100%;
+        height: auto;
+        position: static;
+      }
+    }
+
+  }
+
+  .right {
+    position: relative;
+    width: 1.28rem;
+    height: 100%;
+    padding-right: 30px;
+    display: flex;
+    align-items: center;
+    justify-content: flex-end;
+    z-index: 11;
+
+    >i {
+      font-size: 0.45rem;
+      color: rgba(255, 255, 255, 0.88);
+    }
+
+    >div {
+      position: absolute;
+      display: flex;
+      flex-direction: column;
+      right: 10px;
+      top: 1.3rem;
+      padding: 4px 0.42105rem;
+      background-color: rgba(0, 0, 0, 0.5);
+      border-radius: 5px;
+
+      &::after {
+        content: '';
+        position: absolute;
+        top: -5px;
+        right: 0.3rem;
+        width: 0;
+        height: 0;
+        border-width: 0 5px 5px;
+        border-style: solid;
+        border-color: transparent transparent rgba(0, 0, 0, 0.5);
+      }
+
+      &.flex {
+        li {
+          span {
+            flex: 1;
+            width: auto;
+            // min-width: 2.8rem;
+          }
+        }
+      }
+
+      li {
+        position: relative;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        // margin-top: 0.3rem;
+        font-size: 0;
+        // height: .5333rem;
+        padding: 0.1333rem 0 0.2667rem;
+
+        i {
+          // position: absolute;
+          // left: 0;
+          // top: 0;
+          // font-size: 0.45rem;
+          font-size: 0.3733rem;
+          margin-right: 0.4rem;
+        }
+
+        b {
+          position: absolute;
+          left: 0.32rem;
+          top: 0.33rem;
+          width: 7px;
+          height: 7px;
+          border-radius: 50%;
+          background-color: #00c2c4;
+
+          i {
+            color: #fff;
+            font-size: 12px;
+            transform: scale(0.3, 0.3);
+            top: -4px;
+            left: -3px;
+            position: absolute;
+          }
+        }
+
+        span {
+          width: 1.89474rem;
+          white-space: nowrap;
+          text-align: left;
+          // padding-bottom: 0.3rem;
+          // margin-left: 0.75rem;
+          font-size: 0.3733rem;
+          // text-indent: 0.2rem;
+          // padding-right: 0.2rem;
+        }
+      }
+
+      .home {
+        border-top: solid 1px rgba(255, 255, 255, 0.4);
+
+        a {
+          width: 1.89474rem;
+          margin-top: 0.3rem;
+          margin-bottom: 0.1rem;
+          margin-left: auto;
+          margin-right: auto;
+          display: block;
+          text-decoration: none;
+          overflow: hidden;
+
+          img {
+            width: 100%;
+            outline: none;
+            border: none;
+          }
+        }
+      }
+    }
+  }
+
+  .title {
+    display: flex;
+    flex: 1;
+    width: 100%;
+    height: 100%;
+    font-size: 14px;
+    letter-spacing: 1px;
+    align-items: center;
+    justify-content: center;
+
+    >div {
+      display: flex;
+      transition: background 0.3s ease, min-width 0.3s ease, border-radius 0.3s ease;
+      align-items: center;
+      justify-content: center;
+      padding-right: 12px;
+      padding-left: 12px;
+      white-space: nowrap;
+      position: absolute;
+      height: 100%;
+      min-width: 100%;
+      overflow: visible;
+      pointer-events: none;
+      background: linear-gradient(90deg, transparent, rgba(0, 0, 0, .2) 29%, rgba(0, 0, 0, .2) 69%, transparent);
+    }
+
+    span {
+      display: inline-block;
+      position: relative;
+      white-space: nowrap;
+      overflow: hidden;
+      text-overflow: ellipsis;
+      max-width: 7rem;
+      display: inline-block;
+      padding-right: 20px;
+
+      i {
+        position: absolute;
+        right: 0;
+        color: #fff;
+        font-size: 10px;
+        top: 50%;
+        -webkit-transform: translateY(-50%);
+        transform: translateY(-50%);
+        vertical-align: bottom;
+        line-height: normal;
+      }
+    }
+
+
+    &.up {
+      i {
+        transform: translateY(-50%) rotate(180deg);
+      }
+
+      >div {
+        min-width: 0;
+        //position: static;
+        flex-shrink: 0;
+        background-color: rgba(0, 0, 0, 0.5);
+        border-radius: 1.15789rem;
+      }
+
+      &.drak {
+        >div {
+          background-color: rgba(0, 0, 0, 0.8);
+        }
+      }
+    }
+
+    &.empty {
+      i {
+        display: none;
+      }
+    }
+  }
+
+  .content {
+    position: absolute;
+    top: 1.2rem;
+    left: 0.92105rem;
+    right: 0.92105rem;
+    padding: 10px;
+    background: rgba(0, 0, 0, 0.5);
+    border-radius: 5px;
+    font-size: 0.36842rem;
+    text-align: center;
+
+    &.drak {
+      background: rgba(0, 0, 0, 0.8);
+    }
+
+    >div {
+      display: inline-block;
+      text-align: left;
+      letter-spacing: 1px;
+      word-break: break-all;
+      white-space: normal;
+      line-height: 1.5;
+      // h4 {
+      //     margin: 0;
+      //     padding: 0;
+      //     margin-bottom: 0.28rem;
+      //     font-size: 0.43rem;
+      //     padding-left: 0.18789rem;
+      //     width: 100%;
+      //     position: relative;
+      //     &::before {
+      //         content: "";
+      //         position: absolute;
+      //         left: 0;
+      //         top: 50%;
+      //         height: 80%;
+      //         transform: translateY(-50%);
+      //         width: 2px;
+      //         background-color: var(--editor-main-color);
+      //     }
+      // }
+
+      :deep(p) {
+        word-break: break-word;
+      }
+
+      :deep(a) {
+        color: var(--editor-main-color);
+      }
+    }
+
+    // &::after {
+    //     content: "";
+    //     position: absolute;
+    //     top: -6px;
+    //     left: 50%;
+    //     margin-left: -3px;
+    //     width: 0;
+    //     height: 0;
+    //     border-width: 0 7px 6px;
+    //     border-style: solid;
+    //     border-color: transparent transparent rgba(0, 0, 0, 0.5);
+    // }
+  }
+
+  .url-share {
+    position: fixed;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    background-color: rgba(0, 0, 0, 0.1);
+
+    >div {
+      position: absolute;
+      left: 0.6rem;
+      right: 0.6rem;
+      top: 50vh;
+      transform: translateY(-50%);
+      border-radius: 4px;
+      background-color: rgba(0, 0, 0, 0.5);
+      padding: 0.31579rem;
+      font-size: 0.36842rem;
+
+      .tips {
+        display: flex;
+        align-items: center;
+        justify-content: space-between;
+
+        h4 {
+          margin: 0;
+          font-size: 0.42105rem;
+        }
+
+        i {
+          font-size: 0.6rem;
+        }
+      }
+
+      .url {
+        display: -webkit-box;
+        color: #fff;
+        text-align: center;
+        padding: 0.26316rem;
+        width: 100%;
+        height: 1.8rem;
+        margin: 0.7rem 0rem;
+        border-radius: 0.07rem;
+        line-height: 1.99;
+        font-size: 0.36842rem;
+        background-color: rgba(0, 0, 0, 0.35);
+        overflow: hidden;
+        text-overflow: ellipsis;
+        word-break: break-all;
+        word-wrap: break-word;
+        -webkit-line-clamp: 2; //在第幾行加省略號
+        -webkit-box-orient: vertical;
+      }
+
+      .btns {
+        display: flex;
+        justify-content: space-between;
+
+        button {
+          font-size: 0.36842rem;
+          width: 47%;
+          height: 1.05263rem;
+          border-radius: 1.05263rem;
+
+          &.submit {
+            background: #00c2c4;
+          }
+        }
+      }
+    }
+  }
+
+  .app-share {
+    position: fixed;
+    left: 0;
+    bottom: 0;
+    width: 100%;
+    background-color: #fff;
+    color: var(--editor-main-color);
+    text-shadow: none;
+    border-radius: 0.146667rem 0.146667rem 0px 0px;
+
+    i {
+      // font-size: 2rem;
+      font-size: 1rem;
+      margin: 0.666667rem 0 0.106667rem;
+      display: inline-block;
+    }
+
+    ul {
+      // display: flex;
+      // justify-content: space-around;
+      overflow: hidden;
+
+      div {
+        text-align: center;
+        // margin-top: -0.3rem;
+        font-size: 0.34rem;
+      }
+
+      li {
+        width: 33.3%;
+        float: left;
+        // padding-bottom: 0.5rem;
+        overflow: hidden;
+        text-align: center;
+        // i{
+        //   font-size: 2rem;
+        // }
+      }
+
+      &.flex {
+        display: flex;
+
+        li {
+          float: none;
+        }
+      }
+    }
+
+    >div {
+      height: 1.293333rem;
+      font-size: 16px;
+      text-align: center;
+      // padding: 0.5rem;
+      border-top: solid 1px #eeeeee;
+      margin-top: 0.466667rem;
+      line-height: 1.293333rem;
+    }
+  }
+}
+
+@media (orientation: landscape) {
+  .header {
+    top: 0.2rem;
+    height: 0.7rem;
+
+    &.app {
+      top: 0.2rem;
+    }
+
+    .left {
+      .back-pano {
+        i {
+          font-size: 0.5rem;
+        }
+      }
+    }
+
+    .right {
+      >i {
+        font-size: 0.5rem;
+      }
+
+      >div {
+        right: 10px;
+        top: 0.75rem;
+        padding: 4px 0.2rem;
+
+        &::after {
+          right: 0.23rem;
+        }
+
+        li {
+          margin-top: 0.15rem;
+
+          i {
+            font-size: 0.3rem;
+          }
+
+          b {
+            left: 0.2rem;
+            top: 0.15rem;
+          }
+
+          span {
+            padding-bottom: 0.15rem;
+            margin-left: 0.5rem;
+            font-size: 0.25rem;
+          }
+        }
+
+        .home {
+          a {
+            margin-top: 0.15rem;
+            margin-bottom: 0rem;
+            width: 1.4rem;
+          }
+        }
+      }
+    }
+
+    .title {
+      font-size: 0.3rem;
+    }
+
+    .content {
+      top: 1rem;
+      left: 2rem;
+      right: 2rem;
+      padding: 10px;
+
+      >div {
+        max-height: 3rem;
+        font-size: 0.25rem;
+        line-height: 1.5;
+      }
+    }
+  }
+}
+
+// ipad 橫屏
+@media only screen and (min-device-width: 768px) and (orientation: landscape) {
+  .header {
+    height: 0.8rem;
+
+    .title {
+      i {
+        margin-bottom: 0;
+      }
+    }
+  }
+}
+
+// @media only screen and (min-device-width: 768px) and (orientation: portrait) {
+
+// }
+</style>
+<style lang="scss">
+.animated.short {
+  &.faster {
+    animation-duration: 0.3s;
+  }
+
+  @keyframes fadeInUp {
+    0% {
+      opacity: 0;
+      transform: translate3d(0, 1rem, 0);
+    }
+
+    to {
+      opacity: 1;
+      transform: translateZ(0);
+    }
+  }
+
+  @keyframes fadeOutDown {
+    0% {
+      opacity: 1;
+    }
+
+    to {
+      opacity: 0;
+      transform: translate3d(0, 1rem, 0);
+    }
+  }
+}
+</style>

+ 103 - 69
src/components/Information/View.Mobile.vue

@@ -1,19 +1,12 @@
 <template>
   <div class="header" @touchmove.prevent>
-    <div class="left" :class="{ show: player.showVR }">
-      <div v-show="mode != 'panorama' && !isApp" :class="{ disabled: flying }" class="back-pano" @click="onChangeMode">
-        <ui-icon type="show_back"></ui-icon>
-      </div>
-      <div v-show="mode == 'panorama'" class="back" @click="onBack">
-        <ui-icon type="_back"></ui-icon>
+    <div class="left" v-show="player.showWidgets" :class="{ show: showMusic }">
+      <div class="music" @click.stop="onMusicClick">
+        <img :src="require(`@/assets/images/icon/${showMusicPlaying ? 'music_on@2x' : 'music_off@2x'}.png`)" alt="" />
       </div>
     </div>
-    <div
-      class="title"
-      :class="{ up: player.showDescription, drak: mode != 'panorama', empty: !description }"
-      @click="onShowDescription"
-      v-show="player.showWidgets"
-    >
+    <div class="title" :class="{ up: player.showDescription, drak: mode != 'panorama', empty: !description }"
+      @click="onShowDescription" v-show="player.showWidgets">
       <div>
         <span>
           {{ metadata.title }}
@@ -22,14 +15,10 @@
       </div>
     </div>
     <div class="right" :class="{ more: player.showMore }" v-show="player.showWidgets" @click="onShowMore">
-      <img  :src="require(`@/assets/images/icon/${player.lang}.png`)" alt="" />
+      <img :src="require(`@/assets/images/icon/${player.lang}.png`)" alt="" />
       <keep-alive>
-        <transition
-          appear
-          name="custom-classes-transition"
-          enter-active-class="animated fadeInUp short faster"
-          leave-active-class="animated fadeOutDown short faster"
-        >
+        <transition appear name="custom-classes-transition" enter-active-class="animated fadeInUp short faster"
+          leave-active-class="animated fadeOutDown short faster">
           <div v-if="player.showMore">
             <ul>
               <li @click.stop="onMenuClick('zh_CN')">
@@ -49,13 +38,10 @@
         </transition>
       </keep-alive>
     </div>
-    <transition
-      appear
-      name="custom-classes-transition"
-      enter-active-class="animated fadeInUp short faster"
-      leave-active-class="animated fadeOutDown short faster"
-    >
-      <div class="content" :class="{ drak: mode != 'panorama' }" v-if="player.showDescription" @click="onShowDescription">
+    <transition appear name="custom-classes-transition" enter-active-class="animated fadeInUp short faster"
+      leave-active-class="animated fadeOutDown short faster">
+      <div class="content" :class="{ drak: mode != 'panorama' }" v-if="player.showDescription"
+        @click="onShowDescription">
         <div>
           <div v-html="description"></div>
         </div>
@@ -63,12 +49,8 @@
     </transition>
     <teleport to="body">
       <template v-if="isApp">
-        <transition
-          appear
-          name="custom-classes-transition"
-          enter-active-class="animated fadeInUp short faster"
-          leave-active-class="animated fadeOutDown short faster"
-        >
+        <transition appear name="custom-classes-transition" enter-active-class="animated fadeInUp short faster"
+          leave-active-class="animated fadeOutDown short faster">
           <div class="app-share" v-if="showShare">
             <ul :class="{ flex: getLocale() == 'zh' }">
               <li @click="onShare('weixin')">
@@ -362,6 +344,7 @@ const next = ref(false);
 .disable {
   opacity: 1;
 }
+
 .rules-btn {
   background: rgba(0, 0, 0, 0.8);
   position: fixed;
@@ -372,14 +355,17 @@ const next = ref(false);
   display: flex;
   align-items: center;
   justify-content: center;
+
   .ui-button {
     width: 40%;
     height: 1.0667rem;
+
     &.cancel {
       margin-right: 10px;
     }
   }
 }
+
 .header {
   position: absolute;
   top: 0.3rem;
@@ -391,51 +377,45 @@ const next = ref(false);
   display: flex;
   align-items: center;
   text-shadow: 0px 0px 4px rgba(0, 0, 0, 0.4);
+
   &.app {
     top: 1rem;
   }
+
   .left {
-    width: 1rem;
+    width: 1.28rem;
     height: 100%;
     display: flex;
     align-items: center;
-    justify-content: center;
+    justify-content: flex-end;
+    pointer-events: none;
+
     &.show {
       visibility: visible;
       pointer-events: auto;
-      .back {
+
+      .music {
         visibility: visible;
+        pointer-events: auto;
       }
     }
-    .back {
-      width: 0.78rem;
-      height: 0.78rem;
-      border-radius: 50%;
-      background-color: rgba(0, 0, 0, 0.3);
+
+    .music {
+      width: 0.50rem;
+      height: 0.50rem;
       display: flex;
       align-items: center;
       justify-content: center;
       visibility: hidden;
       position: relative;
-      i {
-        font-size: 0.3rem;
-        width: auto;
-        position: static;
-      }
-    }
-    .back-pano {
-      width: 100%;
-      height: 100%;
-      display: flex;
-      align-items: center;
-      justify-content: center;
-      // padding-left: 15px;
-      position: relative;
-      i {
-        font-size: 0.6rem;
+
+      >img {
+        width: 100%;
+        height: auto;
         position: static;
       }
     }
+
   }
   .right {
     position: relative;
@@ -446,13 +426,16 @@ const next = ref(false);
     align-items: center;
     justify-content: flex-end;
     z-index: 11;
-    > i {
+
+    >i {
       font-size: 0.6rem;
     }
-    > img {
+
+    >img {
       width: 20px;
     }
-    > div {
+
+    >div {
       position: absolute;
       display: flex;
       flex-direction: column;
@@ -461,6 +444,7 @@ const next = ref(false);
       padding: 4px 0.42105rem;
       background-color: rgba(0, 0, 0, 0.5);
       border-radius: 5px;
+
       &::after {
         content: "";
         position: absolute;
@@ -472,6 +456,7 @@ const next = ref(false);
         border-style: solid;
         border-color: transparent transparent rgba(0, 0, 0, 0.5);
       }
+
       &.flex {
         li {
           span {
@@ -481,6 +466,7 @@ const next = ref(false);
           }
         }
       }
+
       li {
         position: relative;
         display: flex;
@@ -490,10 +476,12 @@ const next = ref(false);
         font-size: 0;
         // height: .5333rem;
         padding: 0.1333rem 0 0.2667rem;
-        > img {
+
+        >img {
           width: 22px;
           margin-right: 6px;
         }
+
         i {
           // position: absolute;
           // left: 0;
@@ -502,6 +490,7 @@ const next = ref(false);
           font-size: 0.3733rem;
           margin-right: 0.4rem;
         }
+
         b {
           position: absolute;
           left: 0.32rem;
@@ -510,6 +499,7 @@ const next = ref(false);
           height: 7px;
           border-radius: 50%;
           background-color: #00c2c4;
+
           i {
             color: #fff;
             font-size: 12px;
@@ -519,6 +509,7 @@ const next = ref(false);
             position: absolute;
           }
         }
+
         span {
           width: 1.89474rem;
           white-space: nowrap;
@@ -533,6 +524,7 @@ const next = ref(false);
 
       .home {
         border-top: solid 1px rgba(255, 255, 255, 0.4);
+
         a {
           width: 1.89474rem;
           margin-top: 0.3rem;
@@ -552,6 +544,7 @@ const next = ref(false);
       }
     }
   }
+
   .title {
     display: flex;
     flex: 1;
@@ -561,7 +554,8 @@ const next = ref(false);
     letter-spacing: 1px;
     align-items: center;
     justify-content: center;
-    > div {
+
+    >div {
       display: flex;
       transition: background 0.3s ease, min-width 0.3s ease, border-radius 0.3s ease;
       align-items: center;
@@ -576,6 +570,7 @@ const next = ref(false);
       pointer-events: none;
       background: linear-gradient(90deg, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.15) 50%, rgba(0, 0, 0, 0) 100%);
     }
+
     span {
       display: inline-block;
       position: relative;
@@ -584,6 +579,7 @@ const next = ref(false);
       text-overflow: ellipsis;
       max-width: 7rem;
     }
+
     i {
       transition: all 0.3s;
       position: absolute;
@@ -598,15 +594,17 @@ const next = ref(false);
       i {
         transform: translateX(-50%) rotate(180deg);
       }
-      > div {
+
+      >div {
         min-width: 0;
         //position: static;
         flex-shrink: 0;
         background-color: rgba(0, 0, 0, 0.5);
         border-radius: 1.15789rem;
       }
+
       &.drak {
-        > div {
+        >div {
           background-color: rgba(0, 0, 0, 0.8);
         }
       }
@@ -618,6 +616,7 @@ const next = ref(false);
       }
     }
   }
+
   .content {
     position: absolute;
     top: 1.6rem;
@@ -628,10 +627,12 @@ const next = ref(false);
     border-radius: 5px;
     font-size: 0.36842rem;
     text-align: center;
+
     &.drak {
       background: rgba(0, 0, 0, 0.8);
     }
-    > div {
+
+    >div {
       display: inline-block;
       text-align: left;
       letter-spacing: 1px;
@@ -666,6 +667,7 @@ const next = ref(false);
         color: var(--editor-main-color);
       }
     }
+
     // &::after {
     //     content: "";
     //     position: absolute;
@@ -687,7 +689,8 @@ const next = ref(false);
     right: 0;
     bottom: 0;
     background-color: rgba(0, 0, 0, 0.1);
-    > div {
+
+    >div {
       position: absolute;
       left: 0.6rem;
       right: 0.6rem;
@@ -697,18 +700,22 @@ const next = ref(false);
       background-color: rgba(0, 0, 0, 0.5);
       padding: 0.31579rem;
       font-size: 0.36842rem;
+
       .tips {
         display: flex;
         align-items: center;
         justify-content: space-between;
+
         h4 {
           margin: 0;
           font-size: 0.42105rem;
         }
+
         i {
           font-size: 0.6rem;
         }
       }
+
       .url {
         display: -webkit-box;
         color: #fff;
@@ -728,14 +735,17 @@ const next = ref(false);
         -webkit-line-clamp: 2; //在第几行加省略号
         -webkit-box-orient: vertical;
       }
+
       .btns {
         display: flex;
         justify-content: space-between;
+
         button {
           font-size: 0.36842rem;
           width: 47%;
           height: 1.05263rem;
           border-radius: 1.05263rem;
+
           &.submit {
             background: #00c2c4;
           }
@@ -749,9 +759,11 @@ const next = ref(false);
   .header {
     top: 0.2rem;
     height: 0.7rem;
+
     &.app {
       top: 0.2rem;
     }
+
     .left {
       .back-pano {
         i {
@@ -759,26 +771,33 @@ const next = ref(false);
         }
       }
     }
+
     .right {
-      > i {
+      >i {
         font-size: 0.5rem;
       }
-      > div {
+
+      >div {
         right: 10px;
         top: 0.75rem;
         padding: 4px 0.2rem;
+
         &::after {
           right: 0.23rem;
         }
+
         li {
           margin-top: 0.15rem;
+
           i {
             font-size: 0.3rem;
           }
+
           b {
             left: 0.2rem;
             top: 0.15rem;
           }
+
           span {
             padding-bottom: 0.15rem;
             margin-left: 0.5rem;
@@ -795,16 +814,18 @@ const next = ref(false);
         }
       }
     }
+
     .title {
       font-size: 0.3rem;
     }
+
     .content {
       top: 1rem;
       left: 2rem;
       right: 2rem;
       padding: 10px;
 
-      > div {
+      >div {
         max-height: 3rem;
         font-size: 0.25rem;
         line-height: 1.5;
@@ -817,6 +838,7 @@ const next = ref(false);
 @media only screen and (min-device-width: 768px) and (orientation: landscape) {
   .header {
     height: 0.8rem;
+
     .title {
       i {
         margin-bottom: 0;
@@ -824,6 +846,7 @@ const next = ref(false);
     }
   }
 }
+
 .app-share {
   position: fixed;
   left: 0;
@@ -834,21 +857,25 @@ const next = ref(false);
   text-shadow: none;
   border-radius: 0.146667rem 0.146667rem 0px 0px;
   z-index: 1000;
+
   i {
     // font-size: 2rem;
     font-size: 1rem;
     margin: 0.666667rem 0 0.106667rem;
     display: inline-block;
   }
+
   ul {
     // display: flex;
     // justify-content: space-around;
     overflow: hidden;
+
     div {
       text-align: center;
       // margin-top: -0.3rem;
       font-size: 0.34rem;
     }
+
     li {
       width: 33.3%;
       float: left;
@@ -859,14 +886,17 @@ const next = ref(false);
       //   font-size: 2rem;
       // }
     }
+
     &.flex {
       display: flex;
+
       li {
         float: none;
       }
     }
   }
-  > div {
+
+  >div {
     height: 1.293333rem;
     font-size: 16px;
     text-align: center;
@@ -882,20 +912,24 @@ const next = ref(false);
   &.faster {
     animation-duration: 0.3s;
   }
+
   @keyframes fadeInUp {
     0% {
       opacity: 0;
       transform: translate3d(0, 1rem, 0);
     }
+
     to {
       opacity: 1;
       transform: translateZ(0);
     }
   }
+
   @keyframes fadeOutDown {
     0% {
       opacity: 1;
     }
+
     to {
       opacity: 0;
       transform: translate3d(0, 1rem, 0);

+ 1 - 1
src/components/RTC/PageRtcLive.vue

@@ -630,9 +630,9 @@ const startFollow = (app) => {
       setUserWords(data);
       //禁言
     } else if (data.type == "user-leave") {
-      // 房間解散
       onMemberLeave(data);
     } else if (data.type == "leader-dismiss") {
+      // 房間解散
       emit("closeSocket");
       Dialog.toast({ content: t('common.leader')+t('common.dismissRoom')  });
     } else if (data.type == "tagclick") {

+ 1 - 1
src/components/RTC/dialog/share.vue

@@ -12,7 +12,7 @@
 
         <div class="created_btn">
           <div class="created_cancel" @click="closeCreated">{{ $t('common.cancel')}}</div>
-          <div class="created_confirm"  ref="copylink$" :data-clipboard-text="shareLink" @click="createdConfirm">{{ $t('share.shareLink')}} 複製分享</div>
+          <div class="created_confirm"  ref="copylink$" :data-clipboard-text="shareLink" @click="createdConfirm">{{ $t('share.shareLink')}}</div>
         </div>
       </div>
     </div>

+ 296 - 0
src/components/Tags/goods-list - 副本.vue

@@ -0,0 +1,296 @@
+<template>
+  <transition mode="out-in" appear>
+    <div class="goodlist" v-show="tagclick.type == 'goodlist'">
+      <div class="head-pages">
+        <div>
+          <span>{{ current + 1 }}</span><span>/{{ tagclick.data.products ? tagclick.data.products.length : "-" }}</span>
+        </div>
+        <ui-icon @click.stop="close" type="state_f"></ui-icon>
+      </div>
+      <div class="swiper-container" id="goodlist">
+        <ul class="swiper-wrapper">
+          <li class="swiper-slide" v-for="(i, index) in tagclick.data.products" :key="index">
+            <div>
+              <!-- <viewimg :list="[i.pic]" :keyid="`viewimg_${index + 1}`" /> -->
+              <img :src="i.pic" alt="">
+              <div class="info">
+                <p>{{ i.name }}</p>
+
+              </div>
+              <div class="goods-button">
+                <span v-if="i.saleChannel == 1" class="tipss">{{ $t('common.onlyOffLine') }}</span>
+                <template v-else>
+                  <div @click.stop="viewDetail(i)">{{ $t('common.viewDetail') }}</div>
+                </template>
+              </div>
+            </div>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </transition>
+</template>
+
+<script setup>
+import { onMounted, watch, toRaw, computed, defineEmits, ref, defineProps, nextTick } from "vue";
+import { useApp, getApp } from "@/app";
+import { useStore } from "vuex";
+import * as apis from "@/apis/index.js";
+import { Loading, Dialog } from "@/global_components/";
+import browser from "@/utils/browser";
+import viewimg from "@/views/viewimg";
+
+import { useI18n, getLocale } from '@/i18n'
+const { t } = useI18n({ useScope: 'global' })
+
+
+// get_product_info
+const store = useStore();
+const isshoppingguide = computed(() => store.getters["shoppingguide"]);
+
+const tagclick = computed(() => store.getters["tag/tagClickType"]);
+
+const emit = defineEmits(["close"]);
+
+const current = ref(0);
+
+const mysw = ref(null);
+
+const viewDetail = (item) => {
+  if (isshoppingguide.value) {
+    return;
+  }
+  apis.burying_point({ type: 3, productId: item.id });
+
+  browser.openLink(item.url)
+
+};
+
+
+const close = () => {
+  emit("close");
+};
+
+const brandScroll = () => {
+  nextTick(() => {
+    let t = setTimeout(() => {
+      clearTimeout(t);
+      mysw.value = new Swiper("#goodlist", {
+        effect: "coverflow",
+        grabCursor: true,
+        centeredSlides: true,
+        slidesPerView: "auto",
+        coverflowEffect: {
+          rotate: 0,
+          stretch: -40,
+          depth: 100,
+          modifier: 1,
+          slideShadows: false,
+        },
+        on: {
+          touchMove(swiper, e) {
+            e.stopPropagation();
+            e.preventDefault();
+          },
+          slideChangeTransitionEnd(swiper, e) {
+            current.value = swiper.activeIndex
+          },
+
+        },
+      });
+    }, 100);
+  });
+};
+
+onMounted(() => {
+  brandScroll();
+});
+</script>
+
+<style lang="scss" scoped>
+.goodlist {
+  position: fixed;
+  width: 100%;
+  height: 100%;
+  left: 0;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  margin: 0 auto;
+  max-width: 500px;
+  z-index: 101;
+  background: rgba(0, 0, 0, 0.2);
+  display: flex;
+  align-items: center;
+  flex-direction: column;
+  justify-content: center;
+
+  .head-pages {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    margin-bottom: 10px;
+    width: 76%;
+
+    >div {
+      span {
+        font-size: 14px;
+
+        &:last-of-type {
+          color: rgba(255, 255, 255, 0.5);
+        }
+      }
+    }
+
+    >i {
+      color: rgba(0, 0, 0, 1);
+      font-size: 20px;
+    }
+  }
+
+  #goodlist {
+    width: 100%;
+    overflow: hidden;
+    padding-right: 2px;
+    position: relative;
+
+    >ul {
+      >li {
+        width: 76%;
+        border-radius: 2px;
+        position: relative;
+        font-size: 0;
+        overflow: hidden;
+
+        >div {
+          background: #fff;
+          padding-bottom: 14px;
+
+          >img{
+            width: 100%;
+          }
+
+          .info {
+            font-size: 14px;
+            color: #131d34;
+            padding: 16px 20px;
+
+            >p {
+              font-size: 16px;
+              width: 100%;
+              line-height: 1.5;
+              word-break: break-all;
+            }
+
+            >div {
+              color: var(--editor-main-color);
+              padding: 8px 0px 10px;
+              border-bottom: 1px solid #ebebeb;
+
+              >span {
+                font-size: 16px;
+
+                &:first-of-type {
+                  font-size: 12px;
+                  margin-right: 4px;
+                }
+              }
+            }
+
+            >ul {
+              padding: 12px 0;
+              border-bottom: 1px solid #ebebeb;
+
+              >li {
+                margin: 10px 0;
+                color: #909090;
+
+                &:last-of-type {
+                  display: flex;
+                  justify-content: space-between;
+                  align-items: center;
+                }
+
+                >span {
+                  font-size: 12px;
+                }
+
+                >ul {
+                  display: block;
+
+                  >li {
+                    display: inline-block;
+
+                    >span {
+                      display: inline-block;
+                      border: 1px solid #ebebeb;
+                      padding: 2px 4px;
+                      min-width: 73px;
+                      height: 30px;
+                      line-height: 30px;
+                      margin: 8px 8px 0 0;
+                      text-align: center;
+                      border-radius: 4px;
+                      font-size: 12px;
+                    }
+
+                    &.active {
+                      >span {
+                        border: solid 1px var(--editor-main-color);
+                        color: var(--editor-main-color);
+                      }
+                    }
+                  }
+                }
+
+                .number {
+                  display: flex;
+
+                  i {
+                    font-size: 12px;
+                    border: 1px solid #ebebeb;
+                    padding: 2px 8px;
+                    border-radius: 15px;
+                  }
+
+                  input {
+                    max-width: 40px;
+                    text-align: center;
+                    color: #131d34;
+                  }
+                }
+              }
+            }
+          }
+
+          .goods-button {
+            display: flex;
+            justify-content: space-between;
+            font-size: 16px;
+            padding: 0 20px;
+
+            >div {
+              height: 42px;
+              background: #ff8e24;
+              border-radius: 4px;
+              width: 100%;
+              text-align: center;
+              line-height: 42px;
+
+              &:last-of-type {
+                background: var(--editor-main-color);
+              }
+            }
+
+            .tipss {
+              color: #909090;
+              display: inline-block;
+              margin: 0 auto;
+            }
+          }
+        }
+      }
+    }
+  }
+}
+</style>

+ 195 - 53
src/components/Tags/goods-list.vue

@@ -3,7 +3,8 @@
     <div class="goodlist" v-show="tagclick.type == 'goodlist'">
       <div class="head-pages">
         <div>
-          <span>{{ current + 1 }}</span><span>/{{ tagclick.data.products ? tagclick.data.products.length : "-" }}</span>
+          <span>{{ current + 1 }}</span
+          ><span>/{{ tagclick.data.products ? tagclick.data.products.length : "-" }}</span>
         </div>
         <ui-icon @click.stop="close" type="state_f"></ui-icon>
       </div>
@@ -11,16 +12,57 @@
         <ul class="swiper-wrapper">
           <li class="swiper-slide" v-for="(i, index) in tagclick.data.products" :key="index">
             <div>
-              <!-- <viewimg :list="[i.pic]" :keyid="`viewimg_${index + 1}`" /> -->
-              <img :src="i.pic" alt="">
+              <img v-if="isShowNewGoodType" :src="i.pic" alt="">
+              <viewimg  v-else :list="i.pics" :keyid="`viewimg_${index + 1}`" />
+
               <div class="info">
                 <p>{{ i.name }}</p>
-
+                <div v-if="i.skus">
+                  <span>{{ i.price[0].symbol }}</span
+                  ><span>{{ i.currentSku.price }}</span>
+                </div>
+                <ul v-if="!isShowNewGoodType">
+                  <li>
+                    <span>{{$t('common.guige')}}</span>
+                    <ul>
+                      <li @click.stop="onClickSku(item)" :class="{ active: item.id == i.currentSku.id }" v-for="(item, idx) in i.skus" :key="idx">
+                        <span v-if="item.properties[0]">
+                          {{ item.properties[0].value }}
+                        </span>
+                      </li>
+                    </ul>
+                  </li>
+                  <li>
+                    <span>{{$t('common.shuliang')}}</span>
+                    <div class="number">
+                      <ui-icon
+                        @click="
+                          () => {
+                            i.cartnum--;
+                            i.cartnum = Math.max(i.cartnum, 0);
+                          }
+                        "
+                        type="cad-neiqiang"
+                      ></ui-icon>
+                      <input maxlength="5" v-model="i.cartnum" type="number" />
+                      <ui-icon
+                        @click="
+                          () => {
+                            i.cartnum++;
+                            i.cartnum = Math.min(i.cartnum, 9999);
+                          }
+                        "
+                        type="add"
+                      ></ui-icon>
+                    </div>
+                  </li>
+                </ul>
               </div>
               <div class="goods-button">
-                <span v-if="i.saleChannel == 1" class="tipss">{{ $t('common.onlyOffLine') }}</span>
+                <span v-if="i.saleChannel == 1" class="tipss">{{$t('common.onlyOffLine')}}</span>
                 <template v-else>
-                  <div @click.stop="viewDetail(i)">{{ $t('common.viewDetail') }}</div>
+                  <div :style="{width:isShowNewGoodType?'100%':'48%'}" @click.stop="viewDetail(i)">{{$t('common.viewDetail')}}</div>
+                  <div v-if="!isShowNewGoodType" @click.stop="addCart(i)">{{$t('common.addCart')}}</div>
                 </template>
               </div>
             </div>
@@ -56,21 +98,140 @@ const current = ref(0);
 
 const mysw = ref(null);
 
+const isShowNewGoodType = computed(()=>tagclick.value&&tagclick.value.data.productSource.mchType == 1);
+
+
 const viewDetail = (item) => {
   if (isshoppingguide.value) {
     return;
   }
   apis.burying_point({ type: 3, productId: item.id });
 
-  browser.openLink(item.url)
+  console.log(tagclick.value.data.productSource,'itemitemitem');
+
+  if (tagclick.value.data.productSource.mchType == 1) {
+    browser.openLink(item.url)
+  }else{
+    browser.openLink(
+      `/pages/item/item?productId=${item.id}`,
+      `https://${tagclick.value.data.productSource.cdfHost}/shop/${tagclick.value.data.productSource.cdfMchId}/item?productId=${item.id}`,
+      `/pages/item/item?productId=${item.id}`
+    );
+  }
+
 
 };
 
+const onClickSku = (item) => {
+  let tempData = toRaw(tagclick.value.data);
+
+  tempData.products[current.value] = {
+    ...tempData.products[current.value],
+    currentSku: { ...item },
+  };
+
+  store.commit("tag/setTagClickType", {
+    type: tagclick.value.type,
+    data: tempData,
+  });
+};
+
+const addCart = async (item) => {
+  if (isshoppingguide.value) {
+    return;
+  }
+  Loading.show();
+
+  let result = await apis.inCat({
+    AccessToken: browser.getURLParam("AccessToken"),
+    skuId: item.currentSku.id,
+    num: item.cartnum,
+    rnd: Math.random(),
+    productSourceId:tagclick.value.data.productSourceId
+  });
+
+  Loading.hide();
+  if (result.code === 0) {
+    apis.burying_point({ type: 7, productId: item.id });
+    return Dialog.toast({ content: t('common.addSuccess'), type: "success" });
+  } else {
+    let callbackUrl = `${window.location.origin}${window.location.pathname}?m=${browser.getURLParam("m")}&${getApp().Camera.getPoseUrlParams()}`;
+
+    if (!browser.hasURLParam("tagid")) {
+      callbackUrl += `&tagid=${tagclick.value.data.sid}`;
+    } else {
+      callbackUrl = browser.replaceQueryString(callbackUrl, "tagid", tagclick.value.data.sid);
+    }
+    console.log(callbackUrl);
+    //  Dialog.toast({ content: `登錄狀態失效,請重新登錄`, type: 'error' })
+    browser.openLink(
+      `/pages/login/login?callbackHttpUrl=${encodeURIComponent(callbackUrl)}`,
+      `https://${tagclick.value.data.productSource.cdfHost}/shop/${tagclick.value.data.productSource.cdfMchId}/h5login?redirectUrl=${encodeURIComponent(callbackUrl)}`,
+      `/pages/login/login?callbackHttpUrl=${encodeURIComponent(callbackUrl)}`
+    );
+  }
+};
 
 const close = () => {
   emit("close");
 };
 
+const updateProductsById = async (idx) => {
+  if (tagclick.value.data.productSource.mchType == 1) {
+    return
+  }
+  if (!tagclick.value.data.products[idx]) {
+    Dialog.toast({ content: t('common.viewDetailFail'), type: "error" });
+    close();
+    return;
+  }
+  Loading.show();
+  console.log(tagclick.value,'tagclick.value.data');
+  try {
+    
+    let res = await apis.get_product_info({
+      // productId: 'p15677829'
+      productId: tagclick.value.data.products[idx].id,
+      productSourceId:tagclick.value.data.productSourceId
+    });
+
+    let tempData = toRaw(tagclick.value.data);
+
+    tempData.products[idx] = {
+      ...tempData.products[idx],
+      ...res.data,
+      currentSku: res.data.skus[0] || {
+        price: "",
+        id: "",
+      },
+      cartnum: 1,
+    };
+
+    store.commit("tag/setTagClickType", {
+      type: tagclick.value.type,
+      data: tempData,
+    });
+    Loading.hide();
+  } catch (error) {
+    Loading.hide();
+  }
+};
+
+watch(
+  () => tagclick.value.type,
+  (val, old) => {
+    if (mysw.value) {
+      if (val === "goodlist") {
+        current.value = 0;
+        updateProductsById(current.value);
+      }
+      if (!val) {
+        mysw.value.slideTo(0);
+      }
+    }
+  }
+);
+
 const brandScroll = () => {
   nextTick(() => {
     let t = setTimeout(() => {
@@ -91,7 +252,13 @@ const brandScroll = () => {
           touchMove(swiper, e) {
             e.stopPropagation();
             e.preventDefault();
-          }
+          },
+          slideChange() {
+            if (tagclick.value.type) {
+              current.value = this.activeIndex;
+              updateProductsById(current.value);
+            }
+          },
         },
       });
     }, 100);
@@ -120,104 +287,86 @@ onMounted(() => {
   align-items: center;
   flex-direction: column;
   justify-content: center;
-
   .head-pages {
     display: flex;
     justify-content: space-between;
     align-items: center;
     margin-bottom: 10px;
     width: 76%;
-
-    >div {
+    > div {
       span {
         font-size: 14px;
-
         &:last-of-type {
           color: rgba(255, 255, 255, 0.5);
         }
       }
     }
-
-    >i {
+    > i {
       color: rgba(0, 0, 0, 1);
       font-size: 20px;
     }
   }
-
   #goodlist {
     width: 100%;
     overflow: hidden;
     padding-right: 2px;
     position: relative;
-
-    >ul {
-      >li {
+    > ul {
+      > li {
         width: 76%;
         border-radius: 2px;
         position: relative;
         font-size: 0;
         overflow: hidden;
 
-        >div {
-          background: #fff;
-          padding-bottom: 14px;
-
+        > div {
+        background: #fff;
+        padding-bottom: 14px;
           >img{
             width: 100%;
           }
-
           .info {
             font-size: 14px;
             color: #131d34;
             padding: 16px 20px;
-
-            >p {
+            > p {
               font-size: 16px;
               width: 100%;
               line-height: 1.5;
               word-break: break-all;
             }
-
-            >div {
+            > div {
               color: var(--editor-main-color);
               padding: 8px 0px 10px;
               border-bottom: 1px solid #ebebeb;
-
-              >span {
+              > span {
                 font-size: 16px;
-
                 &:first-of-type {
                   font-size: 12px;
                   margin-right: 4px;
                 }
               }
             }
-
-            >ul {
+            > ul {
               padding: 12px 0;
               border-bottom: 1px solid #ebebeb;
 
-              >li {
+              > li {
                 margin: 10px 0;
                 color: #909090;
-
                 &:last-of-type {
                   display: flex;
                   justify-content: space-between;
                   align-items: center;
                 }
-
-                >span {
+                > span {
                   font-size: 12px;
                 }
-
-                >ul {
+                > ul {
                   display: block;
-
-                  >li {
+                  > li {
                     display: inline-block;
-
-                    >span {
+                    > span {
                       display: inline-block;
                       border: 1px solid #ebebeb;
                       padding: 2px 4px;
@@ -229,26 +378,22 @@ onMounted(() => {
                       border-radius: 4px;
                       font-size: 12px;
                     }
-
                     &.active {
-                      >span {
+                      > span {
                         border: solid 1px var(--editor-main-color);
                         color: var(--editor-main-color);
                       }
                     }
                   }
                 }
-
                 .number {
                   display: flex;
-
                   i {
                     font-size: 12px;
                     border: 1px solid #ebebeb;
                     padding: 2px 8px;
                     border-radius: 15px;
                   }
-
                   input {
                     max-width: 40px;
                     text-align: center;
@@ -258,26 +403,23 @@ onMounted(() => {
               }
             }
           }
-
           .goods-button {
             display: flex;
             justify-content: space-between;
             font-size: 16px;
             padding: 0 20px;
 
-            >div {
+            > div {
               height: 42px;
               background: #ff8e24;
               border-radius: 4px;
-              width: 100%;
+              width: 48%;
               text-align: center;
               line-height: 42px;
-
               &:last-of-type {
                 background: var(--editor-main-color);
               }
             }
-
             .tipss {
               color: #909090;
               display: inline-block;
@@ -289,4 +431,4 @@ onMounted(() => {
     }
   }
 }
-</style>
+</style>

+ 3 - 1
src/components/Tags/waterfall.vue

@@ -44,7 +44,9 @@ const gotoGoods = (item) => {
       return;
   }
   apis.burying_point({ type: 3, productId: item.id });
-  browser.openLink(item.url)
+  console.log(item,'item');
+  // browser.openLink(`/pages/item/item?productId=${item.id}`, `https://m.cdfmembers.com/shop/600667208/item?productId=${item.id}`,`/pages/item/item?productId=${item.id}`);
+  // browser.openLink(item.url)
 };
 </script>
 

+ 7 - 1
src/locales/en.json

@@ -18,7 +18,7 @@
     "tour": "Navigation",
     "all": "All",
     "model": "Dollhouse",
-    "title":"cdf Macau Grand Lisboa Palace Shop",
+    "title":"Duty Zero by cdf",
     "mode":"Livestream",
     "shopping":"Cart",
     "guide":"Guide",
@@ -98,5 +98,11 @@
     "fullScene": "Full screen",
     "exitFullScene": "Exit full screen",
     "rule": "Measurement Tools"
+  },
+  "errorcode":{
+    "5033":"The scene is being calculated, please wait...",
+    "5034":"The cloud scene has been sealed",
+    "5009":"The cloud scene has been deleted",
+    "5005":"The cloud scene does not exist"
   }
 }

+ 7 - 1
src/locales/zh.json

@@ -18,7 +18,7 @@
     "tour": "導覽",
     "all": "全部",
     "model": "三維模式",
-    "title": "cdf澳門上葡京店",
+    "title": "Duty Zero by cdf",
     "mode": "一起逛",
     "shopping": "購物",
     "guide": "專櫃導航",
@@ -82,5 +82,11 @@
     "fullScene": "全屏",
     "exitFullScene": "退出全屏",
     "rule": "測量工具"
+  },
+  "errorcode":{
+    "5033":"場景正在計算中,請稍後...",
+    "5034":"雲端場景已封存",
+    "5009":"雲端場景已被刪除",
+    "5005":"雲端場景不存在"
   }
 }

+ 7 - 1
src/locales/zh_CN.json

@@ -18,7 +18,7 @@
     "tour": "导览",
     "all": "全部",
     "model": "三维模式",
-    "title":"cdf澳门上葡京店",
+    "title":"Duty Zero by cdf",
     "mode":"一起逛",
     "shopping":"购物",
     "guide":"专柜导航",
@@ -98,5 +98,11 @@
     "fullScene": "全屏",
     "exitFullScene": "退出全屏",
     "rule": "测量工具"
+  },
+  "errorcode":{
+    "5033":"场景正在计算中,请稍后...",
+    "5034":"云端场景已封存",
+    "5009":"云端场景已被删除",
+    "5005":"云端场景不存在"
   }
 }

+ 7 - 1
src/locales/zh_HK.json

@@ -18,7 +18,7 @@
     "tour": "導覽",
     "all": "全部",
     "model": "三維模式",
-    "title":"cdf澳門上葡京店",
+    "title":"Duty Zero by cdf",
     "mode":"一起逛",
     "shopping":"購物",
     "guide":"專櫃導航",
@@ -98,5 +98,11 @@
     "fullScene": "全屏",
     "exitFullScene": "退出全屏",
     "rule": "測量工具"
+  },
+  "errorcode":{
+    "5033":"場景正在計算中,請稍後...",
+    "5034":"雲端場景已封存",
+    "5009":"雲端場景已被刪除",
+    "5005":"雲端場景不存在"
   }
 }