tremble 3 роки тому
батько
коміт
3a92b544ce
73 змінених файлів з 1564 додано та 1072 видалено
  1. 235 460
      public/floor/floor.json
  2. 9 0
      public/index.html
  3. 1 9
      public/static/css/main.css
  4. 1 1
      public/static/js/CAD/loadCAD.js
  5. 41 40
      public/static/js/main_2020_show.js
  6. BIN
      src/assets/images/proj2022/bg.png
  7. BIN
      src/assets/images/proj2022/mobile/next.png
  8. BIN
      src/assets/images/proj2022/mobile/prev.png
  9. BIN
      src/assets/images/proj2022/mobile/record_1@2x.png
  10. BIN
      src/assets/images/proj2022/mobile/record_2@2x.png
  11. BIN
      src/assets/images/proj2022/mobile/record_3@2x.png
  12. BIN
      src/assets/images/proj2022/mobile/record_4@2x.png
  13. BIN
      src/assets/images/proj2022/mobile/record_5@2x.png
  14. BIN
      src/assets/images/proj2022/mobile/record_five.png
  15. BIN
      src/assets/images/proj2022/mobile/record_four.png
  16. BIN
      src/assets/images/proj2022/mobile/record_one.png
  17. BIN
      src/assets/images/proj2022/mobile/record_three.png
  18. BIN
      src/assets/images/proj2022/mobile/record_two.png
  19. BIN
      src/assets/images/proj2022/mobile/record_weiting.png
  20. BIN
      src/assets/images/proj2022/mobile/record_wt@2x.png
  21. BIN
      src/assets/images/proj2022/mobile/record_xt@2x.png
  22. BIN
      src/assets/images/proj2022/mobile/record_xuting.png
  23. BIN
      src/assets/images/proj2022/mobile/search_bg.png
  24. BIN
      src/assets/images/proj2022/mobile_bg.png
  25. BIN
      src/assets/images/proj2022/mobile_title.png
  26. BIN
      src/assets/images/proj2022/mobile_units.png
  27. BIN
      src/assets/images/proj2022/pc/clear.png
  28. BIN
      src/assets/images/proj2022/pc/musicoff.png
  29. BIN
      src/assets/images/proj2022/pc/musicon.png
  30. BIN
      src/assets/images/proj2022/pc/pause.png
  31. BIN
      src/assets/images/proj2022/pc/play.png
  32. BIN
      src/assets/images/proj2022/pc/reset@2x.png
  33. BIN
      src/assets/images/proj2022/pc_units.png
  34. BIN
      src/assets/images/proj2022/title.png
  35. BIN
      src/assets/images/project/project.zip
  36. 7 7
      src/assets/theme/color.less
  37. 38 17
      src/assets/theme/theme.less
  38. 38 26
      src/components/bird_view/build.js
  39. 57 14
      src/components/bird_view/index.vue
  40. 21 7
      src/components/hotspot/image.vue
  41. 6 1
      src/components/hotspot/index.vue
  42. 4 9
      src/components/hotspot/model.vue
  43. 4 4
      src/components/hotspot/video.vue
  44. 41 41
      src/data/booth.js
  45. 19 19
      src/data/raw.js
  46. 10 8
      src/pages/Home.vue
  47. 16 7
      src/pages/mobile.vue
  48. 189 0
      src/pages/mobilescene/birdview/ViewOperation.vue
  49. 110 0
      src/pages/mobilescene/birdview/index.vue
  50. 8 16
      src/pages/mobilescene/components/content.vue
  51. 30 23
      src/pages/mobilescene/components/daka.vue
  52. 10 10
      src/pages/mobilescene/components/qrcode.vue
  53. 199 86
      src/pages/mobilescene/index.vue
  54. 14 12
      src/pages/mobilescene/map.vue
  55. 5 4
      src/pages/mobilescene/menu/exhibition.vue
  56. 26 6
      src/pages/mobilescene/menu/func.vue
  57. 0 1
      src/pages/mobilescene/popup.vue
  58. 117 49
      src/pages/mobilescene/raside/menu.vue
  59. 7 6
      src/pages/mobilescene/scene.vue
  60. 52 93
      src/pages/mobilescene/search/index.vue
  61. 21 15
      src/pages/mobilescene/zhanxiang/index.vue
  62. 1 3
      src/pages/scene/aside.vue
  63. 1 0
      src/pages/scene/components/daka.vue
  64. 2 0
      src/pages/scene/components/qrcode.vue
  65. 61 36
      src/pages/scene/index.vue
  66. 1 1
      src/pages/scene/menu.vue
  67. 13 5
      src/pages/scene/raside/map.vue
  68. 9 2
      src/pages/scene/raside/rmenu.vue
  69. 0 3
      src/pages/scene/scene.vue
  70. 7 5
      src/pages/scene/search/index.vue
  71. 40 22
      src/pages/scene/zhanxiang/index.vue
  72. 32 4
      src/pages/scenePage/index.vue
  73. 61 0
      src/utils/index.js

Різницю між файлами не показано, бо вона завелика
+ 235 - 460
public/floor/floor.json


+ 9 - 0
public/index.html

@@ -12,6 +12,15 @@
   <meta name="format-detection" content="telephone=no">
   <link rel="icon" href="<%= BASE_URL %>logo.ico">
   <title>2022年全国大众创业万众创新活动周云展览</title>
+  <script>
+    var _hmt = _hmt || [];
+    (function() {
+      var hm = document.createElement("script");
+      hm.src = "https://hm.baidu.com/hm.js?a1af463bc2692b6861ac40d2e024b07d";
+      var s = document.getElementsByTagName("script")[0]; 
+      s.parentNode.insertBefore(hm, s);
+    })();
+  </script>
 </head>
 
 <body>

+ 1 - 9
public/static/css/main.css

@@ -4016,21 +4016,13 @@ a.hasHover:hover, a:active {
     position: absolute;
     bottom: 2px;
     left: 2px;
-    width: 130px;
-    height: 20px;
+    width: 100%;
     padding: 6px;
     color: #fff;
-    background-color: rgba(0, 0, 0, .7);
     overflow: hidden;
     white-space: nowrap;
-    font-weight: 100;
     text-align: center;
-    line-height: 4px;
     z-index: 100;
-    -moz-transform: translate3d(0, 0, 0);
-    -ms-transform: translate3d(0, 0, 0);
-    -o-transform: translate3d(0, 0, 0);
-    transform: translate3d(0, 0, 0)
 }
 
 .frame .slidee li .mark360View, .frame .slidee li .markInsideView {

+ 1 - 1
public/static/js/CAD/loadCAD.js

@@ -27,7 +27,7 @@ window.grendCAD = (function grendCAD() {
         width: 100%;
         height: 100%;
         top: 0;
-        right: 0;
+        right: 10px;
       }
 
       #cad{

+ 41 - 40
public/static/js/main_2020_show.js

@@ -6941,6 +6941,7 @@ window.Modernizr = function(n, e, t) {
                   , I = p.children();
                 t.on("update.controls", function() {//导览控制
                     var n = t.describe();
+                    window.player.emit('onplayStatus', n),
                     n.tourIsPlaying || i.isWarping() ? (je.tourControls.visible && (l.hide(),
                     c.show()),
                     n.tourInProgress && (h.forEach(function(e) {
@@ -7114,46 +7115,46 @@ window.Modernizr = function(n, e, t) {
                 }
             }
             function D(e, t) {
-                function i() {
-                    var i = t.toJSON();
-                    n.linkToLocation = window.location.protocol + "//" + window.location.host + window.location.pathname + "?m=" + e.sid + "&start=" + be.serialize(i),
-                    t.tagManager.activeTag && (n.linkToLocation += "&tag=" + t.tagManager.activeTag.sid)
-                }
-                var n = {}
-                  , r = new Le.GUI({
-                    autoPlace: !0,
-                    width: "60%"
-                });
-                i(),
-                t.on(xe.ViewChanged, i),
-                r.add(n, "linkToLocation").name(Re.LINK_TO_LOCATION).listen(),
-                r.domElement.id = "datLinks";
-                var o = [].slice.call(r.domElement.querySelectorAll(".property-name"));
-                return o.forEach(function(e) {
-                    if (!K.detectSafari()) {
-                        var t = document.createElement("button");
-                        t.classList.add("btn-deep-link"),
-                        t.innerText = Re.MENU_COPY,
-                        e.nextSibling.appendChild(t);
-                        var i = function() {
-                            alert(Re.LINK_ALERT_COPY),
-                            t.hide()
-                        };
-                        t.addEventListener("click", function(e) {
-                            try {
-                                var t = e.target.parentNode.childNodes[0];
-                                t.select();
-                                var n = document.execCommand("copy");
-                                t.blur(),
-                                n || i()
-                            } catch (e) {
-                                i()
-                            }
-                        })
-                    }
-                }),
-                $(r.__closeButton).hide(),
-                r
+                // function i() {
+                //     var i = t.toJSON();
+                //     n.linkToLocation = window.location.protocol + "//" + window.location.host + window.location.pathname + "?m=" + e.sid + "&start=" + be.serialize(i),
+                //     t.tagManager.activeTag && (n.linkToLocation += "&tag=" + t.tagManager.activeTag.sid)
+                // }
+                // var n = {}
+                //   , r = new Le.GUI({
+                //     autoPlace: !0,
+                //     width: "60%"
+                // });
+                // i(),
+                // t.on(xe.ViewChanged, i),
+                // r.add(n, "linkToLocation").name(Re.LINK_TO_LOCATION).listen(),
+                // r.domElement.id = "datLinks";
+                // var o = [].slice.call(r.domElement.querySelectorAll(".property-name"));
+                // return o.forEach(function(e) {
+                //     if (!K.detectSafari()) {
+                //         var t = document.createElement("button");
+                //         t.classList.add("btn-deep-link"),
+                //         t.innerText = Re.MENU_COPY,
+                //         e.nextSibling.appendChild(t);
+                //         var i = function() {
+                //             alert(Re.LINK_ALERT_COPY),
+                //             t.hide()
+                //         };
+                //         t.addEventListener("click", function(e) {
+                //             try {
+                //                 var t = e.target.parentNode.childNodes[0];
+                //                 t.select();
+                //                 var n = document.execCommand("copy");
+                //                 t.blur(),
+                //                 n || i()
+                //             } catch (e) {
+                //                 i()
+                //             }
+                //         })
+                //     }
+                // }),
+                // $(r.__closeButton).hide(),
+                // r
             }
             function N(e) {
                 He.gui || (He.gui = D(He.model, He.player)),

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


BIN
src/assets/images/proj2022/mobile/next.png


BIN
src/assets/images/proj2022/mobile/prev.png


BIN
src/assets/images/proj2022/mobile/record_1@2x.png


BIN
src/assets/images/proj2022/mobile/record_2@2x.png


BIN
src/assets/images/proj2022/mobile/record_3@2x.png


BIN
src/assets/images/proj2022/mobile/record_4@2x.png


BIN
src/assets/images/proj2022/mobile/record_5@2x.png


BIN
src/assets/images/proj2022/mobile/record_five.png


BIN
src/assets/images/proj2022/mobile/record_four.png


BIN
src/assets/images/proj2022/mobile/record_one.png


BIN
src/assets/images/proj2022/mobile/record_three.png


BIN
src/assets/images/proj2022/mobile/record_two.png


BIN
src/assets/images/proj2022/mobile/record_weiting.png


BIN
src/assets/images/proj2022/mobile/record_wt@2x.png


BIN
src/assets/images/proj2022/mobile/record_xt@2x.png


BIN
src/assets/images/proj2022/mobile/record_xuting.png


BIN
src/assets/images/proj2022/mobile/search_bg.png


BIN
src/assets/images/proj2022/mobile_bg.png


BIN
src/assets/images/proj2022/mobile_title.png


BIN
src/assets/images/proj2022/mobile_units.png


BIN
src/assets/images/proj2022/pc/clear.png


BIN
src/assets/images/proj2022/pc/musicoff.png


BIN
src/assets/images/proj2022/pc/musicon.png


BIN
src/assets/images/proj2022/pc/pause.png


BIN
src/assets/images/proj2022/pc/play.png


BIN
src/assets/images/proj2022/pc/reset@2x.png


BIN
src/assets/images/proj2022/pc_units.png


BIN
src/assets/images/proj2022/title.png


BIN
src/assets/images/project/project.zip


+ 7 - 7
src/assets/theme/color.less

@@ -5,28 +5,28 @@
 }
 
 .themexuting{
-  .theme(#298ADF,#EB7777)
+  .theme(#298ADF,#298ADF)
 }
 
 .themeone{
-  .theme(#BB2727,#89CC62)
+  .theme(#BB2727,#BB2727)
 }
 
 .themetwo{
-  .theme(#71C852,#77CBEB)
+  .theme(#71C852,#71C852)
 }
 
 .themethree{
-  .theme(#F9942F,#FEA45F)
+  .theme(#F9942F,#F9942F)
 }
 
 .themefour{
-  .theme(#14469D,#75D8CB)
+  .theme(#14469D,#14469D)
 }
 .themefive{
-  .theme(#FFCC00,#D13F4A)
+  .theme(#FFCC00,#FFCC00)
 }
 
 .themeweiting{
-  .theme(#298ADF,#D13F4A)
+  .theme(#298ADF,#298ADF)
 }

+ 38 - 17
src/assets/theme/theme.less

@@ -13,25 +13,28 @@
 
   .biankuang {
     position: relative;
-
-    &::before,
-    &::after {
-      background: linear-gradient(186deg, @backcolor 0%, rgba(0, 144, 255, 0) 100%);
-      content: "";
-      width: 100%;
-      height: 4px;
-      position: absolute;
-      top: 0;
-      right: 0;
-      z-index: 99;
+    &.active,&:hover{
+      &::before,
+      &::after {
+        background: linear-gradient(186deg, @backcolor 0%, rgba(0, 144, 255, 0) 100%);
+        content: "";
+        width: 100%;
+        height: 4px;
+        position: absolute;
+        top: 0;
+        right: 0;
+        z-index: 99;
+      }
+  
+      &::after {
+        content: "";
+        top: 4px;
+        height: 100%;
+        width: 4px;
+      }
     }
 
-    &::after {
-      content: "";
-      top: 4px;
-      height: 100%;
-      width: 4px;
-    }
+   
   }
 
   .slidee {
@@ -151,6 +154,24 @@
     }
   }
 
+  #drawer-container {
+    height: 220px;
+    #drawer {
+      height: 130px;
+      .frame-container {
+        background: linear-gradient(90deg, rgba(@backcolor,0.3) 0%, rgba(@backcolor, 0.56) 100%);
+        &::before {
+          content: "";
+          top: 0;
+          left: 0;
+          width: 100%;
+          height: 4px;
+          background: linear-gradient(211deg, @backcolor 0%,  rgba(@backcolor,0) 100%);
+          position: absolute;
+        }
+      }
+    }
+  }
 
   ::-webkit-scrollbar {
     width: 2px;

+ 38 - 26
src/components/bird_view/build.js

@@ -1,31 +1,43 @@
-import Vue from 'vue'
-import UIBirdView from './index.vue'
-
-
-let BirdView = Vue.extend(UIBirdView)
-
-
-var birdviewInstance = ''
-export function $showBirdView(data={}) {
-    if (birdviewInstance) {
-        return
-    }
-    birdviewInstance = new BirdView({
-        data
-    }).$mount()
-
-    document.body.appendChild(birdviewInstance.$el)
-
-    Vue.nextTick(() => {
-        birdviewInstance.show = true
-    })
+import Vue from "vue";
+import UIBirdView from "./index.vue";
+
+let BirdView = Vue.extend(UIBirdView);
+
+var birdviewInstance = "";
+export function $showBirdView(data = {}) {
+  if (birdviewInstance) {
+    return;
+  }
+  birdviewInstance = new BirdView({
+    data,
+  }).$mount();
+
+  document.body.appendChild(birdviewInstance.$el);
+
+  Vue.nextTick(() => {
+    window.parent.postMessage(
+      {
+        source: "mode.changed",
+        data: "birdview",
+      },
+      "*"
+    );
+    birdviewInstance.show = true;
+  });
 }
 
 export function $hideBirdView() {
-    if (birdviewInstance) {
-        document.body.removeChild(birdviewInstance.$el)
-        birdviewInstance = ''
+  if (birdviewInstance) {
+    document.body.removeChild(birdviewInstance.$el);
+    birdviewInstance = "";
+    if (window.player.mode == "panorama") {
+      window.parent.postMessage(
+        {
+          source: "mode.changed",
+          data: "panorama",
+        },
+        "*"
+      );
     }
+  }
 }
-
-

+ 57 - 14
src/components/bird_view/index.vue

@@ -1,33 +1,50 @@
 <template>
   <div class="birdview" :style="{ backgroundImage: `url(${require(`@/assets/images/proj2022/pc/birdviewbg.jpg`)})` }">
-    <img class="close" @click="close" :src="require('@/assets/images/proj2022/pc/cancel.png')" alt="" />
-    <img class="tag" @click="onClick(item)" v-for="(item, i) in themes" :key="i" :class="item.id" :src="require(`@/assets/images/proj2022/bird_view/${item.id}.png`)" alt="" />
+    <img v-if="!hideClose" class="close" @click="close" :src="require('@/assets/images/proj2022/pc/cancel.png')" alt="" />
+    <div class="tag" v-for="(item, i) in themes" :key="i" :class="item.id">
+      <img @click="onClick(item)" :src="require(`@/assets/images/proj2022/bird_view/${item.id}.png`)" alt="" />
+    </div>
   </div>
 </template>
 
 <script>
-import router from '@/router'
-
+import { region } from "@/data/raw.js";
 
 export default {
   data() {
     return {
       show: true,
+      hideClose: false,
+      themescene: "",
     };
   },
   methods: {
     close() {
       this.$hideBirdView();
     },
-    onClick(data){
-      router.push({
-        name:'scene',
-        params:{type:data.id,isjump:'yes'}
-      })
-      setTimeout(() => {
-        this.close()
-      }, 300);
-    }
+    onClick(data) {
+      let fn = () => {
+        let currentRegion = region.find((item) => item.id == data.id);
+        let { x, y, z, w } = currentRegion.firstView.panoQuaternion;
+        window.player.blackToPano({
+          pano: window.player.model.panos.index[currentRegion.firstView.panoId],
+          quaternion: new window.THREE.Quaternion(x, y, z, w),
+        });
+      };
+      if (window.player.mode != "panorama") {
+        window.player.director.changeMode("panorama").then(()=>{
+          fn();
+          setTimeout(() => {
+            this.close();
+          }, 300);
+        });
+      } else {
+        setTimeout(() => {
+          fn();
+          this.close();
+        }, 300);
+      }
+    },
   },
 };
 </script>
@@ -55,6 +72,22 @@ export default {
     position: absolute;
     max-width: 10%;
     cursor: pointer;
+    display: inline-block;
+    &::after {
+      pointer-events: none;
+      animation: highlight-move 3s infinite;
+      background: linear-gradient(90deg, hsla(0, 0%, 100%, 0) 0, hsla(0, 0%, 100%, 0.3) 50%, hsla(0, 0%, 100%, 0));
+      content: "";
+      height: 88%;
+      left: 0%;
+      position: absolute;
+      top: 0;
+      transform: skewX(-45deg);
+      width: 40%;
+    }
+    > img {
+      width: 100%;
+    }
   }
   .one {
     top: 48%;
@@ -73,7 +106,7 @@ export default {
     left: 47%;
   }
   .five {
-        top: 23%;
+    top: 23%;
     left: 37%;
   }
   .xuting {
@@ -85,4 +118,14 @@ export default {
     left: 30%;
   }
 }
+
+@keyframes highlight-move {
+  0% {
+    left: 0%;
+  }
+
+  100% {
+    left: 70%;
+  }
+}
 </style>

+ 21 - 7
src/components/hotspot/image.vue

@@ -21,17 +21,15 @@
   </div>
 
   <div v-else class="mbhotspot">
-    <img @click="$emit('close')" class="close" :src="require('@/assets/images/project/icon/close.png')" alt="" />
-
     <div class="mbhcon" :class="{ fullcon: !hotspot.content }">
       <div class="img-con">
-        <img class="aa" v-if="hotspot.images.length > 1" :src="require('@/assets/images/project/icon/hotspot_l.png')" alt="" @click="handlePage('prev')" />
+        <img class="aa" v-if="hotspot.images.length > 1" :src="require('@/assets/images/proj2022/mobile/prev.png')" alt="" @click="handlePage('prev')" />
         <div class="imgmain" >
           <img id="map" :src="g_fixUrl(hotspot.images[active])" alt="" />
         </div>
-        <img class="aa" :src="require('@/assets/images/project/icon/hotspot_r.png')" alt="" @click="handlePage('next')" />
+        <img class="aa"  v-if="hotspot.images.length > 1" :src="require('@/assets/images/proj2022/mobile/next.png')" alt="" @click="handlePage('next')" />
       </div>
-      <div class="desc">
+      <div class="desc" v-if="hotspot.title||hotspot.imagesDesc[active]">
         <div class="title" v-html="hotspot.title"></div>
         <div v-html="handleContent(hotspot.imagesDesc[active], 14)"></div>
       </div>
@@ -149,10 +147,11 @@ export default {
   width: 100%;
   height: 100%;
   position: fixed;
-  background: #000;
+  background: rgba(0, 0, 0, 0.5);
   left: 0;
   top: 0;
-  z-index: 999999;
+  backdrop-filter: blur(20px);
+  z-index: 9999;
   .close {
     position: absolute;
     top: 26px;
@@ -186,6 +185,21 @@ export default {
           max-width: 100%;
         }
       }
+       @pos: 14px;
+      .aa {
+        position: absolute;
+        width: 18px;
+        height: auto;
+        cursor: pointer;
+        top: 50%;
+        transform: translateY(-50%);
+        left: @pos;
+        z-index: 999;
+        &:last-of-type {
+          right: @pos;
+          left: unset;
+        }
+      }
     }
     .desc {
       overflow-y: auto;

+ 6 - 1
src/components/hotspot/index.vue

@@ -210,7 +210,7 @@ export default {
   padding: 15px;
   border-radius: 50%;
   cursor: pointer;
-  z-index: 99999;
+  z-index: 9999999;
   background: rgba(255, 255, 255, 0.1);
   > img {
     width: 20px;
@@ -220,5 +220,10 @@ export default {
 
 .mbhotspotcon {
   pointer-events: auto;
+  .close {
+    top: 10px;
+    right: 10px;
+    background: rgba(255, 255, 255, 0.0);
+  }
 }
 </style>

+ 4 - 9
src/components/hotspot/model.vue

@@ -32,12 +32,6 @@
   </div>
 
   <div v-else class="mbhotspot">
-    <img
-      @click="$emit('close')"
-      class="close"
-      :src="require('@/assets/images/project/icon/close.png')"
-      alt=""
-    />
     <div class="mbhcon">
       <div class="img-con">
         <img
@@ -64,7 +58,7 @@
         />
       </div>
 
-      <div class="desc">
+      <div class="desc"  v-if="hotspot.title||hotspot.contents[active]">
         <div class="title" v-html="hotspot.title"></div>
         <div v-html="handleContent(hotspot.contents[active], 14)"></div>
       </div>
@@ -117,10 +111,11 @@ export default {
   width: 100%;
   height: 100%;
   position: fixed;
-  background: #000;
+  background: rgba(0, 0, 0, 0.5);
   left: 0;
   top: 0;
-  z-index: 999999;
+  backdrop-filter: blur(20px);
+  z-index: 9999;
   .close {
     position: absolute;
     top: 26px;

+ 4 - 4
src/components/hotspot/video.vue

@@ -32,7 +32,6 @@
   </div>
 
   <div v-else class="mbhotspot">
-    <img @click="$emit('close')" class="close" :src="require('@/assets/images/project/icon/close.png')" alt="" />
     <div class="mbhcon">
       <div class="img-con">
         <img class="aa" v-if="hotspot.video.length > 1" :src="require('@/assets/images/project/icon/hotspot_l.png')" alt="" @click="handlePage('prev')" />
@@ -52,7 +51,7 @@
         <img class="aa" v-if="hotspot.video.length > 1" :src="require('@/assets/images/project/icon/hotspot_r.png')" alt="" @click="handlePage('next')" />
       </div>
 
-      <div class="desc">
+      <div class="desc" v-if="hotspot.title||hotspot.contents[active]">
         <div class="title" v-html="hotspot.title"></div>
         <div v-html="handleContent(hotspot.contents[active], 14)"></div>
       </div>
@@ -128,10 +127,11 @@ export default {
   width: 100%;
   height: 100%;
   position: fixed;
-  background: #000;
+  background: rgba(0, 0, 0, 0.5);
   left: 0;
   top: 0;
-  z-index: 999999;
+  backdrop-filter: blur(20px);
+  z-index: 9999;
   .close {
     position: absolute;
     top: 26px;

+ 41 - 41
src/data/booth.js

@@ -2,61 +2,63 @@ let Booth = [
   {
     id: "xuting",
     name: "序厅",
+    firstView: "&firstView=pano:0,qua:0.004201298516425423,0.6983405631424313,-0.004099157345704842,0.7157415805989583", //初始視角
     company: [
       {
         name: "序厅",
         img: "X-01.jpg", //封面
         id: "xt_1", //標識符 xt_1
-        firstView: "&firstView=pano:0,qua:0.0038368850860956783,0.7005042238404651,-0.003766324081784094,0.7136280054421932", //初始視角
+        firstView: "&firstView=pano:0,qua:0.004201298527209351,0.6983405615554751,-0.00409915733638964,0.7157415822254577", //初始視角
         panoId: "0", //对应点位id
       },
       {
-        name: "序厅",
+        name: "创业带动就业持续增长",
         img: "X-02.jpg", //封面
         id: "xt_2", //標識符 xt_1
-        firstView: "&firstView=pano:0,qua:0.04703409237505493,0.054704026765106585,-0.0025796848293629625,0.9973908972887784", //初始視角
-        panoId: "0", //对应点位id
+        firstView: "&firstView=pano:7,qua:0.0016618062354900175,0.9951116769505177,0.017001429620398033,-0.0972672777124245", //初始視角
+        panoId: "7", //对应点位id
       },
       {
-        name: "序厅",
+        name: "创新创业引领科技自立自强",
         img: "X-03.jpg", //封面
         id: "xt_3", //標識符 xt_1
-        firstView: "&firstView=pano:2,qua:0.11440616679987013,0.2658787186037442,-0.031796032212884046,0.9566654362543237", //初始視角
-        panoId: "2", //对应点位id
+        firstView: "&firstView=pano:6,qua:-0.0001696058448568209,0.9738949773788784,0.0007276645412913977,0.2269978391247142", //初始視角
+        panoId: "6", //对应点位id
       },
       {
-        name: "序厅",
+        name: "创新创业助力构建新发展结局",
         img: "X-04.jpg", //封面
         id: "xt_4", //標識符 xt_1
-        firstView: "&firstView=pano:3,qua:0.05977860601663899,0.21499112798433248,-0.013185522617189974,0.9746955802878524", //初始視角
-        panoId: "3", //对应点位id
+        firstView: "&firstView=pano:5,qua:0.00034539238583263524,0.9722015206464181,-0.0014341398040570643,0.2341410492889125", //初始視角
+        panoId: "5", //对应点位id
       },
       {
-        name: "序厅",
+        name: "吉祥物",
         img: "X-05.jpg", //封面
         id: "xt_5", //標識符 xt_1
-        firstView: "&firstView=pano:7,qua:0.0012662347281888807,0.9974540024503787,-0.01832967310663833,0.06890526167051911", //初始視角
-        panoId: "7", //对应点位id
+        firstView: "&firstView=pano:1,qua:-0.005740031249920988,-0.05586311126381863,-0.0003211628511652553,0.9984218915575973", //初始視角
+        panoId: "1", //对应点位id
       },
       {
-        name: "序厅",
+        name: "创新增动能 创业促就业",
         img: "X-06.jpg", //封面
         id: "xt_6", //標識符 xt_1
-        firstView: "&firstView=pano:6,qua:0.003688269638036607,0.9789261708588267,-0.01775023783567164,0.20340817612807627", //初始視角
-        panoId: "6", //对应点位id
+        firstView: "&firstView=pano:1,qua:0.0001016990481358776,0.3572133344097955,-0.000038894399154036935,0.9340228128281571", //初始視角
+        panoId: "1", //对应点位id
       },
       {
-        name: "序厅",
+        name: "大众创业 万众创新",
         img: "X-07.jpg", //封面
         id: "xt_7", //標識符 xt_1
-        firstView: "&firstView=pano:5,qua:0.00748617332798922,0.9754119733216533,-0.03354310808463041,0.21769310305312425", //初始視角
-        panoId: "5", //对应点位id
+        firstView: "&firstView=pano:4,qua:-0.004988960619255477,-0.71878611095915,-0.005158263903502507,0.6951942504027608", //初始視角
+        panoId: "4", //对应点位id
       },
     ],
   },
   {
     id: "one", //展区id,可以用拼音来作为id 如:展区a---zhanqu_a 
     name: "新业态拓展就业空间", //对应区域
+    firstView: "&firstView=pano:4,qua:-0.016484962519480128,0.7083437993857234,0.016551859736091593,0.7054809155529423", //初始視角
     company: [
       {
         name: "北大创新创业示范基地", //展项名
@@ -308,6 +310,7 @@ let Booth = [
   {
     id: "two",
     name: "新技术助力自立自强",
+    firstView: "&firstView=pano:28,qua:-0.0025227562096617204,0.7274944951689518,0.0026749474742033,0.6861036680499847", //初始視角
     company: [
       {
         name: "基于先进印刷制造的超薄柔性电池",
@@ -559,6 +562,7 @@ let Booth = [
   {
     id: "three",
     name: "新生态激发主体活力",
+    firstView: "&firstView=pano:54,qua:0.001379024148335344,0.7366686163278059,-0.0015022291805256197,0.676250845860994", //初始視角
     company: [
       {
         name: "智铸超云",
@@ -775,6 +779,7 @@ let Booth = [
   {
     id: "four",
     name: "新动能提升发展韧性",
+    firstView: "&firstView=pano:133,qua:0.00008715349787287117,0.9997454110555601,-0.022219891745382258,0.003921320376087155", //初始視角
     company: [
       {
         name: "蛮酷国产自动驾驶4D成像毫米波雷达",
@@ -1026,6 +1031,7 @@ let Booth = [
   {
     id: "five",
     name: "新模式促进共同富裕",
+    firstView: "&firstView=pano:180,qua:0.0012278773790903405,-0.7063726737557519,0.0012253354908840718,0.7078380020572562", //初始視角
     company: [
       {
         name: "薪火芳华——中国青年国潮品牌",
@@ -1242,55 +1248,49 @@ let Booth = [
   {
     id: "weiting",
     name: "尾厅",
+    firstView: "&firstView=pano:232,qua:0.005304150371975262,-0.672455648730051,0.004819339119823067,0.7401027159751582", //初始視角
     company: [
       {
         name: "尾厅",
         img: "W-01.jpg", //封面
         id: "weiting_1", //標識符
-        firstView: "&firstView=pano:233,qua:-0.011847751050887485,-0.6992249189332259,-0.011591061719473932,0.7147095774498183", //初始視角
+        firstView: "&firstView=pano:233,qua:0.032935357563790554,-0.6952698285316488,0.031924551167155014,0.7172837211926921", //初始視角
         panoId: "233", //对应点位id
       },
       {
-        name: "尾厅",
+        name: "大众创业",
         img: "W-02.jpg", //封面
         id: "weiting_2", //標識符
-        firstView: "&firstView=pano:234,qua:0.07181441634068843,-0.025826172872966423,0.0018601196323625015,0.997081857403339", //初始視角
+        firstView: "&firstView=pano:234,qua:0.055881184582540086,0.016122411799243987,-0.0009024674800377453,0.9983068377704948", //初始視角
         panoId: "234", //对应点位id
       },
       {
-        name: "尾厅",
+        name: "万众创新",
         img: "W-03.jpg", //封面
         id: "weiting_3", //標識符
-        firstView: "&firstView=pano:235,qua:0.12113748509466533,-0.013917683442338223,0.0016986304784258213,0.9925367161303704", //初始視角
-        panoId: "235", //对应点位id
+        firstView: "&firstView=pano:237,qua:0.029157914476751,0.03126976611715679,-0.0009125960534838575,0.9990851792454135", //初始視角
+        panoId: "237", //对应点位id
       },
       {
-        name: "尾厅",
+        name: "2015到2017",
         img: "W-04.jpg", //封面
         id: "weiting_4", //標識符
-        firstView: "&firstView=pano:236,qua:0.11447755308678383,-0.023153886815307428,0.0026688758344931567,0.9931523820308368", //初始視角
-        panoId: "236", //对应点位id
+        firstView: "&firstView=pano:234,qua:0.00013194738548272448,0.9970746390522521,-0.07641455196241369,0.001721679815712745", //初始視角
+        panoId: "234", //对应点位id
       },
       {
-        name: "尾厅",
+        name: "2018到2019",
         img: "W-05.jpg", //封面
         id: "weiting_5", //標識符
-        firstView: "&firstView=pano:236,qua:-0.004281232081605008,0.9941158778739673,-0.0994099179726458,-0.04281304030535029", //初始視角
-        panoId: "236", //对应点位id
+        firstView: "&firstView=pano:235,qua:-0.005119344726123866,0.9920579044680445,-0.04300679417817387,-0.11809033345326811", //初始視角
+        panoId: "235", //对应点位id
       },
       {
-        name: "尾厅",
+        name: "2020到2021",
         img: "W-06.jpg", //封面
         id: "weiting_6", //標識符
-        firstView: "&firstView=pano:235,qua:-0.0010871669588813685,0.9945936688345726,-0.10330872568687778,-0.010466582656841332", //初始視角
-        panoId: "235", //对应点位id
-      },
-      {
-        name: "尾厅",
-        img: "W-07.jpg", //封面
-        id: "weiting_7", //標識符
-        firstView: "&firstView=pano:234,qua:0.0000574358388387303,0.9937090733335692,-0.11199110841290948,0.0005096343171049693", //初始視角
-        panoId: "234", //对应点位id
+        firstView: "&firstView=pano:237,qua:0.00039591887032283457,0.9973898365381637,-0.07199498652455322,0.005484902034544629", //初始視角
+        panoId: "237", //对应点位id
       },
     ],
   },

+ 19 - 19
src/data/raw.js

@@ -18,12 +18,12 @@ let region = [
     company: [1, 2, 3], //序厅展位ID
     spread: calcuSpread(0, 7),
     firstView: {
-      panoId: "1",
+      panoId: "0",
       panoQuaternion: {
-        w: 0.7136848069310208,
-        x: -0.0019084363104157679,
-        y: 0.7004618967012249,
-        z: 0.0018730774187821193,
+        w: 0.004201298516425423,
+        x: 0.6983405631424313,
+        y: -0.004099157345704842,
+        z: 0.7157415805989583,
       },
     },
   },
@@ -66,12 +66,12 @@ let region = [
     ], //对应展位id
     spread: calcuSpread(8, 47),
     firstView: {
-      panoId: "8",
+      panoId: "4",
       panoQuaternion: {
-        w: 0.7248763745392001,
-        x: -0.00040960177911638973,
-        y: 0.6888787538646899,
-        z: 0.0003892608210995187,
+        w: -0.016484962519480128,
+        x: 0.7083437993857234,
+        y: 0.016551859736091593,
+        z: 0.7054809155529423,
       },
     },
   },
@@ -110,12 +110,12 @@ let region = [
     ], //展区二展位ID
     spread: calcuSpread(48, 97),
     firstView: {
-      panoId: "48",
+      panoId: "28",
       panoQuaternion: {
-        w: 0.7055175218180174,
-        x: 0.02856187266685435,
-        y: 0.7075371265076107,
-        z: -0.02864363447031339,
+        w: -0.0025227562096617204,
+        x:0.7274944951689518,
+        y: 0.0026749474742033,
+        z: 0.6861036680499847,
       },
     },
   },
@@ -155,7 +155,7 @@ let region = [
     ], //展区三展位ID
     spread: calcuSpread(98, 133),
     firstView: {
-      panoId: "95",
+      panoId: "57",
       panoQuaternion: {
         w: 0.7025372977959743,
         x: 0.03404281418995961,
@@ -205,7 +205,7 @@ let region = [
     ], //展区四展位ID
     spread: calcuSpread(134, 186),
     firstView: {
-      panoId: "134",
+      panoId: "133",
       panoQuaternion: {
         w: -0.3600515275002373,
         x: 0.0035370686330483685,
@@ -257,7 +257,7 @@ let region = [
     ], //展区五展位ID
     spread: calcuSpread(187, 232),
     firstView: {
-      panoId: "207",
+      panoId: "180",
       panoQuaternion: {
         w: 0.3502011027682601,
         x: 0.0028560994705540276,
@@ -280,7 +280,7 @@ let region = [
     ], //尾厅展位ID
     spread: calcuSpread(233, 237),
     firstView: {
-      panoId: "207",
+      panoId: "232",
       panoQuaternion: {
         w: 0.3502011027682601,
         x: 0.0028560994705540276,

+ 10 - 8
src/pages/Home.vue

@@ -2,12 +2,12 @@
   <div
     class="home"
     :style="{
-      backgroundImage: `url(${require('@/assets/images/project/bg.png')})`,
+      backgroundImage: `url(${require('@/assets/images/proj2022/bg.png')})`,
     }"
   >
     <div class="h-con">
       <div class="h-title">
-        <img :src="require('@/assets/images/project/title.png')" alt="" />
+        <img :src="require('@/assets/images/proj2022/title.png')" alt="" />
       </div>
       <!-- <ul>
         <li v-for="(item, i) in units" :key="i">
@@ -15,9 +15,11 @@
           <span>{{ item.val }}</span>
         </li>
       </ul> -->
-      <img class="tunits" :src="require('@/assets/images/project/pc_units.png')" alt="" />
+      <img class="tunits" :src="require('@/assets/images/proj2022/pc_units.png')" alt="" />
 
-      <img @click="$showBirdView()" class="h-btn" :src="require('@/assets/images/project/btn.png')" alt="" />
+      <img @click="$showBirdView({
+        hideClose:true
+      })" class="h-btn" :src="require('@/assets/images/project/btn.png')" alt="" />
     </div>
   </div>
 </template>
@@ -44,7 +46,7 @@ export default {
   background-position: bottom left;
 
   .h-con {
-    width: 72%;
+    width: 60%;
     margin: 0 auto;
     padding-top: 30px;
     color: #fff;
@@ -52,11 +54,11 @@ export default {
     .h-title {
       width: 100%;
       > img {
-        width: 100%;
+        width: 90%;
       }
     }
     .tunits {
-      width: 96%;
+      width: 98%;
       margin: 40px auto 0;
     }
     > ul {
@@ -78,7 +80,7 @@ export default {
       }
     }
     .h-btn {
-      margin: 50px auto 0;
+      margin: 8% auto 0;
       max-width: 298px;
       cursor: pointer;
     }

+ 16 - 7
src/pages/mobile.vue

@@ -2,21 +2,30 @@
   <div
     class="home"
     :style="{
-      backgroundImage: `url(${require('@/assets/images/mobile/bg.png')})`,
+      backgroundImage: `url(${require('@/assets/images/proj2022/mobile_bg.png')})`,
     }"
   >
     <div class="h-con">
       <div class="h-title">
-        <img :src="require('@/assets/images/mobile/title.png')" alt="" />
+        <img :src="require('@/assets/images/proj2022/mobile_title.png')" alt="" />
       </div>
-      <img class="tunits" :src="require('@/assets/images/mobile/mobile_units.png')" alt="" />
-      <img @click="$showBirdView()" class="h-btn" :src="require('@/assets/images/project/btn.png')" alt="" />
+      <img class="tunits" :src="require('@/assets/images/proj2022/mobile_units.png')" alt="" />
+      <img @click="showBirdview=true" class="h-btn" :src="require('@/assets/images/project/btn.png')" alt="" />
+      <birdview @close="showBirdview=false" v-if="showBirdview"/>
     </div>
   </div>
 </template>
 
 <script>
+import birdview from "./mobilescene/birdview/index.vue";
+
 export default {
+  components:{birdview},
+  data(){
+    return {
+      showBirdview:false
+    }
+  }
 };
 </script>
 
@@ -43,7 +52,7 @@ export default {
     }
     .tunits{
       width: 100%;
-      margin: 10px auto 0;
+      margin: 20px auto 0;
     }
     > ul {
         width: 100%;
@@ -64,8 +73,8 @@ export default {
       }
     }
     .h-btn{
-        margin: 0 auto;
-        max-width: 148px;
+        margin: 20px auto;
+        max-width: 168px;
         cursor: pointer;
     }
   }

+ 189 - 0
src/pages/mobilescene/birdview/ViewOperation.vue

@@ -0,0 +1,189 @@
+<template>
+  <div class="per-layout" ref="layout">
+    <div id="box" class="content" :style="contentStyle">
+      <slot />
+    </div>
+  </div>
+</template>
+
+<script>
+import {setGesture} from '@/utils'
+import browser from '@/utils/browser'
+
+const MAXSCALE = 1
+const MINSCALE = 1
+const RANGE = 0.1
+const wh = {width: window.innerHeight * (1920 / 1080), height: window.innerHeight}
+
+export default {
+  data () {
+    return {
+      wh,
+      width: wh.width,
+      height: wh.height,
+      tscale: 1,
+      translate: {
+        x: 0,
+        y: 0
+      },
+      isFireFox: browser.gecko,
+      ismobile: browser.mobile
+    }
+  },
+  computed: {
+    contentStyle () {
+      let tempW = Math.round(this.tscale * wh.width)
+      let tempH = Math.round(this.tscale * wh.height)
+
+      let val = `translateX(calc(-50% + ${this.translate.x}px))
+        translateY(calc(-50% + ${this.translate.y}px))
+        `
+      let width = `${tempW % 2 === 0 ? tempW : tempW + 1}px`
+      let height = `${tempH % 2 === 0 ? tempH : tempH + 1}px`
+      let top = `${Math.round(0.5 * wh.height)}px`
+      return {transform: val, width, height, top}
+    },
+    wLimit () {
+      return this.ismobile ? ((wh.width * Math.max(this.tscale, 1))) / 2 - window.innerWidth / 2 : ((wh.width * this.tscale) - wh.width) / 2
+    },
+    hLimit () {
+      return ((wh.height * this.tscale) - wh.height) / 2
+    }
+  },
+  watch: {
+    tscale () {
+      this.$emit('closeItem')
+      this.translate.x = Math.min(Math.max(this.translate.x, -this.wLimit), this.wLimit)
+      this.translate.y = Math.min(Math.max(this.translate.y, -this.hLimit), this.hLimit)
+    }
+  },
+  methods: {
+    readyMove (ev) {
+      // ev.preventDefault()
+      ev.stopPropagation()
+      let startX, startY
+      if (ev.screenX) {
+        startX = ev.screenX
+        startY = ev.screenY
+      } else {
+        startX = ev.touches[0].clientX
+        startY = ev.touches[0].clientY
+      }
+
+      let x = this.translate.x
+      let y = this.translate.y
+      let moveHandle = ev => {
+        let moveX, moveY
+        if (ev.screenX) {
+          moveX = ev.screenX
+          moveY = ev.screenY
+        } else {
+          moveX = ev.touches[0].clientX
+          moveY = ev.touches[0].clientY
+        }
+
+        this.translate.x = Math.min(Math.max((x + moveX - startX), -this.wLimit), this.wLimit)
+        this.translate.y = Math.min(Math.max((y + moveY - startY), -this.hLimit), this.hLimit)
+      }
+
+      let upHandle = () => {
+        document.removeEventListener('touchmove', moveHandle, { passive: false })
+        document.removeEventListener('touchend', upHandle)
+        document.removeEventListener('mousemove', moveHandle, { passive: false })
+        document.removeEventListener('mouseup', upHandle)
+      }
+
+      document.addEventListener('touchmove', moveHandle, { passive: false })
+      document.addEventListener('touchend', upHandle)
+      document.addEventListener('mousemove', moveHandle, { passive: false })
+      document.addEventListener('mouseup', upHandle)
+    },
+    scrollFunc  (e) {
+      e = e || window.event
+      let up = () => {
+        this.tscale < MAXSCALE && (this.tscale += RANGE)
+      }
+      let down = () => {
+        let scaleFuc = (y) => {
+          this.translate = {
+            x: 0,
+            y
+          }
+        }
+        this.tscale > MINSCALE && (this.tscale -= RANGE)
+        this.ismobile ? (this.tscale === 3 && scaleFuc(184)) : (this.tscale === 1 && scaleFuc(0))
+      }
+      if (this.isFireFox) {
+        switch (true) {
+          case e.detail > 0: // 当滑轮向下滚动时
+            down()
+            break
+          default:
+            up()
+            break
+        }
+      } else { // 判断浏览器IE,谷歌滑轮事件
+        switch (true) {
+          case e.wheelDelta > 0:// 当滑轮向上滚动时
+            up()
+            break
+          default:
+            down()
+            break
+        }
+      }
+    }
+  },
+  mounted () {
+    var box = document.querySelector('#box')
+
+    this.readyMove = this.readyMove.bind(this)
+    this.$refs.layout.addEventListener('mousedown', this.readyMove,  { capture: false })
+    this.$refs.layout.addEventListener('touchstart', this.readyMove,  { capture: false })
+    /* IE、Opera注册事件 */
+    if (document.attachEvent) {
+      box.attachEvent('onmousewheel', this.scrollFunc)
+    }
+    // Firefox使用addEventListener添加滚轮事件
+    if (document.addEventListener) { // firefox
+      box.addEventListener('DOMMouseScroll', this.scrollFunc, false)
+    }
+    // Safari与Chrome属于同一类型
+    window.onmousewheel = box.onmousewheel = this.scrollFunc
+
+    var boxGesture = setGesture(box) // 得到一个对象
+    boxGesture.gesturestart = function () { // 双指开始
+    }
+    boxGesture.gesturemove = () => { // 双指移动
+      // let temp = this.tscale + e.dec
+      // // this.tscale = Math.max(MINSCALE, Math.min(MAXSCALE, temp))
+      // this.tscale = temp < MAXSCALE ? temp : MAXSCALE
+      // this.tscale = temp > MINSCALE ? temp : MINSCALE
+    }
+    boxGesture.gestureend = function () { // 双指结束
+    }
+  },
+  beforeDestroy () {
+    this.$refs.layout.removeEventListener('mousedown', this.readyMove)
+    this.$refs.layout.removeEventListener('touchstart', this.readyMove)
+  }
+}
+</script>
+
+<style lang="less" scoped>
+.per-layout{
+  width: 100%;
+  height: 100%;
+  touch-action:none;
+}
+
+.content{
+  width: 120%;
+  will-change: transform;
+  position: relative;
+  left: 50%;
+  height: 100%;
+  touch-action:none;
+}
+
+</style>

+ 110 - 0
src/pages/mobilescene/birdview/index.vue

@@ -0,0 +1,110 @@
+<template>
+  <div class="birdview">
+    <ViewOperation>
+      <div class="birdcon">
+        <img class="bd_bg" :src="require(`@/assets/images/proj2022/pc/birdviewbg.jpg`)" alt="" />
+        <img
+          class="tag"
+          @click="onClick(item)"
+          v-for="(item, i) in themes"
+          :key="i"
+          :class="item.id"
+          :src="require(`@/assets/images/proj2022/bird_view/${item.id}.png`)"
+          alt=""
+        />
+      </div>
+    </ViewOperation>
+    <img v-if="!hideClose" class="close" @click="close" :src="require('@/assets/images/proj2022/pc/cancel.png')" alt="" />
+  </div>
+</template>
+
+<script>
+import ViewOperation from "./ViewOperation";
+
+export default {
+  props:['hideClose'],
+  data() {
+    return {};
+  },
+  components: {
+    ViewOperation,
+  },
+  methods: {
+    close() {
+      this.$emit("close");
+    },
+    onClick(data) {
+      console.log(data);
+      this.$router.replace({
+        name: "scene",
+        params: { type: data.id, isjump: "yes" },
+      });
+      setTimeout(() => {
+        this.close();
+      }, 300);
+    },
+  },
+  mounted() {},
+};
+</script>
+
+<style lang="less" scoped>
+.birdview {
+  position: fixed;
+  left: 0;
+  top: 0;
+  width: 100%;
+  height: 100%;
+  z-index: 9;
+  .close {
+    position: absolute;
+    right: 20px;
+    top: 20px;
+    cursor: pointer;
+    z-index: 99;
+  }
+  .birdcon {
+    height: 100%;
+    width: auto;
+    position: relative;
+    .bd_bg {
+      width: auto;
+      height: 100%;
+    }
+
+    .tag {
+      position: absolute;
+      max-width: 9%;
+      touch-action:none;
+    }
+    .one {
+      top: 49%;
+      left: 49%;
+    }
+    .two {
+      top: 41%;
+      left: 55%;
+    }
+    .three {
+      top: 35%;
+      left: 62%;
+    }
+    .four {
+      top: 18%;
+      left: 47%;
+    }
+    .five {
+      top: 26%;
+      left: 37%;
+    }
+    .xuting {
+      top: 54%;
+      left: 38%;
+    }
+    .weiting {
+      top: 35%;
+      left: 30%;
+    }
+  }
+}
+</style>

+ 8 - 16
src/pages/mobilescene/components/content.vue

@@ -1,11 +1,9 @@
 <template>
-  <div class="vcontent">
-    <img class="vcontentbg" :src="require(`@/assets/images/mobile/kuangti/liuyan.png`)" alt="">
-    <div class="brightness"></div>
+  <div class="vcontent" :style="{backgroundImage:`url(${require(`@/assets/images/proj2022/mobile/tab_shu@2x.png`)})`}">
     <div class="vcontentcon">
       <div class="cbody">
         <div class="ctitle">
-          <span>网友留言</span>
+          <span>留言</span>
           <span v-if="list.length>0">共{{list.length}}位网友参与留言</span>
           <span v-else>暂无留言</span>
         </div>
@@ -98,20 +96,13 @@ export default {
   width: @w;
   position: relative;
   height: 100%;
-  .vcontentbg{
-    width: @w;
-    position: absolute;
-    z-index: 999;
-    pointer-events: none;
-    bottom: 0;
-    left: 0;
-  }
+  background-size: 100% auto;
+  
   .vcontentcon{
     width: 100%;
     height: 100%;
     text-align: center;
-    padding: 20px 0 0;
-  
+    padding: 40px 0 0;
     .cbody{
       width: 100%;
       height: 100%;
@@ -122,9 +113,10 @@ export default {
         >span{
           display: block;
           &:first-of-type{
-            font-size: 18px;
-            font-weight: bold;
             margin-bottom: 2px;
+            font-family: "pangmen";
+            font-weight: normal;
+            font-size: 24px;
           }
           &:last-of-type{
             font-size: 12px;

+ 30 - 23
src/pages/mobilescene/components/daka.vue

@@ -1,10 +1,17 @@
 <template>
-  <div class="daka">
-    <img class="dakabg" :src="require(`@/assets/images/mobile/kuangti/daka_${theme}.png`)" alt="">
-    <div class="brightness"></div>
+  <div class="daka" :style="{backgroundImage:`url(${require(`@/assets/images/proj2022/mobile/tab_shu@2x.png`)})`}">
+    <!-- <svg height="100%" width="100%">
+      <defs>
+        <clipPath id="svgPathdaka">
+          <path d="M-2751.179,2279.686s49.026-22.606,177.873-5.622c91.091,10.425,144.131,7.4,198.023,5.622.445,22.27,0,653.688,0,653.688h-375.9Z" transform="translate(2751.377 -2178.5)"/>
+        </clipPath>
+      </defs>
+    </svg> -->
+
     <div class="dakacon">
       <h3>打卡</h3>
-      <div @click="daka" class="dakacir">
+      <div class="h3line"></div>
+      <div @click="daka" class="dakacccir" :style="{backgroundImage:`url(${require(`@/assets/images/proj2022/mobile/record_${theme}.png`)})`}">
         <span>打卡</span>
       </div>
       <div class="dakatitle">您正在游览</div>
@@ -82,34 +89,31 @@ export default {
   width: @w;
   height: 100%;
   position: relative;
-  .dakabg{
-    width: @w;
-    height: 100%;
-    position: relative;
-  }
-  .brightness{
-    position: absolute;
-    width: 100%;
-    height: 100%;
-    left: 0;
-    top: 0;
-    z-index: -1;
-  }
-  
+  background-size: 100% auto;
+  // backdrop-filter: blur(30px);
+  // clip-path: url(#svgPathdaka);
+
   .dakacon{
     position: absolute;
     top: 0;
     width: 100%;
     height: 100%;
     text-align: center;
-    padding: 20px 0 0;
+    padding: 40px 0 0;
     >h3{
+      font-family: "pangmen";
       font-weight: normal;
-      font-size: 16px;
+      font-size: 24px;
       position: absolute;
-      top: 20px;
+      top: 30px;
       left: 20px;
     }
+    .h3line{
+      width: 94%;
+      height: 1px;
+      background-color: rgba(255, 255, 255, 0.5);
+      margin: 30px auto 0;
+    }
     .dakatitle{
       font-size: 18px;
       margin-bottom: 10px;
@@ -118,11 +122,14 @@ export default {
       margin-bottom: 30px;
       font-size: 12px;
     }
-    @cirw:100px;
-    .dakacir{
+    @cirw:120px;
+    .dakacccir{
       width: @cirw;
       height: @cirw;
       margin: 50px auto 30px;
+      background-repeat: no-repeat;
+      background-size: cover;
+      position: relative;
       cursor: pointer;
       >span{
         position: absolute;

+ 10 - 10
src/pages/mobilescene/components/qrcode.vue

@@ -1,8 +1,5 @@
 <template>
-  <div class="qrcode">
-    <img class="qrcodebg" :src="require(`@/assets/images/mobile/kuangti/fenxiang.png`)" alt="">
-    <div class="brightness"></div>
-
+  <div class="qrcode" :style="{backgroundImage:`url(${require(`@/assets/images/proj2022/mobile/tab_shu@2x.png`)})`}">
     <div class="downloadQrcon">
       <qrcodetl v-if="tmpPano.id" :id="'qrpg_'+tmpPano.id" :data="tmpPano"/>
       <qrcodetl v-if="currentItem.id" :id="'qrpgc_'+currentItem.id" :data="currentItem"/>
@@ -32,15 +29,15 @@
           <p v-else></p>
           <div class="liimg">
             <img class="real" v-if="tmpImg" :src="tmpImg" alt="">
-            <img class="qrc" v-if="tmpPano.id" :src="require(`@/assets/images/project/qrcode/${tmpPano.id}.jpg`)" alt="" />
+            <img class="qrc" v-if="tmpPano.id" :src="require(`@/assets/images/project/qrcode/11.jpg`)" alt="" />
           </div>
         </div>
 
-        <div class="li" v-if="currentItem.id">
+        <div class="li">
           <p v-html="currentItem.name"></p>
           <div class="liimg">
             <img class="real" v-if="tmpcImg" :src="tmpcImg" alt="">
-            <img class="qrc" :src="require(`@/assets/images/project/qrcode/${currentItem.id}.jpg`)" alt="" />
+            <img class="qrc" :src="require(`@/assets/images/project/qrcode/11.jpg`)" alt="" />
           </div>
         </div>
       </div>
@@ -117,6 +114,8 @@ export default {
   width: @w;
   height: 100%;
   position: relative;
+  background-size: 100% auto;
+
   .downloadQrcon{
     position: fixed;
     top: 0;
@@ -134,13 +133,14 @@ export default {
     width: 100%;
     height: 100%;
     text-align: center;
-    padding: 20px 0 0;
+    padding: 40px 0 0;
     position: relative;
     >h3{
+      font-family: "pangmen";
       font-weight: normal;
-      font-size: 16px;
+      font-size: 24px;
       position: absolute;
-      top: 20px;
+      top: 30px;
       left: 20px;
     }
     .ctitle{

+ 199 - 86
src/pages/mobilescene/index.vue

@@ -1,38 +1,51 @@
 <template>
   <div :class="`theme${theme}`" class="scene-body">
-    <div class="logo">
-      <img :src="require(`@/assets/images/proj2022/pc/logo.png`)" alt="" />
+    <div class="logo" v-if="!showViewMode">
+      <img @click="$router.push({ path: '/' })" :src="require(`@/assets/images/proj2022/pc/logo.png`)" alt="" />
     </div>
     <div class="scene-con">
-      <!-- <vbar :showAside="showAside" v-if="!tourStatus" :name="currentItem.name" @showSearch="showSearch=true" @openAside="showAside=!showAside"></vbar> -->
-      <scene :tourStatus="tourStatus"/>
+      <scene :tourStatus="tourStatus" />
 
-      <vside :isShow="!tourStatus&&showAside" @close="showAside=false" />
-      <vmap  v-show="!tourStatus" />
-
-      <zhanxiang :currentZQ="currentZQ" v-if="isShowZL" @close="isShowZL=false" :tourStatus="tourStatus"/>
+      <div v-if="showViewMode">
+        <div :class="{ disabled: flying }" class="tab-layer">
+          <div class="tabs">
+            <div :class="{ active: mode === 'floorplan' }" @click="changeMode('floorplan', $event)">
+              <img :src="require('@/assets/images/proj2022/mobile/floor@2x.png')" alt="" />
+              <span>平面</span>
+            </div>
+            <div :class="{ active: mode === 'dollhouse' }" @click="changeMode('dollhouse', $event)">
+              <img :src="require('@/assets/images/proj2022/mobile/dollhouse@2x.png')" alt="" />
+              <span>三维</span>
+            </div>
+            <div :class="{ active: mode === 'birdview' }" @click="changeMode('birdview', $event)">
+              <img :src="require('@/assets/images/proj2022/mobile/bird view@2x.png')" alt="" />
+              <span>鸟瞰</span>
+            </div>
+          </div>
+        </div>
+      </div>
 
-      <rmenu :menuType="menuType" :tourStatus="tourStatus" @opencp="handlecp"/>
-      <vmenu :tourStatus="tourStatus" @opencp="handlecp" />
-      <vsearch :currentPanoid="currentPanoid" @closeSearch="showSearch=false" v-if="showSearch"/>
-  
+      <template v-else>
+        <vside :isShow="!tourStatus && showAside" @close="showAside = false" />
+        <zhanxiang @showSearch="showSearch = true" v-if="isShowZL" @close="isShowZL = false" :tourStatus="tourStatus" />
+        <rmenu :currentPanoid="currentPanoid" :isShowfunc="isShowfunc" :menuType="menuType" :tourStatus="tourStatus" @opencp="handlecp" />
+        <vmenu :tourStatus="tourStatus" @opencp="handlecp" />
+        <vsearch :currentPanoid="currentPanoid" @closeSearch="closeSearch" v-if="showSearch" />
+      </template>
     </div>
 
-    <vhotspot v-if="hotspot" @close="hotspot=''" :hotspot='hotspot'/>
+    <birdview :hideClose="true" @close="mode='',showViewMode=false" v-if="mode=='birdview'"/>
+
+    <vhotspot v-if="hotspot" @close="hotspot = ''" :hotspot="hotspot" />
     <vpopup v-if="showpopup && cp" v-clickoutside="handleoutside">
       <div slot="vcon" class="popcon">
         <component :is="cp" :currentPano="currentPano" :currentItem="currentItem"> </component>
-        <img
-          @click="(showpopup = false), (cp = '')"
-          class="close"
-          :src="require('@/assets/images/project/icon/close.png')"
-          alt=""
-        />
+        <img @click="(showpopup = false), (cp = '')" class="close" :src="require('@/assets/images/project/icon/close.png')" alt="" />
       </div>
     </vpopup>
 
     <div class="logincon" v-if="loginUrl">
-      <img class="close" @click="loginUrl=''" :src="require('@/assets/images/mobile/icon/close_b.png')" alt="" />
+      <img class="close" @click="loginUrl = ''" :src="require('@/assets/images/mobile/icon/close_b.png')" alt="" />
       <iframe :src="loginUrl" frameborder="0"></iframe>
     </div>
   </div>
@@ -45,6 +58,8 @@ import menu from "./menu.vue";
 import rmenu from "./raside/menu.vue";
 import zhanxiang from "./zhanxiang/index.vue";
 
+import birdview from "./birdview/index.vue";
+
 
 import popup from "./popup.vue";
 import vsearch from "./search";
@@ -57,7 +72,7 @@ import qrcode from "./components/qrcode.vue";
 import scene from "./scene.vue";
 import vhotspot from "@/components/hotspot/index.vue";
 
-import {region,Booth} from "@/data/raw.js";
+import { region, Booth } from "@/data/raw.js";
 
 export default {
   components: {
@@ -73,71 +88,77 @@ export default {
     vsearch,
     vhotspot,
     vbar,
-    vmap
+    vmap,
+    birdview
   },
-  computed:{
-    currentItem(){
-      return (this.themes.find(item=>item.id==this.theme));
+  computed: {
+    currentItem() {
+      return this.themes.find((item) => item.id == this.theme);
+    },
+    currentPano() {
+      return Booth.find((item) => item.panoId == this.currentPanoid) || {};
     },
-    currentPano(){
-      return Booth.find(item=>item.panoId==this.currentPanoid) || {}
-    }
   },
   data() {
     return {
-      menuType:'func',
+      menuType: "func",
+      isShowfunc: false,
       showpopup: false,
-      showAside:false,
-      showSearch:false,
-      isShowZL:false,
-      currentZQ:'',
+      showAside: false,
+      showSearch: false,
+      isShowZL: false,
       cp: "",
       tourStatus: false,
       showAll: false,
       currentPanoid: "",
       isFull: false,
       hotspots: [],
-      hotspot:'',
-      loginUrl:'',
-      currentTheme:'',
-      booth:Booth
+      hotspot: "",
+      loginUrl: "",
+      currentTheme: "",
+      booth: Booth,
+      showViewMode: false,
+      flying:false,
+      mode:'floorplan'
     };
   },
 
-  watch:{
-    currentTheme(newVal){
+  watch: {
+    currentTheme(newVal) {
       if (newVal) {
-        let tt = this.currentPanoid
-        this.currentPanoid = ''
-        this.$router.push({params:{type:newVal.id,isjump:'none'}})
+        let tt = this.currentPanoid;
+        this.currentPanoid = "";
+        this.$router.push({ params: { type: newVal.id, isjump: "none" } });
         setTimeout(() => {
           this.currentPanoid = tt;
         });
       }
-    }
+    },
   },
- 
+
   mounted() {
-    this.$showLoading()
+    this.$showLoading();
     this.$nextTick(() => {
-      this.$bus.$on('mblogin',data=>{
-        this.loginUrl = data
-      })
+      this.$bus.$on("mblogin", (data) => {
+        this.loginUrl = data;
+      });
 
-      this.$bus.$on('emitShowZX',data=>{
-        this.isShowZL = data.show
-        this.currentZQ = data.current
+      this.$bus.$on("emitShowZX", (data) => {
+        this.isShowZL = data;
+      });
 
-      })
+      this.$bus.$on("changeMenu", (data) => {
+        this.menuType = data;
+      });
 
-      this.$bus.$on('changeMenu',data=>{
-        this.menuType= data
-      })
+      this.$bus.$on("changeShowfunc", (data) => {
+        this.isShowfunc = data;
+      });
 
-      this.$bus.$on('opencp',data=>{
-        this.handlecp(data)
-        this.isShowZL=false
-      })
+      this.$bus.$on("opencp", (data) => {
+        this.handlecp(data);
+        this.isShowZL = false;
+      });
       window.addEventListener("message", (res) => {
         if (Object.prototype.toString.call(res.data) == "[object Object]") {
           let data = res.data.data;
@@ -148,35 +169,62 @@ export default {
           }
 
           if (res.data.source === "onplayStatus") {
-            console.log('onplayStatus');
+            console.log("onplayStatus");
             this.tourStatus = data.tourIsPlaying;
           }
 
           if (res.data.source === "pano.chosen") {
-            console.log('pano.chosen');
-              window.g_lock = true
+            console.log("pano.chosen");
+            window.g_lock = true;
           }
 
           if (res.data.source === "tour.end") {
-            window.g_lock = false
+            window.g_lock = false;
           }
 
+          if (res.data.source === "warp.interrupted") {
+            console.log("warp.interrupted");
+            window.g_lock = false;
+          }
 
-           if (res.data.source === "warp.interrupted") {
-            console.log('warp.interrupted');
-            window.g_lock = false
+          if (res.data.source === "mode.changed") {
+            console.log("mode.changed", data);
+            if (data == "floorplan" || data == "dollhouse") {
+              this.showViewMode = true;
+              this.flying = false;
+              this.mode = data
+              document.querySelector("#ifr").contentWindow.postMessage(
+                {
+                  source: "toggleClear",
+                  data: this.showViewMode,
+                },
+                "*"
+              );
+            } else if (data == "panorama") {
+              this.showViewMode = false;
+              this.flying = false;
+              document.querySelector("#ifr").contentWindow.postMessage(
+                {
+                  source: "toggleClear",
+                  data: this.showViewMode,
+                },
+                "*"
+              );
+            } else if (data == "transitioning") {
+              this.flying = true;
+            }
           }
 
           if (res.data.source === "flying.ended") {
-            console.log('flying.ended');
+            console.log("flying.ended");
             this.currentPanoid = data;
-            this.currentTheme = region.find(item=>{
-              if (item.spread.indexOf(Number(this.currentPanoid))>-1) {
-                return item
+            this.currentTheme = region.find((item) => {
+              if (item.spread.indexOf(Number(this.currentPanoid)) > -1) {
+                return item;
               }
-            })
+            });
             setTimeout(() => {
-              window.g_lock = false
+              window.g_lock = false;
             });
           }
 
@@ -186,19 +234,28 @@ export default {
           }
         }
       });
-
     });
   },
 
   methods: {
+    changeMode(data) {
+      this.mode = data
+      document.querySelector('#ifr').contentWindow.player.director.changeMode(data);
+    },
+    closeSearch(data) {
+      if (data == "closeAll") {
+        this.isShowZL = false;
+      }
+      this.showSearch = false;
+    },
     handlecp(data) {
       this.cp = data;
       this.showpopup = true;
     },
-    handleoutside(){
-      this.cp = '';
+    handleoutside() {
+      this.cp = "";
       this.showpopup = false;
-    }
+    },
   },
 };
 </script>
@@ -206,11 +263,67 @@ export default {
 <style lang="less" scoped>
 .scene-body {
   background-repeat: no-repeat;
+
+  .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: 30px;
+    pointer-events: none;
+    .tabs {
+      pointer-events: auto;
+      position: relative;
+      display: flex;
+      background: rgba(0, 0, 0, 0.5);
+      padding: 2px;
+      justify-content: center;
+      align-items: center;
+      border: 1px solid rgba(255, 255, 255, 0.1);
+      border-radius: 6px;
+      padding: 0px 2px;
+      backdrop-filter: blur(20px);
+      >div {
+        color: #fff;
+        border-radius: 6px;
+        font-size: 16px;
+        transition: all 0.3s ease;
+        display: flex;
+        align-items: center;
+        z-index: 1;
+        margin: 4px;
+        padding: 2px 6px 2px 0;
+        img {
+          width: 30px;
+        }
+        >span{
+          font-size: 14px;
+        }
+
+        &.active {
+          background: rgba(127, 127, 127, 0.57);
+          border-radius: 4px;
+        }
+      }
+
+    }
+  }
+
+  .disabled{
+    opacity: 0.5;
+    pointer-events: none;
+  }
+
   .scene-con {
     width: 100%;
     height: 100%;
   }
-   .logo {
+  .logo {
     position: absolute;
     left: 10px;
     top: 8px;
@@ -227,30 +340,30 @@ export default {
     height: 100%;
     .close {
       position: absolute;
-      top: 20px;
+      top: 40px;
       right: 20px;
       width: 16px;
       cursor: pointer;
       z-index: 1000;
     }
   }
-  .logincon{
+  .logincon {
     position: fixed;
     z-index: 999999;
     width: 100%;
     height: 100%;
     top: 0;
     left: 0;
-    >iframe{
+    > iframe {
       width: 100%;
       height: 100%;
     }
-    .close{
-        display: inline-block;
-        position: absolute;
-        right: 16px;
-        top: 16px;
-        width: 16px;
+    .close {
+      display: inline-block;
+      position: absolute;
+      right: 16px;
+      top: 16px;
+      width: 16px;
     }
   }
 }

+ 14 - 12
src/pages/mobilescene/map.vue

@@ -1,14 +1,12 @@
 <template>
-  <div class="mbmap" >
-    <div class="mapshow" v-if="isShow">
-      <div class="close" @click.stop="isShow=false">
+  <div class="mbmap">
+    <div class="mapshow cadmap" @click="onClickMap" v-if="isShow">
+      <div class="close" @click.stop="isShow = false">
         <img :src="require(`@/assets/images/proj2022/mobile/cancel@2x.png`)" alt="" />
       </div>
-      <div class="mapbig" @click="onClickMap">
-        <img :src="require(`@/assets/images/proj2022/mobile/map@2x.png`)" alt="" />
-      </div>
+      <div class="mapbig" :style="{ backgroundImage: `url(${require(`@/assets/images/proj2022/ditu.png`)})` }" ></div>
     </div>
-    <div class="mapthumb" @click="isShow=true" v-else>
+    <div class="mapthumb" @click="isShow = true" v-else>
       <img :src="require(`@/assets/images/proj2022/mobile/map@2x.png`)" alt="" />
     </div>
   </div>
@@ -22,9 +20,9 @@ export default {
     };
   },
   methods: {
-    onClickMap(){
-        document.querySelector('#ifr').contentWindow.player.director.changeMode('floorplan')
-    }
+    onClickMap() {
+      window.player.director.changeMode("floorplan");
+    },
   },
 };
 </script>
@@ -35,6 +33,7 @@ export default {
   right: 10px;
   top: 8px;
   overflow: hidden;
+  z-index: 999;
   .mapshow {
     width: 40vw;
     height: 120px;
@@ -61,10 +60,13 @@ export default {
         width: 12px;
       }
     }
-    .mapbig{
+    .mapbig {
       width: 100%;
       height: 100%;
-      background: rgba(0, 0, 0, 1);
+      background-size: auto 116%;
+      background-repeat: no-repeat;
+      background-position: center center;
+      background-color: rgba(0, 0, 0, 0.2);
     }
   }
   .mapthumb {

+ 5 - 4
src/pages/mobilescene/menu/exhibition.vue

@@ -30,10 +30,11 @@ export default {
 
   methods: {
     onClick(item) {
-      this.$bus.$emit("emitShowZX", {
-        show: true,
-        current: item.id,
-      });
+        this.$router.push({ params: { type: item.id, isjump: "yes" } });
+      // this.$bus.$emit("emitShowZX", {
+      //   show: true,
+      //   current: item.id,
+      // });
     },
   },
 };

+ 26 - 6
src/pages/mobilescene/menu/func.vue

@@ -1,9 +1,9 @@
 <template>
   <div class="btm-menu">
-    <img  @click.stop="$bus.$emit('changeMenu','exhibition')" :src="require(`@/assets/images/proj2022/mobile/menu@2x.png`)" alt="" />
+    <img @click.stop="$bus.$emit('changeMenu', 'exhibition')" :src="require(`@/assets/images/proj2022/mobile/menu@2x.png`)" alt="" />
     <ul>
       <li v-for="(item, i) in menu" :key="i">
-        <div :class="{ active: i == 3 }" @click="onClick(item)">
+        <div :class="{ active: (i == 3&&isShowHuDong) || (item.id == 'bgm' && isBgm) }" @click="onClick(item)">
           <img :src="require(`@/assets/images/proj2022/mobile/menu/${item.img}.png`)" alt="" />
           <span>{{ item.name }}</span>
         </div>
@@ -17,24 +17,24 @@ import { supCount, getsupCount } from "@/config/api";
 
 let menu = [
   {
-    id: "daka",
+    id: "xiangmu",
     name: "项目",
     img: "project",
     cp: "zhanxiang",
   },
   {
-    id: "content",
+    id: "daolan",
     name: "导览",
     img: "play",
     cp: "daolan",
   },
   {
-    id: "zan",
+    id: "bgm",
     img: "music",
     name: "音乐",
   },
   {
-    id: "qrcode",
+    id: "interaction",
     name: "互动",
     img: "interaction",
     cp: "hudong",
@@ -48,6 +48,7 @@ export default {
       goodNum: 1099,
       isShowGood: false,
       isBgm: false,
+      isShowHuDong: false,
     };
   },
   watch: {
@@ -58,6 +59,9 @@ export default {
         // !newVal ? this.$refs.vbgm.pause() : this.$refs.vbgm.play();
       },
     },
+    isShowHuDong(newVal){
+        this.$bus.$emit("changeShowfunc", newVal);
+    },
     tourStatus(newVal) {
       if (newVal) {
         this.isBgm = false;
@@ -71,6 +75,22 @@ export default {
   },
   methods: {
     onClick(item) {
+
+      if (item.id=='daolan') {
+        return
+      }
+      if (item.id == "xiangmu") {
+        this.$bus.$emit("emitShowZX", {
+          show: true,
+        });
+        return;
+      }
+
+      if (item.id == "interaction") {
+        this.isShowHuDong = !this.isShowHuDong
+        return;
+      }
+
       item.path && this.$router.push(item.path);
       item.cp && this.$bus.$emit("opencp", item.cp);
       if (item.id == "bgm") {

+ 0 - 1
src/pages/mobilescene/popup.vue

@@ -19,7 +19,6 @@ export default {
   width: 100%;
   z-index: 9999;
   height: 80%;
-  border-radius: 30px 30px 0 0;
   overflow: hidden;
 }
 </style>

+ 117 - 49
src/pages/mobilescene/raside/menu.vue

@@ -1,26 +1,92 @@
 <template>
   <div class="rmenu">
-    <ul v-if="menuType=='func'">
+    <ul v-if="menuType == 'func' && isShowfunc">
       <li :class="{ rmactive: isBgm && item.id == 'music' }" v-for="(item, i) in menu" :key="i">
-        <img
-          @click="onClick(item)"
-          :title="item.name"
-          :src="require(`@/assets/images/proj2022/mobile/menu/${item.img}.png`)"
-          alt=""
-        />
+        <img @click="onClick(item)" :title="item.name" :src="require(`@/assets/images/proj2022/mobile/menu/${item.img}.png`)" alt="" />
       </li>
     </ul>
     <div class="control">
-      <img :src="require(`@/assets/images/proj2022/mobile/up@2x.png`)" alt="">
-      <img :src="require(`@/assets/images/proj2022/mobile/down@2x.png`)" alt="">
+      <img @click.stop="onClickNavigate('up')" :src="require(`@/assets/images/proj2022/mobile/up@2x.png`)" alt="" />
+      <img @click.stop="onClickNavigate('down')" :src="require(`@/assets/images/proj2022/mobile/down@2x.png`)" alt="" />
     </div>
   </div>
 </template>
 
 <script>
+import { Booth } from "@/data/booth.js";
+import { g_findCloseNum } from "@/utils/index.js";
+
+let findNextItem = (arr, currentItem) => {
+  let idx = arr.findIndex((item) => item == currentItem);
+  if (idx == arr.length - 1) {
+    idx = 0;
+  } else {
+    idx += 1;
+  }
+
+  return arr[idx];
+};
+
+let findPrevItem = (arr, currentItem) => {
+  let idx = arr.findIndex((item) => item == currentItem);
+  if (idx == 0) {
+    idx = arr.length - 1;
+  } else {
+    idx -= 1;
+  }
+
+  return arr[idx];
+};
+
 export default {
-  props: ["tourStatus",'menuType'],
+  props: ["tourStatus", "menuType", 'isShowfunc', "currentPanoid"],
+  computed: {
+    nextZhanXiang() {
+      let zhanqu = Booth.find((item) => item.id === this.theme);
+      let panoArr = zhanqu.company.map((item) => item.panoId);
+      let currentIdx = panoArr.indexOf(this.currentPanoid);
+      let nextPanoItem = "";
+      if (currentIdx > -1) {
+        if (currentIdx == panoArr.length - 1) {
+          zhanqu = findNextItem(Booth, zhanqu);
+          nextPanoItem = zhanqu.company[0];
+        } else {
+          currentIdx += 1;
+          nextPanoItem = zhanqu.company[currentIdx];
+        }
+      } else {
+        let ttt = g_findCloseNum(
+          zhanqu.company.map((item) => item.panoId),
+          this.currentPanoid
+        );
+        nextPanoItem = zhanqu.company.find((item) => item.panoId == ttt);
+      }
+      return nextPanoItem;
+    },
 
+    prevZhanXiang() {
+      let zhanqu = Booth.find((item) => item.id === this.theme);
+      let panoArr = zhanqu.company.map((item) => item.panoId);
+      let currentIdx = panoArr.indexOf(this.currentPanoid);
+      let prevPanoItem = "";
+      if (currentIdx > -1) {
+        if (currentIdx == 0) {
+          zhanqu = findPrevItem(Booth, zhanqu);
+          prevPanoItem = zhanqu.company[0];
+        } else {
+          currentIdx -= 1;
+          prevPanoItem = zhanqu.company[currentIdx];
+        }
+      } else {
+        let ttt = g_findCloseNum(
+          zhanqu.company.map((item) => item.panoId),
+          this.currentPanoid
+        );
+        prevPanoItem = zhanqu.company.find((item) => item.panoId == ttt);
+      }
+      return prevPanoItem;
+    },
+  },
   data() {
     let bgmAudio = new Audio();
     bgmAudio.src = require(`@/assets/audio/bgm.mp3`);
@@ -31,30 +97,30 @@ export default {
       bgmAudio,
       isBgm: false,
       menu: [
-  {
-    id: "daka",
-    name: "打卡",
-    img:'record',
-    cp: "daka",
-  },
-  {
-    id: "content",
-    name: "评论",
-    img:'message',
-    cp: "vcontent",
-  },
-  {
-    id: "zan",
-    img:'like',
-    name: "点赞",
-  },
-  {
-    id: "qrcode",
-    name: "分享",
-    img:'share',
-    cp: "qrcode",
-  }
-]
+        {
+          id: "daka",
+          name: "打卡",
+          img: "record",
+          cp: "daka",
+        },
+        {
+          id: "content",
+          name: "评论",
+          img: "message",
+          cp: "vcontent",
+        },
+        {
+          id: "zan",
+          img: "like",
+          name: "点赞",
+        },
+        {
+          id: "qrcode",
+          name: "分享",
+          img: "share",
+          cp: "qrcode",
+        },
+      ],
     };
   },
   watch: {
@@ -99,21 +165,23 @@ export default {
     });
   },
   methods: {
-    onClick(item) {
-      if (item.id == "play") {
-        this.$emit("play");
-        return;
-      }
-      if (item.id == "clear") {
-        this.$bus.$emit("toggleClear", true);
-        return;
-      }
-
-      if (item.id == "music") {
-        this.isBgm = !this.isBgm;
-        localStorage.setItem("g_bgmstatus", this.isBgm ? "open" : "close");
+    onClickNavigate(type) {
+      if (type == "up") {
+        this.$bus.$emit("ifrMessage", {
+          events: "flyToPano",
+          data: this.nextZhanXiang,
+        });
+      } else {
+        this.$bus.$emit("ifrMessage", {
+          events: "flyToPano",
+          data: this.prevZhanXiang,
+        });
       }
     },
+    onClick(item) {
+      item.path && this.$router.push(item.path);
+      item.cp && this.$bus.$emit("opencp", item.cp);
+    },
   },
 };
 </script>
@@ -140,12 +208,12 @@ export default {
       }
     }
   }
-  .control{
+  .control {
     display: flex;
     flex-direction: column;
     width: 100%;
     margin-top: 20px;
-    >img{
+    > img {
       width: 100%;
       margin: 5px 0;
     }

+ 7 - 6
src/pages/mobilescene/scene.vue

@@ -43,12 +43,13 @@ export default {
   mounted() {
     let ifrWindow = this.$refs.ifr.contentWindow
     this.$bus.$on('ifrMessage',(data)=>{
-      if (data.events=='flyToPano') {
-          let { x, y, z, w } = data.data.panoQuaternion
-          ifrWindow.player.blackToPano({
-            pano: ifrWindow.player.model.panos.index[data.data.panoId],
-            quaternion: new ifrWindow.THREE.Quaternion(x, y, z, w),
-          });
+      if (data.events == "flyToPano") {
+        let panoQuat = data.data.firstView.split("qua:")[1];
+        let [x, y, z, w] = panoQuat.split(",");
+        ifrWindow.player.blackToPano({
+          pano: ifrWindow.player.model.panos.index[data.data.panoId],
+          quaternion: new ifrWindow.THREE.Quaternion(Number(x), Number(y), Number(z), Number(w)),
+        });
       }
 
       if (data.events=='toggleTour') {

+ 52 - 93
src/pages/mobilescene/search/index.vue

@@ -1,38 +1,26 @@
 <template>
   <div class="vsearch" @click.stop @keydown.stop @touchstart.stop>
-    <img
-      class="searchbg"
-      :src="require(`@/assets/images/mobile/scene_bg.png`)"
-      alt=""
-    />
+    <img class="searchbg" :src="require(`@/assets/images/proj2022/mobile/search_bg.png`)" alt="" />
     <div class="brightness"></div>
     <div class="vinput">
-      <img
-        @click="$emit('closeSearch')"
-        :src="require(`@/assets/images/project/icon/jiantoul.png`)"
-        alt=""
-      />
-      <div>
-        <img :src="require(`@/assets/images/project/icon/search.png`)" alt="" />
-        <input type="text" placeholder="请输入关键字…" v-model="key" />
-      </div>
-      <span>搜索</span>
+      <img @click.stop="$emit('closeSearch')" :src="require('@/assets/images/proj2022/mobile/left@2x.png')" alt="" />
+      <input v-model="key" type="text" placeholder="请输入项目名称..." />
+      <img :src="require('@/assets/images/proj2022/mobile/search@2x.png')" alt="" />
     </div>
     <div class="cpylist">
       <p>参展项目</p>
-      <ul v-if="region.length > 0">
-        <li v-for="(item, i) in region" :key="i">
-          <p v-if="item.company.length>0">{{ item.name }} <span v-html="item.desc"></span></p>
+      <ul v-if="booth.length > 0">
+        <li v-for="(item, i) in booth" :key="i">
+          <p v-if="item.company.length > 0">{{ item.name }} <span v-html="item.desc"></span></p>
           <ul>
             <li
               @click="handleItem(sub)"
               class="textActive"
-               :class="{active:currentPano.id==sub.id}"
+              :class="{ active: currentPano.id == sub.id }"
               v-for="(sub, idx) in item.company"
               :key="idx"
-               v-html="sub.name"
-            >
-            </li>
+              v-html="sub.name"
+            ></li>
           </ul>
         </li>
       </ul>
@@ -44,58 +32,42 @@
 </template>
 
 <script>
-import { Booth, region } from "@/data/raw";
+import { Booth } from "@/data/booth.js";
 
-let gregion = region.map((item) => {
-  let tmp = [];
-  item.company.forEach((sub) => {
-    let ii = Booth.find((son) => son.id == sub);
-    if (ii) {
-      tmp.push(ii);
-    }
-  });
-  let tt = tmp.filter((item) => item.mapId.indexOf("xt") <= -1);
-
-  item.company = tt;
-  return item;
-});
-
-console.log(gregion);
-
-let arr = [];
+let gregion = Booth.filter(item=>(item.id.indexOf('xuting')<=-1&&item.id.indexOf('weiting')<=-1))
 
 export default {
-  props:['currentPanoid'],
+  props: ["currentPanoid"],
   data() {
-    this.u_extend(arr, gregion);
+    // this.u_extend(arr, gregion);
     return {
       key: "",
-      region: arr,
-      formList:''
+      booth: gregion,
+      formList: "",
     };
   },
-  computed:{
-    currentPano(){
+  computed: {
+    currentPano() {
       if (this.formList) {
-        return Booth.find(item=>item.id==this.formList.id) || {}
+        return gregion.find((item) => item.id == this.formList.id) || {};
       }
-      return Booth.find(item=>item.panoId==this.currentPanoid) || {}
-    }
+      return gregion.find((item) => item.panoId == this.currentPanoid) || {};
+    },
   },
   watch: {
-    currentPanoid(newVal){
-      if(newVal != this.formList.panoId){
-        this.formList=''
+    currentPanoid(newVal) {
+      if (newVal != this.formList.panoId) {
+        this.formList = "";
       }
-      this.isShow=false
     },
     key(newVal) {
-      let tmpregion = [];
-      this.u_extend(tmpregion, gregion);
+      let tmpbooth = [];
+      console.log(newVal);
+      this.u_extend(tmpbooth, gregion);
       if (!newVal) {
-        this.region = tmpregion;
+        this.booth = tmpbooth;
       } else {
-        this.region = tmpregion.filter((item) => {
+        this.booth = tmpbooth.filter((item) => {
           item.company = item.company.filter((sub) => {
             if (sub.name.indexOf(newVal) > -1) {
               return sub;
@@ -110,17 +82,19 @@ export default {
   },
   methods: {
     handleItem(item) {
-      this.formList = item
+      this.formList = item;
       this.$bus.$emit("ifrMessage", {
         events: "flyToPano",
         data: item,
       });
-      this.$emit("closeSearch");
+      this.$emit('closeSearch','closeAll')
     },
   },
+  mounted() {},
 };
 </script>
 
+
 <style lang="less" scoped>
 ::-webkit-scrollbar {
   width: 2px;
@@ -146,12 +120,12 @@ export default {
   position: fixed;
   top: 0;
   left: 0;
-  z-index: 99999;
+  z-index: 999999;
   .searchbg {
     width: @w;
-    height: 100%;
+    height: auto;
     position: absolute;
-    top: 0;
+    bottom: 0;
     left: 0;
     z-index: -1;
   }
@@ -161,56 +135,41 @@ export default {
     }
   }
   .vinput {
+    height: 60px;
+    width: 100%;
+    background-color: rgba(0, 0, 0, 0.2);
+    backdrop-filter: blur(12px) brightness(100%);
     display: flex;
     justify-content: space-between;
     align-items: center;
-    padding: 10px 15px 0 10px;
-    width: 100%;
+    padding: 0 10px;
     > img {
-      cursor: pointer;
-      width: 30px;
-      padding: 5px 10px;
+      width: 50px;
       flex-shrink: 0;
-      margin-right: 10px;
     }
-    > div {
-      display: flex;
-      justify-content: flex-start;
-      align-items: center;
-      background-color: rgba(255, 255, 255, 0.2);
-      border-radius: 20px;
-      overflow: hidden;
-      padding: 0 10px;
+    > input {
+      justify-self: flex-start;
+      text-align: left;
       flex: auto;
-      > input {
-        line-height: 35px;
-        height: 35;
-        width: 80%;
-        margin-left: 10px;
-        color: #fff;
-      }
-      > img {
-        width: 20px;
+      font-size: 20px;
+      height: 100%;
+      &::placeholder {
+        color: rgba(255, 255, 255, 0.5);
       }
     }
-    > span {
-      display: inline-block;
-      margin-left: 10px;
-      flex-shrink: 0;
-      min-width: 30px;
-    }
   }
   .cpylist {
     padding: 25px 30px 0 44px;
     height: 100%;
     > p {
-      font-size: 16px;
+      font-size: 20px;
       padding: 0 10px;
     }
     > ul {
       max-height: calc(100% - 110px);
       overflow-y: auto;
       padding: 0 15px 0;
+      font-size: 16px;
 
       > li {
         margin: 18px 0;
@@ -218,7 +177,7 @@ export default {
           margin-bottom: 0;
         }
         > p {
-          font-size: 16px;
+          font-size: 18px;
           font-weight: bold;
         }
         > ul {

+ 21 - 15
src/pages/mobilescene/zhanxiang/index.vue

@@ -2,14 +2,14 @@
   <div class="zhanxiang">
     <div class="z-bar">
       <img @click.stop="$emit('close')" :src="require('@/assets/images/proj2022/mobile/left@2x.png')" alt="" />
-      <input v-model="searchkey" type="text" placeholder="请输入项目名称..." />
+      <span @click.stop="search">请输入项目名称...</span>
       <img @click.stop="search" :src="require('@/assets/images/proj2022/mobile/search@2x.png')" alt="" />
     </div>
 
     <div class="zhan-con" ref="bgsw" v-swiper:mySwiper="swiperOptions">
       <ul class="swiper-wrapper">
-        <li class="swiper-slide" v-for="(item, i) in zhanxiangData.company" :key="i">
-          <img :src="`zhanxiang/images/${currentZQ}/${item.img}`" alt="" />
+        <li @click="onClick(item)" class="swiper-slide" v-for="(item, i) in zhanxiangData.company" :key="i">
+          <img :src="`zhanxiang/images/${theme}/${item.img}`" alt="" />
           <div>
             <h3>{{ zhanxiangData.name }}</h3>
             <span v-html="item.name"></span>
@@ -27,7 +27,6 @@ import "swiper/css/swiper.css";
 import { Booth } from "@/data/booth.js";
 
 export default {
-  props:['currentZQ'],
   data(){
     return{
       searchkey:''
@@ -38,11 +37,21 @@ export default {
       this.swiper.slideNext();
     },
     back() {
-      this.$bus.$emit("toggleShowZX", false);
+      this.$bus.$emit("emitShowZX", {
+          show: false,
+        });
+    },
+    onClick(data){
+      this.$bus.$emit('ifrMessage',{
+        events:'flyToPano',
+        data:data
+      })
+      this.$emit('close')
     },
     search() {
-      let idx = this.zhanxiangData.company.findIndex((item) => item.name.indexOf(this.searchkey) > -1)
-      this.swiper.slideToLoop(idx);
+      this.$emit('showSearch',true)
+      // let idx = this.zhanxiangData.company.findIndex((item) => item.name.indexOf(this.searchkey) > -1)
+      // this.swiper.slideToLoop(idx);
     },
   },
   directives: {
@@ -53,14 +62,14 @@ export default {
       return this.$refs.bgsw.swiper;
     },
     zhanxiangData() {
-      return Booth.find((item) => item.id == this.currentZQ);
+      return Booth.find((item) => item.id == this.theme);
     },
     swiperOptions() {
       return {
         watchSlidesProgress: true,
         slidesPerView: "auto",
         centeredSlides: true,
-        loop: this.zhanxiangData.length> 5,
+        loop: false,
         on: {
           progress: function() {
             for (let i = 0; i < this.slides.length; i++) {
@@ -124,15 +133,12 @@ export default {
       width: 50px;
       flex-shrink: 0;
     }
-    > input {
-      justify-self: flex-start;
+    > span {
       text-align: left;
+      display: inline-block;
       flex: auto;
       font-size: 20px;
-      height: 100%;
-      &::placeholder {
-        color: rgba(255, 255, 255, 0.5);
-      }
+      color: rgba(255, 255, 255, 0.5);
     }
   }
 

+ 1 - 3
src/pages/scene/aside.vue

@@ -14,7 +14,7 @@
         </div>
 
         <div class="txtcon">
-          <span class="tag">{{ item.name }}</span>
+          <span class="tag">{{ item.short }}</span>
           <span class="text" :title="item.desc || item.name">{{ item.desc || item.name }}</span>
         </div>
       </li>
@@ -74,9 +74,7 @@ export default {
       this.$bus.$emit("toggleShowZX", true);
     },
     handleChange(item) {
-      if (!window.g_lock) {
         this.$router.push({ params: { type: item.id, isjump: "yes" } });
-      }
     },
     handleHover(data) {
       this.hoverName = data.name;

+ 1 - 0
src/pages/scene/components/daka.vue

@@ -16,6 +16,7 @@
       <div class="innercon" :style="{backgroundImage:`url(${require(`@/assets/images/proj2022/pc/bg_r_s.png`)})`}">
         <div class="dakatitle">您正在游览</div>
         <p>{{ currentItem.name }}</p>
+        <p>{{ currentItem.desc }}</p>
         <div @click="daka" class="dakacccir" :style="{backgroundImage:`url(${require(`@/assets/images/proj2022/pc/record_${theme}.png`)})`}">
           <span>打卡</span>
         </div>

+ 2 - 0
src/pages/scene/components/qrcode.vue

@@ -34,10 +34,12 @@
           </template>
           <p v-else></p>
           <!-- <img v-if="tmpPano.id" :src="require(`@/assets/images/project/qrcode/${tmpPano.id}.jpg`)" alt="" /> -->
+          <img :src="require(`@/assets/images/project/qrcode/11.jpg`)" alt="" />
           <div @click="download(tmpPano.id, 'qrpg_')" class="download">下载二维码</div>
         </div>
 
         <div class="li" v-if="currentItem.id">
+          <img :src="require(`@/assets/images/project/qrcode/11.jpg`)" alt="" />
           <p v-html="currentItem.name"></p>
           <div @click="download(currentItem.id, 'qrpgc_')" class="download">下载二维码</div>
         </div>

+ 61 - 36
src/pages/scene/index.vue

@@ -1,25 +1,29 @@
 <template>
   <div :class="`theme${theme}`" class="scene-body">
-    <div class="logo">
+    <div class="logo" @click="$router.push({path:'/'})">
       <img :src="require(`@/assets/images/proj2022/pc/logo.png`)" alt="" />
       <span>大众创业万众创新</span>
     </div>
 
     <div class="scene-con" :class="{ showscene: showAll }">
-      <vside
-        @currentPano="
-          (data) => {
-            currentPano = data;
-          }
-        "
-        v-show="!tourStatus && !isClear"
-        :currentPanoid="currentPanoid"
-      />
-      <vmenu :currentPanoid="currentPanoid" v-show="!tourStatus && !isClear" :tourStatus="tourStatus" @opencp="handlecp" />
-      <zhanxiang :currentPanoid="currentPanoid" v-show="!tourStatus && !isClear" :zxdata="zhanxiangData" :class="{zxshow:isShowZX}"/>
+      <!-- <template v-if="!showViewMode&&!tourStatus"> -->
+        <vside
+          @currentPano="
+            (data) => {
+              currentPano = data;
+            }
+          "
+          v-show="!tourStatus && !isClear"
+          :currentPanoid="currentPanoid"
+        />
+        <vmenu :currentPanoid="currentPanoid" v-show="!tourStatus && !isClear" :tourStatus="tourStatus" @opencp="handlecp" />
+        <zhanxiang :currentPanoid="currentPanoid" v-show="!tourStatus && !isClear" :zxdata="zhanxiangData" :class="{ zxshow: isShowZX }" />
+
+        <img v-if="isClear" @click.stop="clicktoClear" class="isClear" :src="require('@/assets/images/proj2022/pc/reset@2x.png')" alt="" />
+      <!-- </template> -->
+
       <scene v-if="showScene" />
     </div>
-    
 
     <vhotspot v-if="hotspot" @close="hotspot = ''" :hotspot="hotspot" />
     <vpopup v-if="showpopup && cp" v-clickoutside="handleoutside">
@@ -41,8 +45,6 @@ import popup from "./popup.vue";
 import vsearch from "./search";
 import zhanxiang from "./zhanxiang";
 
-
-
 import daka from "./components/daka.vue";
 import content from "./components/content.vue";
 import qrcode from "./components/qrcode.vue";
@@ -53,7 +55,6 @@ import vhotspot from "@/components/hotspot/index.vue";
 import { region } from "@/data/raw.js";
 import { Booth } from "@/data/booth.js";
 
-
 let exitFullscreen = function() {
   document.exitFullscreen
     ? document.exitFullscreen()
@@ -100,7 +101,8 @@ export default {
       hotspots: [],
       hotspot: "",
       currentTheme: "",
-      isShowZX:true
+      isShowZX: true,
+      showViewMode: false,
     };
   },
   computed: {
@@ -108,7 +110,7 @@ export default {
       return this.themes.find((item) => item.id == this.theme);
     },
     zhanxiangData() {
-      return Booth.find(item=>item.id==this.theme)
+      return Booth.find((item) => item.id == this.theme);
     },
   },
 
@@ -123,11 +125,11 @@ export default {
         });
       }
     },
-    cp(newVal){
-      if(newVal){
-        this.$bus.$emit('toggleShowZX',false)
+    cp(newVal) {
+      if (newVal) {
+        this.$bus.$emit("toggleShowZX", false);
       }
-    }
+    },
   },
 
   mounted() {
@@ -137,9 +139,9 @@ export default {
         this.isClear = data;
       });
 
-      this.$bus.$on('toggleShowZX',data=>{
-        this.isShowZX = data
-      })
+      this.$bus.$on("toggleShowZX", (data) => {
+        this.isShowZX = data;
+      });
 
       window.addEventListener("message", (res) => {
         if (Object.prototype.toString.call(res.data) == "[object Object]") {
@@ -147,14 +149,24 @@ export default {
           if (res.data.source === "showAll") {
             this.showAll = true;
             this.$hideLoading();
-            document.querySelector('#ifr').contentWindow.postMessage(
+            document.querySelector("#ifr").contentWindow.postMessage(
               {
                 source: "changeTheme",
                 data: this.theme,
               },
               "*"
             );
-            
+          }
+
+          if (res.data.source === "mode.changed") {
+            console.log("mode.changed", data);
+            if (data == "floorplan" || data == "birdview"|| data == "dollhouse") {
+              this.showViewMode = true;
+            } else if (data == "panorama") {
+              this.showViewMode = false;
+            } else if (data == "transitioning") {
+              this.flying = true;
+            }
           }
 
           if (res.data.source === "onplayStatus") {
@@ -162,12 +174,6 @@ export default {
             this.tourStatus = data.tourIsPlaying;
           }
 
-          if (res.data.source === "input.start") {
-            if (this.isClear) {
-              this.isClear = false;
-            }
-          }
-
           if (res.data.source === "pano.chosen") {
             console.log("pano.chosen");
             window.g_lock = true;
@@ -198,7 +204,7 @@ export default {
 
           if (res.data.source === "openHotspot") {
             this.hotspot = data;
-            console.log(data,'openHotspot');
+            console.log(data, "openHotspot");
             this.$bus.$emit("isShowAside", false);
           }
         }
@@ -219,6 +225,16 @@ export default {
     $(document).on("fullscreenchange webkitfullscreenchange mozfullscreenchange MSFullscreenChange");
   },
   methods: {
+    clicktoClear() {
+      this.isClear = false;
+      document.querySelector("#ifr").contentWindow.postMessage(
+        {
+          source: "toggleClear",
+          data: false,
+        },
+        "*"
+      );
+    },
     handleFull() {
       if (this.isFull) {
         exitFullscreen();
@@ -234,7 +250,7 @@ export default {
     handleoutside() {
       this.cp = "";
       this.showpopup = false;
-      this.$bus.$emit('resetMenuActive')
+      this.$bus.$emit("resetMenuActive");
     },
   },
 };
@@ -264,6 +280,14 @@ export default {
   .scene-con {
     width: 100%;
     height: 100%;
+    .isClear {
+      position: absolute;
+      right: 20px;
+      bottom: 20px;
+      z-index: 99;
+      width: 58px;
+      cursor: pointer;
+    }
     .vright {
       position: absolute;
       right: 10px;
@@ -288,8 +312,9 @@ export default {
         }
       }
     }
-    .zxshow{
+    .zxshow {
       left: 0;
+      opacity: 1;
     }
   }
   .popcon {

+ 1 - 1
src/pages/scene/menu.vue

@@ -236,7 +236,7 @@ export default {
   .smenu {
     bottom: 22px;
     right: 15px;
-    position: absolute;
+    position: fixed;
     transition: 0.3s ease all;
     > ul {
       background-repeat: no-repeat;

+ 13 - 5
src/pages/scene/raside/map.vue

@@ -4,7 +4,7 @@
       <div class="cadmap" >
         <div class="cadtu" :style="{backgroundImage:`url(${require(`@/assets/images/proj2022/ditu.png`)})`}"></div>
       </div>
-      <ul>
+      <ul :class="{ disabled: flying }">
         <li @click="onclick(item)" v-for="(item, i) in list" :key="i">
           <img :title="item.name" :src="require(`@/assets/images/proj2022/pc/${item.icon}.png`)" alt="" />
           <span>{{ item.name }}</span>
@@ -13,7 +13,7 @@
     </div>
 
     <div class="draw" @click="isShow = !isShow">
-      <img :src="require(`@/assets/images/proj2022/pc/mapline_${themescene}.png`)" alt="" />
+      <img class="draw_bg" :src="require(`@/assets/images/proj2022/pc/mapline_${themescene}.png`)" alt="" />
       <img class="jiantou" :src="require(`@/assets/images/proj2022/pc/jiantou${!isShow ? 'l' : 'r'}.png`)" alt="" />
     </div>
   </div>
@@ -21,7 +21,7 @@
 
 <script>
 export default {
-  props: ["themescene"],
+  props: ["themescene",'flying'],
   data() {
     return {
       isShow: true,
@@ -49,7 +49,9 @@ export default {
       if (item.id != "bird_view") {
        window.player.director.changeMode(item.id);
       } else {
-        this.$showBirdView();
+        this.$showBirdView({
+          themescene:this.themescene
+        });
       }
     },
   },
@@ -94,7 +96,7 @@ export default {
         height: 100%;
         background-size: auto 116%;
         background-repeat: no-repeat;
-        background-position: -50% center;
+        background-position: -9% center;
       }
     }
     > ul {
@@ -121,6 +123,10 @@ export default {
         }
       }
     }
+    .disabled{
+      opacity: 0.5;
+      pointer-events: none;
+    }
   }
 
   .draw {
@@ -134,6 +140,8 @@ export default {
     top: 0;
     padding-left: 4px;
     backdrop-filter: blur(7px) brightness(55%);
+    text-align: left;
+  
     .jiantou {
       position: absolute;
       top: 50%;

+ 9 - 2
src/pages/scene/raside/rmenu.vue

@@ -14,7 +14,7 @@
 <script>
 export default {
   props: ["tourStatus"],
-  
+
   data() {
     let bgmAudio = new Audio();
     bgmAudio.src = require(`@/assets/audio/bgm.mp3`);
@@ -65,7 +65,6 @@ export default {
     },
   },
   mounted() {
-
     this.isBgm = true;
     localStorage.setItem("g_bgmstatus", this.isBgm ? "open" : "close");
 
@@ -96,6 +95,14 @@ export default {
       }
       if (item.id == "clear") {
         this.$bus.$emit("toggleClear", true);
+
+        document.querySelector("#ifr").contentWindow.postMessage(
+          {
+            source: "toggleClear",
+            data: true,
+          },
+          "*"
+        );
         return;
       }
 

+ 0 - 3
src/pages/scene/scene.vue

@@ -38,9 +38,6 @@ export default {
       if (data.events == "flyToPano") {
         let panoQuat = data.data.firstView.split("qua:")[1];
         let [x, y, z, w] = panoQuat.split(",");
-        console.log(x, y, z, w);
-        console.log(new ifrWindow.THREE.Quaternion(x, y, z, w));
-
         ifrWindow.player.blackToPano({
           pano: ifrWindow.player.model.panos.index[data.data.panoId],
           quaternion: new ifrWindow.THREE.Quaternion(Number(x), Number(y), Number(z), Number(w)),

+ 7 - 5
src/pages/scene/search/index.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="vsearch">
     <div class="vinput" @click.stop @keydown.stop @touchstart.stop>
-      <input type="text" placeholder="请输入关键字…" v-model="key" />
+      <input type="text" placeholder="请输入项目名称…" v-model="key" />
       <img @click="$emit('close')" :src="require(`@/assets/images/proj2022/pc/cancel_btn.png`)" alt="" />
     </div>
     <div class="cpylist">
@@ -31,22 +31,24 @@
 <script>
 import { Booth } from "@/data/booth.js";
 
+let gregion = Booth.filter(item=>(item.id.indexOf('xuting')<=-1&&item.id.indexOf('weiting')<=-1))
+
 export default {
   props: ["currentPanoid"],
   data() {
     // this.u_extend(arr, gregion);
     return {
       key: "",
-      booth: Booth,
+      booth: gregion,
       formList: "",
     };
   },
   computed: {
     currentPano() {
       if (this.formList) {
-        return Booth.find((item) => item.id == this.formList.id) || {};
+        return gregion.find((item) => item.id == this.formList.id) || {};
       }
-      return Booth.find((item) => item.panoId == this.currentPanoid) || {};
+      return gregion.find((item) => item.panoId == this.currentPanoid) || {};
     },
   },
   watch: {
@@ -58,7 +60,7 @@ export default {
     key(newVal) {
       let tmpbooth = [];
       console.log(newVal);
-      this.u_extend(tmpbooth, Booth);
+      this.u_extend(tmpbooth, gregion);
       if (!newVal) {
         this.booth = tmpbooth;
       } else {

+ 40 - 22
src/pages/scene/zhanxiang/index.vue

@@ -5,14 +5,16 @@
     <div class="www" ref="bgsw" v-swiper:mySwiper="swiperOptions">
       <ul class="swiper-wrapper">
         <li
-          class="swiper-slide"
-          :class="{ biankuang: item.panoId == currentPanoid }"
+          class="swiper-slide biankuang"
+          :class="{ active: item.panoId == currentPanoid }"
           :style="{ backgroundImage: `url(zhanxiang/images/${theme}/${item.img})` }"
           v-for="(item, i) in zxdata.company"
           @click="onClick(item)"
           :key="i"
         >
-          <span >{{item.name}}</span>
+          <div class="name">
+            <span>{{ item.name }}</span>
+          </div>
           <i>{{ i + 1 }}</i>
           <div class="mask"></div>
         </li>
@@ -29,34 +31,34 @@ import { directive } from "vue-awesome-swiper";
 import "swiper/css/swiper.css";
 
 export default {
-  props:['zxdata','currentPanoid'],
+  props: ["zxdata", "currentPanoid"],
   methods: {
-    nextsw(){
+    nextsw() {
       this.swiper.slideNext();
     },
-    back(){
-      this.$bus.$emit('toggleShowZX',false)
+    back() {
+      this.$bus.$emit("toggleShowZX", false);
+    },
+    onClick(data) {
+      this.$bus.$emit("ifrMessage", {
+        events: "flyToPano",
+        data: data,
+      });
     },
-    onClick(data){
-      this.$bus.$emit('ifrMessage',{
-        events:'flyToPano',
-        data:data
-      })
-    }
   },
   directives: {
     swiper: directive,
   },
-  
+
   computed: {
     swiper() {
       return this.$refs.bgsw.swiper;
     },
     swiperOptions() {
       return {
-        slidesPerView: 'auto',
+        slidesPerView: "auto",
         spaceBetween: 10,
-        freeMode: true
+        freeMode: true,
       };
     },
   },
@@ -71,13 +73,14 @@ export default {
   z-index: 9999;
   height: 164px;
   width: 100%;
+  opacity: 0;
   background-size: 100% 100%;
   background-repeat: no-repeat;
   background-position-y: 6px;
   display: flex;
   justify-content: flex-end;
   align-items: center;
-  transition: .3s ease all;
+  transition: 0.3s ease all;
   pointer-events: none;
   .back {
     margin-right: 80px;
@@ -110,22 +113,37 @@ export default {
           left: 0;
           top: 0;
           pointer-events: none;
-          background: linear-gradient(180deg, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.8) 100%);
+          background: linear-gradient(0, rgba(0, 0, 0, 0.8) 0%, rgba(0, 0, 0, 0.5) 100%);
         }
         &.biankuang {
-          .mask {
-            background: linear-gradient(180deg, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.84) 100%);
+          &.active,
+          &:hover {
+            .mask {
+              background: linear-gradient(0, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.34) 50%, rgba(0, 0, 0, 0.34) 100%);
+            }
+            .name{
+              span{
+                color: rgba(255, 255, 255, 0.8);
+              }
+            }
           }
         }
-        > span {
+        .name {
           position: absolute;
           bottom: 3px;
           left: 0;
           width: 100%;
           padding: 0 4px;
-          text-align: justify;
           z-index: 9;
           box-sizing: border-box;
+          height: 38px;
+          color: rgba(255, 255, 255, 0.8);
+          display: flex;
+          align-items: center;
+          span{
+            display: inline-block;
+            text-align: justify;
+          }
         }
         i {
           font-size: 12px;

+ 32 - 4
src/pages/scenePage/index.vue

@@ -59,7 +59,7 @@
       <v-other />
     </div>
 
-    <vmap :themescene='themescene' />
+    <vmap v-if="!toggleClear" :flying="flying" :themescene="themescene" />
   </div>
 </template>
 
@@ -77,6 +77,8 @@ import vError from "./views/gui/error";
 import vrCon from "./views/gui/vrcon";
 import vOther from "./views/gui/other";
 import vmap from "../scene/raside/map.vue";
+import vmbmap from "../mobilescene/map.vue";
+import browser from "@/utils/browser";
 
 let tongjiurl = "https://shuangchuang-api.kczg.org.cn/Web/jt/";
 
@@ -84,8 +86,10 @@ export default {
   data() {
     return {
       hotspots: [],
-      themescene:'xuting',
+      themescene: "xuting",
+      toggleClear: false,
       isTour: false,
+      flying: false,
     };
   },
   components: {
@@ -101,7 +105,7 @@ export default {
     vError,
     vrCon,
     vOther,
-    vmap,
+    vmap: browser.mobile ? vmbmap : vmap,
   },
   methods: {
     tongji(event) {
@@ -149,6 +153,7 @@ export default {
         );
 
         window.player.on("onplayStatus", (data) => {
+          console.log(data.tourIsPlaying);
           this.isTour = data.tourIsPlaying;
 
           window.parent.postMessage(
@@ -170,6 +175,24 @@ export default {
           );
         });
 
+        window.player.on("mode.changed", (...data) => {
+          if (data[1] == "floorplan" || data[1] == "dollhouse") {
+            this.flying = false;
+          } else if (data[1] == "panorama") {
+            this.flying = false;
+          } else if (data[1] == "transitioning") {
+            this.flying = true;
+          }
+
+          window.parent.postMessage(
+            {
+              source: "mode.changed",
+              data: data[1],
+            },
+            "*"
+          );
+        });
+
         window.player.on("pano.chosen", () => {
           window.parent.postMessage(
             {
@@ -237,8 +260,13 @@ export default {
         if (Object.prototype.toString.call(res.data) == "[object Object]") {
           let data = res.data.data;
 
+          if (res.data.source === "toggleClear") {
+            this.toggleClear = data;
+            // this.$store.dispatch("changeTheme", data.data);
+          }
+
           if (res.data.source === "changeTheme") {
-            this.themescene=data
+            this.themescene = data;
             // this.$store.dispatch("changeTheme", data.data);
           }
           if (res.data.source === "changeExhition") {

+ 61 - 0
src/utils/index.js

@@ -3,6 +3,12 @@ function getType(o) {
   return ((_t = typeof o) == "object" ? (o == null && "null") || Object.prototype.toString.call(o).slice(8, -1) : _t).toLowerCase();
 }
 
+function getDistance(p1, p2) {
+  var x = p2.pageX - p1.pageX;
+  var y = p2.pageY - p1.pageY;
+  return Math.sqrt(x * x + y * y);
+}
+
 module.exports = {
   u_extend: function(destination, source) {
     for (var p in source) {
@@ -39,4 +45,59 @@ module.exports = {
     }
     return arr[index]; // 返回最接近的数值
   },
+
+  setGesture: function(el) {
+    var RANGE = 0.1;
+    var obj = {}; // 定义一个对象
+    var istouch = false;
+    var start = [];
+    var lastScale = 1;
+    el.addEventListener(
+      "touchstart",
+      function(e) {
+        if (e.touches.length >= 2) {
+          // 判断是否有两个点在屏幕上
+          istouch = true;
+          start = e.touches; // 得到第一组两个点
+          obj.gesturestart && obj.gesturestart.call(el); // 执行gesturestart方法
+        }
+      },
+      false
+    );
+    document.addEventListener(
+      "touchmove",
+      function(e) {
+        if (e.touches.length >= 2 && istouch) {
+          var now = e.touches; // 得到第二组两个点
+
+          var scale = getDistance(now[0], now[1]) / getDistance(start[0], start[1]); // 得到缩放比例,getDistance是勾股定理的一个方法
+          var dec = 1;
+          if (scale > lastScale) {
+            dec = RANGE;
+          } else {
+            dec = -RANGE;
+          }
+          lastScale = scale;
+          let data = {
+            scale: scale,
+            dec,
+          };
+          obj.gesturemove && obj.gesturemove.call(el, data); // 执行gesturemove方法
+        }
+      },
+      { passive: false }
+    );
+    document.addEventListener(
+      "touchend",
+      function() {
+        if (istouch) {
+          istouch = false;
+          obj.gestureend && obj.gestureend.call(el); // 执行gestureend方法
+        }
+      },
+      false
+    );
+
+    return obj;
+  },
 };