tremble 3 år sedan
förälder
incheckning
a245310c90

+ 1 - 1
backstage/src/configue/http.js

@@ -8,7 +8,7 @@ const vue = new Vue();
 var isProduction = process.env.NODE_ENV === "production";
 let loading = "";
 
-const serverName = isProduction ? "/" : "http://192.168.0.135:8013/";
+const serverName = isProduction ? "/" : "http://192.168.0.169:8004/";
 
 const serverLocation = window.location.hostname;
 

+ 2 - 0
backstage/src/pages/content/sand/index.vue

@@ -1,5 +1,7 @@
 <template>
   <div>
+    <main-top>
+    </main-top>
     <div class="tablecon noSubmune" >
       <div class="tablebody">
         <search>

+ 11 - 5
backstage/src/pages/layout/aside.vue

@@ -54,6 +54,7 @@ export default {
       }
     },
     tmpRoute(newVal,oldVal){
+      console.log(newVal,oldVal);
       if (oldVal.length<=0&&!this.replaceLock&&newVal[0].key != "scene") {
         // this.$router.
           // this.$store.commit("SetActiveMenu", newVal[0]);
@@ -78,6 +79,7 @@ export default {
 
           if (item.name == sub.name) {
 
+
             if (sub.name =='操作日志') {
               sub.authority = sub.children[0].authority
             }
@@ -85,12 +87,14 @@ export default {
             let ttmp = ''
 
             for (let i = 0; i < sub.children.length; i++) {
-              let item = sub.children[i];
-              if (item.children) {
-                ttmp = item.children.find(tttt=>tttt.authority)
-                break
+              let cccc = sub.children[i];
+              if (cccc.children) {
+                ttmp = cccc.children.find(tttt=>tttt.authority)
               } else{
-                ttmp = item.authority
+                ttmp = cccc.authority
+              }
+
+              if (ttmp) {
                 break
               }
             }
@@ -108,11 +112,13 @@ export default {
         return tmp ? Object.assign(item,tmp) : tmp
       });
 
+        console.log(this.tmpRoute,'temp');
 
       let temp = this.tmpRoute.filter(item=>{
           return item.key == this.activeIdx
         })
 
+
       this.$store.commit("SetActiveMenu", temp[0] || this.tmpRoute[0]);
 
 

+ 96 - 66
edit-backstage/js/edit.js

@@ -4711,8 +4711,10 @@ var VisiSet = {
     this.showFootIcons(null, true);
 
     for (let i in player.model.hots) {
-      player.model.hots[i].visi_ = player.model.hots[i].visible;
-      player.model.hots[i].visible = false;
+      // player.model.hots[i].visi_ = player.model.hots[i].visible;
+      // player.model.hots[i].visible = false;
+      player.model.hots[i].visi_ = player.model.hots[i].mesh.visible;
+      player.model.hots[i].mesh.visible = false
     }
 
     player.model.panos.forEach((e) => {
@@ -4720,13 +4722,35 @@ var VisiSet = {
     });
   },
 
+  changePanoVisi:function(state){
+    var floor = player.model.allFloorsVisible ? 'all' : player.model.currentFloor
+    if(this.setPanoVisible){
+        if(floor != 'all' && this.panoVsetting && floor != this.panoVsetting.floor){//如果切换到其他楼,取消选中该pano
+            this.pauseSetPanoVisible('unsaved')
+        }
+    }
+    player.model.panos.forEach(e=>{
+        if(!e.footIcon)return
+            
+        if(state && !e.footIcon.visible && (floor == 'all' || floor == e.floor)){
+            e.footIcon.visible = true
+            if (this.setPanoLog)e.addTextSprite(e.id, $('#panoIdColorTex').val(), e.footIcon)
+        }else if(!state || floor != 'all' && floor != e.floor){
+            e.footIcon.visible = false
+            if (this.setPanoLog)e.removeTextSprite()
+        }
+    })
+},
+
   finishSetPanoLog: function () {
     //结束 退出这个设置
     if (!this.setPanoLog) return;
     //否则会加多个侦听
+    this.changePanoVisi(false)
+
     this.setPanoLog = false;
 
-    this.hideFootIcons();
+    // this.hideFootIcons();
 
     this.recoverAllState2();
     this.panosSelect = null;
@@ -4735,14 +4759,15 @@ var VisiSet = {
     permitTranMode(true);
 
     for (let i in player.model.hots) {
-      player.model.hots[i].visible = player.model.hots[i].visi_;
+      // player.model.hots[i].visible = player.model.hots[i].visi_;
+      player.model.hots[i].mesh.visible = player.model.hots[i].visi_
     }
 
     $("#panosIdShow").val("");
 
-    player.model.panos.forEach((e) => {
-      e.removeTextSprite();
-    });
+    // player.model.panos.forEach((e) => {
+    //   e.removeTextSprite();
+    // });
   },
   dealPanoLogClick: function (object) {
     var id = object.name == "" ? object.parent.name : object.name;
@@ -4909,7 +4934,7 @@ var VisiSet = {
     //否则会加多个侦听
     this.setPanoVisible = false;
 
-    this.hideFootIcons();
+    // this.hideFootIcons();
     this.delVisibleLines();
 
     //objects.tagManager.showAllTags();
@@ -5104,35 +5129,36 @@ var VisiSet = {
     return array;
   },
 
-  setDisplay: function (state) {
+  setDisplay: function(state) {
     var panos = player.model.panos;
     if (state) {
-      this.$confirmSnap.text("保存当前设置");
-      this.$confirmSnap.removeClass("hide");
+        this.$confirmSnap.text('保存当前设置');
+        this.$confirmSnap.removeClass('hide');
     } else {
-      this.$confirmSnap.addClass("hide");
-      this.changeBtn.addClass("hide");
+        this.$confirmSnap.addClass('hide');
+        this.changeBtn.addClass('hide')
     }
 
-    player.path.currentPanoMarker.mesh.visible = !state;
+    player.path.currentPanoMarker.mesh.visible = !state; 
     player.reticule.visible = !state;
-  },
+    this.changePanoVisi(state)
+},
 
-  delVisibleLines: function () {
+  delVisibleLines: function() {
     //xzw add  所有线都删除
     for (var i in this.tagsVLines) {
-      this.tagsVLines[i].geometry.dispose();
-      this.tagsVLines[i].material.dispose();
-      this.meshGroup.remove(this.tagsVLines[i]);
-      delete this.tagsVLines[i];
+        this.tagsVLines[i].geometry.dispose();
+        this.tagsVLines[i].material.dispose();
+        this.meshGroup.remove(this.tagsVLines[i]);
+        delete this.tagsVLines[i];
     }
     for (var i in this.panoVLines) {
-      this.panoVLines[i].geometry.dispose();
-      this.panoVLines[i].material.dispose();
-      this.meshGroup.remove(this.panoVLines[i]);
-      delete this.panoVLines[i];
+        this.panoVLines[i].geometry.dispose();
+        this.panoVLines[i].material.dispose();
+        this.meshGroup.remove(this.panoVLines[i]);
+        delete this.panoVLines[i];
     }
-  },
+},
   //--------panoVisible
   createPanoVisiLines: function (pano) {
     //  pano可见性线条
@@ -5358,48 +5384,51 @@ var VisiSet = {
     });
   },
 
-  resetPanosVisiByModel: function () {
-    //一键计算所有漫游可行 (计算后自动连接,但不保存)
-
-    $(".waiting").addClass("showloading");
-
-    let begin = () => {
-      this.pauseSetPanoVisible("unsaved");
-
-      var ifBlock = function (panoA, panoB) {
-        var A = panoA.position.clone();
-        var B = panoB.position.clone();
-        return !!convertTool.ifIntersectChunks(A, B, {});
-      };
-
-      player.model.panos.list.forEach((pano1) => {
-        this.SetOnePanoVisible(pano1); //开始设置pano1
-
-        player.model.panos.list.forEach((pano2) => {
-          if (pano1 == pano2) return;
-          if (pano1.id == "9" && pano2.id == "0") {
-            console.log(1);
-          }
-          var visiNew = !ifBlock(pano1, pano2);
-          var visiOld = !!(this.panoVLines[pano2.id] && this.panoVLines[pano2.id].visible);
-          if (visiNew != visiOld) {
-            //console.log('修改 '+pano1.id+'-'+pano2.id)
-            this.dealPanoVisible(pano2.id); //修改
-          }
-        });
-        this.pauseSetPanoVisible("unsaved"); //修改pano1结束
-      });
-
-      $(".waiting").removeClass("showloading");
-      manage.showInfo("修改成功,可以点击漫游点查看。点击保存当前设置后生效。");
-    };
+  resetPanosVisiByModel: function() {//一键计算所有漫游可行 (计算后自动连接,但不保存) 多楼层还没试过
+     
+    $('.waiting').addClass('showloading');
+    $('.pinBottom  .allFloorBtn').click()//全部楼层显示
+    let begin = ()=>{
+        this.pauseSetPanoVisible("unsaved")
+        
+    
+        var ifBlock = function(panoA, panoB ){
+            var A = panoA.position.clone();
+            var B = panoB.position.clone(); 
+            return !!convertTool.ifIntersectChunks(A, B, {})
+        }
+        
+                
+        player.model.panos.list.forEach(pano1=>{
+            this.SetOnePanoVisible(pano1)//开始设置pano1
+            
+            player.model.panos.list.forEach(pano2=>{
+                if(pano1 == pano2)return
+                if(pano1.id == '9'&& pano2.id == '0'){
+                    console.log(1)
+                }
+                var visiNew = !ifBlock(pano1,pano2)
+                var visiOld = !!(this.panoVLines[pano2.id] && this.panoVLines[pano2.id].visible)
+                if(visiNew != visiOld){
+                    //console.log('修改 '+pano1.id+'-'+pano2.id)
+                    this.dealPanoVisible(pano2.id)//修改
+                }
+                
+            })
+            this.pauseSetPanoVisible('unsaved')//修改pano1结束
+        })
+        
+        $('.waiting').removeClass('showloading');
+        manage.showInfo("修改成功,可以点击漫游点查看。点击保存当前设置后生效。")
+    }
+    
+    setTimeout(()=>{
+        if(this.setPanoVisible){
+            begin()
+        }
+    },100)
+},
 
-    setTimeout(() => {
-      if (this.setPanoVisible) {
-        begin();
-      }
-    }, 100);
-  },
 
   //========热点可见性==============
 
@@ -5440,6 +5469,7 @@ var VisiSet = {
     this.delVisibleLines();
     //删除线
     this.showFootIcons(player.currentPano);
+    this.changePanoVisi(true)
     this.createTagVisiLines(tag);
     //创线
 

+ 5 - 0
edit-backstage/js/main_2020_edit.js

@@ -6276,6 +6276,11 @@ function o(a, s, l) {
                         interaction_source: "gui"
                     })),
                     n.removeClass("open")
+
+                     //add:
+                    if (window.VisiSet && (VisiSet.setPanoVisible || VisiSet.setTagVisible || VisiSet.setPanoLog)){
+                        VisiSet.changePanoVisi(true)
+                    }
                 })
             }
             function I(e, t) {

+ 50 - 0
web/package-lock.json

@@ -12,6 +12,7 @@
         "axios": "^0.19.2",
         "canvaskeyframes": "^0.4.2",
         "core-js": "^3.6.5",
+        "infinite-scroll": "^4.0.1",
         "js-base64": "^3.6.1",
         "swiper": "^5.3.8",
         "v-viewer": "^1.6.4",
@@ -19,6 +20,7 @@
         "vue-awesome-swiper": "^4.1.1",
         "vue-chat-scroll": "^1.4.0",
         "vue-fullpage.js": "^0.1.7",
+        "vue-infinite-scroll": "^2.0.2",
         "vue-router": "^3.2.0",
         "vuex": "^3.5.1"
       },
@@ -5791,6 +5793,11 @@
         "node": ">= 0.6"
       }
     },
+    "node_modules/ev-emitter": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmmirror.com/ev-emitter/download/ev-emitter-2.1.2.tgz",
+      "integrity": "sha512-jQ5Ql18hdCQ4qS+RCrbLfz1n+Pags27q5TwMKvZyhp5hh2UULUYZUy1keqj6k6SYsdqIYjnmz7xyyEY0V67B8Q=="
+    },
     "node_modules/event-pubsub": {
       "version": "4.3.0",
       "resolved": "http://registry.npm.taobao.org/event-pubsub/download/event-pubsub-4.3.0.tgz",
@@ -6329,6 +6336,11 @@
         "node": ">=6"
       }
     },
+    "node_modules/fizzy-ui-utils": {
+      "version": "3.0.0",
+      "resolved": "https://registry.nlark.com/fizzy-ui-utils/download/fizzy-ui-utils-3.0.0.tgz",
+      "integrity": "sha1-zF6HbuomPT2SgooxRHRdvXuXL8g="
+    },
     "node_modules/flat-cache": {
       "version": "2.0.1",
       "resolved": "http://registry.npm.taobao.org/flat-cache/download/flat-cache-2.0.1.tgz",
@@ -7283,6 +7295,15 @@
       "integrity": "sha1-xM78qo5RBRwqQLos6KPScpWvlGc=",
       "dev": true
     },
+    "node_modules/infinite-scroll": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmmirror.com/infinite-scroll/download/infinite-scroll-4.0.1.tgz",
+      "integrity": "sha1-CT2v4thr9M0n2juSCkb4mPIsk58=",
+      "dependencies": {
+        "ev-emitter": "^2.1.0",
+        "fizzy-ui-utils": "^3.0.0"
+      }
+    },
     "node_modules/inflight": {
       "version": "1.0.6",
       "resolved": "http://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz",
@@ -13049,6 +13070,11 @@
       "integrity": "sha1-UylVzB6yCKPZkLOp+acFdGV+CPI=",
       "dev": true
     },
+    "node_modules/vue-infinite-scroll": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/vue-infinite-scroll/download/vue-infinite-scroll-2.0.2.tgz",
+      "integrity": "sha1-yjepH+ku4K07dKz4aCwAkXFEtxE="
+    },
     "node_modules/vue-loader": {
       "version": "15.9.3",
       "resolved": "https://registry.npm.taobao.org/vue-loader/download/vue-loader-15.9.3.tgz",
@@ -19023,6 +19049,11 @@
       "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
       "dev": true
     },
+    "ev-emitter": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmmirror.com/ev-emitter/download/ev-emitter-2.1.2.tgz",
+      "integrity": "sha512-jQ5Ql18hdCQ4qS+RCrbLfz1n+Pags27q5TwMKvZyhp5hh2UULUYZUy1keqj6k6SYsdqIYjnmz7xyyEY0V67B8Q=="
+    },
     "event-pubsub": {
       "version": "4.3.0",
       "resolved": "http://registry.npm.taobao.org/event-pubsub/download/event-pubsub-4.3.0.tgz",
@@ -19481,6 +19512,11 @@
         "locate-path": "^3.0.0"
       }
     },
+    "fizzy-ui-utils": {
+      "version": "3.0.0",
+      "resolved": "https://registry.nlark.com/fizzy-ui-utils/download/fizzy-ui-utils-3.0.0.tgz",
+      "integrity": "sha1-zF6HbuomPT2SgooxRHRdvXuXL8g="
+    },
     "flat-cache": {
       "version": "2.0.1",
       "resolved": "http://registry.npm.taobao.org/flat-cache/download/flat-cache-2.0.1.tgz",
@@ -20256,6 +20292,15 @@
       "integrity": "sha1-xM78qo5RBRwqQLos6KPScpWvlGc=",
       "dev": true
     },
+    "infinite-scroll": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmmirror.com/infinite-scroll/download/infinite-scroll-4.0.1.tgz",
+      "integrity": "sha1-CT2v4thr9M0n2juSCkb4mPIsk58=",
+      "requires": {
+        "ev-emitter": "^2.1.0",
+        "fizzy-ui-utils": "^3.0.0"
+      }
+    },
     "inflight": {
       "version": "1.0.6",
       "resolved": "http://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz",
@@ -25070,6 +25115,11 @@
       "integrity": "sha1-UylVzB6yCKPZkLOp+acFdGV+CPI=",
       "dev": true
     },
+    "vue-infinite-scroll": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/vue-infinite-scroll/download/vue-infinite-scroll-2.0.2.tgz",
+      "integrity": "sha1-yjepH+ku4K07dKz4aCwAkXFEtxE="
+    },
     "vue-loader": {
       "version": "15.9.3",
       "resolved": "https://registry.npm.taobao.org/vue-loader/download/vue-loader-15.9.3.tgz",

+ 2 - 0
web/package.json

@@ -12,6 +12,7 @@
     "axios": "^0.19.2",
     "canvaskeyframes": "^0.4.2",
     "core-js": "^3.6.5",
+    "infinite-scroll": "^4.0.1",
     "js-base64": "^3.6.1",
     "swiper": "^5.3.8",
     "v-viewer": "^1.6.4",
@@ -19,6 +20,7 @@
     "vue-awesome-swiper": "^4.1.1",
     "vue-chat-scroll": "^1.4.0",
     "vue-fullpage.js": "^0.1.7",
+    "vue-infinite-scroll": "^2.0.2",
     "vue-router": "^3.2.0",
     "vuex": "^3.5.1"
   },

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

@@ -7451,6 +7451,8 @@ window.Modernizr = function(n, e, t) {
             K.supportsFullscreen() || $("#gui-fullscreen").hide(),
             $("#pullTab").on("click", function(e) {
                 l(e),
+                window.player.director.emit('isPulltttttt',!$("#drawer").hasClass("open"));
+
                 $("#drawer").hasClass("open") ? (J.trackAlways("showcase_gui", {
                     gui_action: "hide_highlight_reel"
                 }),

+ 3 - 3
web/public/static/js/manage.js

@@ -1,9 +1,9 @@
   
 var g_ProjectName=window.location.pathname.substring(window.location.pathname.indexOf("/")+1,window.location.pathname.lastIndexOf("/"));
-var g_Prefix="https://super.4dage.com/";
+// var g_Prefix="https://super.4dage.com/";
 
-// var g_Prefix=window.location.origin+'/';
-// window.isLocal = true
+var g_Prefix=window.location.origin+'/';
+window.isLocal = true
 
 
 var g_index=null;

+ 6 - 7
web/src/components/exhibition/data.js

@@ -188,7 +188,6 @@ let data = {
     },
   },
 };
-
 let region = {
   '序厅': [
     'd879e313fa5542deb51211c2b48f4eb0',
@@ -355,18 +354,18 @@ let region = {
     '18ed587bebe145708dad59820061cf49',
     '3aba08ec0c3044b081dca02859324a60',
     '3d329f08d3a7464e9d982b476a3d2429',
-    '7209db7784f446298762271fa8f6b06b'
-  ],
-
-
-  '第一专题 政治建设': [
+    '7209db7784f446298762271fa8f6b06b',
     '778cb2df225c45a9bdbab65cdd461e7b',
     '3f3e6375be91453a8a5f4b33540cf95b',
     'b10cd9ecaa504b8b9ea85a0f24203a61',
     '76c49cfe57c24d089a66c5887eecc42f',
     '36b2ec11ff594bca970cf06b1da6788f',
     'cf926eb55f604591bd320bbdc330fb06',
-    '56537b82985f4795a8305562fe7497ef',
+    '56537b82985f4795a8305562fe7497ef'
+  ],
+
+
+  '第一专题 政治建设': [
     '1b9be2c96cd9449ab2cb8bd55aff0cfa',
     '85d0a46a5df54aa19a05f42fa5968ec3',
     '413b648a646e465c9025ca41b3883c52',

+ 3 - 3
web/src/components/exhibition/index.vue

@@ -28,7 +28,7 @@
         <img :src="require(`@/assets/images/project/star_active.png`)" alt="" />
       </li>
     </ul>
-    <div class="daolan" @click="isShow = !isShow">
+    <div class="daolan" @click="$emit('isShow',!isShow)">
       <img :src="require('@/assets/images/icon/daolan.png')" />
       <span>{{ isShow ? "收起" : "展开" }}导览</span>
     </div>
@@ -40,10 +40,11 @@ import { data, region } from "./data";
 
 
 
+
 export default {
+  props:['isShow'],
   data() {
     return {
-      isShow: false,
       currentScene:data[1],
       list: data[1].list,
       currentName: data[1].current.name,
@@ -51,7 +52,6 @@ export default {
   },
   computed:{
 
-
   },
 
   mounted() {

+ 1 - 1
web/src/mixins/index.js

@@ -143,7 +143,7 @@ Vue.mixin({
       if (!str) {
         return '-'
       }
-      let tmp = str.replace(RegExp(key, "g"), `<span style="color:#ffe0a6">${key}</span>`)
+      let tmp = str.replace(RegExp(key, "g"), `<span style="color:#ffe0a6;font-size:inherit;">${key}</span>`)
       console.log(tmp);
 
       return tmp

+ 2 - 2
web/src/newcomponents/returnhome/index.vue

@@ -3,10 +3,10 @@
         <img @click="$router.push({path:'/'})" :src="require(`@/assets/images/project/logo@2x.png`)" alt="">
         <div class="line"></div>
         <div class="view">
-          <p>欢迎您的到来,您是第{{visit||72144}}位参观者!</p>
+          <p>欢迎您的到来,您是第{{visit||'-'}}位参观者!</p>
           <div>
             <img :src="require(`@/assets/images/project/renqi@2x.png`)" alt="">
-            <span>{{visit||72144}}</span><span>浏览量</span>
+            <span>{{visit||'-'}}</span><span>浏览量</span>
           </div>
         </div>
       </div>

+ 350 - 47
web/src/views/expert/carousel/bigpic.vue

@@ -1,70 +1,373 @@
 <template>
-  <div class="longcon">
-    <div class="longbody">
-      <ul ref="layout" :style="{left:x + 'px'}" >
-        <li :class="{weiyi: i%2==0}" v-for="(item,i) in list" :key="i">
-          <img :src="require(`@/assets/images/expert/big/${item}.png`)" alt="">
-        </li>
-      </ul>
-    </div>
+  <div class="lunbo" ref="bgsw" v-swiper:mySwiper="swiperOptions">
+    <ul class="swiper-wrapper">
+      <li
+        class="swiper-slide"
+        @click.stop="handleItem(item)"
+        :class="{ weiyi: i % 2 != 0, flipActive: active.id == item.id }"
+        v-for="(item, i) in piclist"
+        :key="i"
+      >
+        <!-- class="animate__animated animate__flip" -->
+
+        <div class="imgdefault brightnessBigW">
+          <!-- 'http://192.168.0.245:8004/'+ -->
+
+          <img :class="{ hideImg: noImg }" :src="item.thumb" alt="" />
+          <p>
+            <strong :title="item.name">{{ item.name }}</strong>
+            <span :title="item.title || g_typeStr[item.level]">{{ item.title || g_typeStr[item.level] }}</span>
+            <span :title="item.years ? `(${item.years})` : ''">{{ item.years ? `(${item.years})` : "" }}</span>
+          </p>
+        </div>
+
+        <div class="imgactive brightnessBigW">
+          <h2>
+            <strong :title="item.name">{{ item.name }}</strong>
+            <span :title="item.years ? `(${item.years})` : ''">{{ item.years ? `(${item.years})` : "" }}</span>
+          </h2>
+          <h2>
+            <strong :title="item.title || g_typeStr[item.level]">{{ item.title || g_typeStr[item.level] }}</strong>
+          </h2>
+
+          <!-- 'http://192.168.0.245:8004/'+ -->
+          <div v-if="showVideo && item.video" class="iivideo" :class="{ iimask: showBofang, iinourl: item.url }">
+            <img class="bofang" @click.stop="openVideo(item)" :src="require(`@/assets/images/expert/bofang.png`)" v-if="showBofang" />
+            <img class="poster" :src="item.thumb" v-if="showBofang" />
+          </div>
+
+          <p :class="{ novideo: !item.video, nourl: !item.video && !item.url }" v-html="item.description"></p>
+
+          <div class="enter" :title="item.urlName" v-if="item.url" @click.stop="open(item)">
+            <span>{{ item.urlName || "-" }}</span>
+          </div>
+        </div>
+        <!-- <img class="active" v-if="active===item" :src="require(`@/assets/images/expert/big/${active+1}.png`)" alt=""> -->
+      </li>
+    </ul>
   </div>
 </template>
 
 <script>
+import { directive } from "vue-awesome-swiper";
+// import style (<= Swiper 5.x)
+import "swiper/css/swiper.css";
+
 export default {
-  props:['x'],
-  data(){
+  props: ["list"],
+  data() {
     return {
-      list:[
-        1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6,7
-      ]
-    }
-  }
-}
+      piclist: [...this.list],
+      active: "",
+      showBofang: "",
+      hadvideo: false,
+      clkLock: false,
+      showVideo: false,
+      noImg: false,
+      TO: null,
+      TT: null,
+    };
+  },
+  directives: {
+    swiper: directive,
+  },
+
+  methods: {
+    open(item) {
+      let windowObjectReference = window.open();
+      let temp = this.changetohttp(item.url);
+      windowObjectReference.location.href = temp;
+      // window.open(item.url,'_blank')
+    },
+    openVideo(item) {
+      this.$emit("current", item);
+    },
+    handleItem(item) {
+      if (this.clkLock) {
+        return;
+      }
+
+      setTimeout(() => {
+        this.clkLock = false;
+      }, 500);
+
+      this.clkLock = true;
+
+      if (item == this.active) {
+        this.active = "";
+        this.noImg = false;
+        this.TO && clearTimeout(this.TO);
+        this.TO = setTimeout(() => {
+          this.showVideo = false;
+        }, 300);
+      } else {
+        this.active = item;
+
+        this.TT && clearTimeout(this.TT);
+        this.TT = setTimeout(() => {
+          this.noImg = true;
+        }, 600);
+        if (item.video) {
+          this.showVideo = true;
+        } else {
+          this.showVideo = false;
+        }
+      }
+      this.showBofang = true;
+      this.hadvideo = false;
+    },
+  },
+
+  mounted() {
+    this.$bus.$on("handlePN", (data)=>{
+      if (data == 'prev') {
+          this.$refs.bgsw.swiper.slidePrev()
+        }
+        else{
+         this.$refs.bgsw.swiper.slideNext()
+        }
+    });
+  },
+
+  computed: {
+    swiperOptions() {
+      return {
+        slidesPerView: "auto",
+        observer:true,
+        freeMode: true
+      };
+    },
+  },
+};
 </script>
 
 <style lang="less" scoped>
-.longcon{
+@jianjinw: 10%;
+.lunbo {
   width: 100%;
+  position: relative;
   height: 100%;
-  position: absolute;
-  top: 50%;
-  left: 0;
-  transform: translateY(-50%);
-  .close{
-    position: absolute;
-    right: 20px;
-    top: 20px;
-    width: 30px;
-    z-index: 99999;
-    cursor: pointer;
-  }
-  @w:100px;
-  .longbody{
+  color: #fff;
+  .swiper-wrapper {
     width: 100%;
     height: 100%;
-    position: relative;
-    >ul{
-      position: absolute;
-      top: 50%;
-      left: 0;
+    align-items: flex-end;
+    bottom: 188px;
+    .swiper-slide {
       display: inline-block;
-      white-space: nowrap;
-      transition: .8s ease left;
-      transform: translateY(-50%);
-      >li{
+      margin: 0 60px;
+      position: relative;
+      height: auto;
+      // cursor: pointer;
+      width: 340px;
+      perspective: 1000px;
+      transition: 0.3s ease;
+      .imgdefault,
+      .imgactive {
+        width: 100%;
+        padding: 10px;
         display: inline-block;
-        margin: 0 220px;
-        >img {
-          width: 370px;
+        vertical-align: bottom;
+        border: 2px solid rgba(243, 199, 165, 0.4);
+        background: linear-gradient(180deg, rgba(178, 69, 81, 0.2) 0%, rgba(239, 167, 120, 0.2) 100%);
+        position: relative;
+        backface-visibility: hidden;
+        transition: 0.6s;
+        transform-style: preserve-3d;
+        //transform: rotateX(0);
+        > img {
+          width: 100%;
+          position: relative;
+        }
+        > p {
+          text-align: left;
+          font-size: 22px;
+          font-weight: bold;
+          margin: 10px 0;
+          white-space: nowrap;
+          > strong {
+            font-size: 22px;
+            font-weight: bold;
+            width: 90px;
+            overflow: hidden;
+            text-overflow: ellipsis;
+            white-space: nowrap;
+            display: inline-block;
+            vertical-align: bottom;
+          }
+          > span {
+            display: inline-block;
+            font-size: 16px;
+            width: 78px;
+            overflow: hidden;
+            text-overflow: ellipsis;
+            white-space: nowrap;
+            display: inline-block;
+            vertical-align: bottom;
+            text-align: center;
+            &:last-of-type {
+              width: auto;
+              max-width: 170px;
+            }
+          }
         }
       }
-      .weiyi{
-        transform: translate3d(0,80px,30px);
+      .imgactive {
+        position: absolute;
+        left: 0;
+        bottom: 0;
+        height: 560px;
+        text-align: left;
+        transform: rotateY(-180deg);
+        background: linear-gradient(180deg, rgba(178, 69, 81, 0.5) 0%, rgba(239, 167, 120, 0.5) 100%);
+        padding: 20px 26px;
+        .iivideo {
+          width: 100%;
+          height: 70%;
+          position: relative;
+          z-index: 99;
+          overflow: hidden;
+          .bofang {
+            position: absolute;
+            top: 50%;
+            cursor: pointer;
+            left: 50%;
+            transform: translate(-50%, -50%);
+            z-index: 9999;
+          }
+
+          .poster {
+            width: 100%;
+            position: absolute;
+            top: 50%;
+            transform: translateY(-50%);
+          }
+        }
+
+        .iinourl {
+          height: 60%;
+        }
+
+        .iimask {
+          &::before {
+            content: "";
+            display: inline-block;
+            background-color: rgba(0, 0, 0, 0.6);
+            z-index: 1;
+            width: 100%;
+            height: 100%;
+            position: absolute;
+            top: 0;
+            left: 0;
+          }
+        }
+        > h2 {
+          font-size: 24px;
+          font-weight: normal;
+          margin-bottom: 6px;
+          height: 7%;
+          > strong {
+            font-size: 24px;
+            font-weight: bold;
+            width: 120px;
+            overflow: hidden;
+            text-overflow: ellipsis;
+            white-space: nowrap;
+            display: inline-block;
+            vertical-align: bottom;
+          }
+          &:last-of-type {
+            > strong {
+              width: 300px;
+            }
+          }
+          span {
+            width: auto;
+            max-width: 160px;
+            overflow: hidden;
+            text-overflow: ellipsis;
+            white-space: nowrap;
+            display: inline-block;
+            vertical-align: bottom;
+          }
+        }
+
+        > p {
+          text-indent: 28px;
+          font-weight: normal;
+          font-size: 14px;
+          width: 100%;
+          max-height: 12%;
+          overflow-y: auto;
+          overflow-x: hidden;
+          line-height: 1.5;
+          white-space: break-spaces;
+        }
+
+        .novideo {
+          max-height: 64%;
+          min-height: 320px;
+          font-size: 16px;
+          margin-top: 40px;
+          text-align: justify;
+          overflow-y: auto;
+          padding-right: 10px;
+          margin-bottom: 20px;
+        }
+
+        .nourl {
+          max-height: 76%;
+          min-height: 380px;
+        }
+
+        .enter {
+          margin: 0 auto;
+          background: linear-gradient(360deg, #ffe0a6 0%, #fcf5d3 100%);
+          height: 45px;
+          line-height: 45px;
+          width: 70%;
+          color: #a58056;
+          position: relative;
+          padding: 0 20px;
+          cursor: pointer;
+          text-align: center;
+          overflow: hidden;
+          text-overflow: ellipsis;
+          white-space: nowrap;
+          vertical-align: bottom;
+          > span {
+            font-size: 20px;
+          }
+        }
+      }
+    }
+
+    .flipActive {
+      width: 360px;
+      .imgdefault {
+        transform: rotateY(-180deg);
+        > img {
+          width: 100%;
+          position: relative;
+        }
+
+        .hideImg {
+          display: none;
+        }
       }
+      .imgactive {
+        transform: rotateY(0deg);
+      }
+    }
+    .weiyi {
+      transform: translateY(-55px);
     }
   }
- 
+}
+</style>
 
+<style lang="less">
+.swiper-container .swiper-wrapper {
+  transition-timing-function: linear !important;
 }
-</style>
+</style>

+ 112 - 95
web/src/views/expert/carousel/index.vue

@@ -1,26 +1,27 @@
 <template>
-  <div class="carouselin" @pan="onPan" @panend="onPanEnd">
-    <smallpic  @current="data=>{$emit('current',data)}" :smooth="smooth" ref="smpic" :list="piclist" :speedX="speedX" :x="translate.x" />
+  <div class="carouselin">
+    <smallpic v-if="piclist.length>0" @current="data=>{$emit('current',data)}"  :list="piclist"  />
     <!-- <bigpic :x="translate.x*1.3"/> -->
-    <star :x="translate.x * 1.3" />
+    <!-- <star :x="translate.x * 1.3" /> -->
   </div>
 </template>
 
 <script>
-import smallpic from "./smallpic.vue";
+import smallpic from "./bigpic.vue";
+// smallpic
 // import bigpic from "./bigpic.vue";
-import star from "./star.vue";
+// import star from "./star.vue";
 
-import AnyTouch from "any-touch";
+// import AnyTouch from "any-touch";
 
-let speed = 0.08;
+// let speed = 0.08;
 
-let acceleration = 0.1; //摩擦系数
-const wh = { width: window.innerWidth, height: window.innerHeight };
+// let acceleration = 0.1; //摩擦系数
+// const wh = { width: window.innerWidth, height: window.innerHeight };
 
 export default {
   props:['piclist'],
-  components: { smallpic, star },
+  components: { smallpic },
   data() {
     return {
       loading: true,
@@ -33,96 +34,112 @@ export default {
       deltaX: 0,
       isStop: true,
       TO:null,
-      smooth:false
+      smooth:false,
+      isEnd:false,
+      lockEnd:false
     };
   },
 
-  methods: {
-    onPanEnd() {
-      this.isStop = true;
-    },
-    onPan(ev) {
-      this.timer && cancelAnimationFrame(this.timer);
-      this.isStop = false;
-      this.deltaX = ev.deltaX;
-      this.$emit("xchange");
-      let rafId = "";
-
-      // ev.speedX
-      let timerfn = () => {
-        let x = this.translate.x;
-        this.translate.x = Math.min(Math.max(x + this.deltaX, -this.offw), 0);
-        if (this.isStop) {
-          let fn = () => {
-            let tseep = speed;
-            tseep *= acceleration;
-            if (ev.direction == "left") {
-              this.deltaX += Math.abs(tseep);
-            } else {
-              this.deltaX -= Math.abs(tseep);
-            }
-          };
-
-          let animloop = () => {
-            fn();
-            rafId = requestAnimationFrame(animloop);
-
-            if (ev.direction == "left") {
-              if (this.deltaX >= 0) {
-                cancelAnimationFrame(rafId);
-                cancelAnimationFrame(this.timer);
-              }
-            } else {
-              if (this.deltaX <= 0) {
-                cancelAnimationFrame(rafId);
-                cancelAnimationFrame(this.timer);
-              }
-            }
-          };
-          animloop();
-        }
-      };
-
-      let outloop = ()=>{
-        timerfn()
-        this.timer = requestAnimationFrame(outloop);
-      }
-      outloop()
-    },
+  // methods: {
+  //   onPanEnd() {
+  //     this.isStop = true;
+  //   },
+  //   onPan(ev) {
+  //     this.timer && cancelAnimationFrame(this.timer);
+  //     this.isStop = false;
+  //     this.deltaX = ev.deltaX;
+  //     let rafId = "";
+
+  //     // ev.speedX
+  //     let timerfn = () => {
+  //       let x = this.translate.x;
+  //       this.translate.x = Math.min(Math.max(x + this.deltaX, -this.offw), 0);
+
+  //       this.isEnd = (-this.translate.x >= this.offw)
+
+
+  //       if (this.isEnd && !this.lockEnd && !this.isStop) {
+  //         this.lockEnd = true
+  //         // console.log("isEnd");
+  //       } else{
+  //         if (this.lockEnd) {
+  //           this.lockEnd = false
+  //           console.log("noEnd");
+  //         }
+  //       }
+
+       
+  //       if (this.isStop) {
+  //         let fn = () => {
+  //           let tseep = speed;
+  //           tseep *= acceleration;
+  //           if (ev.direction == "left") {
+  //             this.deltaX += Math.abs(tseep);
+  //           } else {
+  //             this.deltaX -= Math.abs(tseep);
+  //           }
+  //         };
+
+  //         let animloop = () => {
+  //           fn();
+  //           rafId = requestAnimationFrame(animloop);
+
+  //           if (ev.direction == "left") {
+  //             if (this.deltaX >= 0) {
+  //               cancelAnimationFrame(rafId);
+  //               cancelAnimationFrame(this.timer);
+  //             }
+  //           } else {
+  //             if (this.deltaX <= 0) {
+  //               cancelAnimationFrame(rafId);
+  //               cancelAnimationFrame(this.timer);
+  //             }
+  //           }
+  //         };
+  //         animloop();
+  //       }
+  //     };
+
+  //     let outloop = ()=>{
+  //       timerfn()
+  //       this.timer = requestAnimationFrame(outloop);
+  //     }
+  //     outloop()
+  //   },
  
-  },
+  // },
   mounted() {
-    this.$nextTick(() => {
-      const at = new AnyTouch(this.$el);
-
-      this.$on("hook:destroyed", () => {
-        at.destroy();
-      });
-
-      this.$bus.$on('handlePN',data=>{
-        this.smooth = true
-        let tttt = 410
-        if (data == 'prev') {
-          this.translate.x = Math.min(Math.max(this.translate.x + tttt, -this.offw), 0)
-        }
-        else{
-          this.translate.x = Math.min(Math.max(this.translate.x - tttt, -this.offw), 0)
-        }
-
-        this.TO && clearTimeout(this.TO)
-        this.TO =  setTimeout(() => {
-          this.smooth = false
-        }, 400);
-      })
-
-
-      if (this.piclist.length>0) {
-        setTimeout(() => {
-          this.offw = this.$refs.smpic.$el.querySelector("ul").offsetWidth - wh.width;
-        }, 700);
-      }
-
-    });
+  //   this.$nextTick(() => {
+  //     const at = new AnyTouch(this.$el);
+
+  //     this.$on("hook:destroyed", () => {
+  //       at.destroy();
+  //     });
+
+  //     this.$bus.$on('handlePN',data=>{
+  //       this.smooth = true
+  //       let tttt = 410
+  //       if (data == 'prev') {
+  //         this.translate.x = Math.min(Math.max(this.translate.x + tttt, -this.offw), 0)
+  //       }
+  //       else{
+  //         this.translate.x = Math.min(Math.max(this.translate.x - tttt, -this.offw), 0)
+  //       }
+
+  //       this.TO && clearTimeout(this.TO)
+  //       this.TO =  setTimeout(() => {
+  //         this.smooth = false
+  //       }, 400);
+  //     })
+
+
+  //     if (this.piclist.length>0) {
+  //       setTimeout(() => {
+  //         this.offw = this.$refs.smpic.$el.querySelector("ul").offsetWidth - wh.width;
+  //       }, 700);
+  //     }
+
+  //   });
   },
   beforeDestroy() {
   },

+ 77 - 22
web/src/views/expert/carousel/smallpic.vue

@@ -12,7 +12,8 @@
 
           <div class="imgdefault brightnessBigW">
             <!-- 'http://192.168.0.245:8004/'+ -->
-            <img :src="item.thumb" alt="" />
+
+            <img :class="{hideImg: noImg}" :src="item.thumb" alt="" />
             <p>
               <strong :title="item.name">{{ item.name }}</strong>
               <span :title="item.title || g_typeStr[item.level]">{{ item.title || g_typeStr[item.level] }}</span>
@@ -31,9 +32,10 @@
 
             <!-- 'http://192.168.0.245:8004/'+ -->
             <div
-             v-if="item.video && (active.id == item.id)" class="iivideo"
+             v-if="showVideo && item.video" class="iivideo"
              :class="{iimask:showBofang, iinourl:item.url}">
-              <img class="bofang" :src="require(`@/assets/images/expert/bofang.png`)" v-if="showBofang"/>
+             
+              <img class="bofang" @click.stop="openVideo(item)" :src="require(`@/assets/images/expert/bofang.png`)" v-if="showBofang"/>
               <img class="poster" :src="item.thumb" v-if="showBofang"/>
             </div>
 
@@ -52,16 +54,29 @@
 
 <script>
 
+let SIZE = 20
+
 export default {
-  props: ["x", "list","smooth"],
+  props: ["x", "list","smooth",'isEnd'],
   data() {
     return {
-      piclist: [...this.list],
+      // piclist: [...this.list],
       active: "",
       showBofang:'',
-      hadvideo: false
+      hadvideo: false,
+      clkLock:false,
+      showVideo:false,
+      noImg:false,
+      TO:null,
+      TT:null,
+      pageNum: 0
     };
   },
+  watch:{
+    isEnd(){
+      this.pageNum += 1  
+    }
+  },
   methods: {
     open(item) {
       let windowObjectReference = window.open();
@@ -69,21 +84,52 @@ export default {
       windowObjectReference.location.href = temp;
       // window.open(item.url,'_blank')
     },
+    openVideo(item){
+      this.$emit('current',item)
+    },
     handleItem(item) {
+      if (this.clkLock) {
+        return
+      }
+
+      setTimeout(() => {
+          this.clkLock = false
+      }, 500);
+
+      this.clkLock = true
+      
       if (item == this.active) {
-        if (this.active&&this.active.video&&!this.hadvideo) {
-          this.$emit('current',item)
-          this.hadvideo = true
-          return
-        }
         this.active = "";
+        this.noImg = false
+        this.TO && clearTimeout(this.TO)
+        this.TO = setTimeout(() => {
+          this.showVideo = false
+        }, 300);
       } else {
         this.active = item;
+
+        this.TT && clearTimeout(this.TT)
+        this.TT = setTimeout(() => {
+          this.noImg = true
+        }, 600);
+        if (item.video) {
+          this.showVideo = true
+        } else {
+          this.showVideo = false
+        }
       }
       this.showBofang = true
       this.hadvideo = false
     },
+    
   },
+  computed:{
+    piclist(){
+      let tmp = this.list.slice(Math.max((SIZE*this.pageNum - 5), 0),(SIZE*(this.pageNum+1)-5))
+      console.log(tmp);
+      return tmp
+    }
+  }
 };
 </script>
 
@@ -112,12 +158,12 @@ export default {
         display: inline-block;
         margin: 0 60px;
         position: relative;
-        cursor: pointer;
+        // cursor: pointer;
         width: 340px;
         perspective: 500px;
         transform-style: preserve-3d;
         transition: 0.3s ease;
-        transform: rotateX(-4deg);
+        //transform: rotateX(0);
 
         .imgdefault,
         .imgactive {
@@ -135,7 +181,7 @@ export default {
           backface-visibility: hidden;
           perspective: 1000px;
           transition: 0.6s;
-          transform: rotateX(-4deg);
+          //transform: rotateX(0);
           > img {
             width: 100%;
             position: relative;
@@ -148,7 +194,7 @@ export default {
             >strong{
               font-size: 22px;
               font-weight: bold;
-              width: 100px;
+              width: 90px;
               overflow: hidden;
               text-overflow:ellipsis;
               white-space: nowrap;
@@ -158,15 +204,16 @@ export default {
             > span {
               display: inline-block;
               font-size: 16px;
-              width: 60px;
+              width: 78px;
               overflow: hidden;
               text-overflow:ellipsis;
               white-space: nowrap;
               display: inline-block;
               vertical-align: bottom;
+              text-align: center;
               &:last-of-type{
                 width: auto;
-                max-width: 160px;
+                max-width: 170px;
               }
             }
           }
@@ -178,7 +225,7 @@ export default {
           bottom: -80px;
           height: 560px;
           text-align: left;
-          transform: rotateX(-4deg) rotateY(-180deg);
+          transform:  rotateY(-180deg);
           background: linear-gradient(
             180deg,
             rgba(178, 69, 81, 0.5) 0%,
@@ -190,14 +237,14 @@ export default {
             height: 70%;
             position: relative;
             z-index: 99;
-            cursor: pointer;
             overflow: hidden;
             .bofang {
               position: absolute;
               top: 50%;
+              cursor: pointer;
               left: 50%;
               transform: translate(-50%,-50%);
-              z-index: 99;
+              z-index: 9999;
             }
 
             .poster {
@@ -310,10 +357,18 @@ export default {
       .flipActive {
         width: 360px;
         .imgdefault {
-          transform: rotateY(-180deg) rotateX(-4deg);
+          transform: rotateY(-180deg);
+           > img {
+            width: 100%;
+            position: relative;
+          }
+
+          .hideImg{
+            display: none;
+          }
         }
         .imgactive {
-          transform: rotateY(-360deg) rotateX(-4deg);
+          transform: rotateY(-360deg);
         }
       }
 

+ 14 - 4
web/src/views/expert/index.vue

@@ -119,6 +119,8 @@ let expertlist = [
   },
 ];
 
+
+
 export default {
   components: { chat, collection, carousel, bofang, search },
   data() {
@@ -129,7 +131,9 @@ export default {
       list: [],
       expertlist: expertlist,
       current: {},
-      key:''
+      pageNum:1,
+      key:'',
+      lockApi:false
     };
   },
   watch: {
@@ -144,7 +148,6 @@ export default {
   },
   methods: {
     handleCurrent(data) {
-      console.log(data);
       this.current = data;
     },
     handlePN(type) {
@@ -163,16 +166,23 @@ export default {
     },
 
     getList() {
+      if(this.lockApi){
+        return
+      }
+      this.lockApi = true
       getExpertList(
         {
-          type: this.nowActive.id || "loyal_1",
+          pageNum: this.pageNum,
+          pageSize: 1000,
+          type: this.key? null : (this.nowActive.id || "loyal_1"),
           searchKey: this.key
         },
         (data) => {
           if (data.code == 0) {
             this.list = [];
             setTimeout(() => {
-              this.list = data.data || [];
+              this.lockApi = false
+              this.list = data.data.list
             });
           }
         }

+ 14 - 1
web/src/views/scene/gui/menu.vue

@@ -77,7 +77,7 @@
           <div id="gui-modes-map"  class="ui-icon double active">
             <div
               data-original-title="导览"
-              @click="isGuide = !isGuide"
+              @click="handleguide"
               id="pullTab"
               rel="tooltip"
               title="导览片段"
@@ -361,6 +361,19 @@ export default {
       });
   },
   methods: {
+    handleguide(e, outclk){
+      console.log(e,outclk,111111)
+      if(outclk){
+        if(!this.isGuide){
+          $('#pullTab').click()
+          this.isGuide = true
+        }
+        return
+      }
+      else{
+        this.isGuide = !this.isGuide
+      }
+    },
     dianzan(){
       this.isdianzan = !this.isdianzan
     },

+ 13 - 3
web/src/views/scene/scene.vue

@@ -28,7 +28,7 @@
             <v-title/>
 
             <!-- 底部菜单 -->
-            <v-menu @btnactive="handleActive"/>
+            <v-menu ref="menu" @btnactive="handleActive"/>
             
             <!-- 导览 -->
             <v-guide/>
@@ -56,7 +56,7 @@
         <v-other/>
         
     </div>
-    <exhibition class="exhibition" :style="{zIndex:showType?0:99}"/>
+    <exhibition class="exhibition" :isShow="isShowEXH" @isShow="handleShow" :style="{zIndex:showType?0:99}"/>
     <hovercom @close="handlepopClose" :showType="showType"/>
     <huizhang :visit="visit" @close="()=>{showhuizhang = false}" :showhuizhang="showhuizhang"/>
 
@@ -146,6 +146,11 @@ export default {
            this.$bus.$emit("resetxlzmode")
         });
 
+        window.player.director.on('isPulltttttt',data=>{
+          if(data) {
+            this.isShowEXH = false
+          }
+        })
         
 
         window.player.director.on("action.interrupted", () => {
@@ -194,6 +199,10 @@ export default {
 
   },
   methods:{
+    handleShow(data){
+      this.isShowEXH = data;
+      this.$refs.menu.handleguide('',true)
+    },
     handleActive(data){
      this.showType = data
       window.player.director.stopTour()
@@ -248,7 +257,8 @@ export default {
         showType:'',
         timer:null,
         cp:'',
-        visit:0
+        visit:0,
+        isShowEXH:false
       }
   }
 }