showMobile.vue 5.4 KB

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