shaogen1995 1 年間 前
コミット
28a9459e77
100 ファイル変更21713 行追加0 行削除
  1. 25 0
      .env
  2. 26 0
      .env.bendi
  3. 26 0
      .env.development
  4. 23 0
      .env.prod
  5. 25 0
      .env.testprod
  6. 23 0
      .gitignore
  7. 24 0
      README.md
  8. 3 0
      babel.config.js
  9. 1 0
      jsconfig.json
  10. 18176 0
      package-lock.json
  11. 32 0
      package.json
  12. 46 0
      public/index.html
  13. BIN
      public/viewer/favicon.png
  14. BIN
      public/viewer/marker.png
  15. 11 0
      public/viewer/static/lib/animate/animate.min.css
  16. 109 0
      public/viewer/static/lib/flexible.min.js
  17. 7 0
      public/viewer/static/lib/flv.min.js
  18. 1 0
      public/viewer/static/lib/jweixin-1.0.0.js
  19. 1 0
      public/viewer/static/lib/jweixin-1.6.0.js
  20. 22 0
      public/viewer/static/lib/mobile-detect.js
  21. 2060 0
      public/viewer/static/lib/socket.io.min.js
  22. 13 0
      public/viewer/static/lib/swiper/swiper-bundle.min.css
  23. 14 0
      public/viewer/static/lib/swiper/swiper-bundle.min.js
  24. 13 0
      public/viewer/static/lib/swiper/swiper.min.css
  25. 14 0
      public/viewer/static/lib/swiper/swiper.min.js
  26. 1 0
      public/viewer/static/lib/swiper/swiper.min.js.map
  27. 10 0
      public/viewer/static/lib/vconsole.js
  28. 2 0
      public/viewer/static/lib/zmjm.min.js
  29. BIN
      public/viewer/static/music/01.mp3
  30. BIN
      public/viewer/static/music/02.mp3
  31. BIN
      public/viewer/static/music/03.mp3
  32. BIN
      public/viewer/static/music/04.mp3
  33. BIN
      public/viewer/static/music/05.mp3
  34. BIN
      public/viewer/static/music/06.mp3
  35. BIN
      public/viewer/static/music/07.mp3
  36. BIN
      public/viewer/static/music/08.mp3
  37. 65 0
      src/apis/index.js
  38. 32 0
      src/app.js
  39. 827 0
      src/app.vue
  40. BIN
      src/assets/favicon.png
  41. BIN
      src/assets/images/floorlogo/0.png
  42. BIN
      src/assets/images/floorlogo/1.png
  43. BIN
      src/assets/images/floorlogo/2.png
  44. BIN
      src/assets/images/floorlogo/en/0.png
  45. BIN
      src/assets/images/floorlogo/en/1.png
  46. BIN
      src/assets/images/floorlogo/en/2.png
  47. BIN
      src/assets/images/floorlogo/enter-style-default.png
  48. BIN
      src/assets/images/floorlogo/enter-style-down.png
  49. BIN
      src/assets/images/floorlogo/enter-style-up.png
  50. BIN
      src/assets/images/floorlogo/icon-corner-24.png
  51. BIN
      src/assets/images/floorlogo/icon-corner.png
  52. BIN
      src/assets/images/guide/novice_guide_button_en@2x.png
  53. BIN
      src/assets/images/guide/novice_guide_button_zh@2x.png
  54. BIN
      src/assets/images/guide/novice_guide_text@2x.png
  55. BIN
      src/assets/images/guide/novice_guide_text_en@2x.png
  56. 17 0
      src/assets/images/icon/1.svg
  57. 17 0
      src/assets/images/icon/2.svg
  58. 17 0
      src/assets/images/icon/3.svg
  59. BIN
      src/assets/images/icon/bg.png
  60. BIN
      src/assets/images/icon/bofang.png
  61. 3 0
      src/assets/images/icon/camera-mute.svg
  62. 3 0
      src/assets/images/icon/camera.svg
  63. 3 0
      src/assets/images/icon/clippy.svg
  64. BIN
      src/assets/images/icon/en.png
  65. BIN
      src/assets/images/icon/exhibits.png
  66. BIN
      src/assets/images/icon/gift.gif
  67. BIN
      src/assets/images/icon/gifts_off.png
  68. BIN
      src/assets/images/icon/gifts_on.png
  69. 12 0
      src/assets/images/icon/help.svg
  70. BIN
      src/assets/images/icon/img_scene_share.png
  71. BIN
      src/assets/images/icon/logo.png
  72. BIN
      src/assets/images/icon/logo_beauty.png
  73. 4 0
      src/assets/images/icon/mic-mute.svg
  74. 4 0
      src/assets/images/icon/mic.svg
  75. BIN
      src/assets/images/icon/music_off@2x.png
  76. BIN
      src/assets/images/icon/music_on@2x.png
  77. 1 0
      src/assets/images/icon/search.svg
  78. BIN
      src/assets/images/icon/start_vr.png
  79. BIN
      src/assets/images/icon/top5.png
  80. BIN
      src/assets/images/icon/zh_CN.png
  81. BIN
      src/assets/images/icon/zh_HK.png
  82. BIN
      src/assets/images/loading.jpg
  83. BIN
      src/assets/images/rtcLive/Input_disabled@2x.png
  84. BIN
      src/assets/images/rtcLive/Input_norma@2x.png
  85. BIN
      src/assets/images/rtcLive/arrows@2x.png
  86. BIN
      src/assets/images/rtcLive/avatar_small@2x.png
  87. BIN
      src/assets/images/rtcLive/brushes@2x.png
  88. BIN
      src/assets/images/rtcLive/brushes_selected@2_1.png
  89. BIN
      src/assets/images/rtcLive/brushes_selected@2x.png
  90. BIN
      src/assets/images/rtcLive/chat_off@2x.png
  91. BIN
      src/assets/images/rtcLive/chat_on@2x.png
  92. BIN
      src/assets/images/rtcLive/chrome.png
  93. BIN
      src/assets/images/rtcLive/cross@2x.png
  94. BIN
      src/assets/images/rtcLive/edge.png
  95. BIN
      src/assets/images/rtcLive/exit@2x.png
  96. BIN
      src/assets/images/rtcLive/firefox.png
  97. BIN
      src/assets/images/rtcLive/guided@2x.png
  98. BIN
      src/assets/images/rtcLive/hot_spot@2x.png
  99. BIN
      src/assets/images/rtcLive/hot_spot_selected@2x.png
  100. 0 0
      src/assets/images/rtcLive/invitation@2x.png

+ 25 - 0
.env

@@ -0,0 +1,25 @@
+
+# 场景资源地址
+VUE_APP_RESOURCE_URL=https://eurs3.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/
+
+
+# 静态资源目录
+VUE_APP_STATIC_DIR=viewer
+
+# 云存储环境
+VUE_APP_REGION_URL=aws
+
+
+# 接口请求地址
+VUE_APP_APIS_URL=http://192.168.0.38:8888/
+

+ 26 - 0
.env.bendi

@@ -0,0 +1,26 @@
+
+# 场景资源地址
+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/
+
+# 静态资源目录
+VUE_APP_STATIC_DIR=viewer
+
+# 云存储环境
+VUE_APP_REGION_URL=aws
+
+# 接口请求地址
+VUE_APP_APIS_URL=https://zhongmian.4dage.com/
+

+ 26 - 0
.env.development

@@ -0,0 +1,26 @@
+
+# 场景资源地址
+VUE_APP_RESOURCE_URL=https://eurs3.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/
+
+# 静态资源目录
+VUE_APP_STATIC_DIR=viewer
+
+# 云存储环境
+VUE_APP_REGION_URL=aws
+
+# 接口请求地址
+#VUE_APP_APIS_URL=http://192.168.0.38:8888/
+VUE_APP_APIS_URL=https://vr.cdfmembers.com/
+

+ 23 - 0
.env.prod

@@ -0,0 +1,23 @@
+# 场景资源地址
+VUE_APP_RESOURCE_URL=https://eurs3.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/
+
+# 静态资源目录
+VUE_APP_STATIC_DIR=viewer
+
+# 云存储环境
+VUE_APP_REGION_URL=aws
+
+# 接口请求地址
+VUE_APP_APIS_URL=https://vr.cdfmembers.com/

+ 25 - 0
.env.testprod

@@ -0,0 +1,25 @@
+
+# 场景资源地址
+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/
+
+# 静态资源目录
+VUE_APP_STATIC_DIR=viewer
+
+# 云存储环境
+VUE_APP_REGION_URL=aws
+
+# 接口请求地址
+VUE_APP_APIS_URL=https://zhongmian.4dage.com/

+ 23 - 0
.gitignore

@@ -0,0 +1,23 @@
+.DS_Store
+node_modules
+/dist
+
+
+# local env files
+.env.local
+.env.*.local
+
+# Log files
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?

+ 24 - 0
README.md

@@ -0,0 +1,24 @@
+# cdfg_vue3
+
+## Project setup
+```
+npm install
+```
+
+### Compiles and hot-reloads for development
+```
+npm run serve
+```
+
+### Compiles and minifies for production
+```
+npm run build
+```
+
+### Lints and fixes files
+```
+npm run lint
+```
+
+### Customize configuration
+See [Configuration Reference](https://cli.vuejs.org/config/).

+ 3 - 0
babel.config.js

@@ -0,0 +1,3 @@
+module.exports = {
+  presets: ["@vue/cli-plugin-babel/preset"],
+};

+ 1 - 0
jsconfig.json

@@ -0,0 +1 @@
+{}

ファイルの差分が大きいため隠しています
+ 18176 - 0
package-lock.json


+ 32 - 0
package.json

@@ -0,0 +1,32 @@
+{
+  "name": "cdfg_vue3",
+  "version": "0.1.0",
+  "private": true,
+  "scripts": {
+    "serve": "vue-cli-service serve",
+    "serve-prod": "vue-cli-service serve --mode prod",
+    "serve-HK": "vue-cli-service serve --mode bendi",
+    "build-testprod": "vue-cli-service build --mode testprod",
+    "build": "vue-cli-service build --mode prod",
+    "lint": "vue-cli-service lint"
+  },
+  "dependencies": {
+    "axios": "^0.21.1",
+    "clipboard": "^2.0.8",
+    "core-js": "^3.8.3",
+    "jsonp": "^0.2.1",
+    "socket.io": "^4.5.1",
+    "trtc-js-sdk": "^4.13.0",
+    "vue": "^3.2.36",
+    "vue-i18n": "9",
+    "vuex": "^4.0.2"
+  },
+  "devDependencies": {
+    "@intlify/vue-i18n-loader": "^4.2.0",
+    "@vue/cli-plugin-babel": "~5.0.0",
+    "@vue/cli-service": "~5.0.0",
+    "@vue/compiler-sfc": "^3.0.0",
+    "sass": "^1.26.5",
+    "sass-loader": "^8.0.2"
+  }
+}

+ 46 - 0
public/index.html

@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<html lang="">
+  <head>
+    <meta charset="utf-8" />
+    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
+    <link rel="icon" href="<%= BASE_URL %><%= VUE_APP_STATIC_DIR %>/favicon.png" />
+    <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.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>Duty Zero by cdf</title>
+  </head>
+
+  <body>
+    <noscript>
+      <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
+    </noscript>
+    <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.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>
+
+    <script src="<%= VUE_APP_STATIC_DIR %>/static/lib/jweixin-1.6.0.js"></script>
+
+    <script src="<%= VUE_APP_SDK_DIR %>/kankan-sdk-deps.js?v=4.37.3-alpha.81"></script>
+    <script src="<%= VUE_APP_SDK_DIR %>/kankan-sdk.js?v=4.37.3-alpha.81"></script>
+
+    <!-- <script src="https://4dkk.4dage.com/v4/www/sdk/kankan-sdk-deps.js?v=4.0.0-alpha.44"></script>
+        <script src="https://4dkk.4dage.com/v4/www/sdk/kankan-sdk.js?v=4.0.0-alpha.44"></script> -->
+
+    <!-- <script src="https://eurs3.4dkankan.com/v4/cdfg/sdk/kankan-sdk-deps.js?v=4.0.0-alpha.45"></script>
+        <script src="https://eurs3.4dkankan.com/v4/cdfg/sdk/kankan-sdk.js?v=4.0.0-alpha.45"></script> -->
+    <!-- built files will be auto injected -->
+    <script>
+      if ((query = window.location.href.indexOf('vlog') != -1)) {
+        var vConsole = new window.VConsole();
+      }
+    </script>
+  </body>
+</html>

BIN
public/viewer/favicon.png


BIN
public/viewer/marker.png


ファイルの差分が大きいため隠しています
+ 11 - 0
public/viewer/static/lib/animate/animate.min.css


+ 109 - 0
public/viewer/static/lib/flexible.min.js

@@ -0,0 +1,109 @@
+(function(win, lib) {
+    var doc = win.document;
+    var docEl = doc.documentElement;
+    var metaEl = doc.querySelector('meta[name="viewport"]');
+    var flexibleEl = doc.querySelector('meta[name="flexible"]');
+    var dpr = 0;
+    var scale = 0;
+    var tid;
+    var flexible = lib.flexible || (lib.flexible = {});
+     
+    if (metaEl) {
+        console.warn('将根据已有的meta标签来设置缩放比例');
+        var match = metaEl.getAttribute('content').match(/initial\-scale=([\d\.]+)/);
+        if (match) {
+            scale = parseFloat(match[1]);
+            dpr = parseInt(1 / scale);
+        }
+    } else if (flexibleEl) {
+        var content = flexibleEl.getAttribute('content');
+        if (content) {
+            var initialDpr = content.match(/initial\-dpr=([\d\.]+)/);
+            var maximumDpr = content.match(/maximum\-dpr=([\d\.]+)/);
+            if (initialDpr) {
+                dpr = parseFloat(initialDpr[1]);
+                scale = parseFloat((1 / dpr).toFixed(2));   
+            }
+            if (maximumDpr) {
+                dpr = parseFloat(maximumDpr[1]);
+                scale = parseFloat((1 / dpr).toFixed(2));   
+            }
+        }
+    }
+    if (!dpr && !scale) {
+        var isAndroid = win.navigator.appVersion.match(/android/gi);
+        var isIPhone = win.navigator.appVersion.match(/iphone/gi);
+        var devicePixelRatio = win.devicePixelRatio;
+        if (isIPhone) {
+            // iOS下,对于2和3的屏,用2倍的方案,其余的用1倍方案
+            if (devicePixelRatio >= 3 && (!dpr || dpr >= 3)) {               
+                dpr = 3;
+            } else if (devicePixelRatio >= 2 && (!dpr || dpr >= 2)){
+                dpr = 2;
+            } else {
+                dpr = 1;
+            }
+        } else {
+            // 其他设备下,仍旧使用1倍的方案
+            dpr = 1;
+        }
+        scale = 1 / dpr;
+    }
+    docEl.setAttribute('data-dpr', dpr);
+    if (!metaEl) {
+        metaEl = doc.createElement('meta');
+        metaEl.setAttribute('name', 'viewport');
+        metaEl.setAttribute('content', 'initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no');
+        if (docEl.firstElementChild) {
+            docEl.firstElementChild.appendChild(metaEl);
+        } else {
+            var wrap = doc.createElement('div');
+            wrap.appendChild(metaEl);
+            doc.write(wrap.innerHTML);
+        }
+    }
+    function refreshRem(){
+        var width = docEl.getBoundingClientRect().width;
+        if (width / dpr > 540) {
+            width = 540 * dpr;
+        }
+        var rem = width / 10;
+        docEl.style.fontSize = rem + 'px';
+        flexible.rem = win.rem = rem;
+    }
+    win.addEventListener('resize', function() {
+        clearTimeout(tid);
+        tid = setTimeout(refreshRem, 300);
+    }, false);
+    win.addEventListener('pageshow', function(e) {
+        if (e.persisted) {
+            clearTimeout(tid);
+            tid = setTimeout(refreshRem, 300);
+        }
+    }, false);
+    if (doc.readyState === 'complete') {
+        doc.body.style.fontSize = 12 * dpr + 'px';
+    } else {
+        doc.addEventListener('DOMContentLoaded', function(e) {
+            doc.body.style.fontSize = 12 * dpr + 'px';
+        }, false);
+    }
+     
+    refreshRem();
+    flexible.dpr = win.dpr = dpr;
+    flexible.refreshRem = refreshRem;
+    flexible.rem2px = function(d) {
+        var val = parseFloat(d) * this.rem;
+        if (typeof d === 'string' && d.match(/rem$/)) {
+            val += 'px';
+        }
+        return val;
+    }
+    flexible.px2rem = function(d) {
+        var val = parseFloat(d) / this.rem;
+        if (typeof d === 'string' && d.match(/px$/)) {
+            val += 'rem';
+        }
+        return val;
+    }
+})(window, window['lib'] || (window['lib'] = {}));

ファイルの差分が大きいため隠しています
+ 7 - 0
public/viewer/static/lib/flv.min.js


ファイルの差分が大きいため隠しています
+ 1 - 0
public/viewer/static/lib/jweixin-1.0.0.js


ファイルの差分が大きいため隠しています
+ 1 - 0
public/viewer/static/lib/jweixin-1.6.0.js


+ 22 - 0
public/viewer/static/lib/mobile-detect.js

@@ -0,0 +1,22 @@
+(function(win) {
+    var orgLink = win.location.href
+    var newLink = ''
+    if (orgLink.indexOf('&mobile=true') != -1) {
+        Object.defineProperty(navigator, 'userAgent', {
+            value: "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1",
+            writable: false
+        })
+    }
+    else if (/iPhone|iPad|Android/i.test(win.navigator.userAgent)) {
+        if (orgLink.indexOf('pc.html') !== -1) {
+            newLink = orgLink.replace('pc.html', 'mobile.html')
+        }
+    } else {
+        if (orgLink.indexOf('mobile.html') !== -1) {
+            newLink = orgLink.replace('mobile.html', 'pc.html')
+        }
+    }
+    if (newLink) {
+        win.location.href = newLink
+    }
+}(window))

ファイルの差分が大きいため隠しています
+ 2060 - 0
public/viewer/static/lib/socket.io.min.js


ファイルの差分が大きいため隠しています
+ 13 - 0
public/viewer/static/lib/swiper/swiper-bundle.min.css


ファイルの差分が大きいため隠しています
+ 14 - 0
public/viewer/static/lib/swiper/swiper-bundle.min.js


ファイルの差分が大きいため隠しています
+ 13 - 0
public/viewer/static/lib/swiper/swiper.min.css


ファイルの差分が大きいため隠しています
+ 14 - 0
public/viewer/static/lib/swiper/swiper.min.js


ファイルの差分が大きいため隠しています
+ 1 - 0
public/viewer/static/lib/swiper/swiper.min.js.map


ファイルの差分が大きいため隠しています
+ 10 - 0
public/viewer/static/lib/vconsole.js


ファイルの差分が大きいため隠しています
+ 2 - 0
public/viewer/static/lib/zmjm.min.js


BIN
public/viewer/static/music/01.mp3


BIN
public/viewer/static/music/02.mp3


BIN
public/viewer/static/music/03.mp3


BIN
public/viewer/static/music/04.mp3


BIN
public/viewer/static/music/05.mp3


BIN
public/viewer/static/music/06.mp3


BIN
public/viewer/static/music/07.mp3


BIN
public/viewer/static/music/08.mp3


+ 65 - 0
src/apis/index.js

@@ -0,0 +1,65 @@
+import { http } from "@/utils/request";
+import browser from "@/utils/browser";
+import store from "@/store";
+let deptId = null
+
+export const get_goods_list = (data) => {
+  return http.get("/back/product/list", data);
+};
+
+export const get_category_list = (data) => {
+  return http.get("/api/getShopCategory", {
+    ...data,
+    sceneNum:browser.getURLParam('m')
+  });
+};
+
+export const get_shop_list = (data) => {
+  return http.get("/api/getShopByCategory", {
+    ...data,
+    sceneNum:browser.getURLParam('m'),
+    deptId:store.getters['scene/cdfRegionData'].deptId || null
+  });
+};
+
+export const get_tags_list = (data) => {
+  return http.get("/service/scene/edit/tag/getHotJson", data);
+};
+
+export const get_product_info = (data) => {
+  return http.get("/api/getProductInfo", data);
+};
+
+export const get_video = (data) => {
+
+  return http.get("/api/getVideo", data);
+};
+
+export const inCat = (data) => {
+  return http.get("/api/inCat", data);
+};
+
+export const getSign = (data) => {
+  return http.get("/api/tencentYun/getSign", data);
+};
+
+
+
+export const burying_point = (data) => {
+  let url = encodeURI(window.location.href)
+
+  if (browser.getURLParam("AccessToken")) {
+    return http.get("/api/point", {
+      userId: browser.getURLParam("userId") || 1,
+      AccessToken: browser.getURLParam("AccessToken") || 'none',
+      cookieId: browser.getURLParam("cookieId") || 'none',
+      isMiniApp: browser.getURLParam("isMiniApp") || 'h5',
+      whereUrl: url,
+      type: data.type,
+      productId: data.productId,
+      sceneNum:browser.getURLParam('m')
+      // deptId:store.getters['scene/cdfRegionData'].deptId || null
+    });
+  }
+
+};

+ 32 - 0
src/app.js

@@ -0,0 +1,32 @@
+let _app
+let _num
+let deferred = KanKan.Deferred()
+
+export function createApp(opitons = {}) {
+    if (_app) {
+        return
+    }
+    // opitons.region = process.env.VUE_APP_REGION_URL
+    opitons.resource = process.env.VUE_APP_RESOURCE_URL
+    _num = opitons.num
+    _app = new KanKan(opitons)
+    deferred.resolve(_app)
+    window.__sdk = _app
+    document.body.setAttribute('is-mobile', true)
+    return _app
+}
+
+export function useApp() {
+    if (_app) {
+        return Promise.resolve(_app)
+    }
+    return deferred
+}
+
+export function getApp() {
+    return _app
+}
+
+export function getNum() {
+    return _num
+}

+ 827 - 0
src/app.vue

@@ -0,0 +1,827 @@
+<template>
+  <LoadingLogo v-if="hadVideo" :thumb="true" />
+  <OpenVideo v-else @close="hadVideo = true" />
+  <Guide />
+
+  <div class="ui-view-layout" :class="{ show: show }" is-mobile="true">
+    <div class="scene" ref="scene$"></div>
+    <template v-if="dataLoaded">
+      <Information v-if="!isshoppingguide" />
+      <Control />
+
+      <teleport v-if="refMiniMap && player.showWidgets" :to="refMiniMap">
+        <span :class="{ gudieDisabled: isshoppingguide && role != 'leader' }" class="button-switch" @click.stop="toggleMap">
+          <ui-icon type="show_map_collect"></ui-icon>
+        </span>
+        <div v-if="controls.showDollhouse" :class="{ gudieDisabled: isshoppingguide && role != 'leader' }" class="change" @click="changeMode('dollhouse')">
+          <ui-icon type="show_3d_normal"></ui-icon>
+          <span> {{ $t('mode.dollhouseModel') }}</span>
+        </div>
+      </teleport>
+
+      <template v-if="refMiniMap && player.showWidgets">
+        <div :class="{ disabled: flying, gudieDisabled: isshoppingguide && role != 'leader' }" v-show="mode != 'panorama'" v-if="controls.showFloorplan && controls.showDollhouse" class="tab-layer">
+          <div class="tabs" v-if="controls.showMap">
+            <span :class="{ active: mode === 'floorplan' }" ref="floorplan_ref" @click="changeMode('floorplan', $event)">
+              <ui-icon :type="mode == 'floorplan' ? 'show_plane_selected' : 'show_plane_normal'"></ui-icon>
+              {{ $t('mode.floorplan') }}
+            </span>
+            <span :class="{ active: mode === 'dollhouse' }" ref="dollhouse_ref" @click="changeMode('dollhouse', $event)">
+              <ui-icon :type="mode == 'dollhouse' ? 'show_3d_selected' : 'show_3d_normal'"></ui-icon>
+
+              {{ $t('mode.dollhouse') }}
+            </span>
+            <div class="background" ref="background"></div>
+          </div>
+        </div>
+      </template>
+    </template>
+    <!-- <UiTags /> -->
+  </div>
+
+  <GoodsList @close="closetagtype" />
+  <Treasure @close="closetagtype" />
+  <Waterfall @close="closetagtype" />
+</template>
+
+<script setup>
+import { useMusicPlayer } from '@/utils/sound';
+// import UiTags from "@/components/Tags";
+import GoodsList from '@/components/Tags/goods-list.vue';
+import Treasure from '@/components/Tags/treasure.vue';
+//waterfall和exhibits公用
+import Waterfall from '@/components/Tags/waterfall.vue';
+
+import Information from '@/components/Information';
+import Control from '@/components/Controls/Control.Mobile.vue';
+import LoadingLogo from '@/components/shared/Loading.vue';
+import OpenVideo from '@/components/openVideo/';
+import Guide from '@/components/shared/Guide.vue';
+import { Dialog } from '@/global_components/';
+
+import { createApp } from '@/app';
+import { ref, onMounted, computed, nextTick, watch } from 'vue';
+import { useStore } from 'vuex';
+import browser from '@/utils/browser';
+import { useApp, getApp } from '@/app';
+import common from '@/utils/common';
+import { useI18n, getLocale } from '@/i18n';
+import { Cache } from '@/utils/index';
+import wxShare from '@/utils/wxshare';
+
+import * as apis from '@/apis/index.js';
+
+const { t } = useI18n({ useScope: 'global' });
+
+const store = useStore();
+
+let jumpNewScene = (sceneFirstView) => {
+  let url = window.location.href;
+
+  if (!browser.hasURLParam('pose')) {
+    url += `&${sceneFirstView.sceneview}`;
+  } else {
+    url = browser.replaceQueryString(url, 'pose', sceneFirstView.sceneview.replace('pose=', ''));
+  }
+
+  url = browser.replaceQueryString(url, 'm', sceneFirstView.num);
+  return url;
+};
+
+let visibilitychangeFn = () => {
+  if (browser.isTabHidden()) {
+    apis.burying_point({ type: 1 });
+  }
+};
+
+let hashchangefn = () => {
+  if (window.location.hash.indexOf('#showpage') >= 0) {
+    window.history.go(-1);
+  }
+};
+
+const musicPlayer = useMusicPlayer();
+
+let app = null;
+
+let tagid = browser.getURLParam('tagid');
+
+const role = computed(() => store.getters['rtc/role']);
+
+const closetagtype = () => {
+  store.commit('tag/setTagClickType', {
+    type: '',
+    data: {},
+  });
+
+  if (isshoppingguide.value) {
+    if (role.value == 'leader') {
+      socket.value &&
+        socket.value.emit('action', {
+          type: 'tagclose',
+        });
+    }
+  }
+};
+const socket = computed(() => store.getters['rtc/socket']);
+
+const tags = computed(() => {
+  return store.getters['tag/tags'] || [];
+});
+
+const isshoppingguide = computed(() => store.getters['shoppingguide']);
+
+const player = computed(() => store.getters['player']);
+const flying = computed(() => store.getters['flying']);
+const metadata = computed(() => store.getters['scene/metadata']);
+const controls = computed(() => {
+  return metadata.value.controls;
+});
+const mode = computed(() => store.getters['mode']);
+const showNavigations = computed(() => store.getters['showNavigations']);
+const scene$ = ref(null);
+const hadVideo = ref(true);
+
+let VIDEOSCENELIST = [
+  'KJ-eur-7bRK91138f',
+  'KJ-eur-g4hE95af2b',
+  'KJ-eur-g9MJ95515d',
+  'KJ-eur-LHyX95b547',
+  'KJ-eur-WR9V913f23',
+  'KJ-eur-MBJF95ae80'
+]
+console.log('result:', Cache.get('HIDENVIDEOEXPIRES'));
+
+if (!Cache.get('HIDENVIDEOEXPIRES')) {
+  if ((VIDEOSCENELIST.includes(browser.getURLParam('m')) && (browser.getURLParam('pose') == 'pano:188,qua:0.0013,-0.6099,0.001,0.7925'))||
+  (VIDEOSCENELIST.includes(browser.getURLParam('m')) && (browser.getURLParam('pose') == 'pano:58,qua:0,-0.7979,0,0.6028'))) {
+    // Cache.set('HIDENVIDEOEXPIRES', 'yes', 1);
+    Cache.set('HIDENVIDEOEXPIRES', 'yes', 60 * 8 * 60);
+    hadVideo.value = false;
+  } else {
+    hadVideo.value = true;
+  }
+}
+
+if (browser.getURLParam('role')) {
+  hadVideo.value = true;
+}
+
+const show = ref(false);
+const dataLoaded = ref(false);
+const refMiniMap = ref(null);
+const isCollapse = ref(false);
+const background = ref(null);
+const resize = () => {
+  if (this.$refs.background && (this.mode == 'floorplan' || this.mode == 'dollhouse')) {
+    this.$nextTick(() => {
+      let $active = $(this.$el).find('.tabs .active');
+      background.value.style.width = $active[0].getBoundingClientRect().width + 'px';
+      background.value.style.left = $active.position().left + 'px';
+    });
+  }
+};
+
+watch(
+  () => isshoppingguide.value,
+  (val, old) => {
+    let $minmap = document.querySelector('[xui_min_map]');
+
+    if ($minmap) {
+      setTimeout(async () => {
+        if (browser.getURLParam('role') == 'customer') {
+          await nextTick();
+          if (isshoppingguide.value) {
+            $minmap.classList.add('gudieDisabled');
+          } else {
+            $minmap.classList.remove('gudieDisabled');
+            // wxShare({
+            //   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",
+            // });
+          }
+        }
+      });
+    }
+  },
+  {
+    deep: true,
+  }
+);
+
+watch(
+  () => player.value.showMap,
+  (val, old) => {
+    if (!isCollapse.value) {
+      let $minmap = document.querySelector('[xui_min_map]');
+      if ($minmap) {
+        if (val) {
+          $minmap.classList.remove('collapse');
+        } else {
+          $minmap.classList.add('collapse');
+        }
+      }
+    }
+  },
+  {
+    deep: true,
+  }
+);
+watch(
+  () => player.value.showWidgets,
+  (val, old) => {
+    let $minmap = document.querySelector('[xui_min_map]');
+    if ($minmap) {
+      if (val) {
+        $minmap.classList.remove('collapse');
+      } else {
+        $minmap.classList.add('collapse');
+      }
+    }
+  },
+  {
+    deep: true,
+  }
+);
+
+watch(
+  () => mode.value,
+  (val, old) => {
+    console.log(val);
+    let timer = setTimeout(() => {
+      clearTimeout(timer);
+      if (val == 'floorplan') {
+        if (floorplan_ref.value && floorplan_ref.value) {
+          background.value.style.width = floorplan_ref.value.getBoundingClientRect().width + 'px';
+          background.value.style.left = floorplan_ref.value.offsetLeft + 'px';
+        }
+      } else if (val == 'dollhouse') {
+        if (dollhouse_ref.value && dollhouse_ref.value) {
+          background.value.style.width = dollhouse_ref.value.getBoundingClientRect().width + 'px';
+          background.value.style.left = dollhouse_ref.value.offsetLeft + 'px';
+        }
+      }
+    }, 0);
+  },
+  {
+    deep: true,
+  }
+);
+const floorplan_ref = ref(null);
+const dollhouse_ref = ref(null);
+const changeMode = (name, e) => {
+  if (e) {
+    if (!flying.value) {
+      store.commit('setMode', name);
+    }
+  } else {
+    store.commit('setMode', name);
+  }
+};
+const toggleMap = () => {
+  isCollapse.value = !isCollapse.value;
+  let $minmap = document.querySelector('[xui_min_map]');
+  if ($minmap) {
+    if (!isCollapse.value) {
+      $minmap.classList.remove('collapse');
+    } else {
+      $minmap.classList.add('collapse');
+    }
+  }
+};
+
+const onClickTagInfo = (el) => {
+  el.stopPropagation();
+  let item = tags.value.find((item) => item.sid == el.target.dataset.id);
+  if (item.type == 'commodity') {
+    guideclicktag(item);
+    store.commit('tag/setTagClickType', {
+      type: 'goodlist',
+      data: item,
+    });
+  } else if (item.type == 'link_scene') {
+    guideclicktag(item);
+    let sceneFirstView = item.hotContent.sceneFirstView;
+    window.location.href = jumpNewScene(sceneFirstView);
+  }
+};
+
+const guideclicktag = (tag) => {
+  if (isshoppingguide.value) {
+    if (role.value == 'leader') {
+      socket.value &&
+        socket.value.emit('action', {
+          type: 'tagclick',
+          data: {
+            sid: tag.sid,
+          },
+        });
+    }
+  }
+  return;
+};
+
+const getCurrentHotJson = ()=>{
+  let lang = browser.getURLParam('lang')
+  let jsonname = lang == 'zh_CN'?'hot_eshop_cn':(lang == 'zh_HK'?'hot_eshop_zh':'hot_eshop_en')
+  return `https://glp-vr.cdfmembers.com/cdf/hot/${browser.getURLParam('m')}/${jsonname}.json?rnd=${Math.random()}`
+}
+
+onMounted(async () => {
+  apis.burying_point({ type: 0 });
+
+  app = createApp({
+    num: browser.getURLParam('m'),
+    dom: scene$.value,
+    mobile: true,
+    isLoadTags: false,
+    sceneKind: 'tiles',
+    lang: getLocale(),
+    scene: {
+      markerOpacity: 1,
+      markerURL: 'https://eurs3.4dkankan.com/cdf/file/43aa29799bfd472298a47cc6370b10cc.png',
+      pathEndColor: '#FF4641',
+    },
+  });
+  app.use('MinMap', { theme: { camera_fillStyle: '#ED5D18' } });
+  app.use('Tag');
+  app
+    .use('TagView', {
+      render(data) {
+        if (data.type == 'waterfall' || data.type == 'exhibits') {
+          return `<span class="tag-icon ${data.type == 'waterfall'?'waterfall':''} animate" style="background-image:url({{icon}})"></span>`;
+        } else if (data.type == 'coupon') {
+          return `<span class="tag-icon coupon animate" style="background-image:url({{icon}})"></span>`;
+        } else if (data.type == 'applet_link') {
+          try {
+            data.hotContent = JSON.parse(data.hotContent);
+          } catch (error) {}
+          return `<span class="tag-icon applet_link animate" style="background-image:url(${data.hotContent.liveIcon.src ? common.changeUrl(data.hotContent.liveIcon.src) : '{{icon}}'})"></span>`;
+        } else if (data.type == 'link_scene') {
+          return `<span class="tag-icon animate" style="background-image:url({{icon}})"></span>
+                      <div class="tag-body">
+                        <div data-id="${data.sid}" class="tag-commodity tag-link_scene">
+                          <p class="tag-title">${t('common.goNext')}</p>
+                        </div>
+                      </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"> ${range} ${t('common.view')} ></p>
+                        </div>
+                      </div>
+                  `;
+        } else {
+          return `<span class="tag-icon animate" style="background-image:url({{icon}})"></span>`;
+        }
+      },
+    })
+    .then((view) => {
+      view.on('click', (e) => {
+        var tag = e.data;
+        // 聚焦當前點擊的熱點
+        view.focus(tag.sid).then(() => {
+          if (tag.type == 'coupon') {
+            try {
+              if (isshoppingguide.value) {
+                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(
+                '/subPackage/pages/activity/activity?pageId=' + hotcontent.couponLink,
+                `${metadata.value?.cdfProductSource?.cdfHost}/shop/${metadata.value?.cdfProductSource?.cdfMchId}/showactivity?pageId=${hotcontent.couponLink}`,
+                `/pages/showactivity/showactivity?pageId=${hotcontent.couponLink}`
+                `${metadata.value?.cdfProductSource?.cdfHostPc}/showactivity/${hotcontent.couponLink}`,
+              );
+
+              apis.burying_point({ type: 2 });
+            } catch (error) {}
+          }
+          else if (tag.type == 'point_jump') {
+            let hotcontent = typeof tag.hotContent == 'string' ? JSON.parse(tag.hotContent) : tag.hotContent;
+            console.log('result:', hotcontent);
+            app.Camera.flyToPano(hotcontent.videoId)
+          }
+          else if (tag.type == 'waterfall' || tag.type == 'exhibits') {
+            store.commit('tag/setTagClickType', {
+              type: 'waterfall',
+              data: tag,
+            });
+            guideclicktag(tag);
+          } else if (tag.type == 'applet_link') {
+            try {
+              if (isshoppingguide.value) {
+                return;
+              }
+              let hotcontent = typeof tag.hotContent == 'string' ? JSON.parse(tag.hotContent) : tag.hotContent;
+              browser.openLink(
+                '/subPackage/pages/home/home?pageType=2&pageId=' + hotcontent.liveLink,
+                `${metadata.value?.cdfProductSource?.cdfHost}/shop/${metadata.value?.cdfProductSource?.cdfMchId}/showactivity?pageId=${hotcontent.liveLink}`,
+                `/pages/showactivity/showactivity?pageId=${hotcontent.liveLink}`,
+                `${metadata.value?.cdfProductSource?.cdfHostPc}/showactivity/${hotcontent.couponLink}`,
+              );
+            } catch (error) {}
+          } else if (tag.type == 'link_scene') {
+            guideclicktag(tag);
+            let sceneFirstView = tag.hotContent.sceneFirstView;
+            window.location.href = jumpNewScene(sceneFirstView);
+          }
+        });
+      });
+
+      view.on('focus', (e) => {
+        document.querySelectorAll('[xui_tags_view] >div').forEach((el) => {
+          if (el.getAttribute('data-tag-type') == 'link_scene' || el.getAttribute('data-tag-type') == 'commodity') {
+            el.querySelector('.tag-body').classList.remove('show');
+            el.style.zIndex = 'auto';
+          }
+        });
+        if (e.data.type == 'commodity' || e.data.type == 'link_scene') {
+          e.target.style.zIndex = '999';
+          e.target.querySelector('.tag-body').classList.add('show');
+          e.target.querySelector('.tag-commodity').removeEventListener('click', onClickTagInfo);
+          e.target.querySelector('.tag-commodity').addEventListener('click', onClickTagInfo);
+
+          if (tagid) {
+            document.querySelector(`[data-id="${tagid}"]`) && document.querySelector(`[data-id="${tagid}"]`).click();
+            tagid = null;
+          }
+        }
+      });
+
+      view.on('rendered', (e) => {
+        tagid && view.focus(tagid);
+      }); //dom渲染完成
+    });
+
+  app.use('TourPlayer');
+
+  app.TourManager.on('loaded', (list) => {
+    store.commit('tour/loaded', list);
+    // app.TourManager.load(tours.value);
+  });
+  // if (!hadVideo.value) {
+  //   app.Scene.lock();
+  // }
+
+
+  app.Scene.on('ready', () => {
+    show.value = true;
+    store.commit('SetPlayerOptions', {
+      lang: getLocale(),
+    });
+    wxShare({
+      title: `${t('common.title')}~`,
+      desc: `${t('common.title')}~`,
+      link: window.location.href,
+      imgUrl: 'https://glp-vr.cdfmembers.com/cdf/file/91dd5305525f463286f03a31abd1c154.jpg',
+    });
+  });
+  app.Scene.on('error', (data) => {
+    switch (data.code) {
+      case 5033:
+        Dialog.alert(t('errorcode.5033'));
+        break;
+      case 5034:
+        Dialog.alert(t('errorcode.5034'));
+        break;
+      case 5009:
+        Dialog.alert(t('errorcode.5009'));
+        break;
+      case 5005:
+        Dialog.alert(t('errorcode.5005'));
+        break;
+    }
+  });
+  app.Scene.on('loaded', (pano) => {
+    refMiniMap.value = '[xui_min_map]';
+    store.commit('setFloorId', pano.floorIndex);
+    store.commit('rtc/setShowdaogou', true);
+
+    if (browser.getURLParam('roomId')) {
+      store.commit('showShoppingguide', true);
+    } else {
+      if (!localStorage.getItem('user_guide')) {
+        Dialog.confirm({
+          showCloseIcon: false,
+          okText: t('common.know'),
+          content: "<span style='font-size: 16px; line-height: 1.5;'>" + t('common.notice') + '<span/>',
+          title: `${t('common.tips')}:`,
+          single: true,
+          func: (state) => {
+            if (state == 'ok') {
+              localStorage.setItem('user_guide', Date.now());
+            }
+          },
+        });
+      }
+    }
+
+    // app.resource.tags(`https://glp-vr.cdfmembers.com/cdf/hot/${browser.getURLParam('m')}/hot.json?rnd=${Math.random()}`);
+    app.resource.tags(getCurrentHotJson());
+    useMusicPlayer();
+  });
+  app.Scene.on('panorama.videorenderer.resumerender', () => {
+    musicPlayer.pause(true);
+  });
+
+  app.Scene.on('panorama.videorenderer.suspendrender', async () => {
+    let player = await getApp().TourManager.player;
+    if (!player.isPlaying) {
+      musicPlayer.resume();
+    }
+  });
+  app.store.on('metadata', (metadata) => {
+    store.commit('scene/load', metadata);
+    console.log(metadata,'metadatametadatametadata');
+    if (!metadata.controls.showMap) {
+      app.MinMap.hide(true);
+    }
+    dataLoaded.value = true;
+  });
+  app.store.on('tags', (tags) => {
+    store.commit('tag/load', tags);
+  });
+  app.Camera.on('mode.beforeChange', ({ fromMode, toMode, floorIndex }) => {
+    if (fromMode) {
+      store.commit('setFlying', true);
+    }
+  });
+  app.Camera.on('mode.afterChange', ({ toMode, floorIndex }) => {
+    store.commit('setFlying', false);
+  });
+  app.Camera.on('flying.started', (pano) => {
+    store.commit('setFlying', true);
+  });
+  app.Camera.on('flying.ended', ({ targetPano }) => {
+    store.commit('setFlying', false);
+    store.commit('setPanoId', targetPano.id);
+    if (app.Scene.isCurrentPanoHasVideo) {
+      apis.burying_point({ type: 5 });
+    }
+  });
+
+  app.Camera.on('pano.chosen', (pano) => {
+    apis.burying_point({ type: 4 });
+  });
+  // app.store.on('tour', async (tour) => {
+  //   app.TourManager.load(tour);
+  //   store.commit('tour/setData', {
+  //     tours: JSON.parse(
+  //       JSON.stringify(app.TourManager.tours, (key, val) => {
+  //         if (key === 'audio') {
+  //           return null;
+  //         } else {
+  //           return val;
+  //         }
+  //       })
+  //     ),
+  //   });
+  //   store.commit('tour/setBackUp', {
+  //     tours: JSON.parse(
+  //       JSON.stringify(app.TourManager.tours, (key, val) => {
+  //         if (key === 'audio') {
+  //           return null;
+  //         } else {
+  //           return val;
+  //         }
+  //       })
+  //     ),
+  //   });
+  // });
+  app.store.on('floorcad', (floor) => store.commit('scene/loadFloorData', floor));
+
+  app.render();
+  document.removeEventListener('visibilitychange', visibilitychangeFn);
+  document.addEventListener('visibilitychange', visibilitychangeFn);
+
+  if (browser.detectWeixin()) {
+    //ios的ua中无miniProgram,但都有MicroMessenger(表示是微信浏览器)
+    wx.miniProgram.getEnv((res) => {
+      if (res.miniprogram) {
+        window.removeEventListener('hashchange', hashchangefn);
+        window.addEventListener('hashchange', hashchangefn);
+      }
+    });
+  }
+});
+</script>
+<style lang="scss">
+.tab-layer {
+  width: 100%;
+  text-align: center;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  z-index: 10;
+  position: fixed;
+  left: 50%;
+  transform: translateX(-50%);
+  top: 2.3rem;
+  pointer-events: none;
+}
+.tabs {
+  pointer-events: auto;
+  position: relative;
+  display: flex;
+  background: #222222;
+  border-radius: 6px;
+  padding: 2px;
+  justify-content: center;
+  align-items: center;
+  border: 1px solid rgba(255, 255, 255, 0.1);
+  box-shadow: inset 0px 0px 6px 0px rgba(0, 0, 0, 0.5);
+  .background {
+    position: absolute;
+    left: 2px;
+    top: 2px;
+    bottom: 2px;
+    width: 50%;
+    border-radius: 4px;
+    background: #444444;
+    box-shadow: 2px 0px 4px 0px rgba(0, 0, 0, 0.3);
+    z-index: 0;
+    transition: left 0.3s;
+  }
+  span {
+    flex: 1;
+    color: #fff;
+    opacity: 0.5;
+    border-radius: 6px;
+    height: 0.94737rem;
+    font-size: 0.36842rem;
+    transition: all 0.3s ease;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    padding-left: 10px;
+    padding-right: 10px;
+    white-space: nowrap;
+    z-index: 1;
+    i {
+      font-size: 0.47368rem;
+      margin-right: 4px;
+      pointer-events: none;
+    }
+  }
+
+  span.active {
+    opacity: 1;
+  }
+}
+
+[xui_tags_view] {
+  .tag-body {
+    /* display: none; */
+    position: absolute;
+    left: 50%;
+    bottom: 50px;
+    transform: translateX(-50%) scale(0);
+    transform-origin: bottom;
+    transition: all 0.3s cubic-bezier(0.35, 0.32, 0.65, 0.63);
+    // pointer-events: none;
+    .tag-commodity,
+    .tag-link_scene {
+      min-width: 230px;
+      height: 76px;
+      background: rgba(255, 255, 255, 0.8);
+      box-shadow: 0px 3px 6px 0px rgba(0, 0, 0, 0.16);
+      border-radius: 2px;
+      position: relative;
+      margin-bottom: 30px;
+      &::before {
+        content: '';
+        display: inline-block;
+        left: 50%;
+        transform: translateX(-50%);
+        width: 2px;
+        height: 28px;
+        bottom: -30px;
+        background: linear-gradient(145deg, rgba(255, 255, 255, 0.8), rgba(255, 255, 255, 0));
+        position: absolute;
+      }
+      .tag-avatar {
+        position: absolute;
+        z-index: 99;
+        width: 80px;
+        height: 80px;
+        background: #ffffff;
+        box-shadow: 0px 3px 6px 0px rgb(0 0 0 / 16%);
+        border-radius: 2px;
+        top: -14px;
+        left: -12px;
+        background-size: cover;
+        pointer-events: none;
+      }
+      > p {
+        color: #131d34;
+        font-size: 16px;
+        pointer-events: none;
+      }
+      .tag-title {
+        padding: 10px 10px 10px 76px;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        white-space: nowrap;
+        width: 240px;
+      }
+      .tag-info {
+        padding: 0 20px 0 76px;
+        font-size: 12px;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        white-space: nowrap;
+      }
+    }
+    &.show {
+      transform: translateX(-50%) scale(1);
+    }
+
+    .tag-link_scene {
+      height: auto;
+      min-width: unset;
+      .tag-title {
+        padding: 10px;
+        width: auto;
+        text-align: center;
+      }
+    }
+  }
+
+  .coupon {
+    width: 84px !important;
+    height: 84px !important;
+    &::after {
+      content: '發現好禮';
+      width: 100%;
+      color: #ed5d18;
+      position: absolute;
+      bottom: -24px;
+      text-align: center;
+      font-size: 14px;
+    }
+  }
+
+  .waterfall {
+    width: 90px !important;
+    height: 90px !important;
+  }
+
+  .applet_link {
+    width: 64px !important;
+    height: 64px !important;
+    border-radius: 50%;
+    background-color: #fff;
+    border: 1px solid #ed5d18;
+    position: relative;
+    overflow: hidden;
+    &::after {
+      content: '直播中';
+      width: 100%;
+      height: 20px;
+      background: #ed5d18;
+      position: absolute;
+      bottom: 0;
+      text-align: center;
+      line-height: 1.2;
+      font-size: 12px;
+      border-radius: 26%;
+    }
+  }
+}
+
+.gudieDisabled {
+  pointer-events: none !important;
+  * {
+    pointer-events: none !important;
+  }
+}
+
+@media (orientation: landscape) {
+  .tab-layer {
+    top: 1.2rem;
+    .tabs {
+      height: 0.7rem;
+      > span {
+        height: 0.7rem;
+        font-size: 0.25rem;
+      }
+    }
+  }
+}
+</style>

BIN
src/assets/favicon.png


BIN
src/assets/images/floorlogo/0.png


BIN
src/assets/images/floorlogo/1.png


BIN
src/assets/images/floorlogo/2.png


BIN
src/assets/images/floorlogo/en/0.png


BIN
src/assets/images/floorlogo/en/1.png


BIN
src/assets/images/floorlogo/en/2.png


BIN
src/assets/images/floorlogo/enter-style-default.png


BIN
src/assets/images/floorlogo/enter-style-down.png


BIN
src/assets/images/floorlogo/enter-style-up.png


BIN
src/assets/images/floorlogo/icon-corner-24.png


BIN
src/assets/images/floorlogo/icon-corner.png


BIN
src/assets/images/guide/novice_guide_button_en@2x.png


BIN
src/assets/images/guide/novice_guide_button_zh@2x.png


BIN
src/assets/images/guide/novice_guide_text@2x.png


BIN
src/assets/images/guide/novice_guide_text_en@2x.png


ファイルの差分が大きいため隠しています
+ 17 - 0
src/assets/images/icon/1.svg


ファイルの差分が大きいため隠しています
+ 17 - 0
src/assets/images/icon/2.svg


ファイルの差分が大きいため隠しています
+ 17 - 0
src/assets/images/icon/3.svg


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


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


+ 3 - 0
src/assets/images/icon/camera-mute.svg

@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="white" class="bi bi-camera-video-off-fill" viewBox="0 0 16 16">
+  <path fill-rule="evenodd" d="M10.961 12.365a1.99 1.99 0 0 0 .522-1.103l3.11 1.382A1 1 0 0 0 16 11.731V4.269a1 1 0 0 0-1.406-.913l-3.111 1.382A2 2 0 0 0 9.5 3H4.272l6.69 9.365zm-10.114-9A2.001 2.001 0 0 0 0 5v6a2 2 0 0 0 2 2h5.728L.847 3.366zm9.746 11.925-10-14 .814-.58 10 14-.814.58z"/>
+</svg>

+ 3 - 0
src/assets/images/icon/camera.svg

@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="white" class="bi bi-camera-video-fill" viewBox="0 0 16 16">
+  <path fill-rule="evenodd" d="M0 5a2 2 0 0 1 2-2h7.5a2 2 0 0 1 1.983 1.738l3.11-1.382A1 1 0 0 1 16 4.269v7.462a1 1 0 0 1-1.406.913l-3.111-1.382A2 2 0 0 1 9.5 13H2a2 2 0 0 1-2-2V5z"/>
+</svg>

+ 3 - 0
src/assets/images/icon/clippy.svg

@@ -0,0 +1,3 @@
+<svg height="1024" width="896" xmlns="http://www.w3.org/2000/svg">
+  <path d="M128 768h256v64H128v-64z m320-384H128v64h320v-64z m128 192V448L384 640l192 192V704h320V576H576z m-288-64H128v64h160v-64zM128 704h160v-64H128v64z m576 64h64v128c-1 18-7 33-19 45s-27 18-45 19H64c-35 0-64-29-64-64V192c0-35 29-64 64-64h192C256 57 313 0 384 0s128 57 128 128h192c35 0 64 29 64 64v320h-64V320H64v576h640V768zM128 256h512c0-35-29-64-64-64h-64c-35 0-64-29-64-64s-29-64-64-64-64 29-64 64-29 64-64 64h-64c-35 0-64 29-64 64z" />
+</svg>

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


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


BIN
src/assets/images/icon/gift.gif


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


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


ファイルの差分が大きいため隠しています
+ 12 - 0
src/assets/images/icon/help.svg


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


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


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


+ 4 - 0
src/assets/images/icon/mic-mute.svg

@@ -0,0 +1,4 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="white" class="bi bi-mic-mute-fill" viewBox="0 0 16 16">
+  <path d="M13 8c0 .564-.094 1.107-.266 1.613l-.814-.814A4.02 4.02 0 0 0 12 8V7a.5.5 0 0 1 1 0v1zm-5 4c.818 0 1.578-.245 2.212-.667l.718.719a4.973 4.973 0 0 1-2.43.923V15h3a.5.5 0 0 1 0 1h-7a.5.5 0 0 1 0-1h3v-2.025A5 5 0 0 1 3 8V7a.5.5 0 0 1 1 0v1a4 4 0 0 0 4 4zm3-9v4.879L5.158 2.037A3.001 3.001 0 0 1 11 3z"/>
+  <path d="M9.486 10.607 5 6.12V8a3 3 0 0 0 4.486 2.607zm-7.84-9.253 12 12 .708-.708-12-12-.708.708z"/>
+</svg>

+ 4 - 0
src/assets/images/icon/mic.svg

@@ -0,0 +1,4 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="white" class="bi bi-mic-fill" viewBox="0 0 16 16">
+  <path d="M5 3a3 3 0 0 1 6 0v5a3 3 0 0 1-6 0V3z"/>
+  <path d="M3.5 6.5A.5.5 0 0 1 4 7v1a4 4 0 0 0 8 0V7a.5.5 0 0 1 1 0v1a5 5 0 0 1-4.5 4.975V15h3a.5.5 0 0 1 0 1h-7a.5.5 0 0 1 0-1h3v-2.025A5 5 0 0 1 3 8V7a.5.5 0 0 1 .5-.5z"/>
+</svg>

BIN
src/assets/images/icon/music_off@2x.png


BIN
src/assets/images/icon/music_on@2x.png


ファイルの差分が大きいため隠しています
+ 1 - 0
src/assets/images/icon/search.svg


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


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


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


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


BIN
src/assets/images/loading.jpg


BIN
src/assets/images/rtcLive/Input_disabled@2x.png


BIN
src/assets/images/rtcLive/Input_norma@2x.png


BIN
src/assets/images/rtcLive/arrows@2x.png


BIN
src/assets/images/rtcLive/avatar_small@2x.png


BIN
src/assets/images/rtcLive/brushes@2x.png


BIN
src/assets/images/rtcLive/brushes_selected@2_1.png


BIN
src/assets/images/rtcLive/brushes_selected@2x.png


BIN
src/assets/images/rtcLive/chat_off@2x.png


BIN
src/assets/images/rtcLive/chat_on@2x.png


BIN
src/assets/images/rtcLive/chrome.png


BIN
src/assets/images/rtcLive/cross@2x.png


BIN
src/assets/images/rtcLive/edge.png


BIN
src/assets/images/rtcLive/exit@2x.png


BIN
src/assets/images/rtcLive/firefox.png


BIN
src/assets/images/rtcLive/guided@2x.png


BIN
src/assets/images/rtcLive/hot_spot@2x.png


BIN
src/assets/images/rtcLive/hot_spot_selected@2x.png


+ 0 - 0
src/assets/images/rtcLive/invitation@2x.png


この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません