From 50ee7232f3c98fe24a1f2e31dba9508cfec14887 Mon Sep 17 00:00:00 2001
From: gjj <Ganjj@probim.com.cn>
Date: Fri, 21 Feb 2025 17:35:39 +0800
Subject: [PATCH] 模型预览

---
 src/views/Home.vue |  362 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 362 insertions(+), 0 deletions(-)

diff --git a/src/views/Home.vue b/src/views/Home.vue
new file mode 100644
index 0000000..da552b2
--- /dev/null
+++ b/src/views/Home.vue
@@ -0,0 +1,362 @@
+<template>
+  <div class="home-container">
+    <!-- 顶部导航 -->
+    <div class="top-nav">
+      <div class="nav-items">
+        <div class="nav-item mr-[8px]" :class="{ active: currentView === 'model' }" @click="handleChange('model')">模型</div>
+        <div class="nav-item mr-[8px]" :class="{ active: currentView === '720' }" @click="handleChange('720')">720全景</div>
+        <div class="nav-item" :class="{ active: currentView === 'project' }" @click="handleChange('project')">项目实况</div>
+      </div>
+      <div class="time-info">
+        <div class="time-info-item">
+          <i class="el-icon-date" style="color: #FFBF00;font-size: 20px;"></i>
+          <div class="text-white text-[16px] ml-[4px]">工程倒计时/天</div>
+          <div class="text-[#FFBF00] text-[24px] font-bold ml-[28px]">175</div>
+        </div>
+        <div class="time-line">
+        </div>
+      </div>
+    </div>
+
+    <div class="content-wrapper mb-[20px]">
+      <!-- 720菜单 -->
+      <div class="side-menu" v-if="currentView === '720'">
+        <div class="menu-dropdown">
+          <select class="menu-select">
+            <option>请选择</option>
+          </select>
+        </div>
+        <div class="menu-list">
+          <div class="menu-item">
+            <span>一期</span>
+            <i class="arrow-icon"></i>
+          </div>
+          <div class="menu-item">
+            <span>二期</span>
+            <i class="arrow-icon"></i>
+          </div>
+          <div class="menu-item">
+            <span>三期</span>
+            <i class="arrow-icon"></i>
+          </div>
+          <div class="menu-item">
+            <span>四期</span>
+            <i class="arrow-icon"></i>
+          </div>
+        </div>
+        <div class="submenu">
+          <div class="submenu-item">1#楼东立面图</div>
+          <div class="submenu-item">1#出入口层立-1</div>
+          <div class="submenu-item">2#出入口层立-2</div>
+          <div class="submenu-item">2#楼东立面图</div>
+          <div class="submenu-item">3#楼东立面图</div>
+          <div class="submenu-item">停车场入口区控制面</div>
+        </div>
+      </div>
+
+      <!-- 主要内容区域 -->
+      <div class="main-content" v-loading="isLoading">
+        <!-- 模型 -->
+        <div class="w-full h-full" v-if="currentView === 'model'" >
+          <iframe id="model-iframe" class="content-frame w-full h-[588px]" src="" frameborder="0"></iframe>
+        </div>
+        <!-- 720 -->
+        <div class="w-full h-full bg-white" v-if="currentView === '720'">
+          <div id="panoviewpreview" class="pano-frame w-full h-[588px]">
+          </div>
+        </div>
+        <!-- 项目 -->
+        <div class="w-full h-full" v-if="currentView === 'project'" >
+          <iframe id="scene-iframe" class="scene-frame w-full h-[588px]" src="" frameborder="0"></iframe>
+        </div>
+      </div>
+    </div>
+    <div class="chart-content">
+      <div 
+        class="w-full h-[4vh] mb-[1vh]" 
+        :style="{
+          backgroundImage: `url(${bottomImage})`,
+          backgroundRepeat: 'no-repeat',
+          backgroundPosition: 'center center',
+          backgroundSize: '100% 100%'
+        }"
+      >
+      </div>
+      <div class="chart-container">
+        <img src="../assets/images/backgrounds/shigongjinduchart.png" alt="施工进度" class="w-full h-[280px]"/>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { nextTick } from 'vue'
+export default {
+  name: 'Home',
+  components: {
+  },
+  data() {
+    return {
+      currentView: 'model',
+      chartOptions: {
+        id: 'shigongjinduChart',
+        options: {
+          title: {
+            text: '施工进度'
+          }
+        }
+      },
+      bottomImage: new URL('@/assets/images/titles/shigong.png', import.meta.url).href,
+      isLoading: false
+    }
+  },
+  methods: {
+    handleChange(view) {
+      this.isLoading = true
+      this.currentView = view
+      if (view === 'model') {
+        removepano('krpanoSWFObject')
+        nextTick(() => {
+          this.modelShow()
+        })
+      } else if (view === '720') {
+        nextTick(() => {
+          this.panoShow()
+        })
+      } else if (view === 'project') {
+        nextTick(() => {
+          this.sceneShow()
+        })
+      }
+    },
+    modelShow() {
+      const iframe = document.getElementById('model-iframe')
+      const token = '08168BBAD572518D1AB6EC233A13C3E2FA9C16340A21C6B6D0F2785DBDF2CB3506A0873877DA22C7E7ADA6CB1012493B4C702FC75B529ABD'
+      const projectId = '1c179617-a7d9-4243-b813-84fa55a17ce7'
+      let ifrSrc = ''
+      console.log('模型中查看')
+      ifrSrc = `${window.ProjectConfig.modelUrl}?token=${token}&projectId=${projectId}&isPreview=1&edit=false`
+      iframe.src = ifrSrc
+      console.log('加载iframe地址', ifrSrc)
+      this.isLoading = false
+    },
+    panoShow(item, scene) {
+      this.isLoading = false
+      const basepath = `${window.ProjectConfig.panoUrl}/Panorama${item.PbUrl}/vtour/`
+      const xmlurl = `${basepath}tour.xml?r=${(Math.random() * 100000 + 1)}`
+      let setting = {}
+      if (scene) {
+        const scenename = 'scene_' + scene.PsScenename
+        setting = { startscene: scenename }
+      }
+      this.$nextTick(() => {
+        embedpano({
+          xml: xmlurl,
+          target: 'panoviewpreview',
+          basepath,
+          vars: setting,
+          html5: 'auto',
+          passQueryParameters: true
+        })
+      })
+    },
+    sceneShow() {
+      const iframe = document.getElementById('scene-iframe')
+      const ifrSrc = window.ProjectConfig.sceneUrl
+      iframe.src = ifrSrc
+      this.isLoading = false
+    }
+  },
+  mounted() {
+    this.isLoading = true
+    this.modelShow()
+  },
+}
+</script>
+
+<style scoped lang="scss">
+.home-container {
+  display: flex;
+  flex-direction: column;
+  height: 100vh;
+}
+
+.top-nav {
+  height: 50px;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  color: white;
+}
+
+.nav-items {
+  display: flex;
+  gap: 20px;
+}
+
+.nav-item {
+  background: rgba(112,119,140,0.3);
+  border-radius: 2px;
+  border: 1px solid rgba(112,124,140,0.6);
+  padding: 5px 16px;
+  cursor: pointer;
+}
+
+.nav-item.active {
+  background: rgba(255,191,0,0.2);
+  border-radius: 2px;
+  border: 1px solid #FFBF00;
+}
+
+.time-info {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  width: 200px;
+}
+.time-info-item {
+  display: flex;
+  align-items: center;
+  
+}
+.time-line {
+  width: 200px;
+  height: 1px;
+  background: linear-gradient( 270deg, rgba(255,191,0,0) 0%, #FFBF00 100%);
+}
+
+.content-wrapper {
+  display: flex;
+  overflow: hidden;
+  position: relative;
+}
+
+.side-menu {
+  width: 250px;
+  background-color: #1e3d6b;
+  color: white;
+  position: absolute;
+  top: 10px;
+  left: 10px;
+  right: auto;
+  bottom: auto;
+}
+
+.menu-dropdown {
+  padding: 15px;
+}
+
+.menu-select {
+  width: 100%;
+  padding: 8px;
+  background-color: #0a1931;
+  color: white;
+  border: 1px solid #2a4d7d;
+}
+
+.menu-list {
+  border-top: 1px solid #2a4d7d;
+}
+
+.menu-item {
+  padding: 12px 20px;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  cursor: pointer;
+}
+
+.menu-item:hover {
+  background-color: rgba(255, 255, 255, 0.1);
+}
+
+.arrow-icon {
+  border: solid white;
+  border-width: 0 2px 2px 0;
+  display: inline-block;
+  padding: 3px;
+  transform: rotate(-45deg);
+}
+
+.submenu {
+  background-color: #152b4a;
+}
+
+.submenu-item {
+  padding: 10px 30px;
+  font-size: 14px;
+  cursor: pointer;
+}
+
+.submenu-item:hover {
+  background-color: rgba(255, 255, 255, 0.1);
+}
+
+.main-content {
+  flex: 1;
+  background-color: #fff;
+  width: 100%;
+  height: 588px;
+}
+
+.content-header {
+  color: white;
+  margin-bottom: 20px;
+}
+
+.chart-container {
+  background-color: #1e3d6b;
+  border-radius: 8px;
+  padding: 20px;
+  width: 100%;
+  height: 100%;
+}
+
+.chart-legend {
+  display: flex;
+  gap: 20px;
+  margin-bottom: 20px;
+  color: white;
+}
+
+.legend-item {
+  display: flex;
+  align-items: center;
+  gap: 8px;
+}
+
+.dot {
+  width: 10px;
+  height: 10px;
+  border-radius: 50%;
+}
+
+.dot.blue {
+  background-color: #00ffff;
+}
+
+.dot.yellow {
+  background-color: #ffd700;
+}
+
+.chart-area {
+  height: 400px;
+  margin-bottom: 20px;
+}
+
+.chart-tabs {
+  display: flex;
+  gap: 10px;
+}
+
+.tab {
+  padding: 8px 16px;
+  color: white;
+  cursor: pointer;
+  border-radius: 4px;
+}
+
+.tab.active {
+  background-color: #2a4d7d;
+}
+</style>

--
Gitblit v1.9.3