showMobile.vue 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. <template>
  2. <LoadingLogo v-if="workEnable" />
  3. <template v-if="workEnable">
  4. <Password />
  5. <Share />
  6. <div class="ui-view-layout" :class="{ show: show }">
  7. <Pano />
  8. <Tags />
  9. <UiGather v-show="!vrStatus"/>
  10. <TitieSlide/>
  11. </div>
  12. </template>
  13. <Error v-else />
  14. </template>
  15. <script setup>
  16. import Pano from "@/components/Pano";
  17. import Tags from "@/components/assembly/MobileTags";
  18. import Password from "@/components/assembly/Password";
  19. import Share from "@/components/assembly/Share";
  20. import Error from "@/components/assembly/Error";
  21. import UiGather from "@/components/UIGather/mobile";
  22. import TitieSlide from "@/components/assembly/titieSlide";
  23. import LoadingLogo from "@/components/assembly/Loading";
  24. import { createApp } from "@/app";
  25. import { ref, onMounted, computed, watch, nextTick } from "vue";
  26. import { getPanoInfo, checkWork } from "@/apis";
  27. import { useStore } from "vuex";
  28. import config from "@/utils/config";
  29. import browser from "@/utils/browser";
  30. import { useApp } from '@/app'
  31. const fixOpening = {
  32. '小行星开场': 1,
  33. '水平巡游开场': 2,
  34. '小行星巡游开场': 3,
  35. '水晶球开场': 4,
  36. '小行星缩放开场': 5,
  37. }
  38. const store = useStore();
  39. const show = ref(false);
  40. const workEnable = ref(true);
  41. const currentScene = computed(() => store.getters["scene/currentScene"]);
  42. const currentCatalogRoot = computed(() => store.getters["scene/currentCatalogRoot"]);
  43. const vrStatus = computed(() => store.getters["functions/vrStatus"]);
  44. const isAutoRotate = computed(() => store.getters["functions/isAutoRotate"]);
  45. const earthMask = computed(() => store.getters["scene/earthMask"]);
  46. const skyMask = computed(() => store.getters["scene/skyMask"]);
  47. onMounted(async () => {
  48. if (!browser.isMobile()) {
  49. window.location.href = window.location.href.replace('showMobile.html','show.html')
  50. return
  51. }
  52. let res = await checkWork();
  53. if (!res.data) {
  54. workEnable.value = res.data;
  55. return;
  56. }
  57. getPanoInfo().then(async (data) => {
  58. store.commit("scene/setScenes", data.scenes);
  59. store.commit("scene/setPassword", data.password === "" ? false : data.password);
  60. store.commit("scene/setMetaData", data);
  61. let firstScene = "";
  62. if (config.sceneNum) {
  63. console.log(config.sceneNum);
  64. firstScene = data.scenes.find((item) => item.sceneCode == config.sceneNum);
  65. } else if (data.firstScene) {
  66. firstScene = data.scenes.find((item) => item.sceneCode == data.firstScene.sceneCode);
  67. }
  68. store.commit("scene/setCurrentScene", firstScene || data.scenes[0]);
  69. // 过滤空分组
  70. let ttt = data.catalogRoot.filter((item) => {
  71. let flag = ''
  72. if (item.children) {
  73. item.children.some((sub) => {
  74. flag = data.scenes.some(son => {
  75. // console.log(String(son.category).toLowerCase(), String(sub).toLowerCase());
  76. return String(son.category).toLowerCase() == String(sub).toLowerCase()
  77. })
  78. return flag
  79. });
  80. }
  81. return flag
  82. });
  83. data.catalogRoot = ttt
  84. let catalog = data.catalogs.find((item) => item.id == currentScene.value.category);
  85. // 查询初始场景的所在1级分组
  86. data.catalogRoot.forEach((item) => {
  87. let temp = item.children && item.children.find((sub) => sub == catalog.id);
  88. if (temp) {
  89. store.commit("scene/setCurrentCatalogRoot", item);
  90. return;
  91. }
  92. });
  93. // 查询初始场景的所在2级分组
  94. store.commit("scene/setCurrentSecondary", catalog);
  95. store.commit("functions/setAutoRotate", !!data.isAuto);
  96. show.value = true;
  97. let isHavePano = data.scenes.some(item => item.type == 'pano')
  98. document.body.setAttribute('is-mobile', true)
  99. const app = createApp({
  100. // xml: "%HTMLPATH%/static/template/tour.xml",
  101. xml: `${process.env.VUE_APP_CDN}/720yun_fd_manage/${config.projectNum}/tour.xml`,
  102. swf: "%HTMLPATH%/showviewer/lib/krpano/tour.swf",
  103. target: "pano",
  104. html5: "auto",
  105. mobilescale: 1,
  106. isHavePano,
  107. vars: {
  108. startscene: "scene_" + currentScene.value.sceneCode,
  109. "view.vlookat": currentScene.value.initVisual ? currentScene.value.initVisual.vlookat : 0,
  110. "view.hlookat": currentScene.value.initVisual ? currentScene.value.initVisual.hlookat : 0,
  111. "autorotate.enabled": !!data.isAuto,
  112. "skin_settings.littleplanetintro": fixOpening[data.openingAnimationType || '小行星开场']
  113. },
  114. passQueryParameters: true,
  115. });
  116. app.Scene.lock();
  117. app.render();
  118. if (isHavePano) {
  119. app.Scene.on("sceneReady", () => {
  120. if (app.krpanoDom) {
  121. if (earthMask.value) {
  122. app.krpanoDom.set(`hotspot[nadirlogo].visible`, earthMask.value.isShow);
  123. if (earthMask.value.icon) {
  124. app.krpanoDom.set(`hotspot[nadirlogo].url`, earthMask.value.icon);
  125. }
  126. }
  127. if (skyMask.value) {
  128. app.krpanoDom.set(`hotspot[peaklogo].visible`, skyMask.value.isShow);
  129. if (skyMask.value.icon) {
  130. app.krpanoDom.set(`hotspot[peaklogo].url`, skyMask.value.icon);
  131. }
  132. }
  133. }
  134. app.Tags.initHotspot(currentScene.value.someData ? currentScene.value.someData.hotspots : [], false);
  135. });
  136. }
  137. });
  138. });
  139. </script>
  140. <style lang="scss" scoped>
  141. .ui-view-layout {
  142. position: relative;
  143. }
  144. </style>