PanoView.vue 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. <template>
  2. <div class="pano-view">
  3. <div
  4. id="pano"
  5. :style="{zIndex: $globalConfig.zIndex.pano.self}"
  6. />
  7. <button
  8. class="top back"
  9. @click="onClickBack"
  10. >
  11. <img
  12. src="@/assets/images/pano/back.png"
  13. alt=""
  14. draggable="false"
  15. >
  16. <div>返回</div>
  17. </button>
  18. <button
  19. class="top switch-pano"
  20. @click="onClickSwitchPano"
  21. >
  22. <img
  23. src="@/assets/images/swkk/changjingdaolan.png"
  24. alt=""
  25. draggable="false"
  26. >
  27. <div>全景切换</div>
  28. </button>
  29. <PanoDesc
  30. v-if="currentSceneDesc"
  31. :desc="currentSceneDesc"
  32. :audio-src="currentSceneAudio"
  33. class="pano-desc"
  34. />
  35. <router-view />
  36. </div>
  37. </template>
  38. <script>
  39. import * as krfn from "@/libs/pano-core/index.js"
  40. import PanoDesc from "@/components/panoDesc.vue"
  41. import { vrTxtInfo as sceneDescList } from "@/components/sceneDesc.js"
  42. let __krfn = krfn.default
  43. export default {
  44. components: {
  45. 'PanoDesc': PanoDesc,
  46. },
  47. beforeRouteUpdate(to, from, next) {
  48. next()
  49. if (to.name === 'PanoView') {
  50. if (this.$route.params.scene) {
  51. this.scene = this.$route.params.scene
  52. this.loadScene()
  53. }
  54. }
  55. },
  56. data() {
  57. return {
  58. scene: null,
  59. }
  60. },
  61. computed: {
  62. ...globalMapState([
  63. 'panoData',
  64. ]),
  65. sceneDescList() {
  66. return sceneDescList
  67. },
  68. currentSceneDesc() {
  69. return this.sceneDescList.find((item) => {
  70. return item.code === this.scene?.sceneCode
  71. })
  72. },
  73. currentSceneAudio() {
  74. return `${process.env.VUE_APP_CDN_PATH_QJKK_DESC}${this.scene?.sceneCode}.mp3`
  75. }
  76. },
  77. async mounted() {
  78. console.log('this.$route.params.scene: ', this.$route.params.scene)
  79. this.scene = this.$route.params.scene
  80. window.__krfn = __krfn
  81. this.loadScene()
  82. this.$msgCenter.subscribe('clickHotspot', (hotspotName) => {
  83. console.log('hotspotName: ', hotspotName)
  84. let someData = this.scene.someData
  85. if (typeof someData == "string") {
  86. someData = JSON.parse(this.activeItem.someData)
  87. }
  88. let clickedHotspot = someData.hotspots.find((item) => item.name == hotspotName)
  89. if (clickedHotspot) {
  90. if (clickedHotspot.hotspotType == "link") {
  91. window.open(clickedHotspot.hyperlink, "_blank")
  92. } else if (clickedHotspot.hotspotType == "scene") {
  93. this.scene = clickedHotspot.secne
  94. this.loadScene()
  95. // this.$router.replace({ name: 'PanoView', params: { scene: clickedHotspot.secne } })
  96. }
  97. }
  98. })
  99. },
  100. methods: {
  101. loadScene() {
  102. $("#pano").empty()
  103. window.vrInitFn = () => {
  104. // eslint-disable-next-line no-undef
  105. // $smallWaiting.hide()
  106. var krpano = document.getElementById("krpanoSWFObject")
  107. __krfn.utils.initHotspot(krpano, this.scene.someData, false)
  108. }
  109. window.vrViewFn = () => {
  110. try {
  111. let tmp = this.scene.initVisual || {}
  112. var krpano = document.getElementById("krpanoSWFObject")
  113. krpano.set("view.vlookat", tmp.vlookat || 0)
  114. krpano.set("view.hlookat", tmp.hlookat || 0)
  115. krpano.set("autorotate.enabled", Boolean(this.panoData.isAuto))
  116. } catch (error) {
  117. console.log(error)
  118. }
  119. }
  120. let settings = {
  121. "events[skin_events].onxmlcomplete": "js(window.vrViewFn());",
  122. "events[skin_events].onloadcomplete": "js(window.vrInitFn());",
  123. }
  124. // eslint-disable-next-line no-undef
  125. removepano("#pano")
  126. // eslint-disable-next-line no-undef
  127. embedpano({
  128. xml: `${process.env.VUE_APP_PROTOCOL}zzbbh.4dage.com/YHT/Qjkk/local/pano/${this.scene.sceneCode}/vtour/tour.xml`,
  129. swf: "%HTMLPATH%/static/template/tour.swf", // todo: 咋回事?
  130. target: "pano",
  131. html5: "auto",
  132. mobilescale: 1,
  133. vars: settings,
  134. passQueryParameters: true,
  135. })
  136. },
  137. onClickBack: globalUtils.throttle(function() {
  138. this.$router.push({ name: 'ObliqueView' })
  139. }, 1000),
  140. onClickSwitchPano() {
  141. this.$router.push({ name: 'PanoListInPano' })
  142. }
  143. },
  144. }
  145. </script>
  146. <style lang="less" scoped>
  147. .pano-view {
  148. position: relative;
  149. width: 100%;
  150. height: 100%;
  151. z-index: 0;
  152. #pano {
  153. width: 100%;
  154. height: 100%;
  155. }
  156. > button.top {
  157. position: absolute;
  158. top: 2.08rem;
  159. width: 5rem;
  160. z-index: 2;
  161. > img {
  162. width: 100%;
  163. }
  164. > div {
  165. margin-top: 0.17rem;
  166. text-shadow: 0 0 0.1rem rgba(0,0,0,0.3);
  167. color: #333333;
  168. font-size: 1.17rem;
  169. font-weight: bold;
  170. }
  171. &.back {
  172. left: 1.63rem;
  173. }
  174. &.switch-pano {
  175. right: 1.63rem;
  176. }
  177. }
  178. > .pano-desc {
  179. position: absolute;
  180. top: 2.54rem;
  181. left: 50%;
  182. transform: translateX(-50%);
  183. height: 4.17rem;
  184. width: 22.5rem;
  185. }
  186. }
  187. </style>