tremble 4 jaren geleden
bovenliggende
commit
bb27fc5939
41 gewijzigde bestanden met toevoegingen van 12983 en 47 verwijderingen
  1. 3 0
      hotspot/.browserslistrc
  2. 17 0
      hotspot/.eslintrc.js
  3. 23 0
      hotspot/.gitignore
  4. 24 0
      hotspot/README.md
  5. 5 0
      hotspot/babel.config.js
  6. 12039 0
      hotspot/package-lock.json
  7. 31 0
      hotspot/package.json
  8. 16 0
      hotspot/public/index.html
  9. 25 0
      hotspot/src/App.vue
  10. BIN
      hotspot/src/assets/images/bg.png
  11. BIN
      hotspot/src/assets/images/close@2x.png
  12. BIN
      hotspot/src/assets/images/icon/ICON-09.png
  13. BIN
      hotspot/src/assets/images/icon/ICON_bofang1.png
  14. BIN
      hotspot/src/assets/images/icon/ICON_bofang2.png
  15. BIN
      hotspot/src/assets/images/icon/ICON_moxing1.png
  16. BIN
      hotspot/src/assets/images/icon/ICON_moxing2.png
  17. BIN
      hotspot/src/assets/images/icon/ICON_wangluo1.png
  18. BIN
      hotspot/src/assets/images/icon/ICON_wangluo2.png
  19. BIN
      hotspot/src/assets/images/icon/ICON_xiangpian1.png
  20. BIN
      hotspot/src/assets/images/icon/ICON_xiangpian2.png
  21. BIN
      hotspot/src/assets/images/icon/ICON_画板 1 副本 5.png
  22. BIN
      hotspot/src/assets/images/iframe-icon.png
  23. BIN
      hotspot/src/assets/images/img-icon.png
  24. BIN
      hotspot/src/assets/images/jiantou.png
  25. BIN
      hotspot/src/assets/images/model-icon.png
  26. BIN
      hotspot/src/assets/images/txt-icon.png
  27. BIN
      hotspot/src/assets/images/video-icon.png
  28. BIN
      hotspot/src/assets/logo.png
  29. 59 0
      hotspot/src/components/HelloWorld.vue
  30. 17 0
      hotspot/src/main.js
  31. 27 0
      hotspot/src/router/index.js
  32. 29 0
      hotspot/src/utils/browser.js
  33. 0 0
      hotspot/src/utils/http.js
  34. 5 0
      hotspot/src/views/About.vue
  35. 552 0
      hotspot/src/views/Home.vue
  36. 3 0
      hotspot/vue.config.js
  37. 45 37
      web/public/static/js/main_2020_show.js
  38. 2 0
      web/public/static/js/manage.js
  39. 2 2
      web/public/static/js/myShow.js
  40. 3 1
      web/src/components/welcome/index.vue
  41. 56 7
      web/src/views/gui/newguide.vue

+ 3 - 0
hotspot/.browserslistrc

@@ -0,0 +1,3 @@
+> 1%
+last 2 versions
+not dead

+ 17 - 0
hotspot/.eslintrc.js

@@ -0,0 +1,17 @@
+module.exports = {
+  root: true,
+  env: {
+    node: true
+  },
+  'extends': [
+    'plugin:vue/essential',
+    'eslint:recommended'
+  ],
+  parserOptions: {
+    parser: 'babel-eslint'
+  },
+  rules: {
+    'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
+    'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off'
+  }
+}

+ 23 - 0
hotspot/.gitignore

@@ -0,0 +1,23 @@
+.DS_Store
+node_modules
+/dist
+
+
+# local env files
+.env.local
+.env.*.local
+
+# Log files
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?

+ 24 - 0
hotspot/README.md

@@ -0,0 +1,24 @@
+# hotspot
+
+## Project setup
+```
+npm install
+```
+
+### Compiles and hot-reloads for development
+```
+npm run serve
+```
+
+### Compiles and minifies for production
+```
+npm run build
+```
+
+### Lints and fixes files
+```
+npm run lint
+```
+
+### Customize configuration
+See [Configuration Reference](https://cli.vuejs.org/config/).

+ 5 - 0
hotspot/babel.config.js

@@ -0,0 +1,5 @@
+module.exports = {
+  presets: [
+    '@vue/cli-plugin-babel/preset'
+  ]
+}

File diff suppressed because it is too large
+ 12039 - 0
hotspot/package-lock.json


+ 31 - 0
hotspot/package.json

@@ -0,0 +1,31 @@
+{
+  "name": "hotspot",
+  "version": "0.1.0",
+  "private": true,
+  "scripts": {
+    "serve": "vue-cli-service serve",
+    "build": "vue-cli-service build",
+    "lint": "vue-cli-service lint"
+  },
+  "dependencies": {
+    "axios": "^0.20.0",
+    "core-js": "^3.6.5",
+    "swiper": "^5.4.5",
+    "v-viewer": "^1.5.1",
+    "vue": "^2.6.11",
+    "vue-awesome-swiper": "^4.1.1",
+    "vue-router": "^3.2.0"
+  },
+  "devDependencies": {
+    "@vue/cli-plugin-babel": "~4.5.0",
+    "@vue/cli-plugin-eslint": "~4.5.0",
+    "@vue/cli-plugin-router": "~4.5.0",
+    "@vue/cli-service": "~4.5.0",
+    "babel-eslint": "^10.1.0",
+    "eslint": "^6.7.2",
+    "eslint-plugin-vue": "^6.2.2",
+    "less": "^3.0.4",
+    "less-loader": "^5.0.0",
+    "vue-template-compiler": "^2.6.11"
+  }
+}

+ 16 - 0
hotspot/public/index.html

@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width,initial-scale=1.0">
+    <title><%= htmlWebpackPlugin.options.title %></title>
+  </head>
+  <body>
+    <noscript>
+      <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
+    </noscript>
+    <div id="app"></div>
+    <!-- built files will be auto injected -->
+  </body>
+</html>

+ 25 - 0
hotspot/src/App.vue

@@ -0,0 +1,25 @@
+<template>
+  <div id="app">
+    <router-view/>
+  </div>
+</template>
+
+<style lang="less">
+html,body{
+  width: 100%;
+  height: 100%;
+  overflow: hidden;
+}
+body{
+  background: rgba(0, 0, 0, 0.4);
+}
+*{
+  margin: 0;
+  padding: 0;
+}
+#app {
+  width: 100%;
+  height: 100%;
+}
+
+</style>

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


BIN
hotspot/src/assets/images/close@2x.png


BIN
hotspot/src/assets/images/icon/ICON-09.png


BIN
hotspot/src/assets/images/icon/ICON_bofang1.png


BIN
hotspot/src/assets/images/icon/ICON_bofang2.png


BIN
hotspot/src/assets/images/icon/ICON_moxing1.png


BIN
hotspot/src/assets/images/icon/ICON_moxing2.png


BIN
hotspot/src/assets/images/icon/ICON_wangluo1.png


BIN
hotspot/src/assets/images/icon/ICON_wangluo2.png


BIN
hotspot/src/assets/images/icon/ICON_xiangpian1.png


BIN
hotspot/src/assets/images/icon/ICON_xiangpian2.png


BIN
hotspot/src/assets/images/icon/ICON_画板 1 副本 5.png


BIN
hotspot/src/assets/images/iframe-icon.png


BIN
hotspot/src/assets/images/img-icon.png


BIN
hotspot/src/assets/images/jiantou.png


BIN
hotspot/src/assets/images/model-icon.png


BIN
hotspot/src/assets/images/txt-icon.png


BIN
hotspot/src/assets/images/video-icon.png


BIN
hotspot/src/assets/logo.png


+ 59 - 0
hotspot/src/components/HelloWorld.vue

@@ -0,0 +1,59 @@
+<template>
+  <div class="hello">
+    <h1>{{ msg }}</h1>
+    <p>
+      For a guide and recipes on how to configure / customize this project,<br>
+      check out the
+      <a href="https://cli.vuejs.org" target="_blank" rel="noopener">vue-cli documentation</a>.
+    </p>
+    <h3>Installed CLI Plugins</h3>
+    <ul>
+      <li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-babel" target="_blank" rel="noopener">babel</a></li>
+      <li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-router" target="_blank" rel="noopener">router</a></li>
+      <li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-eslint" target="_blank" rel="noopener">eslint</a></li>
+    </ul>
+    <h3>Essential Links</h3>
+    <ul>
+      <li><a href="https://vuejs.org" target="_blank" rel="noopener">Core Docs</a></li>
+      <li><a href="https://forum.vuejs.org" target="_blank" rel="noopener">Forum</a></li>
+      <li><a href="https://chat.vuejs.org" target="_blank" rel="noopener">Community Chat</a></li>
+      <li><a href="https://twitter.com/vuejs" target="_blank" rel="noopener">Twitter</a></li>
+      <li><a href="https://news.vuejs.org" target="_blank" rel="noopener">News</a></li>
+    </ul>
+    <h3>Ecosystem</h3>
+    <ul>
+      <li><a href="https://router.vuejs.org" target="_blank" rel="noopener">vue-router</a></li>
+      <li><a href="https://vuex.vuejs.org" target="_blank" rel="noopener">vuex</a></li>
+      <li><a href="https://github.com/vuejs/vue-devtools#vue-devtools" target="_blank" rel="noopener">vue-devtools</a></li>
+      <li><a href="https://vue-loader.vuejs.org" target="_blank" rel="noopener">vue-loader</a></li>
+      <li><a href="https://github.com/vuejs/awesome-vue" target="_blank" rel="noopener">awesome-vue</a></li>
+    </ul>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'HelloWorld',
+  props: {
+    msg: String
+  }
+}
+</script>
+
+<!-- Add "scoped" attribute to limit CSS to this component only -->
+<style scoped lang="less">
+h3 {
+  margin: 40px 0 0;
+}
+ul {
+  list-style-type: none;
+  padding: 0;
+}
+li {
+  display: inline-block;
+  margin: 0 10px;
+}
+a {
+  color: #42b983;
+}
+</style>

+ 17 - 0
hotspot/src/main.js

@@ -0,0 +1,17 @@
+import Vue from 'vue'
+import App from './App.vue'
+import router from './router'
+import axios from 'axios'
+import 'viewerjs/dist/viewer.css'
+import Viewer from 'v-viewer'
+ 
+
+Vue.config.productionTip = false
+Vue.prototype.$http = axios
+
+Vue.use(Viewer)
+
+new Vue({
+  router,
+  render: h => h(App)
+}).$mount('#app')

+ 27 - 0
hotspot/src/router/index.js

@@ -0,0 +1,27 @@
+import Vue from 'vue'
+import VueRouter from 'vue-router'
+import Home from '../views/Home.vue'
+
+Vue.use(VueRouter)
+
+const routes = [
+  {
+    path: '/',
+    name: 'Home',
+    component: Home
+  },
+  {
+    path: '/about',
+    name: 'About',
+    // route level code-splitting
+    // this generates a separate chunk (about.[hash].js) for this route
+    // which is lazy-loaded when the route is visited.
+    component: () => import(/* webpackChunkName: "about" */ '../views/About.vue')
+  }
+]
+
+const router = new VueRouter({
+  routes
+})
+
+export default router

+ 29 - 0
hotspot/src/utils/browser.js

@@ -0,0 +1,29 @@
+function versions () {
+    var u = window.navigator.userAgent
+    return {
+      // IE内核
+      trident: u.indexOf('Trident') > -1,
+      // opera内核
+      presto: u.indexOf('Presto') > -1,
+      // 苹果、谷歌内核
+      webKit: u.indexOf('AppleWebKit') > -1,
+      // 火狐内核
+      gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') === -1,
+      // 是否为移动终端 / Tablets use desktop version
+      mobile: (/Android|webOS|iPhone|iPod|BlackBerry/i.test(navigator.userAgent)) && !(/Tablet|iPad/i.test(navigator.userAgent)),
+      // ios终端
+      ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/),
+      // android终端或者uc浏览器
+      android: u.indexOf('Android') > -1 || u.indexOf('Linux') > -1,
+      // 是否为iPhone或者安卓QQ浏览器
+      iPhone: u.indexOf('iPhone') > -1 || u.indexOf('Mac') > -1,
+      // 是否为iPad
+      iPad: u.indexOf('iPad') > -1,
+      // 是否为web应用程序,没有头部与底部
+      webApp: u.indexOf('Safari') === -1,
+      // 是否为微信浏览器
+      weixin: ~u.indexOf('MicroMessenger')
+    }
+  }
+  
+  export default versions()

+ 0 - 0
hotspot/src/utils/http.js


+ 5 - 0
hotspot/src/views/About.vue

@@ -0,0 +1,5 @@
+<template>
+  <div class="about">
+    <h1>This is an about page</h1>
+  </div>
+</template>

+ 552 - 0
hotspot/src/views/Home.vue

@@ -0,0 +1,552 @@
+<template>
+  <div class="home" @click="autoplay" @touchstart="autoplay">
+    <audio
+      v-if="audio"
+      class="audio"
+      id="audio1"
+      :src="audio"
+      preload
+      autoplay
+      ref="musicBg"
+    ></audio>
+    <div class="content" v-if="fixIcon.length > 0">
+      <img
+        class="close"
+        @click="colseParent"
+        :src="require('@/assets/images/close@2x.png')"
+        alt=""
+      />
+      <img class="bg" :src="require('@/assets/images/bg.png')" alt="" />
+      <ul class="iconarr" v-if="fixIcon.length > 1">
+        <li
+          :class="{ active: item.id === active }"
+          @click="active = item.id"
+          v-for="(item, i) in fixIcon"
+          :key="i"
+        >
+          <img
+            :src="
+              require(`@/assets/images/icon/${item.img}${
+                item.id === active ? '2' : '1'
+              }.png`)
+            "
+            alt=""
+          />
+          <span>{{ item.name }}</span>
+        </li>
+      </ul>
+      <div class="title" v-html="data.title"></div>
+      <div @click="slideto('slidePrev')" v-if="data[active].length>1" class="swiper-button-prev"></div>
+      <swiper class="warpper" ref="mySwiper" :options="swiperOptions">
+        <swiper-slide v-for="(item, i) in data[active]" :key="i">
+          <div class="slide">
+            <img
+              style="cursor: pointer"
+              v-viewer
+              v-if="active === 'images'"
+              :src="fixUrl(item)"
+              alt=""
+            />
+            <video
+              v-else-if="active === 'video'"
+              :src="fixUrl(item.url)"
+              controls
+              autoplay
+            ></video>
+            <iframe
+              v-else
+              :src="fixUrl(item)"
+              frameborder="0"
+            ></iframe>
+          </div>
+        </swiper-slide>
+        <div class="swiper-pagination"  v-if="data[active].length>1" slot="pagination"></div>
+      </swiper>
+      <div @click="slideto('slideNext')"  v-if="data[active].length>1" class="swiper-button-next"></div>
+      <p class="desc" ref="desc" :class="{'desc-duo':data.content&&data.content.length>60}" v-html="data.content"></p>
+    </div>
+
+    <div class="content" v-if="fixIcon.length <= 0 && hadLoad">
+      <img
+        class="close"
+        @click="colseParent"
+        :src="require('@/assets/images/close@2x.png')"
+        alt=""
+      />
+      <img class="bg" :src="require('@/assets/images/bg.png')" alt="" />
+      <div class="norecord">该热点无数据</div>
+    </div>
+
+    <div class="intro" :class="{ ismtop: fixIcon.length <= 0 }"></div>
+  </div>
+</template>
+
+<script>
+import { Swiper, SwiperSlide } from "vue-awesome-swiper";
+import "swiper/css/swiper.css";
+import browser from "@/utils/browser";
+
+let iconArr = [
+  { name: "图片", id: "images", img: "ICON_xiangpian", display: false },
+  { name: "视频", id: "video", img: "ICON_bofang", display: false },
+  { name: "网页", id: "iframe", img: "ICON_wangluo", display: false },
+  { name: "模型", id: "model", img: "ICON_moxing", display: false },
+];
+
+browser.mobile &&
+  iconArr.push({ name: "介绍", id: "title", img: "txt-icon", display: false });
+
+export default {
+  name: "Home",
+  data() {
+    return {
+      // http://8.135.106.227:8009
+      server:"",
+      loadAuto: false,
+      hadLoad:false,
+      audio: "",
+      m: this.$route.query.m,
+      id: this.$route.query.id,
+      isAndriod: browser.android,
+      swiperOptions: browser.mobile
+        ? {
+            pagination: {
+              el: ".swiper-pagination",
+              clickable: true,
+            },
+          }
+        : {
+            spaceBetween: 0,
+            centeredSlides: true,
+            pagination: {
+              el: ".swiper-pagination",
+              clickable: true,
+            },
+          },
+      data: {},
+      iconArr,
+      active: ""
+    };
+  },
+  watch: {
+    active(newVal) {
+      if (!newVal) {
+        return;
+      }
+      if (!this.$refs.musicBg) {
+        return;
+      }
+      setTimeout(() => {
+        if (newVal == "video") {
+          if (!this.$refs.musicBg.paused) {
+            this.$refs.musicBg.pause();
+          }
+        } else {
+          if (this.$refs.musicBg.paused) {
+            this.$refs.musicBg.play(); // 暂停
+          }
+        }
+      }, 500);
+    },
+  },
+  computed: {
+    swiper() {
+      return this.$refs.mySwiper.$swiper;
+    },
+    fixIcon() {
+      let arr = this.iconArr.filter((item) => !!item.display);
+      return arr;
+    }
+  },
+  components: {
+    Swiper,
+    SwiperSlide,
+  },
+  methods: {
+    autoplay() {
+      if (this.loadAuto) {
+        return;
+      }
+      try {
+        this.$refs.musicBg.play();
+        this.loadAuto = true;
+      } catch (error) {
+        error;
+      }
+    },
+    async getData() {
+      // http://super.4dage.com
+      let url = `${this.server}/data/${
+        this.id
+      }/hot/js/data.js?time=${Math.random()}`;
+      let result = (await this.$http.get(url)).data;
+      this.data = result[this.m];
+      if (!this.data) {
+        return alert("热点解析错误");
+      }
+
+      this.audio = this.data["backgroundMusic"];
+
+      if (!this.data.content && this.isMobile) {
+        this.iconArr.pop();
+      }
+      this.iconArr.forEach((item) => {
+        if (this.data[item.id]) {
+          this.active = !this.active ? item.id : this.active;
+          item.display = true;
+        }
+      });
+      this.hadLoad = true
+      
+    },
+
+    colseParent() {
+        window.parent.document.getElementById("closepop").click();
+    },
+    fixUrl(item) {
+      return this.server + item;
+    },
+    slideto(action) {
+      this.swiper[action]();
+    },
+  },
+  mounted() {
+    this.getData();
+    
+    document.addEventListener(
+      "WeixinJSBridgeReady",
+      () => {
+        this.autoplay();
+      },
+      false
+    );
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.audio {
+  position: fixed;
+  top: -100px;
+  left: -100px;
+  opacity: 0;
+}
+
+.swiper-button-prev, .swiper-button-next{
+  background: none!important;
+  padding: 10px 30px!important;
+}
+
+.mb-intro {
+  color: #fff;
+  padding: 10px;
+  > p {
+    line-height: 1.5;
+    letter-spacing: 1px;
+    &:first-of-type {
+      font-weight: bold;
+      font-size: 20px;
+    }
+  }
+}
+
+.home {
+  width: 100%;
+  height: 100%;
+  position: relative;
+  .ismtop {
+    padding-top: 40px !important;
+  }
+  .content {
+    width: 1200px;
+    height: 86%;
+    margin: 2% auto;
+    position: relative;
+    .norecord{
+      position: absolute;
+      top: 50%;
+      left: 50%;
+      transform: translate(-50%,-50%);
+      color: #fff;
+    }
+    .warpper {
+      width: 100%;
+      height: calc(100% - 40px);
+      margin: 0 auto;
+      .slide {
+        font-size: 0;
+        width: 100%;
+        height: calc(100% - 180px);
+        position: relative;
+        img,
+        video,
+        iframe {
+          max-height: 100%;
+          max-width: calc(100% - 220px);
+          border-radius: 14px;
+          box-shadow: 0 0 16px rgba(0, 0, 0, 0.6);
+          transform: translate(-50%,-50%);
+          top: 50%;
+          left: 50%;
+          position: absolute;
+        }
+        iframe{
+          width: calc(100% - 220px);
+          height: 100%;
+        }
+        video {
+          width: 100%;
+        }
+      }
+    }
+    .desc{
+      color: #fff;
+      width: 76%;
+      margin: -36px auto 0;
+      max-height: 120px;
+      overflow-y: auto;
+      overflow-x: hidden;
+      text-align: center;
+      position: relative;
+      z-index: 999;
+      line-height: 1.2;
+    }
+    .desc-duo{
+      text-indent: 32px;
+      text-align: left;
+    }
+    .close {
+      position: absolute;
+      bottom: 50px;
+      right: 50px;
+      box-shadow: none;
+      width: 24px;
+      cursor: pointer;
+      z-index: 999;
+    }
+    .bg {
+      position: absolute;
+      box-shadow: none;
+      top: 0;
+      left: 0;
+      width: 100%;
+      height: 100%;
+      max-height: unset;
+      z-index: -1;
+    }
+  }
+
+  .iconarr {
+    list-style: none;
+    display: flex;
+    justify-content: flex-end;
+    margin-right: 30px;
+    position: absolute;
+    left: 40px;
+    top: 20px;
+    z-index: 999;
+    li {
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      color: #fff;
+      list-style: none;
+      font-size: 14px;
+      width: 90px;
+      height: 32px;
+      line-height: 32px;
+      cursor: pointer;
+      border-radius: 10px;
+      span {
+        margin-left: 10px;
+      }
+      > img {
+        width: 24px;
+      }
+    }
+    .active {
+      color: rgba(252, 214, 123, 1);
+      border: none;
+    }
+  }
+  .title{
+    color: rgba(252, 214, 123, 1);
+    width: 100%;
+    text-align: center;
+    transform: translateX(-50%);
+    top: 24px;
+    left: 50%;
+    font-size: 18px;
+    position: absolute;
+  }
+  .intro {
+    max-height: 20vh;
+    overflow: auto;
+    width: 70%;
+    color: #fff;
+    margin: 0 auto;
+    > h3 {
+      font-size: 20px;
+      font-weight: 600;
+    }
+    > p {
+      line-height: 1.5;
+      margin-top: 10px;
+      font-size: 16px;
+      text-indent: 32px;
+    }
+  }
+}
+
+@media screen and (max-width: 1400px) {
+  .home {
+    .content {
+      .warpper {
+        .slide {
+          img,
+          video,
+          iframe {
+          }
+          iframe {
+          }
+        }
+      }
+    }
+  }
+}
+
+@media screen and (max-width: 1000px) {
+  .home {
+    background: rgba(0, 0, 0, 0.8);
+    .content {
+      .warpper {
+        .slide {
+          width: 100%;
+          img,
+          video,
+          iframe {
+            max-height: none;
+            width: 100%;
+            border-radius: 0;
+          }
+          iframe {
+            width: 100%;
+            height: 100vh;
+          }
+        }
+      }
+    }
+    .iconarr {
+      list-style: none;
+      margin-right: 0px;
+      position: fixed;
+      bottom: 10px;
+      right: 0px;
+      z-index: 10000;
+      li {
+        width: 70px;
+      }
+    }
+  }
+}
+
+@media only screen and (max-width: 906px) and (orientation: landscape) {
+  .home {
+    .content {
+      .warpper {
+        .slide {
+          width: 100%;
+          img,
+          video,
+          iframe {
+            max-width: 70%;
+            max-height: 80vh;
+          }
+          iframe {
+            width: 100%;
+            max-width: unset;
+            height: 100vh;
+          }
+        }
+      }
+    }
+  }
+}
+</style>
+
+<style>
+*{
+  word-break: break-all;
+}
+.swiper-container {
+  width: 100%;
+  height: 100%;
+}
+
+.swiper-pagination-bullet {
+  background: #fff;
+}
+
+.swiper-pagination-bullets {
+  bottom: 40px!important;
+}
+
+.swiper-slide {
+  text-align: center;
+  font-size: 18px;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  transition: 300ms;
+  transform: scale(0.8);
+  position: relative;
+  opacity: 0.5;
+}
+
+.swiper-slide-active,
+.swiper-slide-duplicate-active {
+  transform: scale(1);
+  opacity: 1;
+  z-index: 999;
+}
+
+.swiper-button-prev,
+.swiper-button-next {
+  background: rgba(0, 0, 0, 0.4);
+  padding: 10px 20px;
+  color: #fff !important;
+}
+.swiper-button-prev {
+  left: 0;
+}
+.swiper-button-next {
+  right: 0;
+}
+
+@media screen and (max-width: 500px) {
+  .swiper-slide {
+    width: 100%;
+  }
+}
+
+
+
+::-webkit-scrollbar-track-piece {  
+	background-color:#ffffff;  
+}  
+::-webkit-scrollbar {  
+	width:8px;  
+  overflow: hidden;
+	height:13px;  
+}  
+::-webkit-scrollbar-thumb {  
+	background-color:#ccc;  
+	background-clip:padding-box;  
+	min-height:10px;  
+	border-radius: 4px;
+}  
+::-webkit-scrollbar-thumb:hover {  
+	background-color:#929292;  
+}  
+
+</style>

+ 3 - 0
hotspot/vue.config.js

@@ -0,0 +1,3 @@
+module.exports = {
+  publicPath: "./"
+};

+ 45 - 37
web/public/static/js/main_2020_show.js

@@ -16,11 +16,11 @@ g_tourAudio.addEventListener("ended", function() {
 
 g_tourAudio.oncanplaythrough = function() {
     g_tourAudio.play();
-    if(g_bgAudio && !g_bgAudio.paused){
-        manage.switchBgmState(false); 
-        g_bgAudio.pauseByTour = true
-    }
-    g_playAudio = g_tourAudio;  
+    // if(g_bgAudio && !g_bgAudio.paused){
+    //     manage.switchBgmState(false); 
+    //     g_bgAudio.pauseByTour = true
+    // }
+    // g_playAudio = g_tourAudio;  
 }
 
 
@@ -4852,7 +4852,7 @@ window.Modernizr = function(n, e, t) {
                 return destination && destination.panoId == e
             }
             ,
-            n.prototype.redirectToItem = function(e, t) {
+            n.prototype.redirectToItem = function(e, t,noMusic) {
                 if (null === e || void 0 === e)
                     return void A.warn("Director.redirectToItem() -> Redirecting to null item.");
                 if (!this.wouldInterrupt())
@@ -4862,8 +4862,9 @@ window.Modernizr = function(n, e, t) {
                 A.debug("Director.redirectToItem() -> Redirecting to " + e + " via " + t);
                 var i = function() {
                     s.setTimeout(function() {
+                        let flag = noMusic?'noMusic':''
                         this.setDestinationItem(e),
-                        this.goToDestination(!0, g.BEGINNING, a.warp.warpInterruptionRedirectTime, !1)
+                        this.goToDestination(flag, g.BEGINNING, a.warp.warpInterruptionRedirectTime, !1)
                     }
                     .bind(this), 0)
                 }
@@ -4902,10 +4903,16 @@ window.Modernizr = function(n, e, t) {
                 if(this.destinationItem[1] == 0){//如果是每个folder的起始
                     var musicInfo = this.model.heroLocations[this.destinationItem[0]].musicInfo
                     if(musicInfo && musicInfo.music){
-                        var o = musicInfo.music.includes(g_Prefix.slice(-10)) ? musicInfo.music :  g_Prefix + musicInfo.music;
-                        g_tourAudio.src = manage.dealURL(o);
-                        g_tourAudio.load()  
+                        g_tourAudio.pause();
+                        g_tourAudio.src = ""
+                        
+                        if(e!='noMusic'){
+                            var o = musicInfo.music.includes(g_Prefix.slice(-10)) ? musicInfo.music :  g_Prefix + musicInfo.music;
+                            g_tourAudio.src = manage.dealURL(o);
+                            g_tourAudio.load()  
+                        }
                     }
+                    
                 }
                 
                 if (this.onTheBus = !0,
@@ -4971,17 +4978,18 @@ window.Modernizr = function(n, e, t) {
                     this.emit(p.TourStart),
                     this.player.enablePreRendering(),
                     this.walkingSectionPaused ? (this.clearWalkingSectionPaused(),
-                    this.goToDestination()) : this.goNext()))
+                    this.goToDestination()) : (this.clearWalkingSectionPaused(),
+                    this.goToDestination())))
             } 
 			,
 			n.prototype.bgmReplay = function() {//xzw add  结束tour后可能要继续播放背景音乐
 				//if(g_tourAudio && g_tourAudio.paused && g_bgAudio && g_bgAudio.paused){
-                if(g_bgAudio && g_bgAudio.paused && g_bgAudio.pauseByTour){
-                    g_playAudio = g_bgAudio;
-                    g_tourAudio && g_tourAudio.pause();
-                    //window.tourAudio && window.tourAudio.pause(); 
-                    manage.switchBgmState(true); 
-				}
+                // if(g_bgAudio && g_bgAudio.paused && g_bgAudio.pauseByTour){
+                //     g_playAudio = g_bgAudio;
+                //     g_tourAudio && g_tourAudio.pause();
+                //     //window.tourAudio && window.tourAudio.pause(); 
+                //     manage.switchBgmState(true); 
+				// }
 			}
 			,
             n.prototype.stopTour = function(isAutoStop) {//停止导览        isAutoStop 希望仅在飞完结束自动停止时的stopTour不停止tourSound, 这样才能完整播放tourSound.  不过似乎会在倒数第二个片段点击按钮停止导览时也视作自动结束的(执行this.interrupt() )。
@@ -5008,7 +5016,7 @@ window.Modernizr = function(n, e, t) {
             ,
             n.prototype.goToHighlight = function(e) {
                 if (this.wouldInterrupt())
-                    this.itemCompare(this.destinationItem,e,'equal') ? this.interrupt() : this.redirectToItem(e, "goToHighlight");
+                    this.itemCompare(this.destinationItem,e,'equal') ? this.interrupt() : this.redirectToItem(e, "goToHighlight",true);
                 else {
                     if (A.debug("<tour.goto " + e + ">"),
                     this.isInterrupted())
@@ -5016,7 +5024,7 @@ window.Modernizr = function(n, e, t) {
                     this.clearWalkingSectionPaused(),
                     this.setDestinationItem(e),
                     this.useSpecialTransition("Hilight"),
-                    this.goToDestination(),
+                    this.goToDestination('noMusic'),
                     h.trackAlways("reach_highlight", {
                         reach_source: "thumb"
                     })
@@ -15781,7 +15789,7 @@ window.Modernizr = function(n, e, t) {
                 transparent: !0
             })
             var sprite = new r.Mesh( geometry, shaderMaterial );
-            var hotIconScale = parseFloat(window.MP_PREFETCHED_MODELDATA.hotIconScale);
+            var hotIconScale = parseFloat(window.MP_PREFETCHED_MODELDATA.hotIconScale*0.7);
 			sprite.dynamic = true; 
 			sprite.position.copy(this.position);
             sprite.quaternion.copy(this.quaternion)
@@ -15911,9 +15919,9 @@ window.Modernizr = function(n, e, t) {
                     exit.style["z-index"] = "3"
                     exit.onclick = ()=>{
                         $(div).remove()
-                        if(g_bgAudio && g_bgAudio.pauseByHot){
-                            manage.switchBgmState(true)
-                        }
+                        // if(g_bgAudio && g_bgAudio.pauseByHot){
+                        //     manage.switchBgmState(true)
+                        // }
                     }  
                     
                     var myElement = document.createElement("iframe");
@@ -15932,11 +15940,11 @@ window.Modernizr = function(n, e, t) {
                     
                     //打开热点的时候把背景音乐关闭了,避免与热点里面的音乐冲突
                     //g_bgAudio && g_bgAudio.pause();
-                    if(g_bgAudio && !g_bgAudio.paused){
-                        // manage.switchBgmState(false); 
-                        // g_bgAudio.pauseByHot = true
-                    } 
-                    if(g_tourAudio)g_tourAudio.pause()
+                    // if(g_bgAudio && !g_bgAudio.paused){
+                    //     manage.switchBgmState(false); 
+                    //     g_bgAudio.pauseByHot = true
+                    // } 
+                    // if(g_tourAudio)g_tourAudio.pause()
                     
                     
                     
@@ -15959,11 +15967,11 @@ window.Modernizr = function(n, e, t) {
 				var myElement = document.createElement("iframe");
                 //打开热点的时候把背景音乐关闭了,避免与热点里面的音乐冲突
                 //g_bgAudio && g_bgAudio.pause();
-                if(g_bgAudio && !g_bgAudio.paused){
-                    manage.switchBgmState(false); 
-                    g_bgAudio.pauseByHot = true
-                } 
-                if(g_tourAudio)g_tourAudio.pause()
+                // if(g_bgAudio && !g_bgAudio.paused){
+                //     manage.switchBgmState(false); 
+                //     g_bgAudio.pauseByHot = true
+                // } 
+                // if(g_tourAudio)g_tourAudio.pause()
                 
                 var src = getLink(this.link   )
                 myElement.src = src; 
@@ -21781,9 +21789,9 @@ window.Modernizr = function(n, e, t) {
                     manage.switchBgmState(true)
                 }; */
                 
-                if(g_bgAudio && g_bgAudio.pauseByHot){
-                    manage.switchBgmState(true)
-                }
+                // if(g_bgAudio && g_bgAudio.pauseByHot){
+                //     manage.switchBgmState(true)
+                // }
                 
                 
 				//$('#player').off("click",this.closePopup);
@@ -21930,7 +21938,7 @@ window.Modernizr = function(n, e, t) {
                     manage.switchBgmState(true)
                 } */
                 
-                if(!this.director.tourIsPlaying) this.director.bgmReplay()
+                // if(!this.director.tourIsPlaying) this.director.bgmReplay()
 			}
 			,
             n.prototype.bindEvents = function(e) {

+ 2 - 0
web/public/static/js/manage.js

@@ -110,6 +110,8 @@ Manage.prototype.loadAudio = function() { //相关:g_tourAudio \  g_playAudio
     g_bgAudio.loop = true;
     g_bgAudio.autoplay = false;
     g_bgAudio.id = "bgaudio";
+    g_bgAudio.volume = 0.4;
+
     
     //https://www.cnblogs.com/interdrp/p/4211883.html   部分资料
     g_bgAudio.load();	// iOS 9   还需要额外的 load 一下, 否则直接 play 无效

+ 2 - 2
web/public/static/js/myShow.js

@@ -1,7 +1,7 @@
 var g_ProjectName=window.location.pathname.substring(window.location.pathname.indexOf("/")+1,window.location.pathname.lastIndexOf("/"));
-// var g_Prefix="http://8.135.106.227:8009/";
+var g_Prefix="http://192.168.1.101:8080/";
 // https://super.4dage.com/
-var g_Prefix=window.location.origin+'/';
+// var g_Prefix=window.location.origin+'/';
 
 var s = window.location.href.split('/');
 s.pop();

+ 3 - 1
web/src/components/welcome/index.vue

@@ -2,7 +2,7 @@
   <div class="welcome">
     <template v-show="!isVideo">
       <img class="bg" :style="{'z-index': isVideo?-1:0,opacity:isVideo?0:1}" :src="require('@/assets/images/bg.jpg')" alt="">
-      <div  v-if="!isVideo" class="we_title">欢迎访问信息工程大学数字史馆</div>
+      <div  v-if="!isVideo" class="we_title">欢迎访问<br/>战略支援部队信息工程大学数字史馆</div>
       <span v-if="!isVideo" class="btn" @click="showVideo">开始预览</span>
     </template>
     <video @click="autoplay" ref="welcome" :style="{opacity:isVideo?1:0}" preload="auto" :poster="require('@/assets/images/videopost.jpg')" :src="require('@/assets/video/welcome.mp4')"></video>
@@ -77,6 +77,8 @@ export default {
   }
   >video{
     width: 100%;
+    height: 100%;
+    object-fit: fill;
   }
   .btn{
     position: absolute;

+ 56 - 7
web/src/views/gui/newguide.vue

@@ -3,17 +3,17 @@
     <img class="bg" :src="require('@/assets/images/daolanBg.png')" alt="" />
     <div class="swcon">
       <swiper
-        v-if="guide.list.length > 0"
+        v-if="mapData.length > 0"
         ref="listSwiper"
         class="swiper-con"
         :options="swiperOptions"
       >
         <swiper-slide
           class="swiper-slide"
-          v-for="(item, i) in guide.list"
+          v-for="(item, i) in mapData"
           :key="i"
         >
-          <div :class="{'slActive':guideActive === i,hoverCls:hoverIdx===i}">
+          <div :class="{'slActive':item.activemin<=guideActive&& item.activemax>=guideActive,hoverCls: item.toIdx===hoverIdx}">
             <img @click="gotoLight(item)" @mouseleave="hoverOutHandle(item,i)" @mouseenter="hoverHandle(item,i)" :src="(item.locations?item.locations[0].thumbnail_signed_src : item.thumbnail_signed_src)" :alt="item.name" />
             <span :title="item.name">{{item.name}}</span>
           </div>
@@ -114,6 +114,7 @@ export default {
       inter:null,
       hoverIdx:'',
       guideActive:'',
+      mapData:[],
       swiperOptions: {
         slidesPerView: "auto",
         autoplay: false,
@@ -141,14 +142,15 @@ export default {
       this.swiper[type]()
     },
     gotoLight(item){
-      player.director.goToHighlight([this.hoverIdx,0])
+      player.director.goToHighlight([item.toIdx,0])
     },
     hoverHandle(item,i){
-      this.hoverIdx = i;
-      player.model.emit('tourThumbImgHover',i)
+      this.hoverIdx = item.toIdx;
+      console.log(item);
+      player.model.emit('tourThumbImgHover',item.toIdx)
     },
     hoverOutHandle(item,i){ 
-        player.model.emit('tourThumbImgHoverLeave',i) 
+        player.model.emit('tourThumbImgHoverLeave',item.toIdx) 
        this.hoverIdx= '' 
     }
   },
@@ -161,6 +163,53 @@ export default {
       window.addEventListener("loadfinish", () => {
         this.guide = window.player.model.images;
         console.log(this.guide);
+        let fixArr = [{
+          idx:0,
+          activemin:0,
+          activemax:0,
+          name:'开篇'
+        },{
+          idx:1,
+          name:'序厅',
+          activemin:1,
+          activemax:4
+        },{
+          idx:5,
+          name:'万水千山 铁心向党',
+          activemin:5,
+          activemax:14
+        },{
+          idx:15,
+          name:'辗转办学 奠定优秀',
+          activemin:15,
+          activemax:20
+        },{
+          idx:21,
+          name:'汇聚中原 扬帆起航',
+          activemin:21,
+          activemax:26
+        },{
+          idx:27,
+          name:'综合办学 世纪跨越',
+          activemin:27,
+          activemax:32
+        },{
+          idx:33,
+          name:'不忘出心 时代重塑',
+          activemin:33,
+          activemax:41
+        }]
+        this.guide.list.forEach((item,i)=>{
+          let tmp = fixArr.find(sub=>sub.idx ==i)
+          if (tmp) {
+            this.mapData.push({
+              ...item,
+              ...tmp,
+              toIdx:i
+            })
+          }
+        })
+        console.log(this.mapData);
          //监听导览状态
           window.player.on('onplayStatus', (data)=>{
             this.guideActive = data.destinationItem && data.destinationItem[0]