tremble 4 лет назад
Родитель
Сommit
ef523c835c
69 измененных файлов с 2608 добавлено и 1367 удалено
  1. 9 0
      babel.config.js
  2. 399 5
      package-lock.json
  3. 3 0
      package.json
  4. 1 1
      public/show.html
  5. 4 2
      public/showMobile.html
  6. 3 3
      public/static/template/plugins/gyro2.js
  7. 2 2
      public/static/template/plugins/webvr.js
  8. 42 80
      public/static/template/plugins/webvr.xml
  9. 1 1
      public/static/template/skin/vtourskin.xml
  10. 1 1
      public/static/template/static/js/vrshow.js
  11. 1 1
      public/vr.html
  12. 7 3
      src/api/index.js
  13. BIN
      src/assets/images/default/img_cover_default.png
  14. 71 42
      src/assets/style/component.less
  15. 7 4
      src/components/audio/index.vue
  16. 3 0
      src/components/paging.vue
  17. 28 12
      src/components/rollName/index.vue
  18. 15 1
      src/components/shared/loading/index.js
  19. 71 0
      src/components/shared/loading/smallWaiting.vue
  20. 7 4
      src/components/shared/message/Alert.vue
  21. 7 6
      src/components/shared/message/Confirm.vue
  22. 34 35
      src/components/shared/uploads/UploadMultiple.vue
  23. 8 1
      src/components/tableSelect.vue
  24. 25 7
      src/components/tablist/index.vue
  25. 54 54
      src/framework/Head.vue
  26. 15 17
      src/framework/Toolbar.vue
  27. 1 1
      src/framework/core/index.vue
  28. 1 0
      src/framework/material/aside.vue
  29. 3 3
      src/framework/material/header.vue
  30. 91 8
      src/framework/show/index.vue
  31. 3 2
      src/framework/show/list.vue
  32. 1 1
      src/framework/show/popup/imgview.vue
  33. 6 4
      src/framework/show/popup/password.vue
  34. 4 2
      src/framework/show/popup/preview.vue
  35. 235 116
      src/framework/showMobile/index.vue
  36. 120 65
      src/framework/showMobile/list.vue
  37. 1 1
      src/framework/showMobile/popup/imgview.vue
  38. 1 2
      src/framework/showMobile/popup/index.vue
  39. 1 2
      src/framework/showMobile/popup/password.vue
  40. 33 3
      src/framework/showMobile/popup/preview.vue
  41. 37 57
      src/framework/showMobile/ui/Show.Header.vue
  42. 92 67
      src/framework/vr/index.vue
  43. 45 0
      src/mixins/index.js
  44. 3 0
      src/pages/material.js
  45. 11 1
      src/pages/showMobile.js
  46. 4 4
      src/router/index.js
  47. 455 390
      src/utils/request.js
  48. 104 0
      src/utils/wxshare.js
  49. 4 0
      src/views/base/EditPanel/logo.vue
  50. 3 3
      src/views/base/Toolbar.vue
  51. 6 1
      src/views/hotspot/EditPanel.vue
  52. 24 5
      src/views/hotspot/Setting.vue
  53. 12 7
      src/views/hotspot/hotspotType/audio.vue
  54. 3 1
      src/views/hotspot/hotspotType/image.vue
  55. 2 2
      src/views/hotspot/hotspotType/scene.vue
  56. 5 1
      src/views/hotspot/hotspotType/video.vue
  57. 1 0
      src/views/information/Setting.vue
  58. 8 6
      src/views/information/Toolbar.vue
  59. 9 7
      src/views/information/index.vue
  60. 195 130
      src/views/material/audio/index.vue
  61. 3 0
      src/views/material/components/paging.vue
  62. 27 20
      src/views/material/image/index.vue
  63. 26 16
      src/views/material/pano/index.vue
  64. 1 4
      src/views/material/popup/cover.vue
  65. 3 9
      src/views/material/popup/preview.vue
  66. 1 0
      src/views/material/popup/share.vue
  67. 4 1
      src/views/material/style.less
  68. 186 136
      src/views/material/video/index.vue
  69. 15 7
      src/views/material/works/index.vue

+ 9 - 0
babel.config.js

@@ -1,5 +1,14 @@
 module.exports = {
 module.exports = {
   presets: [
   presets: [
     '@vue/cli-plugin-babel/preset'
     '@vue/cli-plugin-babel/preset'
+  ],
+  plugins: [
+    [
+      "component",
+      {
+        "libraryName": "element-ui",
+        "styleLibraryName": "theme-chalk"
+      }
+    ]
   ]
   ]
 }
 }

+ 399 - 5
package-lock.json

@@ -993,7 +993,6 @@
       "version": "7.12.5",
       "version": "7.12.5",
       "resolved": "https://registry.npm.taobao.org/@babel/runtime/download/@babel/runtime-7.12.5.tgz?cache=0&sync_timestamp=1604441104026&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fruntime%2Fdownload%2F%40babel%2Fruntime-7.12.5.tgz",
       "resolved": "https://registry.npm.taobao.org/@babel/runtime/download/@babel/runtime-7.12.5.tgz?cache=0&sync_timestamp=1604441104026&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fruntime%2Fdownload%2F%40babel%2Fruntime-7.12.5.tgz",
       "integrity": "sha1-QQ5+SHRB4bNgwpvnFdhw2bmFiC4=",
       "integrity": "sha1-QQ5+SHRB4bNgwpvnFdhw2bmFiC4=",
-      "dev": true,
       "requires": {
       "requires": {
         "regenerator-runtime": "^0.13.4"
         "regenerator-runtime": "^0.13.4"
       }
       }
@@ -1408,6 +1407,74 @@
         }
         }
       }
       }
     },
     },
+    "@videojs/http-streaming": {
+      "version": "2.6.4",
+      "resolved": "https://registry.npm.taobao.org/@videojs/http-streaming/download/@videojs/http-streaming-2.6.4.tgz",
+      "integrity": "sha1-o9nrYrAsbkhDnwM2dew6b1+M2yU=",
+      "requires": {
+        "@babel/runtime": "^7.12.5",
+        "@videojs/vhs-utils": "^3.0.0",
+        "aes-decrypter": "3.1.2",
+        "global": "^4.4.0",
+        "m3u8-parser": "4.5.2",
+        "mpd-parser": "0.15.4",
+        "mux.js": "5.10.0",
+        "video.js": "^6 || ^7"
+      },
+      "dependencies": {
+        "global": {
+          "version": "4.4.0",
+          "resolved": "https://registry.npm.taobao.org/global/download/global-4.4.0.tgz",
+          "integrity": "sha1-PnsQUXkAajI+1xqvyj6cV6XMZAY=",
+          "requires": {
+            "min-document": "^2.19.0",
+            "process": "^0.11.10"
+          }
+        }
+      }
+    },
+    "@videojs/vhs-utils": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npm.taobao.org/@videojs/vhs-utils/download/@videojs/vhs-utils-3.0.0.tgz",
+      "integrity": "sha1-mY/aKnUZIYowdZOF0gSLHNMOujY=",
+      "requires": {
+        "@babel/runtime": "^7.12.5",
+        "global": "^4.4.0",
+        "url-toolkit": "^2.2.1"
+      },
+      "dependencies": {
+        "global": {
+          "version": "4.4.0",
+          "resolved": "https://registry.npm.taobao.org/global/download/global-4.4.0.tgz",
+          "integrity": "sha1-PnsQUXkAajI+1xqvyj6cV6XMZAY=",
+          "requires": {
+            "min-document": "^2.19.0",
+            "process": "^0.11.10"
+          }
+        }
+      }
+    },
+    "@videojs/xhr": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npm.taobao.org/@videojs/xhr/download/@videojs/xhr-2.5.1.tgz",
+      "integrity": "sha1-JrxaeduzsDv7E3QsbOVZ+J6QcZ4=",
+      "requires": {
+        "@babel/runtime": "^7.5.5",
+        "global": "~4.4.0",
+        "is-function": "^1.0.1"
+      },
+      "dependencies": {
+        "global": {
+          "version": "4.4.0",
+          "resolved": "https://registry.npm.taobao.org/global/download/global-4.4.0.tgz",
+          "integrity": "sha1-PnsQUXkAajI+1xqvyj6cV6XMZAY=",
+          "requires": {
+            "min-document": "^2.19.0",
+            "process": "^0.11.10"
+          }
+        }
+      }
+    },
     "@vue/babel-helper-vue-jsx-merge-props": {
     "@vue/babel-helper-vue-jsx-merge-props": {
       "version": "1.2.1",
       "version": "1.2.1",
       "resolved": "https://registry.npm.taobao.org/@vue/babel-helper-vue-jsx-merge-props/download/@vue/babel-helper-vue-jsx-merge-props-1.2.1.tgz?cache=0&sync_timestamp=1602851122331&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fbabel-helper-vue-jsx-merge-props%2Fdownload%2F%40vue%2Fbabel-helper-vue-jsx-merge-props-1.2.1.tgz",
       "resolved": "https://registry.npm.taobao.org/@vue/babel-helper-vue-jsx-merge-props/download/@vue/babel-helper-vue-jsx-merge-props-1.2.1.tgz?cache=0&sync_timestamp=1602851122331&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fbabel-helper-vue-jsx-merge-props%2Fdownload%2F%40vue%2Fbabel-helper-vue-jsx-merge-props-1.2.1.tgz",
@@ -2135,6 +2202,28 @@
         }
         }
       }
       }
     },
     },
+    "aes-decrypter": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npm.taobao.org/aes-decrypter/download/aes-decrypter-3.1.2.tgz",
+      "integrity": "sha1-NUVUb46fa4eGQDOaJC7+Ihunp8s=",
+      "requires": {
+        "@babel/runtime": "^7.12.5",
+        "@videojs/vhs-utils": "^3.0.0",
+        "global": "^4.4.0",
+        "pkcs7": "^1.0.4"
+      },
+      "dependencies": {
+        "global": {
+          "version": "4.4.0",
+          "resolved": "https://registry.npm.taobao.org/global/download/global-4.4.0.tgz",
+          "integrity": "sha1-PnsQUXkAajI+1xqvyj6cV6XMZAY=",
+          "requires": {
+            "min-document": "^2.19.0",
+            "process": "^0.11.10"
+          }
+        }
+      }
+    },
     "aggregate-error": {
     "aggregate-error": {
       "version": "3.1.0",
       "version": "3.1.0",
       "resolved": "https://registry.npm.taobao.org/aggregate-error/download/aggregate-error-3.1.0.tgz?cache=0&sync_timestamp=1598049717562&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Faggregate-error%2Fdownload%2Faggregate-error-3.1.0.tgz",
       "resolved": "https://registry.npm.taobao.org/aggregate-error/download/aggregate-error-3.1.0.tgz?cache=0&sync_timestamp=1598049717562&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Faggregate-error%2Fdownload%2Faggregate-error-3.1.0.tgz",
@@ -2496,6 +2585,14 @@
       "integrity": "sha1-3TeelPDbgxCwgpH51kwyCXZmF/0=",
       "integrity": "sha1-3TeelPDbgxCwgpH51kwyCXZmF/0=",
       "dev": true
       "dev": true
     },
     },
+    "async-validator": {
+      "version": "1.8.5",
+      "resolved": "https://registry.npm.taobao.org/async-validator/download/async-validator-1.8.5.tgz",
+      "integrity": "sha1-3D4I7B/Q3dtn5ghC8CwM0c7G1/A=",
+      "requires": {
+        "babel-runtime": "6.x"
+      }
+    },
     "asynckit": {
     "asynckit": {
       "version": "0.4.0",
       "version": "0.4.0",
       "resolved": "http://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz",
       "resolved": "http://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz",
@@ -2916,6 +3013,11 @@
         "babel-types": "^6.24.1"
         "babel-types": "^6.24.1"
       }
       }
     },
     },
+    "babel-helper-vue-jsx-merge-props": {
+      "version": "2.0.3",
+      "resolved": "https://registry.nlark.com/babel-helper-vue-jsx-merge-props/download/babel-helper-vue-jsx-merge-props-2.0.3.tgz",
+      "integrity": "sha1-Iq69OzOQIyjlEyk6jkmSs4T58bY="
+    },
     "babel-helpers": {
     "babel-helpers": {
       "version": "6.24.1",
       "version": "6.24.1",
       "resolved": "https://registry.npm.taobao.org/babel-helpers/download/babel-helpers-6.24.1.tgz",
       "resolved": "https://registry.npm.taobao.org/babel-helpers/download/babel-helpers-6.24.1.tgz",
@@ -2953,6 +3055,38 @@
         "babel-runtime": "^6.22.0"
         "babel-runtime": "^6.22.0"
       }
       }
     },
     },
+    "babel-plugin-component": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npm.taobao.org/babel-plugin-component/download/babel-plugin-component-1.1.1.tgz",
+      "integrity": "sha1-mwI6I/9cmq4P1WxaGLnKuMTUXuo=",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-imports": "7.0.0-beta.35"
+      },
+      "dependencies": {
+        "@babel/helper-module-imports": {
+          "version": "7.0.0-beta.35",
+          "resolved": "https://registry.npm.taobao.org/@babel/helper-module-imports/download/@babel/helper-module-imports-7.0.0-beta.35.tgz",
+          "integrity": "sha1-MI41DnMXUs200PBY3x1wSSXGTgo=",
+          "dev": true,
+          "requires": {
+            "@babel/types": "7.0.0-beta.35",
+            "lodash": "^4.2.0"
+          }
+        },
+        "@babel/types": {
+          "version": "7.0.0-beta.35",
+          "resolved": "https://registry.nlark.com/@babel/types/download/@babel/types-7.0.0-beta.35.tgz",
+          "integrity": "sha1-z5M6mpo4SEynJLM1uI2Dcm1auWA=",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.2.0",
+            "to-fast-properties": "^2.0.0"
+          }
+        }
+      }
+    },
     "babel-plugin-dynamic-import-node": {
     "babel-plugin-dynamic-import-node": {
       "version": "2.3.3",
       "version": "2.3.3",
       "resolved": "https://registry.npm.taobao.org/babel-plugin-dynamic-import-node/download/babel-plugin-dynamic-import-node-2.3.3.tgz?cache=0&sync_timestamp=1587495903478&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbabel-plugin-dynamic-import-node%2Fdownload%2Fbabel-plugin-dynamic-import-node-2.3.3.tgz",
       "resolved": "https://registry.npm.taobao.org/babel-plugin-dynamic-import-node/download/babel-plugin-dynamic-import-node-2.3.3.tgz?cache=0&sync_timestamp=1587495903478&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbabel-plugin-dynamic-import-node%2Fdownload%2Fbabel-plugin-dynamic-import-node-2.3.3.tgz",
@@ -3963,6 +4097,14 @@
         "lazy-cache": "^1.0.3"
         "lazy-cache": "^1.0.3"
       }
       }
     },
     },
+    "chainsaw": {
+      "version": "0.0.9",
+      "resolved": "https://registry.npm.taobao.org/chainsaw/download/chainsaw-0.0.9.tgz",
+      "integrity": "sha1-EaBRAtHEx4W20EFdM21aOhYSkT4=",
+      "requires": {
+        "traverse": ">=0.3.0 <0.4"
+      }
+    },
     "chalk": {
     "chalk": {
       "version": "2.4.2",
       "version": "2.4.2",
       "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz",
       "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz",
@@ -5150,8 +5292,7 @@
     "deepmerge": {
     "deepmerge": {
       "version": "1.5.2",
       "version": "1.5.2",
       "resolved": "https://registry.npm.taobao.org/deepmerge/download/deepmerge-1.5.2.tgz?cache=0&sync_timestamp=1572279720382&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdeepmerge%2Fdownload%2Fdeepmerge-1.5.2.tgz",
       "resolved": "https://registry.npm.taobao.org/deepmerge/download/deepmerge-1.5.2.tgz?cache=0&sync_timestamp=1572279720382&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdeepmerge%2Fdownload%2Fdeepmerge-1.5.2.tgz",
-      "integrity": "sha1-EEmdhohEza1P7ghC34x/bwyVp1M=",
-      "dev": true
+      "integrity": "sha1-EEmdhohEza1P7ghC34x/bwyVp1M="
     },
     },
     "default-gateway": {
     "default-gateway": {
       "version": "5.0.5",
       "version": "5.0.5",
@@ -5493,6 +5634,11 @@
         }
         }
       }
       }
     },
     },
+    "dom-walk": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npm.taobao.org/dom-walk/download/dom-walk-0.1.2.tgz",
+      "integrity": "sha1-DFSL7wSPTR8qlySQAiNgYNqj/YQ="
+    },
     "dom7": {
     "dom7": {
       "version": "3.0.0",
       "version": "3.0.0",
       "resolved": "https://registry.npm.taobao.org/dom7/download/dom7-3.0.0.tgz",
       "resolved": "https://registry.npm.taobao.org/dom7/download/dom7-3.0.0.tgz",
@@ -5602,6 +5748,26 @@
       "resolved": "https://registry.npm.taobao.org/electron-to-chromium/download/electron-to-chromium-1.3.633.tgz?cache=0&sync_timestamp=1608748384027&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Felectron-to-chromium%2Fdownload%2Felectron-to-chromium-1.3.633.tgz",
       "resolved": "https://registry.npm.taobao.org/electron-to-chromium/download/electron-to-chromium-1.3.633.tgz?cache=0&sync_timestamp=1608748384027&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Felectron-to-chromium%2Fdownload%2Felectron-to-chromium-1.3.633.tgz",
       "integrity": "sha1-Ft1a7J3gOJTo0UodtM2oo2m5t/4="
       "integrity": "sha1-Ft1a7J3gOJTo0UodtM2oo2m5t/4="
     },
     },
+    "element-ui": {
+      "version": "2.15.1",
+      "resolved": "https://registry.npm.taobao.org/element-ui/download/element-ui-2.15.1.tgz?cache=0&sync_timestamp=1614082623756&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Felement-ui%2Fdownload%2Felement-ui-2.15.1.tgz",
+      "integrity": "sha1-raAKpuMsAndKLndWPdhGaPgTzf8=",
+      "requires": {
+        "async-validator": "~1.8.1",
+        "babel-helper-vue-jsx-merge-props": "^2.0.0",
+        "deepmerge": "^1.2.0",
+        "normalize-wheel": "^1.0.1",
+        "resize-observer-polyfill": "^1.5.0",
+        "throttle-debounce": "^1.0.1"
+      },
+      "dependencies": {
+        "throttle-debounce": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npm.taobao.org/throttle-debounce/download/throttle-debounce-1.1.0.tgz?cache=0&sync_timestamp=1604313832516&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fthrottle-debounce%2Fdownload%2Fthrottle-debounce-1.1.0.tgz",
+          "integrity": "sha1-UYU9o3vmihVctugns1FKPEIuic0="
+        }
+      }
+    },
     "elliptic": {
     "elliptic": {
       "version": "6.5.3",
       "version": "6.5.3",
       "resolved": "https://registry.npm.taobao.org/elliptic/download/elliptic-6.5.3.tgz?cache=0&sync_timestamp=1592493064833&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Felliptic%2Fdownload%2Felliptic-6.5.3.tgz",
       "resolved": "https://registry.npm.taobao.org/elliptic/download/elliptic-6.5.3.tgz?cache=0&sync_timestamp=1592493064833&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Felliptic%2Fdownload%2Felliptic-6.5.3.tgz",
@@ -6048,6 +6214,11 @@
       "resolved": "https://registry.npm.taobao.org/estraverse/download/estraverse-4.3.0.tgz?cache=0&sync_timestamp=1596642998635&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Festraverse%2Fdownload%2Festraverse-4.3.0.tgz",
       "resolved": "https://registry.npm.taobao.org/estraverse/download/estraverse-4.3.0.tgz?cache=0&sync_timestamp=1596642998635&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Festraverse%2Fdownload%2Festraverse-4.3.0.tgz",
       "integrity": "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0="
       "integrity": "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0="
     },
     },
+    "estree-walker": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npm.taobao.org/estree-walker/download/estree-walker-0.6.1.tgz?cache=0&sync_timestamp=1611956983677&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Festree-walker%2Fdownload%2Festree-walker-0.6.1.tgz",
+      "integrity": "sha1-UwSRQ/QMbrkYsjZx0f4yGfOhs2I="
+    },
     "esutils": {
     "esutils": {
       "version": "2.0.3",
       "version": "2.0.3",
       "resolved": "https://registry.npm.taobao.org/esutils/download/esutils-2.0.3.tgz",
       "resolved": "https://registry.npm.taobao.org/esutils/download/esutils-2.0.3.tgz",
@@ -6789,6 +6960,22 @@
       "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=",
       "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=",
       "dev": true
       "dev": true
     },
     },
+    "global": {
+      "version": "4.3.2",
+      "resolved": "https://registry.npm.taobao.org/global/download/global-4.3.2.tgz",
+      "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=",
+      "requires": {
+        "min-document": "^2.19.0",
+        "process": "~0.5.1"
+      },
+      "dependencies": {
+        "process": {
+          "version": "0.5.2",
+          "resolved": "https://registry.npm.taobao.org/process/download/process-0.5.2.tgz",
+          "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8="
+        }
+      }
+    },
     "globals": {
     "globals": {
       "version": "11.12.0",
       "version": "11.12.0",
       "resolved": "https://registry.npm.taobao.org/globals/download/globals-11.12.0.tgz?cache=0&sync_timestamp=1608438490211&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglobals%2Fdownload%2Fglobals-11.12.0.tgz",
       "resolved": "https://registry.npm.taobao.org/globals/download/globals-11.12.0.tgz?cache=0&sync_timestamp=1608438490211&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglobals%2Fdownload%2Fglobals-11.12.0.tgz",
@@ -6957,6 +7144,14 @@
         "minimalistic-assert": "^1.0.1"
         "minimalistic-assert": "^1.0.1"
       }
       }
     },
     },
+    "hashish": {
+      "version": "0.0.4",
+      "resolved": "https://registry.npm.taobao.org/hashish/download/hashish-0.0.4.tgz",
+      "integrity": "sha1-bWC8b/r3Ebav1g5CbQd5iAFOZVQ=",
+      "requires": {
+        "traverse": ">=0.2.4"
+      }
+    },
     "he": {
     "he": {
       "version": "1.2.0",
       "version": "1.2.0",
       "resolved": "http://registry.npm.taobao.org/he/download/he-1.2.0.tgz",
       "resolved": "http://registry.npm.taobao.org/he/download/he-1.2.0.tgz",
@@ -7374,6 +7569,11 @@
       "resolved": "http://registry.npm.taobao.org/indexes-of/download/indexes-of-1.0.1.tgz",
       "resolved": "http://registry.npm.taobao.org/indexes-of/download/indexes-of-1.0.1.tgz",
       "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc="
       "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc="
     },
     },
+    "individual": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npm.taobao.org/individual/download/individual-2.0.0.tgz",
+      "integrity": "sha1-gzsJfa0jKU52EXqY+zjg2a1hu5c="
+    },
     "infer-owner": {
     "infer-owner": {
       "version": "1.0.4",
       "version": "1.0.4",
       "resolved": "https://registry.npm.taobao.org/infer-owner/download/infer-owner-1.0.4.tgz",
       "resolved": "https://registry.npm.taobao.org/infer-owner/download/infer-owner-1.0.4.tgz",
@@ -7727,6 +7927,11 @@
       "integrity": "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=",
       "integrity": "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=",
       "dev": true
       "dev": true
     },
     },
+    "is-function": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npm.taobao.org/is-function/download/is-function-1.0.2.tgz",
+      "integrity": "sha1-Twl/MKv2762smDOxfKXcA/gUTgg="
+    },
     "is-glob": {
     "is-glob": {
       "version": "4.0.1",
       "version": "4.0.1",
       "resolved": "http://registry.npm.taobao.org/is-glob/download/is-glob-4.0.1.tgz",
       "resolved": "http://registry.npm.taobao.org/is-glob/download/is-glob-4.0.1.tgz",
@@ -8049,6 +8254,11 @@
         "verror": "1.10.0"
         "verror": "1.10.0"
       }
       }
     },
     },
+    "keycode": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npm.taobao.org/keycode/download/keycode-2.2.0.tgz",
+      "integrity": "sha1-PQr1bce4uOXLqNCpfxByBO7CKwQ="
+    },
     "killable": {
     "killable": {
       "version": "1.0.1",
       "version": "1.0.1",
       "resolved": "http://registry.npm.taobao.org/killable/download/killable-1.0.1.tgz",
       "resolved": "http://registry.npm.taobao.org/killable/download/killable-1.0.1.tgz",
@@ -8450,6 +8660,35 @@
         "yallist": "^3.0.2"
         "yallist": "^3.0.2"
       }
       }
     },
     },
+    "m3u8-parser": {
+      "version": "4.5.2",
+      "resolved": "https://registry.npm.taobao.org/m3u8-parser/download/m3u8-parser-4.5.2.tgz",
+      "integrity": "sha1-99SKYBEkZuUoMkYkxOZtUu00GnU=",
+      "requires": {
+        "@babel/runtime": "^7.12.5",
+        "@videojs/vhs-utils": "^3.0.0",
+        "global": "^4.4.0"
+      },
+      "dependencies": {
+        "global": {
+          "version": "4.4.0",
+          "resolved": "https://registry.npm.taobao.org/global/download/global-4.4.0.tgz",
+          "integrity": "sha1-PnsQUXkAajI+1xqvyj6cV6XMZAY=",
+          "requires": {
+            "min-document": "^2.19.0",
+            "process": "^0.11.10"
+          }
+        }
+      }
+    },
+    "magic-string": {
+      "version": "0.25.7",
+      "resolved": "https://registry.npm.taobao.org/magic-string/download/magic-string-0.25.7.tgz",
+      "integrity": "sha1-P0l9b9NMZpxnmNy4IfLvMfVEUFE=",
+      "requires": {
+        "sourcemap-codec": "^1.4.4"
+      }
+    },
     "make-dir": {
     "make-dir": {
       "version": "3.1.0",
       "version": "3.1.0",
       "resolved": "https://registry.npm.taobao.org/make-dir/download/make-dir-3.1.0.tgz?cache=0&sync_timestamp=1587567572251&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmake-dir%2Fdownload%2Fmake-dir-3.1.0.tgz",
       "resolved": "https://registry.npm.taobao.org/make-dir/download/make-dir-3.1.0.tgz?cache=0&sync_timestamp=1587567572251&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmake-dir%2Fdownload%2Fmake-dir-3.1.0.tgz",
@@ -8725,6 +8964,14 @@
       "resolved": "https://registry.npm.taobao.org/mimic-fn/download/mimic-fn-1.2.0.tgz?cache=0&sync_timestamp=1596095644798&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmimic-fn%2Fdownload%2Fmimic-fn-1.2.0.tgz",
       "resolved": "https://registry.npm.taobao.org/mimic-fn/download/mimic-fn-1.2.0.tgz?cache=0&sync_timestamp=1596095644798&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmimic-fn%2Fdownload%2Fmimic-fn-1.2.0.tgz",
       "integrity": "sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI="
       "integrity": "sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI="
     },
     },
+    "min-document": {
+      "version": "2.19.0",
+      "resolved": "https://registry.npm.taobao.org/min-document/download/min-document-2.19.0.tgz",
+      "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=",
+      "requires": {
+        "dom-walk": "^0.1.0"
+      }
+    },
     "mini-css-extract-plugin": {
     "mini-css-extract-plugin": {
       "version": "0.9.0",
       "version": "0.9.0",
       "resolved": "https://registry.npm.taobao.org/mini-css-extract-plugin/download/mini-css-extract-plugin-0.9.0.tgz?cache=0&sync_timestamp=1607647607846&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmini-css-extract-plugin%2Fdownload%2Fmini-css-extract-plugin-0.9.0.tgz",
       "resolved": "https://registry.npm.taobao.org/mini-css-extract-plugin/download/mini-css-extract-plugin-0.9.0.tgz?cache=0&sync_timestamp=1607647607846&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmini-css-extract-plugin%2Fdownload%2Fmini-css-extract-plugin-0.9.0.tgz",
@@ -8888,6 +9135,28 @@
         "run-queue": "^1.0.3"
         "run-queue": "^1.0.3"
       }
       }
     },
     },
+    "mpd-parser": {
+      "version": "0.15.4",
+      "resolved": "https://registry.npm.taobao.org/mpd-parser/download/mpd-parser-0.15.4.tgz?cache=0&sync_timestamp=1618380427507&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmpd-parser%2Fdownload%2Fmpd-parser-0.15.4.tgz",
+      "integrity": "sha1-4bRF0NwqqxOJ/eZCDKnMp8mZV10=",
+      "requires": {
+        "@babel/runtime": "^7.12.5",
+        "@videojs/vhs-utils": "^3.0.0",
+        "global": "^4.4.0",
+        "xmldom": "^0.4.0"
+      },
+      "dependencies": {
+        "global": {
+          "version": "4.4.0",
+          "resolved": "https://registry.npm.taobao.org/global/download/global-4.4.0.tgz",
+          "integrity": "sha1-PnsQUXkAajI+1xqvyj6cV6XMZAY=",
+          "requires": {
+            "min-document": "^2.19.0",
+            "process": "^0.11.10"
+          }
+        }
+      }
+    },
     "ms": {
     "ms": {
       "version": "2.1.2",
       "version": "2.1.2",
       "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz?cache=0&sync_timestamp=1607433842694&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.1.2.tgz",
       "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz?cache=0&sync_timestamp=1607433842694&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.1.2.tgz",
@@ -8913,6 +9182,14 @@
       "integrity": "sha1-FjDEKyJR/4HiooPelqVJfqkuXg0=",
       "integrity": "sha1-FjDEKyJR/4HiooPelqVJfqkuXg0=",
       "dev": true
       "dev": true
     },
     },
+    "mux.js": {
+      "version": "5.10.0",
+      "resolved": "https://registry.npm.taobao.org/mux.js/download/mux.js-5.10.0.tgz",
+      "integrity": "sha1-gPsw+SM8eQLKxcyOGuXxnpHPhHc=",
+      "requires": {
+        "@babel/runtime": "^7.11.2"
+      }
+    },
     "mz": {
     "mz": {
       "version": "2.7.0",
       "version": "2.7.0",
       "resolved": "http://registry.npm.taobao.org/mz/download/mz-2.7.0.tgz",
       "resolved": "http://registry.npm.taobao.org/mz/download/mz-2.7.0.tgz",
@@ -9076,6 +9353,11 @@
       "integrity": "sha1-suHE3E98bVd0PfczpPWXjRhlBVk=",
       "integrity": "sha1-suHE3E98bVd0PfczpPWXjRhlBVk=",
       "dev": true
       "dev": true
     },
     },
+    "normalize-wheel": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npm.taobao.org/normalize-wheel/download/normalize-wheel-1.0.1.tgz",
+      "integrity": "sha1-rsiGr/2wRQcNhWRH32Ls+GFG7EU="
+    },
     "npm-run-path": {
     "npm-run-path": {
       "version": "2.0.2",
       "version": "2.0.2",
       "resolved": "https://registry.npm.taobao.org/npm-run-path/download/npm-run-path-2.0.2.tgz?cache=0&sync_timestamp=1577053500910&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnpm-run-path%2Fdownload%2Fnpm-run-path-2.0.2.tgz",
       "resolved": "https://registry.npm.taobao.org/npm-run-path/download/npm-run-path-2.0.2.tgz?cache=0&sync_timestamp=1577053500910&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnpm-run-path%2Fdownload%2Fnpm-run-path-2.0.2.tgz",
@@ -9649,6 +9931,14 @@
         "pinkie": "^2.0.0"
         "pinkie": "^2.0.0"
       }
       }
     },
     },
+    "pkcs7": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npm.taobao.org/pkcs7/download/pkcs7-1.0.4.tgz",
+      "integrity": "sha1-YJC55xFg2r9pIJ1xnLr6U4sAocs=",
+      "requires": {
+        "@babel/runtime": "^7.5.5"
+      }
+    },
     "pkg-dir": {
     "pkg-dir": {
       "version": "4.2.0",
       "version": "4.2.0",
       "resolved": "https://registry.npm.taobao.org/pkg-dir/download/pkg-dir-4.2.0.tgz?cache=0&sync_timestamp=1602859045787&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpkg-dir%2Fdownload%2Fpkg-dir-4.2.0.tgz",
       "resolved": "https://registry.npm.taobao.org/pkg-dir/download/pkg-dir-4.2.0.tgz?cache=0&sync_timestamp=1602859045787&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpkg-dir%2Fdownload%2Fpkg-dir-4.2.0.tgz",
@@ -11175,8 +11465,7 @@
     "regenerator-runtime": {
     "regenerator-runtime": {
       "version": "0.13.7",
       "version": "0.13.7",
       "resolved": "https://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.13.7.tgz?cache=0&sync_timestamp=1595456311465&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregenerator-runtime%2Fdownload%2Fregenerator-runtime-0.13.7.tgz",
       "resolved": "https://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.13.7.tgz?cache=0&sync_timestamp=1595456311465&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregenerator-runtime%2Fdownload%2Fregenerator-runtime-0.13.7.tgz",
-      "integrity": "sha1-ysLazIoepnX+qrrriugziYrkb1U=",
-      "dev": true
+      "integrity": "sha1-ysLazIoepnX+qrrriugziYrkb1U="
     },
     },
     "regenerator-transform": {
     "regenerator-transform": {
       "version": "0.14.5",
       "version": "0.14.5",
@@ -11279,6 +11568,14 @@
       "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=",
       "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=",
       "dev": true
       "dev": true
     },
     },
+    "remove": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npm.taobao.org/remove/download/remove-0.1.5.tgz",
+      "integrity": "sha1-CV/9gn1lyfQa2X0z5BanWBEHmVU=",
+      "requires": {
+        "seq": ">= 0.3.5"
+      }
+    },
     "remove-trailing-separator": {
     "remove-trailing-separator": {
       "version": "1.1.0",
       "version": "1.1.0",
       "resolved": "http://registry.npm.taobao.org/remove-trailing-separator/download/remove-trailing-separator-1.1.0.tgz",
       "resolved": "http://registry.npm.taobao.org/remove-trailing-separator/download/remove-trailing-separator-1.1.0.tgz",
@@ -11381,6 +11678,11 @@
       "resolved": "http://registry.npm.taobao.org/requires-port/download/requires-port-1.0.0.tgz",
       "resolved": "http://registry.npm.taobao.org/requires-port/download/requires-port-1.0.0.tgz",
       "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8="
       "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8="
     },
     },
+    "resize-observer-polyfill": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npm.taobao.org/resize-observer-polyfill/download/resize-observer-polyfill-1.5.1.tgz",
+      "integrity": "sha1-DpAg3T0hAkRY1OvSfiPkAmmBBGQ="
+    },
     "resolve": {
     "resolve": {
       "version": "1.19.0",
       "version": "1.19.0",
       "resolved": "https://registry.npm.taobao.org/resolve/download/resolve-1.19.0.tgz?cache=0&sync_timestamp=1605052120709&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fresolve%2Fdownload%2Fresolve-1.19.0.tgz",
       "resolved": "https://registry.npm.taobao.org/resolve/download/resolve-1.19.0.tgz?cache=0&sync_timestamp=1605052120709&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fresolve%2Fdownload%2Fresolve-1.19.0.tgz",
@@ -11510,6 +11812,23 @@
         "inherits": "^2.0.1"
         "inherits": "^2.0.1"
       }
       }
     },
     },
+    "rollup-plugin-replace": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npm.taobao.org/rollup-plugin-replace/download/rollup-plugin-replace-2.2.0.tgz?cache=0&sync_timestamp=1572273363490&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frollup-plugin-replace%2Fdownload%2Frollup-plugin-replace-2.2.0.tgz",
+      "integrity": "sha1-9BrlNy4R56IXzeNJyLXV/RFecOM=",
+      "requires": {
+        "magic-string": "^0.25.2",
+        "rollup-pluginutils": "^2.6.0"
+      }
+    },
+    "rollup-pluginutils": {
+      "version": "2.8.2",
+      "resolved": "https://registry.npm.taobao.org/rollup-pluginutils/download/rollup-pluginutils-2.8.2.tgz",
+      "integrity": "sha1-cvKvB0i1kjZNvTOJ5gDlqURKNR4=",
+      "requires": {
+        "estree-walker": "^0.6.1"
+      }
+    },
     "run-async": {
     "run-async": {
       "version": "2.4.1",
       "version": "2.4.1",
       "resolved": "https://registry.npm.taobao.org/run-async/download/run-async-2.4.1.tgz",
       "resolved": "https://registry.npm.taobao.org/run-async/download/run-async-2.4.1.tgz",
@@ -11525,6 +11844,14 @@
         "aproba": "^1.1.1"
         "aproba": "^1.1.1"
       }
       }
     },
     },
+    "rust-result": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npm.taobao.org/rust-result/download/rust-result-1.0.0.tgz",
+      "integrity": "sha1-NMdbLm3Dn+WHXlveyFteD5FTb3I=",
+      "requires": {
+        "individual": "^2.0.0"
+      }
+    },
     "rxjs": {
     "rxjs": {
       "version": "6.6.3",
       "version": "6.6.3",
       "resolved": "https://registry.npm.taobao.org/rxjs/download/rxjs-6.6.3.tgz?cache=0&sync_timestamp=1607305574298&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frxjs%2Fdownload%2Frxjs-6.6.3.tgz",
       "resolved": "https://registry.npm.taobao.org/rxjs/download/rxjs-6.6.3.tgz?cache=0&sync_timestamp=1607305574298&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frxjs%2Fdownload%2Frxjs-6.6.3.tgz",
@@ -11539,6 +11866,14 @@
       "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz",
       "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz",
       "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0="
       "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0="
     },
     },
+    "safe-json-parse": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npm.taobao.org/safe-json-parse/download/safe-json-parse-4.0.0.tgz",
+      "integrity": "sha1-fA9XjPzNEtM6ccDgVBPi7KFx6qw=",
+      "requires": {
+        "rust-result": "^1.0.0"
+      }
+    },
     "safe-regex": {
     "safe-regex": {
       "version": "1.1.0",
       "version": "1.1.0",
       "resolved": "https://registry.npm.taobao.org/safe-regex/download/safe-regex-1.1.0.tgz",
       "resolved": "https://registry.npm.taobao.org/safe-regex/download/safe-regex-1.1.0.tgz",
@@ -11633,6 +11968,15 @@
         }
         }
       }
       }
     },
     },
+    "seq": {
+      "version": "0.3.5",
+      "resolved": "https://registry.npm.taobao.org/seq/download/seq-0.3.5.tgz",
+      "integrity": "sha1-rgKvOkJHk9jMvyEtaRdODFTf/jg=",
+      "requires": {
+        "chainsaw": ">=0.0.7 <0.1",
+        "hashish": ">=0.0.2 <0.1"
+      }
+    },
     "serialize-javascript": {
     "serialize-javascript": {
       "version": "4.0.0",
       "version": "4.0.0",
       "resolved": "https://registry.npm.taobao.org/serialize-javascript/download/serialize-javascript-4.0.0.tgz?cache=0&sync_timestamp=1599740650381&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fserialize-javascript%2Fdownload%2Fserialize-javascript-4.0.0.tgz",
       "resolved": "https://registry.npm.taobao.org/serialize-javascript/download/serialize-javascript-4.0.0.tgz?cache=0&sync_timestamp=1599740650381&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fserialize-javascript%2Fdownload%2Fserialize-javascript-4.0.0.tgz",
@@ -12018,6 +12362,11 @@
       "resolved": "http://registry.npm.taobao.org/source-map-url/download/source-map-url-0.4.0.tgz",
       "resolved": "http://registry.npm.taobao.org/source-map-url/download/source-map-url-0.4.0.tgz",
       "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM="
       "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM="
     },
     },
+    "sourcemap-codec": {
+      "version": "1.4.8",
+      "resolved": "https://registry.npm.taobao.org/sourcemap-codec/download/sourcemap-codec-1.4.8.tgz",
+      "integrity": "sha1-6oBL2UhXQC5pktBaOO8a41qatMQ="
+    },
     "spdx-correct": {
     "spdx-correct": {
       "version": "3.1.1",
       "version": "3.1.1",
       "resolved": "https://registry.npm.taobao.org/spdx-correct/download/spdx-correct-3.1.1.tgz",
       "resolved": "https://registry.npm.taobao.org/spdx-correct/download/spdx-correct-3.1.1.tgz",
@@ -12726,6 +13075,11 @@
         "punycode": "^2.1.1"
         "punycode": "^2.1.1"
       }
       }
     },
     },
+    "traverse": {
+      "version": "0.3.9",
+      "resolved": "https://registry.npm.taobao.org/traverse/download/traverse-0.3.9.tgz",
+      "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk="
+    },
     "trim-newlines": {
     "trim-newlines": {
       "version": "1.0.0",
       "version": "1.0.0",
       "resolved": "https://registry.npm.taobao.org/trim-newlines/download/trim-newlines-1.0.0.tgz",
       "resolved": "https://registry.npm.taobao.org/trim-newlines/download/trim-newlines-1.0.0.tgz",
@@ -13085,6 +13439,11 @@
         "requires-port": "^1.0.0"
         "requires-port": "^1.0.0"
       }
       }
     },
     },
+    "url-toolkit": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npm.taobao.org/url-toolkit/download/url-toolkit-2.2.1.tgz",
+      "integrity": "sha1-iQCe09YqNXTeB5UypyZsFNLMHE8="
+    },
     "use": {
     "use": {
       "version": "3.1.1",
       "version": "3.1.1",
       "resolved": "http://registry.npm.taobao.org/use/download/use-3.1.1.tgz",
       "resolved": "http://registry.npm.taobao.org/use/download/use-3.1.1.tgz",
@@ -13204,6 +13563,36 @@
         "extsprintf": "^1.2.0"
         "extsprintf": "^1.2.0"
       }
       }
     },
     },
+    "video.js": {
+      "version": "7.11.8",
+      "resolved": "https://registry.npm.taobao.org/video.js/download/video.js-7.11.8.tgz",
+      "integrity": "sha1-H6J8VvMKQ2sGtE8hVg8iPiZK7FE=",
+      "requires": {
+        "@babel/runtime": "^7.9.2",
+        "@videojs/http-streaming": "2.6.4",
+        "@videojs/xhr": "2.5.1",
+        "global": "4.3.2",
+        "keycode": "^2.2.0",
+        "remove": "^0.1.5",
+        "rollup-plugin-replace": "^2.2.0",
+        "safe-json-parse": "4.0.0",
+        "videojs-font": "3.2.0",
+        "videojs-vtt.js": "^0.15.2"
+      }
+    },
+    "videojs-font": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npm.taobao.org/videojs-font/download/videojs-font-3.2.0.tgz",
+      "integrity": "sha1-ISydP05Ow/pzRRZ9ZDFq3TXpIjI="
+    },
+    "videojs-vtt.js": {
+      "version": "0.15.3",
+      "resolved": "https://registry.npm.taobao.org/videojs-vtt.js/download/videojs-vtt.js-0.15.3.tgz",
+      "integrity": "sha1-hCYDk7eUh/zxldk3L4Etf6uDqZM=",
+      "requires": {
+        "global": "^4.3.1"
+      }
+    },
     "viewerjs": {
     "viewerjs": {
       "version": "1.9.0",
       "version": "1.9.0",
       "resolved": "https://registry.npm.taobao.org/viewerjs/download/viewerjs-1.9.0.tgz",
       "resolved": "https://registry.npm.taobao.org/viewerjs/download/viewerjs-1.9.0.tgz",
@@ -15774,6 +16163,11 @@
         "async-limiter": "~1.0.0"
         "async-limiter": "~1.0.0"
       }
       }
     },
     },
+    "xmldom": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npm.taobao.org/xmldom/download/xmldom-0.4.0.tgz?cache=0&sync_timestamp=1618677843359&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fxmldom%2Fdownload%2Fxmldom-0.4.0.tgz",
+      "integrity": "sha1-h3HkgqMzr0RYfjDOAm8JmMI/ODA="
+    },
     "xtend": {
     "xtend": {
       "version": "4.0.2",
       "version": "4.0.2",
       "resolved": "https://registry.npm.taobao.org/xtend/download/xtend-4.0.2.tgz",
       "resolved": "https://registry.npm.taobao.org/xtend/download/xtend-4.0.2.tgz",

+ 3 - 0
package.json

@@ -12,9 +12,11 @@
   },
   },
   "dependencies": {
   "dependencies": {
     "core-js": "^3.8.2",
     "core-js": "^3.8.2",
+    "element-ui": "^2.15.1",
     "photoswipe": "^4.1.3",
     "photoswipe": "^4.1.3",
     "swiper": "^6.5.6",
     "swiper": "^6.5.6",
     "v-viewer": "^1.5.1",
     "v-viewer": "^1.5.1",
+    "video.js": "^7.11.8",
     "vue": "^2.6.12",
     "vue": "^2.6.12",
     "vue-awesome-swiper": "^4.1.1",
     "vue-awesome-swiper": "^4.1.1",
     "vue-cropperjs": "^4.2.0",
     "vue-cropperjs": "^4.2.0",
@@ -30,6 +32,7 @@
     "@vue/cli-plugin-router": "^4.5.9",
     "@vue/cli-plugin-router": "^4.5.9",
     "@vue/cli-service": "^4.5.9",
     "@vue/cli-service": "^4.5.9",
     "babel-eslint": "^10.1.0",
     "babel-eslint": "^10.1.0",
+    "babel-plugin-component": "^1.1.1",
     "eslint": "^6.8.0",
     "eslint": "^6.8.0",
     "eslint-plugin-vue": "^6.2.2",
     "eslint-plugin-vue": "^6.2.2",
     "less": "^3.13.1",
     "less": "^3.13.1",

+ 1 - 1
public/show.html

@@ -11,7 +11,7 @@
     <link rel="stylesheet" href="//at.alicdn.com/t/font_2410347_4htx35g8w1b.css"/>
     <link rel="stylesheet" href="//at.alicdn.com/t/font_2410347_4htx35g8w1b.css"/>
     <link rel="stylesheet" href="<%= VUE_APP_STATIC_DIR %>/lib/scrollbar/perfect-scrollbar.css"/>
     <link rel="stylesheet" href="<%= VUE_APP_STATIC_DIR %>/lib/scrollbar/perfect-scrollbar.css"/>
     <link rel="icon" href="./favicon.ico" />
     <link rel="icon" href="./favicon.ico" />
-    <title>VR楼盘</title>
+    <title>VR作品</title>
   </head>
   </head>
   <body>
   <body>
     <div id="app"></div>
     <div id="app"></div>

+ 4 - 2
public/showMobile.html

@@ -4,7 +4,8 @@
     <meta charset="utf-8">
     <meta charset="utf-8">
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
     <meta http-equiv="X-UA-Compatible" content="IE=edge">
     <meta http-equiv="X-UA-Compatible" content="IE=edge">
-    <meta name="viewport" content="width=device-width,initial-scale=1.0">
+    <meta content="yes" name="apple-mobile-web-app-capable" />  
+    <meta name="viewport" content="width=device-width,height=device-height,inital-scale=1.0,maximum-scale=1.0,user-scalable=no" />
     <link rel="stylesheet" href="<%= VUE_APP_STATIC_DIR %>/lib/iconfont/iconfont.css"/>
     <link rel="stylesheet" href="<%= VUE_APP_STATIC_DIR %>/lib/iconfont/iconfont.css"/>
     <link rel="stylesheet" href="<%= VUE_APP_STATIC_DIR %>/lib/iconfontQJ/iconfont.css"/>
     <link rel="stylesheet" href="<%= VUE_APP_STATIC_DIR %>/lib/iconfontQJ/iconfont.css"/>
     <link rel="stylesheet" href="<%= VUE_APP_STATIC_DIR %>/lib/iconfontVR/iconfont.css"/>
     <link rel="stylesheet" href="<%= VUE_APP_STATIC_DIR %>/lib/iconfontVR/iconfont.css"/>
@@ -12,12 +13,13 @@
     <link rel="stylesheet" href="//at.alicdn.com/t/font_1064953_6ikt2gc1snb.css"/>
     <link rel="stylesheet" href="//at.alicdn.com/t/font_1064953_6ikt2gc1snb.css"/>
     <link rel="stylesheet" href="<%= VUE_APP_STATIC_DIR %>/lib/animate/animate.min.css" />
     <link rel="stylesheet" href="<%= VUE_APP_STATIC_DIR %>/lib/animate/animate.min.css" />
     <link rel="icon" href="./favicon.ico" />
     <link rel="icon" href="./favicon.ico" />
-    <title>VR楼盘</title>
+    <title>VR作品</title>
   </head>
   </head>
   <body>
   <body>
     <div id="app"></div>
     <div id="app"></div>
     <!-- built files will be auto injected -->
     <!-- built files will be auto injected -->
     <script src="<%= VUE_APP_STATIC_DIR %>/lib/jquery-2.1.1.min.js"></script>
     <script src="<%= VUE_APP_STATIC_DIR %>/lib/jquery-2.1.1.min.js"></script>
     <script src="<%= VUE_APP_STATIC_DIR %>/lib/krpano/js/tour.js"></script>
     <script src="<%= VUE_APP_STATIC_DIR %>/lib/krpano/js/tour.js"></script>
+    <script src="https://res2.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
   </body>
   </body>
 </html>
 </html>

Разница между файлами не показана из-за своего большого размера
+ 3 - 3
public/static/template/plugins/gyro2.js


Разница между файлами не показана из-за своего большого размера
+ 2 - 2
public/static/template/plugins/webvr.js


+ 42 - 80
public/static/template/plugins/webvr.xml

@@ -15,10 +15,11 @@
 	        mobilevr_lens_dist2="1|0|0|0"
 	        mobilevr_lens_dist2="1|0|0|0"
 	        mobilevr_lens_ca="0.0"
 	        mobilevr_lens_ca="0.0"
 	        mobilevr_lens_vign="100"
 	        mobilevr_lens_vign="100"
+	        mobilevr_webvr_dist="false"
 	        mobilevr_wakelock="true"
 	        mobilevr_wakelock="true"
 	        mobilevr_sensor_mode="3"
 	        mobilevr_sensor_mode="3"
 	        mobilevr_autocalibration="false"
 	        mobilevr_autocalibration="false"
-	        mobilevr_touch_support="true"
+	        mobilevr_touch_support="false"
 	        mobilevr_fake_support="false"
 	        mobilevr_fake_support="false"
 	        vr_cursor="hotspot[vr_cursor]"
 	        vr_cursor="hotspot[vr_cursor]"
 	        vr_cursor_enabled="true"
 	        vr_cursor_enabled="true"
@@ -26,10 +27,11 @@
 	        vr_cursor_onout="tween(hotspot[vr_cursor].scale,0.3,0.1);"
 	        vr_cursor_onout="tween(hotspot[vr_cursor].scale,0.3,0.1);"
 	        onavailable="webvr_onavailable();"
 	        onavailable="webvr_onavailable();"
 	        onunavailable=""
 	        onunavailable=""
-	        onunknowndevice="webvr_onunknowndevice();"
+	        onunknowndevice="set(ask_user_for_screensize,true);"
 	        onentervr="webvr_onentervr();"
 	        onentervr="webvr_onentervr();"
 	        onexitvr="webvr_onexitvr();"
 	        onexitvr="webvr_onexitvr();"
 	        />
 	        />
+
 	
 	
 	<!-- a custom xml data structure with the supported VR headsets -->
 	<!-- a custom xml data structure with the supported VR headsets -->
 	<vrheadsets>
 	<vrheadsets>
@@ -54,23 +56,24 @@
 	         depth="1000"
 	         depth="1000"
 	         />
 	         />
 
 
+
 	<!-- vr_auto_click() - call this action in the onover event of a
 	<!-- vr_auto_click() - call this action in the onover event of a
 	     hotspot to trigger automatically a click after some time.  -->
 	     hotspot to trigger automatically a click after some time.  -->
 	<action name="vr_auto_click">
 	<action name="vr_auto_click">
 		if(webvr.isenabled,
 		if(webvr.isenabled,
 			if(%1 != null, set(vr_aclk_timeout, %1), set(vr_aclk_timeout, 2000));
 			if(%1 != null, set(vr_aclk_timeout, %1), set(vr_aclk_timeout, 2000));
-			copy(vr_aclk_t1, timertick);    <!-- timertick为系统当前时间,赋值给vr_aclk_waiting -->
+			copy(vr_aclk_t1, timertick);
 			set(vr_aclk_waiting, true);
 			set(vr_aclk_waiting, true);
-			copy(vr_aclk_hotspot, name);    <!-- name为hotspot的name,赋值给vr_aclk_hotspot -->
 			set(hotspot[vr_cursor].crop,'0|0|80|80');
 			set(hotspot[vr_cursor].crop,'0|0|80|80');
 
 
-			asyncloop(vr_aclk_waiting AND vr_aclk_hotspot == name,
-				sub(dt, timertick,vr_aclk_t1);    <!-- 求初始时间vr_aclk_t1与当前时间timertick的差值 -->
+			asyncloop(vr_aclk_waiting,
+				sub(dt, timertick,vr_aclk_t1);
+
 				if(!hovering,
 				if(!hovering,
 					set(vr_aclk_waiting, false);
 					set(vr_aclk_waiting, false);
 					set(hotspot[vr_cursor].crop,'0|0|80|80');
 					set(hotspot[vr_cursor].crop,'0|0|80|80');
 				  ,
 				  ,
-					div(f, dt, vr_aclk_timeout);    <!-- dt占vr_aclk_timeout的比例-->
+					div(f, dt, vr_aclk_timeout);
 					mul(f, 16);
 					mul(f, 16);
 					roundval(f);
 					roundval(f);
 					Math.min(f, 16);
 					Math.min(f, 16);
@@ -79,7 +82,7 @@
 					txtadd(hotspot[vr_cursor].crop,get(f),'|0|80|80');
 					txtadd(hotspot[vr_cursor].crop,get(f),'|0|80|80');
 
 
 					<!-- wait another 100ms delay after finishing the animation before doing the click -->
 					<!-- wait another 100ms delay after finishing the animation before doing the click -->
-					sub(dt, 100);    <!-- dt自减100 -->
+					sub(dt, 100);
 					if(dt GT vr_aclk_timeout,
 					if(dt GT vr_aclk_timeout,
 						set(vr_aclk_waiting,false);
 						set(vr_aclk_waiting,false);
 						set(hotspot[vr_cursor].crop,'0|0|80|80');
 						set(hotspot[vr_cursor].crop,'0|0|80|80');
@@ -94,31 +97,16 @@
 
 
 	<!-- by pressing SPACE the Oculus Rift could be re-centered -->
 	<!-- by pressing SPACE the Oculus Rift could be re-centered -->
 	<events name="webvr_events" devices="html5" keep="true"
 	<events name="webvr_events" devices="html5" keep="true"
-	        onkeydown="if(webvr AND webvr.isenabled AND keycode==32, webvr.resetSensor() );"
+	        onkeydown="if(keycode==32, webvr.resetSensor(0) );"
 	        onmousedown="if(webvr AND webvr.isenabled, webvr_showbuttons() );"
 	        onmousedown="if(webvr AND webvr.isenabled, webvr_showbuttons() );"
 	        />
 	        />
 
 
 
 
 	<!-- when WebVR support is available show an EnterVR button -->
 	<!-- when WebVR support is available show an EnterVR button -->
 	<action name="webvr_onavailable">
 	<action name="webvr_onavailable">
-		webvr.loadsettings();
+
 		delayedcall(0.5, tween(layer[webvr_enterbutton].alpha,1.0); );
 		delayedcall(0.5, tween(layer[webvr_enterbutton].alpha,1.0); );
 	</action>
 	</action>
-	
-	
-	<action name="webvr_onunknowndevice">
-		if(webvr.isfake AND device.desktop AND webvr.havesettings == false,
-			<!-- set the 'no distortion' headset for fake desktop usage -->
-			set(webvr.mobilevr_lens_overlap, 1.0);
-			set(webvr.mobilevr_lens_fov, 96.0);
-			set(webvr.mobilevr_lens_dist, 0.0);
-			set(webvr.mobilevr_lens_dist2, '1|0|0|0');
-			set(webvr.mobilevr_lens_ca, 0.0);
-			set(webvr.mobilevr_lens_vign, 100);
-		  ,
-			set(ask_user_for_screensize,true);
-		  );
-	</action>
 
 
 
 
 	<action name="webvr_onentervr">
 	<action name="webvr_onentervr">
@@ -130,7 +118,7 @@
 		<!-- when the screen size is unknown an no custom size is set, open the setup screen on entering the VR mode -->
 		<!-- when the screen size is unknown an no custom size is set, open the setup screen on entering the VR mode -->
 		if(webvr.ismobilevr == true AND !webvr.isfake AND ask_user_for_screensize == true AND webvr.mobilevr_screensize == 'auto',
 		if(webvr.ismobilevr == true AND !webvr.isfake AND ask_user_for_screensize == true AND webvr.mobilevr_screensize == 'auto',
 			set(ask_user_for_screensize, false);
 			set(ask_user_for_screensize, false);
-			vr_setup();
+			<!-- vr_setup(); -->
 		  );
 		  );
 		if(webvr.isfake,
 		if(webvr.isfake,
 			webvr_show_fakemode_info(true);
 			webvr_show_fakemode_info(true);
@@ -143,7 +131,7 @@
 
 
 		tween(layer[webvr_enterbutton].alpha,1);
 		tween(layer[webvr_enterbutton].alpha,1);
 		tween(layer[webvr_exitbutton].alpha,0);
 		tween(layer[webvr_exitbutton].alpha,0);
-		tween(layer[webvr_setupbutton].alpha,0);
+		<!-- tween(layer[webvr_setupbutton].alpha,0); -->
 		
 		
 		webvr_show_fakemode_info(false);
 		webvr_show_fakemode_info(false);
 
 
@@ -180,6 +168,7 @@
 			set(layer[webvr_fakemode_info].y, 80);
 			set(layer[webvr_fakemode_info].y, 80);
 			set(layer[webvr_fakemode_info].background, false);
 			set(layer[webvr_fakemode_info].background, false);
 			set(layer[webvr_fakemode_info].css, 'color:#FFFFFF;text-align:center;');
 			set(layer[webvr_fakemode_info].css, 'color:#FFFFFF;text-align:center;');
+			set(layer[webvr_fakemode_info].html, '');
 		  ,
 		  ,
 			removelayer(webvr_fakemode_info);
 			removelayer(webvr_fakemode_info);
 		  );
 		  );
@@ -205,7 +194,7 @@
 	
 	
 	<layer name="webvr_enterbutton" keep="true" vr="true"
 	<layer name="webvr_enterbutton" keep="true" vr="true"
 	       style="webvr_button_style"
 	       style="webvr_button_style"
-	       html="VR模式"
+	       html="Enter VR"
 	       align="top" y="24"
 	       align="top" y="24"
 	       autoalpha="true" alpha="0.0"
 	       autoalpha="true" alpha="0.0"
 	       onclick="webvr.enterVR();"
 	       onclick="webvr.enterVR();"
@@ -213,20 +202,15 @@
 
 
 	<layer name="webvr_exitbutton" keep="true" vr="true"
 	<layer name="webvr_exitbutton" keep="true" vr="true"
 	       style="webvr_button_style"
 	       style="webvr_button_style"
-	       html="退出VR"
+	       html="退出VR模式"
 	       align="top" y="24"
 	       align="top" y="24"
 	       autoalpha="true" alpha="0.0"
 	       autoalpha="true" alpha="0.0"
 	       onclick="webvr.exitVR();"
 	       onclick="webvr.exitVR();"
 	       />
 	       />
 
 
-	<!-- <layer name="webvr_setupbutton" keep="true" vr="true"
-	       style="webvr_button_style"
-	       html="VR设置"
-	       align="bottom" y="24"
+	<layer name="webvr_setupbutton" keep="true" vr="true"
 	       autoalpha="true" alpha="0.0"
 	       autoalpha="true" alpha="0.0"
-	       onclick="vr_setup()"
-	       /> -->
-
+	       />
 
 
 	<action name="webvr_showbuttons">
 	<action name="webvr_showbuttons">
 		stopdelayedcall(vr_button_fadeout);
 		stopdelayedcall(vr_button_fadeout);
@@ -350,44 +334,29 @@
 		
 		
 		<!-- create the text elements -->
 		<!-- create the text elements -->
 		set(vr_setup_text_parent, 'vr_setup_m1');
 		set(vr_setup_text_parent, 'vr_setup_m1');
-		<!--
-		vr_setup_createtext(vr_setup_title, 'MOBILE VR SET',       center, center, 0, -225, #FFFFFF,     false);
-		-->
-		vr_setup_createtext(vr_setup_title, '手机VR设置',       center, center, 0, -225, #FFFFFF,     false);
+		vr_setup_createtext(vr_setup_title, 'VR设置',       center, center, 0, -225, #FFFFFF,     false);
 
 
-		<!--
-		vr_setup_createtext(vr_setup_dvn1, 'Device:',         center, right,  0, -145, #FFFFFF,     true, vr_setup_select('screen') );
+		vr_setup_createtext(vr_setup_dvn1, '设备:',         center, right,  0, -145, #FFFFFF,     true, vr_setup_select('screen') );
 		vr_setup_createtext(vr_setup_dvn2, get(i_devicename), center, left,   0, -145, get(sizcol), true, vr_setup_select('screen') );
 		vr_setup_createtext(vr_setup_dvn2, get(i_devicename), center, left,   0, -145, get(sizcol), true, vr_setup_select('screen') );
-		-->
-		
-		<!--
-		vr_setup_createtext(vr_setup_siz1, 'Screensize:',     center, right,  0, -105, #FFFFFF,     true, vr_setup_select('screen') );
-		-->
-		vr_setup_createtext(vr_setup_siz1, '画面尺寸:',     center, right,  0, -105, #FFFFFF,     true, vr_setup_select('screen') );
+		vr_setup_createtext(vr_setup_siz1, '屏幕尺寸:',     center, right,  0, -105, #FFFFFF,     true, vr_setup_select('screen') );
 		vr_setup_createtext(vr_setup_siz2, get(i_screensize), center, left,   0, -105, get(sizcol), true, vr_setup_select('screen') );
 		vr_setup_createtext(vr_setup_siz2, get(i_screensize), center, left,   0, -105, get(sizcol), true, vr_setup_select('screen') );
-        
-		<!--
-		vr_setup_createtext(vr_setup_ipd1, 'IPD:',            center, right,  0,  -35, #FFFFFF,     true, vr_setup_select('ipd') );
+
+		vr_setup_createtext(vr_setup_ipd1, '瞳距:',            center, right,  0,  -35, #FFFFFF,     true, vr_setup_select('ipd') );
 		vr_setup_createtext(vr_setup_ipd2, get(i_ipd),        center, left,   0,  -35, #FFFFFF,     true, vr_setup_select('ipd') );
 		vr_setup_createtext(vr_setup_ipd2, get(i_ipd),        center, left,   0,  -35, #FFFFFF,     true, vr_setup_select('ipd') );
-        -->
-		
-		<!--
-		vr_setup_createtext(vr_setup_hmd1, 'VR Headset:',     center, right,  0,  +35, #FFFFFF,     true, vr_setup_select('headset') );
+
+		vr_setup_createtext(vr_setup_hmd1, '设置头显:',     center, right,  0,  +35, #FFFFFF,     true, vr_setup_select('headset') );
 		vr_setup_createtext(vr_setup_hmd2, get(i_headset),    center, left,   0,  +35, #FFFFFF,     true, vr_setup_select('headset') );
 		vr_setup_createtext(vr_setup_hmd2, get(i_headset),    center, left,   0,  +35, #FFFFFF,     true, vr_setup_select('headset') );
-		-->
 		
 		
-		<!--
-		vr_setup_createtext(vr_setup_hmd3, 'Customize',       center, center, 0,  +75, #FFFFFF,     true, set(background,true), set(background,false), vr_setup_customize_headset() );
-        -->
+		vr_setup_createtext(vr_setup_hmd3, '调节头显',       center, center, 0,  +75, #FFFFFF,     true, set(background,true), set(background,false), vr_setup_customize_headset() );
+
 		
 		
-        <!--
+
 		if(webvr.iswebvr == false,
 		if(webvr.iswebvr == false,
-			vr_setup_createtext(vr_setup_cal, 'Calibrate Gyroscope',   center, center,    0, +145, #FFFFFF,     true, set(background,true), set(background,false), vr_setup_calibration() );
+			vr_setup_createtext(vr_setup_cal, '陀螺仪校准',   center, center,    0, +145, #FFFFFF,     true, set(background,true), set(background,false), vr_setup_calibration() );
 		  );
 		  );
-		-->
 
 
 		vr_setup_createtext(vr_setup_sav, '保存',          center, center, -200, +225, #FFFFFF,     true, set(background,true), set(background,false), vr_setup_save() );
 		vr_setup_createtext(vr_setup_sav, '保存',          center, center, -200, +225, #FFFFFF,     true, set(background,true), set(background,false), vr_setup_save() );
-		vr_setup_createtext(vr_setup_rst, '重',         center, center,    0, +225, #FFFFFF,     true, set(background,true), set(background,false), vr_setup_reset() );
+		vr_setup_createtext(vr_setup_rst, '重',         center, center,    0, +225, #FFFFFF,     true, set(background,true), set(background,false), vr_setup_reset() );
 		vr_setup_createtext(vr_setup_cls, '关闭',         center, center, +200, +225, #FFFFFF,     true, set(background,true), set(background,false), vr_setup_close() );
 		vr_setup_createtext(vr_setup_cls, '关闭',         center, center, +200, +225, #FFFFFF,     true, set(background,true), set(background,false), vr_setup_close() );
 		
 		
 		<!-- and the adjusting buttons -->
 		<!-- and the adjusting buttons -->
@@ -397,7 +366,7 @@
 		
 		
 		<!-- create the customize_headset text elements -->
 		<!-- create the customize_headset text elements -->
 		set(vr_setup_text_parent, 'vr_setup_m3');
 		set(vr_setup_text_parent, 'vr_setup_m3');
-		vr_setup_createtext(vr_setup_m31, 'VR HEADSET', center, center, 0, -225, #FFFFFF, false);
+		vr_setup_createtext(vr_setup_m31, '头显设置', center, center, 0, -225, #FFFFFF, false);
 		
 		
 		vr_setup_createtext(vr_setup_fov1,  'FOV:',           center, right,  0,  -80,  #FFFFFF,    true, vr_setup_select('fov') );
 		vr_setup_createtext(vr_setup_fov1,  'FOV:',           center, right,  0,  -80,  #FFFFFF,    true, vr_setup_select('fov') );
 		vr_setup_createtext(vr_setup_fov2, get(i_fov),        center, left,   0,  -80,  #FFFFFF,    true, vr_setup_select('fov') );
 		vr_setup_createtext(vr_setup_fov2, get(i_fov),        center, left,   0,  -80,  #FFFFFF,    true, vr_setup_select('fov') );
@@ -417,16 +386,16 @@
 		vr_setup_createtext(vr_setup_olp1, 'Overlap:',        center, right,  0, +160,  #FFFFFF,    true, vr_setup_select('overlap') );
 		vr_setup_createtext(vr_setup_olp1, 'Overlap:',        center, right,  0, +160,  #FFFFFF,    true, vr_setup_select('overlap') );
 		vr_setup_createtext(vr_setup_olp2, get(i_overlap),    center, left,   0, +160,  #FFFFFF,    true, vr_setup_select('overlap') );
 		vr_setup_createtext(vr_setup_olp2, get(i_overlap),    center, left,   0, +160,  #FFFFFF,    true, vr_setup_select('overlap') );
 				
 				
-		vr_setup_createtext(vr_setup_m35, 'CLOSE',       center, center, 0, +225, #FFFFFF, true, set(background,true), set(background,false), vr_setup_close_sub_menus() );
+		vr_setup_createtext(vr_setup_m35, '关闭',       center, center, 0, +225, #FFFFFF, true, set(background,true), set(background,false), vr_setup_close_sub_menus() );
 		
 		
 		
 		
 		<!-- create the calibration text elements -->
 		<!-- create the calibration text elements -->
 		set(vr_setup_text_parent, 'vr_setup_m2');
 		set(vr_setup_text_parent, 'vr_setup_m2');
-		vr_setup_createtext(vr_setup_cb1, 'GYROSCOPE', center, center, 0, -225, #FFFFFF, false);
-		vr_setup_createtext(vr_setup_cb2, 'Place the device on a flat and[br]stable surface and tab calibrate[br]to correct a gyroscope drifting.', center, center, 0, -95, #FFFFFF, false, vr_setup_select('screen') );
-		vr_setup_createtext(vr_setup_cb3, 'CALIBRATE',   center, center, 0,  +55, #FFFFFF, true, set(background,true), set(background,false), vr_setup_do_calibration() );
-		vr_setup_createtext(vr_setup_cb4, 'RESET',       center, center, 0, +125, #FFFFFF, true, set(background,true), set(background,false), webvr.resetcalibration() );
-		vr_setup_createtext(vr_setup_cb5, 'CLOSE',       center, center, 0, +225, #FFFFFF, true, set(background,true), set(background,false), vr_setup_close_sub_menus() );
+		vr_setup_createtext(vr_setup_cb1, '陀螺仪', center, center, 0, -225, #FFFFFF, false);
+		vr_setup_createtext(vr_setup_cb2, '水平放置后校准', center, center, 0, -95, #FFFFFF, false, vr_setup_select('screen') );
+		vr_setup_createtext(vr_setup_cb3, '校准',   center, center, 0,  +55, #FFFFFF, true, set(background,true), set(background,false), vr_setup_do_calibration() );
+		vr_setup_createtext(vr_setup_cb4, '重置',       center, center, 0, +125, #FFFFFF, true, set(background,true), set(background,false), webvr.resetcalibration() );
+		vr_setup_createtext(vr_setup_cb5, '关闭',       center, center, 0, +225, #FFFFFF, true, set(background,true), set(background,false), vr_setup_close_sub_menus() );
 		
 		
 		vr_setup_createtext(vr_setup_cb6, 'Calibrating...',      bottom, center, 0, 40, #FFFFFF, false, null );
 		vr_setup_createtext(vr_setup_cb6, 'Calibrating...',      bottom, center, 0, 40, #FFFFFF, false, null );
 		vr_setup_createtext(vr_setup_cb7, 'Calibration okay.',   bottom, center, 0, 40, #FFFFFF, false, null );
 		vr_setup_createtext(vr_setup_cb7, 'Calibration okay.',   bottom, center, 0, 40, #FFFFFF, false, null );
@@ -448,6 +417,7 @@
 	</action>
 	</action>
 
 
 
 
+
 	<action name="vr_setup_createtext">
 	<action name="vr_setup_createtext">
 		<!--
 		<!--
 			%1 = name
 			%1 = name
@@ -499,7 +469,7 @@
 		<!-- reset to the defaults -->
 		<!-- reset to the defaults -->
 		set(webvr.mobilevr_screensize, 'auto');
 		set(webvr.mobilevr_screensize, 'auto');
 		copy(i_screensize, webvr.devicesize);
 		copy(i_screensize, webvr.devicesize);
-		if(i_screensize LE 0, set(i_screensize, 5.0); );
+		if(i_screensize LE 0, set(i_screensize, 5.0));
 		roundval(i_screensize, 1);
 		roundval(i_screensize, 1);
 		set(layer[vr_setup_dvn2].html, get(webvr.devicename));
 		set(layer[vr_setup_dvn2].html, get(webvr.devicename));
 		txtadd(layer[vr_setup_siz2].html, get(i_screensize), ' inch');
 		txtadd(layer[vr_setup_siz2].html, get(i_screensize), ' inch');
@@ -512,18 +482,10 @@
 		<!-- set fake custom lens settings and call 'next' headset to switch to the default 'Cardboard' settings -->
 		<!-- set fake custom lens settings and call 'next' headset to switch to the default 'Cardboard' settings -->
 		set(webvr.mobilevr_lens_fov, 100);
 		set(webvr.mobilevr_lens_fov, 100);
 		set(webvr.mobilevr_lens_dist, 0.5);
 		set(webvr.mobilevr_lens_dist, 0.5);
-		set(webvr.mobilevr_lens_dist2, '1|0|0|0');
 		set(webvr.mobilevr_lens_vign, 100);
 		set(webvr.mobilevr_lens_vign, 100);
 		set(webvr.mobilevr_lens_overlap, 1.0);
 		set(webvr.mobilevr_lens_overlap, 1.0);
 		set(webvr.mobilevr_lens_ca, 0.0);
 		set(webvr.mobilevr_lens_ca, 0.0);
-		
-		if(webvr.isfake AND device.desktop,
-			<!-- select 'no distortion' headset for fake desktop usage -->
-			vr_setup_change_headset(-1);
-		  ,
-			<!-- select 'Cardboard A' headset for Mobile-VR usage -->
-			vr_setup_change_headset(+1);	
-		  );
+		vr_setup_change_headset(+1);
 
 
 		vr_setup_select(get(selected_var));
 		vr_setup_select(get(selected_var));
 	</action>
 	</action>

+ 1 - 1
public/static/template/skin/vtourskin.xml

@@ -624,7 +624,7 @@
   </action>
   </action>
 
 
 <action protect="true" name="vr_yc_thumbs_time">
 <action protect="true" name="vr_yc_thumbs_time">
-        set(vr_time,%1);
+      set(vr_time,%1);
       add(vr_time,1);
       add(vr_time,1);
       set(time_kz,true);
       set(time_kz,true);
       if(vr_time == 15, delete(time_kz,vr_time);start_thumbs(exit););
       if(vr_time == 15, delete(time_kz,vr_time);start_thumbs(exit););

+ 1 - 1
public/static/template/static/js/vrshow.js

@@ -451,7 +451,7 @@ function initPano(){//TODO
        html5:'prefer',
        html5:'prefer',
        //flash:'only',
        //flash:'only',
        wmode:'opaque-flash',
        wmode:'opaque-flash',
-       mobilescale:0.7,
+       mobilescale:1,
        vars: settings
        vars: settings
    });
    });
 }
 }

+ 1 - 1
public/vr.html

@@ -6,7 +6,7 @@
     <meta http-equiv="X-UA-Compatible" content="IE=edge">
     <meta http-equiv="X-UA-Compatible" content="IE=edge">
     <meta name="viewport" content="width=device-width,initial-scale=1.0">
     <meta name="viewport" content="width=device-width,initial-scale=1.0">
     <link rel="icon" href="./favicon.ico" />
     <link rel="icon" href="./favicon.ico" />
-    <title>VR楼盘</title>
+    <title>VR作品</title>
   </head>
   </head>
   <body>
   <body>
     <div id="app"></div>
     <div id="app"></div>

+ 7 - 3
src/api/index.js

@@ -255,7 +255,12 @@ export function saveInitScreen(data, ok, no) {
  * @param {*} no 
  * @param {*} no 
  */
  */
  export function checkWork(data, ok, no) {
  export function checkWork(data, ok, no) {
-    return http.get(`${URL_FILL}/web/common/checkWork/${number()}`, data, ok, no)
+     let visit = ''
+    if (window.location.pathname.indexOf('showMobile.html')>-1 || window.location.pathname.indexOf('show.html')>-1) {
+        visit = 1111
+    }
+
+    return http.get(`${URL_FILL}/web/common/checkWork/${number()}${visit?('?visit='+visit):''}`, data, ok, no)
 }
 }
 
 
 
 
@@ -276,8 +281,7 @@ export function saveInitScreen(data, ok, no) {
  */
  */
 export function checkLogin() {
 export function checkLogin() {
     if (window.location.pathname.indexOf('material.html')>-1) {
     if (window.location.pathname.indexOf('material.html')>-1) {
-        return http.get(`${URL_FILL}/web/common/checkToken/`)
-
+        return http.get(`${URL_FILL}/web/common/checkToken/?_=${Math.random()}`)
     }else{
     }else{
         return http.get(`${URL_FILL}/manage/work/checkToken/${number()}`)
         return http.get(`${URL_FILL}/manage/work/checkToken/${number()}`)
     }
     }

BIN
src/assets/images/default/img_cover_default.png


+ 71 - 42
src/assets/style/component.less

@@ -173,7 +173,7 @@ textarea:-ms-input-placeholder {
       background: rgba(255, 255, 255, 0.08);
       background: rgba(255, 255, 255, 0.08);
       position: relative;
       position: relative;
       cursor: pointer;
       cursor: pointer;
-      max-width: 150px;
+      max-width: 126px;
       text-overflow: ellipsis;
       text-overflow: ellipsis;
       overflow: hidden;
       overflow: hidden;
       white-space: nowrap;
       white-space: nowrap;
@@ -339,8 +339,8 @@ textarea:-ms-input-placeholder {
       }
       }
       
       
       .oper {
       .oper {
-        top: unset;
-        left: unset;
+        top: auto;
+        left: auto;
         bottom: 10px;
         bottom: 10px;
         right: 10px;
         right: 10px;
         width: 62px;
         width: 62px;
@@ -369,7 +369,7 @@ textarea:-ms-input-placeholder {
           position: absolute;
           position: absolute;
           top: 50%;
           top: 50%;
           right: 8px;
           right: 8px;
-          left: unset;
+          left: auto;
           transform: translateY(-50%);
           transform: translateY(-50%);
         }
         }
         &::before {
         &::before {
@@ -696,6 +696,10 @@ textarea:-ms-input-placeholder {
   }
   }
 }
 }
 
 
+.message-material{
+  border-radius: 0;
+}
+
 .ui-message-header {
 .ui-message-header {
   width: 100%;
   width: 100%;
   border-bottom: 1px solid #e3e3e3;
   border-bottom: 1px solid #e3e3e3;
@@ -715,6 +719,22 @@ textarea:-ms-input-placeholder {
   }
   }
 }
 }
 
 
+.header-material{
+  span {
+    font-size: 16px;
+    font-weight: bold;
+
+    &:last-child {
+      width: 40px;
+      cursor: pointer;
+      >i{
+        font-size: 20px;
+        color: #909090;
+      }
+    }
+  }
+}
+
 .ui-message-footer {
 .ui-message-footer {
   margin: 18px 0;
   margin: 18px 0;
 
 
@@ -727,6 +747,29 @@ textarea:-ms-input-placeholder {
   }
   }
 }
 }
 
 
+.footer-material{
+  margin: 0;
+  padding: 20px 0;
+  border-top: 1px solid #e3e3e3;
+  .ui-button {
+    margin: 0 10px;
+    font-size: 14px;
+    border-radius: 0;
+    width: 104px;
+    height: 32px;
+    border: none;
+    &.submit{
+      background: #1FE4DC;
+      color: #202020;
+    }
+    &.cancel{
+      color: #202020;
+      background: #EBEBEB;
+    }
+  }
+
+}
+
 .ui-message-main {
 .ui-message-main {
   .ui-message-icon {
   .ui-message-icon {
     height: 108px;
     height: 108px;
@@ -753,6 +796,18 @@ textarea:-ms-input-placeholder {
   }
   }
 }
 }
 
 
+.main-material{
+  .ui-message-icon,.ui-message-title{
+    display: none;
+  }
+  .ui-message-content{
+    line-height: 20px;
+    color: #202020;
+    margin: 30px;
+  }
+}
+
+
 .animated.speed {
 .animated.speed {
   -webkit-animation-duration: 0.2s;
   -webkit-animation-duration: 0.2s;
   animation-duration: 0.2s;
   animation-duration: 0.2s;
@@ -800,34 +855,33 @@ textarea:-ms-input-placeholder {
   }
   }
 }
 }
 
 
-[show-mode="mobile"],
-[edit-mode="mobile"] {
-  .ui-button.cancel {
-    color: #fff;
-    border: 1px solid #ccc;
-    background-color: transparent;
-  }
+  
 
 
-  .ui-message {
-    width: 8rem;
+  .message-mobile {
+    width: 80%;
+
+    .ui-button.cancel {
+      color: #fff;
+      border: 1px solid #ccc;
+      background-color: transparent;
+    }
 
 
     .ui-message-header {
     .ui-message-header {
       display: none;
       display: none;
     }
     }
 
 
     .ui-message-title {
     .ui-message-title {
-      font-size: 0.4rem;
       font-weight: 600;
       font-weight: 600;
       margin-bottom: 0;
       margin-bottom: 0;
       color: #595959;
       color: #595959;
     }
     }
 
 
     .ui-message-content {
     .ui-message-content {
-      font-size: 0.3rem;
+      font-size: 14px;
       font-weight: 400;
       font-weight: 400;
       color: #595959;
       color: #595959;
-      margin: 0.5rem;
-      margin-top: 0.2rem;
+      margin: 5px;
+      margin-top: 2px;
     }
     }
 
 
     .ui-message-footer {
     .ui-message-footer {
@@ -837,11 +891,9 @@ textarea:-ms-input-placeholder {
       button {
       button {
         //float: right;
         //float: right;
         width: 50%;
         width: 50%;
-        height: 1.4rem;
         letter-spacing: 1px;
         letter-spacing: 1px;
         margin: 0;
         margin: 0;
         border-radius: 0;
         border-radius: 0;
-        font-size: 0.4rem;
         border: none;
         border: none;
 
 
         &:last-child {
         &:last-child {
@@ -859,26 +911,3 @@ textarea:-ms-input-placeholder {
     }
     }
   }
   }
 
 
-  @media (orientation: landscape) {
-    .ui-message {
-      width: 7rem;
-      .ui-message-icon {
-        height: 80px;
-      }
-      .ui-message-content {
-        font-size: 0.25rem;
-        font-weight: 400;
-      }
-      .ui-message-footer {
-        button {
-          height: 1rem;
-          font-size: 0.3rem;
-        }
-        a.link {
-          height: 1rem;
-          line-height: 1rem;
-        }
-      }
-    }
-  }
-}

+ 7 - 4
src/components/audio/index.vue

@@ -3,7 +3,7 @@
     <audio ref="audio" :key="vkey">
     <audio ref="audio" :key="vkey">
       <source :src="myAudioUrl+`?_=${idleft}`" type="audio/mp3" />
       <source :src="myAudioUrl+`?_=${idleft}`" type="audio/mp3" />
     </audio>
     </audio>
-    <div class="block" @click="myPlay">
+    <div class="block" :ref="`_${vkey}`" @click="myPlay">
       <div :id="idleft" class="left"></div>
       <div :id="idleft" class="left"></div>
       <div :id="idright" class="right"></div>
       <div :id="idright" class="right"></div>
       <div class="circle"></div>
       <div class="circle"></div>
@@ -36,8 +36,8 @@ export default {
   mounted() {
   mounted() {
     this.init();
     this.init();
     this.$bus.on('toggleAudio',data=>{
     this.$bus.on('toggleAudio',data=>{
-      if (this.myAudioUrl == data) {
-        this.myPlay()
+      if (this.$refs[`_${data}`]) {
+          this.$refs[`_${data}`].click()
       }
       }
     })
     })
   },
   },
@@ -45,6 +45,9 @@ export default {
     loadCircle() {
     loadCircle() {
       let leftEl = document.querySelector(`#${this.idleft}`);
       let leftEl = document.querySelector(`#${this.idleft}`);
       let rightEl = document.querySelector(`#${this.idright}`);
       let rightEl = document.querySelector(`#${this.idright}`);
+      if (!rightEl && !leftEl) {
+        return
+      }
       if (this.progress) {
       if (this.progress) {
         if (this.progress > 0 && this.progress < 50) {
         if (this.progress > 0 && this.progress < 50) {
           rightEl.style.transform = "rotate(" + 3.6 * this.progress + "deg)";
           rightEl.style.transform = "rotate(" + 3.6 * this.progress + "deg)";
@@ -99,7 +102,7 @@ export default {
     // 更新进度条与当前播放时间
     // 更新进度条与当前播放时间
     updateProgress() {
     updateProgress() {
       let value = this.audio.currentTime / this.audio.duration;
       let value = this.audio.currentTime / this.audio.duration;
-      this.progress = value * 60;
+      this.progress = value * 100;
       // 初始时间
       // 初始时间
       this.$refs.audioCurTime &&
       this.$refs.audioCurTime &&
         (this.$refs.audioCurTime.innerHTML = this.transTime(
         (this.$refs.audioCurTime.innerHTML = this.transTime(

+ 3 - 0
src/components/paging.vue

@@ -137,6 +137,9 @@ export default {
   .number span {
   .number span {
     margin: 0 5px;
     margin: 0 5px;
     cursor: pointer;
     cursor: pointer;
+    &:first-of-type{
+      margin-left: 0;
+    }
   }
   }
   div {
   div {
     display: inline-block;
     display: inline-block;

+ 28 - 12
src/components/rollName/index.vue

@@ -13,6 +13,7 @@ export default {
       translate: 0,
       translate: 0,
       parentW:0,
       parentW:0,
       childW:0,
       childW:0,
+      inter:null
     }
     }
   },
   },
   watch:{
   watch:{
@@ -20,35 +21,50 @@ export default {
       immediate:true,
       immediate:true,
       handler:function (newVal) {
       handler:function (newVal) {
         if (newVal) {
         if (newVal) {
-          this.start()
+          this.init()
         }
         }
       }
       }
     }
     }
   },
   },
   methods:{
   methods:{
+    clearInter(){
+      clearInterval(this.inter)
+      this.inter = null
+    },
+    init(){
+      this.$nextTick(() => {
+          this.parentW = this.$refs['r_'+this.myref] ? this.$refs['r_'+this.myref].offsetWidth : 0
+          this.childW = this.$refs[this.myref] ? this.$refs[this.myref].offsetWidth : 0
+          this.start()
+      })
+    },
     start(){
     start(){
       let fn = ()=>{
       let fn = ()=>{
-        this.translate -= 0.4
-        if ((this.parentW - this.translate - this.offset - (this.mgin || 0))>this.childW) {
-          this.translate = this.offset 
+        this.translate -= 0.2
+        if ((this.parentW - this.translate -  (this.mgin || 0))>(this.childW + this.parentW)) {
+          this.translate = this.parentW
         }
         }
         if (!this.active) {
         if (!this.active) {
           this.translate = 0
           this.translate = 0
+          this.clearInter()
           return
           return
         }
         }
-        requestAnimationFrame(fn)
+        // requestAnimationFrame(fn)
       }
       }
+
+console.log('==============');
+      console.log(this.parentW, this.childW);
+      
       if (this.parentW < this.childW) {
       if (this.parentW < this.childW) {
-        fn()
+        this.clearInter()
+        this.inter = setInterval(() => {
+            fn()
+        }, 10);
       }
       }
     }
     }
   },
   },
   mounted(){
   mounted(){
-    this.$nextTick(() => {
-      this.parentW = this.$refs['r_'+this.myref].offsetWidth
-      this.childW =this.$refs[this.myref].offsetWidth
-      this.start()
-    })
+    this.init()
   },
   },
   beforeDestroy(){
   beforeDestroy(){
   }
   }
@@ -62,7 +78,7 @@ export default {
   >span{
   >span{
     width: auto;
     width: auto;
     display: inline-block;
     display: inline-block;
-    transition: 0.3s transform ease;
+    // transition: 0.3s transform ease;
     vertical-align:unset;
     vertical-align:unset;
   }
   }
   .shenglv{
   .shenglv{

+ 15 - 1
src/components/shared/loading/index.js

@@ -1,9 +1,14 @@
 import Vue from 'vue'
 import Vue from 'vue'
 import UIViewLoading from './ViewLoading'
 import UIViewLoading from './ViewLoading'
 import UIWaiting from './Waiting'
 import UIWaiting from './Waiting'
+import UISmallWaiting from './smallWaiting'
+
+
 
 
 export const ViewLoading = Vue.extend(UIViewLoading)
 export const ViewLoading = Vue.extend(UIViewLoading)
 export const Waiting = Vue.extend(UIWaiting)
 export const Waiting = Vue.extend(UIWaiting)
+export const SmallWaiting = Vue.extend(UISmallWaiting)
+
 
 
 const waiting = function(){
 const waiting = function(){
     let instance = new Waiting().$mount()
     let instance = new Waiting().$mount()
@@ -11,6 +16,12 @@ const waiting = function(){
     return instance
     return instance
 }
 }
 
 
+const smallWaiting = function(){
+    let instance = new SmallWaiting().$mount()
+    document.body.appendChild(instance.$el)
+    return instance
+}
+
 
 
 export function $viewLoading(data={}){
 export function $viewLoading(data={}){
     let instance = new ViewLoading({data}).$mount()
     let instance = new ViewLoading({data}).$mount()
@@ -32,4 +43,7 @@ export function $viewLoading(data={}){
 
 
 
 
 
 
-export const $waiting = waiting()
+export const $waiting = waiting()
+export const $smallWaiting = smallWaiting()
+
+

+ 71 - 0
src/components/shared/loading/smallWaiting.vue

@@ -0,0 +1,71 @@
+<template>
+    <popup ref="Message" v-if="display">
+        <div class="ui-waiting">
+            <div class="txt">加载中</div>
+            <div class="spinner">
+                <div class="bounce1"></div>
+                <div class="bounce2"></div>
+                <div class="bounce3"></div>
+            </div>
+            <!-- <div>请稍等...</div> -->
+        </div>
+    </popup>
+</template>
+<script>
+import Popup from "../popup";
+export default {
+    name: "ui-waiting",
+    components: {
+        Popup
+    },
+    data() {
+        return {
+            display: false,
+            duration: 0
+        };
+    },
+    methods: {
+        show() {
+            this.$nextTick(() => (this.display = true));
+        },
+        hide() {
+            this.$nextTick(() => (this.display = false));
+        }
+    }
+};
+</script>
+<style lang="less" scoped>
+.ui-waiting {
+    color: #fff;
+    text-align: center;
+    letter-spacing: 2px;
+    .txt{
+        font-size: 14px;
+    }
+    .spinner {
+        width: 100%;
+        text-align: center;
+        display: flex;
+        justify-content: center;
+        align-items: center;
+        margin-top: 5px;
+        > div {
+            width: 5px;
+            height: 5px;
+            background-color: #fff;
+            margin: 5px;
+            border-radius: 100%;
+            display: inline-block;
+            animation: bouncedelay 1.4s infinite ease-in-out;
+            animation-fill-mode: both;
+        }
+
+        .bounce1 {
+            animation-delay: -0.32s;
+        }
+        .bounce2 {
+            animation-delay: -0.16s;
+        }
+    }
+}
+</style>

+ 7 - 4
src/components/shared/message/Alert.vue

@@ -1,18 +1,18 @@
 <template>
 <template>
     <popup ref="Message" :show="show">
     <popup ref="Message" :show="show">
-        <div class="ui-message ui-message-alert">
-            <div class="ui-message-header">
+        <div class="ui-message ui-message-alert" :class="{'message-material':isMaterial,'message-mobile':isMobile}">
+            <div class="ui-message-header" :class="{'header-material':isMaterial}">
                 <span>{{title}}</span>
                 <span>{{title}}</span>
                 <span @click="onClose">
                 <span @click="onClose">
                     <i class="iconfont icon_close"></i>
                     <i class="iconfont icon_close"></i>
                 </span>
                 </span>
             </div>
             </div>
-            <div class="ui-message-main">
+            <div class="ui-message-main" :class="{'main-material':isMaterial}">
                 <div class="ui-message-icon" :class="[icon?icon:null]"></div>
                 <div class="ui-message-icon" :class="[icon?icon:null]"></div>
                 <div class="ui-message-title">{{tips}}</div>
                 <div class="ui-message-title">{{tips}}</div>
                 <div class="ui-message-content" v-html="content"></div>
                 <div class="ui-message-content" v-html="content"></div>
             </div>
             </div>
-            <div class="ui-message-footer">
+            <div class="ui-message-footer" :class="{'footer-material':isMaterial}">
                 <button class="ui-button submit" @click="onOk">{{okText}}</button>
                 <button class="ui-button submit" @click="onOk">{{okText}}</button>
             </div>
             </div>
         </div>
         </div>
@@ -21,6 +21,7 @@
 <script>
 <script>
 import {i18n} from "@/lang"
 import {i18n} from "@/lang"
 import Popup from "../popup";
 import Popup from "../popup";
+import config from '@/config'
 export default {
 export default {
     name: "ui-alert",
     name: "ui-alert",
     components: {
     components: {
@@ -28,6 +29,8 @@ export default {
     },
     },
     data() {
     data() {
         return {
         return {
+            isMaterial: window.location.pathname.indexOf('material.html')>-1,
+            isMobile:config.isMobile(),
             show: false,
             show: false,
             forceOK:false,
             forceOK:false,
             duration: 0,
             duration: 0,

+ 7 - 6
src/components/shared/message/Confirm.vue

@@ -1,18 +1,18 @@
 <template>
 <template>
     <popup ref="Message" :show="show">
     <popup ref="Message" :show="show">
-        <div class="ui-message ui-message-confirm">
-            <div class="ui-message-header">
+        <div class="ui-message ui-message-confirm" :class="{'message-material':isMaterial}">
+            <div class="ui-message-header" :class="{'header-material':isMaterial}">
                 <span>{{title}}</span>
                 <span>{{title}}</span>
                 <span @click="onNo" v-if="showCloseIcon">
                 <span @click="onNo" v-if="showCloseIcon">
                     <i class="iconfont icon_close"></i>
                     <i class="iconfont icon_close"></i>
                 </span>
                 </span>
             </div>
             </div>
-            <div class="ui-message-main">
+            <div class="ui-message-main" :class="{'main-material':isMaterial}">
                 <div class="ui-message-icon" :class="[icon?icon:null]"></div>
                 <div class="ui-message-icon" :class="[icon?icon:null]"></div>
                 <div class="ui-message-title">{{tips}}</div>
                 <div class="ui-message-title">{{tips}}</div>
                 <div class="ui-message-content" v-html="content"></div>
                 <div class="ui-message-content" v-html="content"></div>
             </div>
             </div>
-            <div class="ui-message-footer" v-if="okLink">
+            <div class="ui-message-footer" :class="{'footer-material':isMaterial}" v-if="okLink">
                 <a
                 <a
                     :href="okLink"
                     :href="okLink"
                     target="_blank"
                     target="_blank"
@@ -26,9 +26,9 @@
                     @click="onNo"
                     @click="onNo"
                 >{{noText}}</a>
                 >{{noText}}</a>
             </div>
             </div>
-            <div v-else class="ui-message-footer">
-                <button class="ui-button submit" @click="onOk">{{okText}}</button>
+            <div v-else class="ui-message-footer"  :class="{'footer-material':isMaterial}">
                 <button class="ui-button cancel" @click="onNo">{{noText}}</button>
                 <button class="ui-button cancel" @click="onNo">{{noText}}</button>
+                <button class="ui-button submit" @click="onOk">{{okText}}</button>
             </div>
             </div>
         </div>
         </div>
     </popup>
     </popup>
@@ -43,6 +43,7 @@ export default {
     },
     },
     data() {
     data() {
         return {
         return {
+            isMaterial: window.location.pathname.indexOf('material.html')>-1,
             show: false,
             show: false,
             showCloseIcon: true,
             showCloseIcon: true,
             duration: 0,
             duration: 0,

+ 34 - 35
src/components/shared/uploads/UploadMultiple.vue

@@ -5,7 +5,7 @@
     type="file"
     type="file"
     name="file"
     name="file"
     id
     id
-    style="display:none"
+    style="display: none"
     :accept="accept"
     :accept="accept"
   />
   />
 </template>
 </template>
@@ -17,8 +17,7 @@ export default {
     mediaType: String,
     mediaType: String,
     acceptType: String,
     acceptType: String,
     failString: String,
     failString: String,
-    limitFailStr:String
-
+    limitFailStr: String,
   },
   },
   computed: {
   computed: {
     accept() {
     accept() {
@@ -33,7 +32,7 @@ export default {
   mounted() {
   mounted() {
     this.$el.addEventListener("change", (e) => {
     this.$el.addEventListener("change", (e) => {
       if (!window.FileReader) {
       if (!window.FileReader) {
-        this.$alert({ content: "无法上传" });
+        this.$msg.error("无法上传");
         e.target.value = "";
         e.target.value = "";
         return;
         return;
       }
       }
@@ -45,48 +44,48 @@ export default {
 
 
       this.files = e.target.files;
       this.files = e.target.files;
 
 
-
-      this.files.forEach((item) => {
+      this.files = Array.from(this.files).filter((item, i) => {
         if (!fileInfo.checkMediaMime(this.mediaType, item.name)) {
         if (!fileInfo.checkMediaMime(this.mediaType, item.name)) {
-          e.target.value = "";
-          if (this.failString) {
-            return this.$alert({
-              content: `“${item.name}”` + this.failString,
-            });
-          }
-          return this.$alert({
-            content: "不支持该文件格式",
-          });
+          setTimeout(() => {
+            if (this.failString) {
+              this.$msg.error(`“${item.name}”` + this.failString);
+            } else {
+              this.$msg.error("不支持该文件格式");
+            }
+          }, i * 100);
+          return;
         }
         }
         if (this.limit > 0) {
         if (this.limit > 0) {
           if (!fileInfo.checkSizeLimitFree(item.size, this.limit)) {
           if (!fileInfo.checkSizeLimitFree(item.size, this.limit)) {
             e.target.value = "";
             e.target.value = "";
-            if (this.limitFailStr) {
-                return this.$alert({
-                    content:`“${item.name}”` + this.limitFailStr
-                });
-            }
-            return this.$alert({
-              content: `文件大小不能超过${this.limit}MB`,
-            });
+            setTimeout(() => {
+              if (this.limitFailStr) {
+                this.$msg.error(`“${item.name}”` + this.limitFailStr);
+              }
+              else{
+                this.$msg.error(`文件大小不能超过${this.limit}MB`);
+              }
+            }, i * 100);
+            return;
           }
           }
         } else if (!fileInfo.checkSizeLimit(this.mediaType, item.size)) {
         } else if (!fileInfo.checkSizeLimit(this.mediaType, item.size)) {
-          e.target.value = "";
-          if (this.limitFailStr) {
-              return this.$alert({
-                  content:`“${item.name}”` + this.limitFailStr
-              });
-          }
-          return this.$alert({
-            content: `上传文件太大,不能超过${
-              fileInfo.mediaMaxSize[this.mediaType]
-            }MB`,
-          });
+          setTimeout(() => {
+            if (this.limitFailStr) {
+              this.$msg.error(`“${item.name}”` + this.limitFailStr);
+            }
+            else{
+              this.$msg.error(
+                `上传文件太大,不能超过${fileInfo.mediaMaxSize[this.mediaType]}MB`
+              );
+            }
+            
+          }, i * 100);
+          return;
         }
         }
+        return item
       });
       });
 
 
       this.$emit("file-change", this);
       this.$emit("file-change", this);
-
       e.target.value = "";
       e.target.value = "";
     });
     });
   },
   },

+ 8 - 1
src/components/tableSelect.vue

@@ -46,7 +46,7 @@
             <div class="audio" v-else-if="sub.type=='audio'" >
             <div class="audio" v-else-if="sub.type=='audio'" >
               <v-audio :vkey="item.id" :idleft="`_${$randomWord(true,8,8)}`" :idright="`_${$randomWord(true,8,8)}`" :myAudioUrl="item[sub.key]"></v-audio>
               <v-audio :vkey="item.id" :idleft="`_${$randomWord(true,8,8)}`" :idright="`_${$randomWord(true,8,8)}`" :myAudioUrl="item[sub.key]"></v-audio>
           </div>
           </div>
-            <span v-else>{{item[sub.key]}}</span>
+            <span class="shenglvhao" v-else>{{item[sub.key]}}</span>
           </td>
           </td>
         </tr>
         </tr>
         <tr v-if="list.length === 0">
         <tr v-if="list.length === 0">
@@ -196,6 +196,13 @@ props:{
     border-radius: 4px;
     border-radius: 4px;
     background: #fff;
     background: #fff;
 }
 }
+.shenglvhao{
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 200px;
+  display: inline-block;
+}
 .select-commodity {
 .select-commodity {
   position: absolute;
   position: absolute;
   z-index: 3;
   z-index: 3;

+ 25 - 7
src/components/tablist/index.vue

@@ -7,8 +7,7 @@
           <i class="iconfont icon_plus"></i>
           <i class="iconfont icon_plus"></i>
       </span>
       </span>
     </template>
     </template>
-    <div class="menu sub-menu" :class="(!isShowScroll&&!deviation?'sm-active':'') + ' ' + `${cls}`" :id="id">
-
+    <div class="menu sub-menu" :class="(!isShowScroll&&!deviation?'sm-active ':(cls?'':'addBef')) + ' ' + `${cls}`" :id="id">
       <ul class="mytablist" :id="subId" :style="{ left: oneLeft + 'px' }">
       <ul class="mytablist" :id="subId" :style="{ left: oneLeft + 'px' }">
         <li
         <li
           :title="item.name"
           :title="item.name"
@@ -42,7 +41,7 @@
 </template>
 </template>
 
 
 <script>
 <script>
-const RANGE = 100
+const RANGE = 60
 export default {
 export default {
   props: {
   props: {
     list: {
     list: {
@@ -77,13 +76,16 @@ export default {
   methods:{
   methods:{
     refreshScroll(){
     refreshScroll(){
       this.$nextTick(()=>{
       this.$nextTick(()=>{
-        this.oneWidth = $('#'+this.subId).width()
-        this.menuWidth = $('#'+this.id).width()
-        this.isShowScroll = this.oneWidth > this.menuWidth
+        this.oneLeft = 0
+        this.oneWidth = document.querySelector('#'+this.subId).scrollWidth
+        this.menuWidth = document.querySelector('#'+this.id).scrollWidth
+
+        this.isShowScroll = this.oneWidth  + 40 > this.menuWidth
       })
       })
     },
     },
     moveSlide(type) {
     moveSlide(type) {
       if (type == 'back') {
       if (type == 'back') {
+        console.log((this.menuWidth - this.oneLeft), this.oneWidth);
         if ((this.menuWidth - this.oneLeft) > this.oneWidth) {
         if ((this.menuWidth - this.oneLeft) > this.oneWidth) {
           return
           return
         }
         }
@@ -155,7 +157,7 @@ export default {
   }
   }
   > .icon_forward {
   > .icon_forward {
     right: 10px;
     right: 10px;
-    left: unset;
+    left: auto;
   }
   }
   .sub-menu {
   .sub-menu {
     max-width: calc(100% - 70px);
     max-width: calc(100% - 70px);
@@ -189,6 +191,22 @@ export default {
     }
     }
   }
   }
 
 
+  .addBef{
+    position: relative;
+    &::before{
+      position: absolute;
+      right: 0;
+      top: 0;
+      content: '';
+      display: inline-block;
+      width: 40px;
+      height: 30px;
+      z-index: 999;
+      pointer-events: none;
+      background: linear-gradient(to right, rgba(0,0,0,0), #161a1a);
+    }
+  }
+
   .sm-active{
   .sm-active{
     max-width: 100%;
     max-width: 100%;
 
 

+ 54 - 54
src/framework/Head.vue

@@ -17,7 +17,7 @@
       v-if="info"
       v-if="info"
       :name="info.name"
       :name="info.name"
       :show="showPreview"
       :show="showPreview"
-      :ifr="`./show.html?id=${info.id}&vr=${info.firstScene?info.firstScene.sceneCode:(info.scenes[0]?info.scenes[0].sceneCode:'')}`"
+      :ifr="`./show.html?id=${info.id}`"
       @close="showPreview = false"
       @close="showPreview = false"
     />
     />
   </header>
   </header>
@@ -55,7 +55,7 @@ export default {
   },
   },
   methods: {
   methods: {
     checkParams() {
     checkParams() {
-      if (!this.info.name && !this.info.icon && !this.info.description) {
+      if (!this.info.name && !this.info.icon && !this.info.description && this.info.scenes.length<=0) {
         this.$alert({
         this.$alert({
           content: "您还未创建任何内容哦",
           content: "您还未创建任何内容哦",
           ok: () => {
           ok: () => {
@@ -103,60 +103,60 @@ export default {
     },
     },
 
 
     fixData() {
     fixData() {
-      let tmp = [];
-      this.info.scenes.forEach((item) => {
-        this.info.catalogs.forEach((sub) => {
-          if (item.category == sub.id) {
-            tmp.push(sub);
-          }
-        });
-      });
-      tmp = this.$unique(tmp)
-      this.info.catalogs = tmp;
-      let rootmp = [];
-      tmp.forEach((item) => {
-        this.info.catalogRoot.forEach((sub) => {
-          sub.children = this.$unique(sub.children)
-          if (sub.children.indexOf(item.id) > -1) {
-            rootmp.push(sub);
-          }
-        });
-      });
-      rootmp = this.$unique(rootmp)
+    //   let tmp = [];
+    //   this.info.scenes.forEach((item) => {
+    //     this.info.catalogs.forEach((sub) => {
+    //       if (item.category == sub.id) {
+    //         tmp.push(sub);
+    //       }
+    //     });
+    //   });
+    //   tmp = this.$unique(tmp)
+    //   this.info.catalogs = tmp;
+    //   let rootmp = [];
+    //   tmp.forEach((item) => {
+    //     this.info.catalogRoot.forEach((sub) => {
+    //       sub.children = this.$unique(sub.children)
+    //       if (sub.children.indexOf(item.id) > -1) {
+    //         rootmp.push(sub);
+    //       }
+    //     });
+    //   });
+    //   rootmp = this.$unique(rootmp)
 
 
-      this.info.catalogRoot = rootmp.map((item,i) => {
-        let temp = [];
-        item.children = this.$unique(item.children)
-        item.children.forEach((sub) => {
-          tmp.forEach((jj) => {
-            if (jj.id == sub) {
-              temp.push(sub);
-            }
-          });
-        });
-        return {
-          ...item,
-          children: temp,
-        };
-      });
-      this.info.catalogs = tmp
+    //   this.info.catalogRoot = rootmp.map((item) => {
+    //     let temp = [];
+    //     item.children = this.$unique(item.children)
+    //     item.children.forEach((sub) => {
+    //       tmp.forEach((jj) => {
+    //         if (jj.id == sub) {
+    //           temp.push(sub);
+    //         }
+    //       });
+    //     });
+    //     return {
+    //       ...item,
+    //       children: temp,
+    //     };
+    //   });
+    //   this.info.catalogs = tmp
 
 
-      let cid = 'c_'+this.$randomWord(true,8,8)
+    //   let cid = 'c_'+this.$randomWord(true,8,8)
 
 
-      if (this.info.catalogRoot.length <= 0) {
-        this.info.catalogRoot.push({
-          id: 'r_'+this.$randomWord(true,8,8),
-          name: "全部场景",
-          children:[cid]
-        });
-      }
+    //   if (this.info.catalogRoot.length <= 0) {
+    //     this.info.catalogRoot.push({
+    //       id: 'r_'+this.$randomWord(true,8,8),
+    //       name: "全部场景",
+    //       children:[cid]
+    //     });
+    //   }
 
 
-      if (this.info.catalogs.length <= 0) {
-        this.info.catalogs.push({
-          id: cid,
-          name: "默认二级分组",
-        });
-      }
+    //   if (this.info.catalogs.length <= 0) {
+    //     this.info.catalogs.push({
+    //       id: cid,
+    //       name: "默认二级分组",
+    //     });
+    //   }
 
 
       if (this.info.firstScene) {
       if (this.info.firstScene) {
         this.info.firstScene = this.info.scenes.find(item=>item.sceneCode==this.info.firstScene.sceneCode)
         this.info.firstScene = this.info.scenes.find(item=>item.sceneCode==this.info.firstScene.sceneCode)
@@ -221,7 +221,7 @@ export default {
   margin-top: -16px;
   margin-top: -16px;
   height: 32px;
   height: 32px;
   border-radius: 32px;
   border-radius: 32px;
-  padding: 0 10px;
+  padding: 0 30px;
   font-size: 12px;
   font-size: 12px;
   color: #efefef;
   color: #efefef;
   background-color: @color;
   background-color: @color;
@@ -236,6 +236,6 @@ export default {
 }
 }
 
 
 .app-head-view {
 .app-head-view {
-  right: 100px;
+  right: 130px;
 }
 }
 </style>
 </style>

+ 15 - 17
src/framework/Toolbar.vue

@@ -68,6 +68,19 @@ export default {
     })
     })
   },
   },
   methods: {
   methods: {
+    undateScroll(){
+      this.$nextTick(() => {
+        if ($scroll == null) {
+          $scroll = $(".clip-scroller")[0];
+          frame = new PerfectScrollbar($scroll, {
+            useBothWheelAxes: true,
+            suppressScrollY: true,
+            wheelSpeed: 0.8,
+          });
+          $($scroll).data("scrollbar", frame);
+        }
+      });
+    },
     updateInfo(){
     updateInfo(){
       let iidx = this.info.scenes.findIndex(item=>this.activeItem.sceneCode == item.sceneCode)
       let iidx = this.info.scenes.findIndex(item=>this.activeItem.sceneCode == item.sceneCode)
       if (iidx>-1) {
       if (iidx>-1) {
@@ -80,12 +93,6 @@ export default {
   },
   },
   created() {},
   created() {},
   watch: {
   watch: {
-    'info.scenes':{
-      deep:true,
-      handler: function (newVal) {
-        console.log(newVal);
-      }
-    },
     taboneActive: {
     taboneActive: {
       deep:true,
       deep:true,
       handler: function (newVal,oldVal) {
       handler: function (newVal,oldVal) {
@@ -149,17 +156,7 @@ export default {
     },
     },
   },
   },
   mounted() {
   mounted() {
-    this.$nextTick(() => {
-      if ($scroll == null) {
-        $scroll = $(".clip-scroller")[0];
-        frame = new PerfectScrollbar($scroll, {
-          useBothWheelAxes: true,
-          suppressScrollY: true,
-          wheelSpeed: 0.8,
-        });
-        $($scroll).data("scrollbar", frame);
-      }
-    });
+    this.undateScroll()
     this.$bus.on("setListThumb", (data) => {
     this.$bus.on("setListThumb", (data) => {
       this.activeItem.icon = data.icon;
       this.activeItem.icon = data.icon;
       this.activeItem.initVisual = JSON.stringify(data.initVisual);
       this.activeItem.initVisual = JSON.stringify(data.initVisual);
@@ -171,6 +168,7 @@ export default {
 
 
     this.$bus.on("scenesChange", ()=> {
     this.$bus.on("scenesChange", ()=> {
       this.loadList = true;
       this.loadList = true;
+      this.undateScroll()
     });
     });
   },
   },
 };
 };

+ 1 - 1
src/framework/core/index.vue

@@ -124,7 +124,7 @@ export default {
             swf: "%HTMLPATH%/static/template/tour.swf",
             swf: "%HTMLPATH%/static/template/tour.swf",
             target: "pano",
             target: "pano",
             html5: "auto",
             html5: "auto",
-            mobilescale: 0.7,
+            mobilescale: 1,
             vars:settings,
             vars:settings,
             webglsettings: { preserveDrawingBuffer: true },
             webglsettings: { preserveDrawingBuffer: true },
             passQueryParameters: true,
             passQueryParameters: true,

+ 1 - 0
src/framework/material/aside.vue

@@ -63,6 +63,7 @@ export default {
       &:hover, &.router-link-exact-active,
       &:hover, &.router-link-exact-active,
       &.router-link-active {
       &.router-link-active {
         background: #EBEBEB;
         background: #EBEBEB;
+        font-weight: bold;
       }
       }
       .iconfont{
       .iconfont{
         margin-right: 10px;
         margin-right: 10px;

+ 3 - 3
src/framework/material/header.vue

@@ -88,6 +88,7 @@ export default {
     align-items: center;
     align-items: center;
     margin: 0 auto;
     margin: 0 auto;
     position: relative;
     position: relative;
+    padding: 0;
     .logo {
     .logo {
       font-size: 24px;
       font-size: 24px;
       font-weight: bold;
       font-weight: bold;
@@ -119,9 +120,8 @@ export default {
       top: 50%;
       top: 50%;
       transform: translateY(-50%);
       transform: translateY(-50%);
       border-radius: 50%;
       border-radius: 50%;
-      border: 1px solid #000;
-      width: 50px;
-      height: 50px;
+      width: 32px;
+      height: 32px;
       overflow: hidden;
       overflow: hidden;
       > img {
       > img {
         cursor: pointer;
         cursor: pointer;

+ 91 - 8
src/framework/show/index.vue

@@ -67,6 +67,7 @@ import * as krfn from "@/core/index.js";
 import { getPanoInfo, checkPassword,checkWork } from "@/api";
 import { getPanoInfo, checkPassword,checkWork } from "@/api";
 import password from "./popup/password";
 import password from "./popup/password";
 import preview from "./popup/preview";
 import preview from "./popup/preview";
+import { $smallWaiting } from '@/components/shared/loading'
 
 
 
 
 import popup from "./popup/";
 import popup from "./popup/";
@@ -92,7 +93,7 @@ export default {
     return {
     return {
       showPreview: false,
       showPreview: false,
       isFullscreen:false,
       isFullscreen:false,
-      showTips: true,
+      showTips: false,
       canLoad: false,
       canLoad: false,
       loadFinish:false,
       loadFinish:false,
       showPassword: false,
       showPassword: false,
@@ -180,14 +181,78 @@ export default {
       this.activeItem = data;
       this.activeItem = data;
     },
     },
 
 
+    fixData() {
+      let tmp = [];
+      this.showInfo.scenes.forEach((item) => {
+        this.showInfo.catalogs.forEach((sub) => {
+          if (item.category == sub.id) {
+            tmp.push(sub);
+          }
+        });
+      });
+      tmp = this.$unique(tmp)
+      this.showInfo.catalogs = tmp;
+      let rootmp = [];
+      tmp.forEach((item) => {
+        this.showInfo.catalogRoot.forEach((sub) => {
+          sub.children = this.$unique(sub.children)
+          if (sub.children.indexOf(item.id) > -1) {
+            rootmp.push(sub);
+          }
+        });
+      });
+      rootmp = this.$unique(rootmp)
+
+      this.showInfo.catalogRoot = rootmp.map((item) => {
+        let temp = [];
+        item.children = this.$unique(item.children)
+        item.children.forEach((sub) => {
+          tmp.forEach((jj) => {
+            if (jj.id == sub) {
+              temp.push(sub);
+            }
+          });
+        });
+        return {
+          ...item,
+          children: temp,
+        };
+      });
+      this.showInfo.catalogs = tmp
+
+      let cid = 'c_'+this.$randomWord(true,8,8)
+
+      if (this.showInfo.catalogRoot.length <= 0) {
+        this.showInfo.catalogRoot.push({
+          id: 'r_'+this.$randomWord(true,8,8),
+          name: "全部场景",
+          children:[cid]
+        });
+      }
+
+      if (this.showInfo.catalogs.length <= 0) {
+        this.showInfo.catalogs.push({
+          id: cid,
+          name: "默认二级分组",
+        });
+      }
+
+      if (this.showInfo.firstScene) {
+        this.showInfo.firstScene = this.showInfo.scenes.find(item=>item.sceneCode==this.showInfo.firstScene.sceneCode)
+      }
+
+      this.$store.commit("SetShowInfo", this.showInfo);
+    },
+
     getSceneInfo() {
     getSceneInfo() {
       checkWork("",data=>{
       checkWork("",data=>{
         if (data.data) {
         if (data.data) {
           getPanoInfo(
           getPanoInfo(
             "",
             "",
-            (data) => {
+            (res) => {
+              this.$store.commit("SetShowInfo", res);
+              this.fixData()
               this.loadFinish = true
               this.loadFinish = true
-              this.$store.commit("SetShowInfo", data);
             }
             }
           );
           );
         } else{
         } else{
@@ -215,6 +280,7 @@ export default {
     },
     },
     canLoad(newVal) {
     canLoad(newVal) {
       if (newVal) {
       if (newVal) {
+        this.showTips = this.localRemind
         setTimeout(() => {
         setTimeout(() => {
           this.showTips = false;
           this.showTips = false;
         }, this.showInfo.remindTime * 1000);
         }, this.showInfo.remindTime * 1000);
@@ -225,7 +291,7 @@ export default {
       immediate: true,
       immediate: true,
       handler: function (newVal) {
       handler: function (newVal) {
         if (newVal) {
         if (newVal) {
-          document.title = newVal.name || '未命名'
+          document.title = newVal.name || '无标题'
           let locoR = "localRemind"+newVal.id
           let locoR = "localRemind"+newVal.id
           if (!newVal.description) {
           if (!newVal.description) {
             this.aside.shift()
             this.aside.shift()
@@ -238,6 +304,11 @@ export default {
             this.localRemind = true;
             this.localRemind = true;
             localStorage.setItem(locoR, 0);
             localStorage.setItem(locoR, 0);
           }
           }
+          if (this.showInfo.firstScene) {
+            if (this.showInfo.firstScene.type == '4dkk') {
+              this.localRemind = false;
+            }
+          }
           newVal.password ? (this.showPassword = true) : this.startLoad();
           newVal.password ? (this.showPassword = true) : this.startLoad();
         }
         }
       },
       },
@@ -246,6 +317,7 @@ export default {
       handler(newVal) {
       handler(newVal) {
         $("#pano").empty();
         $("#pano").empty();
         window.vrInitFn = () => {
         window.vrInitFn = () => {
+          $smallWaiting.hide()
           var krpano = document.getElementById("krpanoSWFObject");
           var krpano = document.getElementById("krpanoSWFObject");
           __krfn.utils.initHotspot(krpano, newVal && newVal.someData, false);
           __krfn.utils.initHotspot(krpano, newVal && newVal.someData, false);
         };
         };
@@ -265,14 +337,21 @@ export default {
           "events[skin_events].onloadcomplete": "js(window.vrInitFn());",
           "events[skin_events].onloadcomplete": "js(window.vrInitFn());",
         };
         };
         if (newVal) {
         if (newVal) {
+          if (newVal.type=='4dkk') {
+              removepano("#pano");
+              $("#pano").empty();
+              return
+          }
           removepano("#pano");
           removepano("#pano");
+          $smallWaiting.show()
+
           embedpano({
           embedpano({
-            xml: "%HTMLPATH%/static/template/tour.xml",
-            // xml: `${this.$cdn}/720yun_fd_manage/${newVal.sceneCode}/vtour/tour.xml`,
+            // xml: "%HTMLPATH%/static/template/tour.xml",
+            xml: `${this.$cdn}/720yun_fd_manage/${newVal.sceneCode}/vtour/tour.xml`,
             swf: "%HTMLPATH%/static/template/tour.swf",
             swf: "%HTMLPATH%/static/template/tour.swf",
             target: "pano",
             target: "pano",
             html5: "auto",
             html5: "auto",
-            mobilescale: 0.7,
+            mobilescale: 1,
             vars: settings,
             vars: settings,
             passQueryParameters: true,
             passQueryParameters: true,
           });
           });
@@ -329,6 +408,8 @@ export default {
     left: 20px;
     left: 20px;
     > img {
     > img {
       max-width: 120px;
       max-width: 120px;
+      max-height: 100px;
+      pointer-events: none;
     }
     }
   }
   }
 
 
@@ -337,7 +418,7 @@ export default {
     top: 50%;
     top: 50%;
     left: 50%;
     left: 50%;
     transform: translate(-50%, -50%);
     transform: translate(-50%, -50%);
-    transition: all 0.3s ease;
+    transition: display 0.3s ease;
     > img {
     > img {
       max-width: 300px;
       max-width: 300px;
     }
     }
@@ -376,6 +457,8 @@ export default {
   }
   }
   .introcon {
   .introcon {
     line-height: 20px;
     line-height: 20px;
+    word-break: break-all;
+    text-align: justify;
   }
   }
 }
 }
 </style>
 </style>

+ 3 - 2
src/framework/show/list.vue

@@ -31,7 +31,7 @@
 
 
     </div>
     </div>
     <div class="btn dl" @click="showList=!showList">
     <div class="btn dl" @click="showList=!showList">
-      <i class="iconfont " :class="showList?'iconnav_scene_down':'iconnav_scene_up'"></i>场景导</div>
+      <i class="iconfont " :class="showList?'iconnav_scene_down':'iconnav_scene_up'"></i>场景导</div>
   </div>
   </div>
 </template>
 </template>
 
 
@@ -131,7 +131,8 @@ export default {
       immediate:true,
       immediate:true,
       handler:function (newVal) {
       handler:function (newVal) {
           if (!newVal) {
           if (!newVal) {
-            this.handleVR(this.showInfo.scenes[0])
+            let tmp = this.showInfo.firstScene||this.showInfo.scenes[0]
+            this.handleVR(tmp)
             return
             return
           }
           }
           let val = this.showInfo.scenes.find(item=>item.sceneCode==newVal)
           let val = this.showInfo.scenes.find(item=>item.sceneCode==newVal)

+ 1 - 1
src/framework/show/popup/imgview.vue

@@ -69,7 +69,7 @@ export default {
     }
     }
   }
   }
   .toRight{
   .toRight{
-    left: unset;
+    left: auto;
     right: 10px;
     right: 10px;
   }
   }
   .scale{
   .scale{

+ 6 - 4
src/framework/show/popup/password.vue

@@ -4,8 +4,7 @@
       <div class="ui-message ui-message-confirm" style="width: 400px">
       <div class="ui-message ui-message-confirm" style="width: 400px">
         <div class="ui-message-header">
         <div class="ui-message-header">
           <span>访问密码</span>
           <span>访问密码</span>
-          <span @click="$emit('close')">
-            <i class="iconfont icon_close"></i>
+          <span>
           </span>
           </span>
         </div>
         </div>
         <div class="ui-message-main re-name">
         <div class="ui-message-main re-name">
@@ -14,17 +13,18 @@
               @keyup.enter="emitname"
               @keyup.enter="emitname"
               class="ui-input"
               class="ui-input"
               type="password"
               type="password"
+              ref="uinput"
               maxlength="20"
               maxlength="20"
               placeholder="请输入访问密码"
               placeholder="请输入访问密码"
               v-model="key"
               v-model="key"
             />
             />
-            <i v-if="key" class="iconfont icon_close" @click="key=''"></i>
+            <i v-if="key" ref="isearch" class="iconfont icon_close" @click="key=''"></i>
           </div>
           </div>
         </div>
         </div>
         <div class="ma-line"></div>
         <div class="ma-line"></div>
         <div class="ui-message-footer">
         <div class="ui-message-footer">
           <div class="btn">
           <div class="btn">
-            <button @click="emitname"  class="ui-button ui-button-rect submit" :class="{disable:!key}" >
+            <button @click="emitname" class="ui-button ui-button-rect submit" :class="{disable:!key}" >
               确定
               确定
             </button>
             </button>
           </div>
           </div>
@@ -48,9 +48,11 @@ export default {
   },
   },
   methods:{
   methods:{
     emitname(){
     emitname(){
+      this.$refs.uinput.blur()
       if (!this.key.trim()) {
       if (!this.key.trim()) {
         return this.$alert({ content: "请输入访问密码" });
         return this.$alert({ content: "请输入访问密码" });
       }
       }
+      
       this.$emit('submit',this.key)
       this.$emit('submit',this.key)
     }
     }
   }
   }

+ 4 - 2
src/framework/show/popup/preview.vue

@@ -61,8 +61,8 @@ export default {
 <style lang="less" scoped>
 <style lang="less" scoped>
 .ui-message-confirm{
 .ui-message-confirm{
   border-radius: 0;
   border-radius: 0;
-  top: unset;
-  left: unset;
+  top: auto;
+  left: auto;
   transform: none;
   transform: none;
   .icon_close{
   .icon_close{
     color: #909090;
     color: #909090;
@@ -86,7 +86,9 @@ export default {
       text-align: left;
       text-align: left;
       >span{
       >span{
         font-size: 14px;
         font-size: 14px;
+        word-break: break-all;
         color: #202020;
         color: #202020;
+        display: inline-block;
       }
       }
     }
     }
 
 

+ 235 - 116
src/framework/showMobile/index.vue

@@ -1,28 +1,39 @@
 <template>
 <template>
   <div class="panocon">
   <div class="panocon">
     <template v-if="showInfo">
     <template v-if="showInfo">
-      <v-ifr v-if="activeItem.type=='4dkk'" :url="`https://test.4dkankan.com/embed.html?from=mingyuan&m=${activeItem.sceneCode}`" />
-      <div v-show="activeItem.type!='4dkk'" id="pano"></div>
+      <v-ifr
+        v-if="activeItem.type == '4dkk'"
+        :url="`https://test.4dkankan.com/embed.html?from=mingyuan&m=${activeItem.sceneCode}`"
+      />
+      <div v-show="activeItem.type != '4dkk'" id="pano"></div>
 
 
-      <div class="pano-logo" v-if="showInfo.isLogo&&activeItem.type!='4dkk'">
-        <img :src="showInfo.logo||require('@/assets/images/default/img_logoshow@2x.png')" alt="" />
+      <div
+        class="pano-logo"
+        v-if="showInfo.isLogo && activeItem.type != '4dkk'"
+      >
+        <img
+          :src="
+            showInfo.logo ||
+            require('@/assets/images/default/img_logoshow@2x.png')
+          "
+          alt=""
+        />
       </div>
       </div>
 
 
-      <ul class="aside" v-show="activeItem.type!='4dkk'">
-        <li v-for="(item, i) in aside" :key="i">
-          <span @click="handleItem(item)">
-            <i class="iconfont" :class="item.icon"></i>
-          </span>
-        </li>
-      </ul>
-
       <list
       <list
-        v-if="canLoad"
+        v-if="canLoad&&!isVR"
         @select="handleSelect"
         @select="handleSelect"
         :firstScene="firstScene"
         :firstScene="firstScene"
         :select="activeItem"
         :select="activeItem"
       ></list>
       ></list>
 
 
+      <ul class="aside" v-show="activeItem.type != '4dkk'">
+        <li v-for="(item, i) in aside" :key="i">
+          <span @click="handleItem(item)">
+            <i class="iconfont" :class="item.icon"></i>
+          </span>
+        </li>
+      </ul>
       <div
       <div
         class="oper-tips"
         class="oper-tips"
         :class="{ hidetips: !showTips }"
         :class="{ hidetips: !showTips }"
@@ -44,7 +55,7 @@
       />
       />
       <popup :title="'简介'" :show="showIntro" @close="showIntro = false">
       <popup :title="'简介'" :show="showIntro" @close="showIntro = false">
         <div slot="content" class="introcon">
         <div slot="content" class="introcon">
-          {{ showInfo.description || "暂无简介" }}
+          <span>{{ showInfo.description || "暂无简介" }}</span>
         </div>
         </div>
       </popup>
       </popup>
       <imgview
       <imgview
@@ -65,43 +76,49 @@
         @close="showTextarea = false"
         @close="showTextarea = false"
       >
       >
         <div slot="content" class="introcon">
         <div slot="content" class="introcon">
-          {{ currentHotspot.textarea }}
+          <span>{{ currentHotspot.textarea }}</span>
         </div>
         </div>
       </popup>
       </popup>
 
 
-      <div v-if="audioUrl" class="audio-btn" @click="bofang=!bofang">
-        {{bofang?'继续':'停止'}}播放
-        <v-audio :vkey="audioUrl.id" @audioEnded="handleEnded" :autoplay="true" :bofang="bofang" :v-show="false" :idleft="`_${$randomWord(true,8,8)}`" :idright="`_${$randomWord(true,8,8)}`" :myAudioUrl="audioUrl.audio.ossPath"></v-audio>
+      <div v-if="audioUrl" class="audio-btn" @click="audioUrl = ''">
+        停止播放
+        <v-audio
+          v-if="audioUrl"
+          :vkey="audioUrl.id"
+          @audioEnded="handleEnded"
+          :autoplay="true"
+          :idleft="`_${$randomWord(true, 8, 8)}`"
+          :idright="`_${$randomWord(true, 8, 8)}`"
+          :myAudioUrl="audioUrl.audio.ossPath"
+        ></v-audio>
       </div>
       </div>
-      
     </template>
     </template>
 
 
-  <template v-else>
-     <div class="hasDel" v-if="loadFinish">
-      <div>
-        <img :src="$noresult" alt="">
-        <p>作品已被删除</p>
+    <template v-else>
+      <div class="hasDel" v-if="loadFinish">
+        <div>
+          <img :src="$noresult" alt="" />
+          <p>作品已被删除</p>
+        </div>
       </div>
       </div>
-    </div>
-  </template>
-
-   
+    </template>
   </div>
   </div>
 </template>
 </template>
 
 
 <script>
 <script>
 import * as krfn from "@/core/index.js";
 import * as krfn from "@/core/index.js";
-import { getPanoInfo, checkPassword,checkWork } from "@/api";
+import { getPanoInfo, checkPassword, checkWork } from "@/api";
 import password from "./popup/password";
 import password from "./popup/password";
 import preview from "./popup/preview";
 import preview from "./popup/preview";
+import { $smallWaiting } from '@/components/shared/loading'
 
 
 import imgview from "./popup/imgview";
 import imgview from "./popup/imgview";
 import vIfr from "./iframe";
 import vIfr from "./iframe";
-
+import Share from "@/utils/wxshare";
 
 
 import popup from "./popup/";
 import popup from "./popup/";
 import { mapGetters } from "vuex";
 import { mapGetters } from "vuex";
-import vAudio from '@/components/audio'
+import vAudio from "@/components/audio";
 
 
 import list from "./list";
 import list from "./list";
 
 
@@ -115,7 +132,7 @@ export default {
     preview,
     preview,
     imgview,
     imgview,
     vIfr,
     vIfr,
-    vAudio
+    vAudio,
   },
   },
   computed: {
   computed: {
     ...mapGetters({
     ...mapGetters({
@@ -124,12 +141,13 @@ export default {
   },
   },
   data() {
   data() {
     return {
     return {
+      isVR:false,
+      localRemind:false,
       showPreview: false,
       showPreview: false,
-      audioUrl:'',
-      bofang:false,
-      showTips: true,
+      audioUrl: "",
+      showTips: false,
       showImage: false,
       showImage: false,
-      showAudio:false,
+      showAudio: false,
       canLoad: false,
       canLoad: false,
       showPassword: false,
       showPassword: false,
       showIntro: false,
       showIntro: false,
@@ -140,7 +158,7 @@ export default {
       someData: "",
       someData: "",
       currentHotspot: "",
       currentHotspot: "",
       list: [],
       list: [],
-      loadFinish:false,
+      loadFinish: false,
       aside: [
       aside: [
         {
         {
           id: "about",
           id: "about",
@@ -154,21 +172,27 @@ export default {
     };
     };
   },
   },
   methods: {
   methods: {
-    handleEnded(){
-      this.audioUrl = ''
+    handleEnded() {
+      this.audioUrl = "";
     },
     },
     handleItem(data) {
     handleItem(data) {
       if (data.id == "about") {
       if (data.id == "about") {
         this.showIntro = true;
         this.showIntro = true;
       }
       }
       if (data.id == "vr") {
       if (data.id == "vr") {
-        var krpano = document.getElementById("krpanoSWFObject");
-        var webvr = krpano.get("webvr");
-        webvr.entervr();
-        // window.webvr.enterVR()
+        this.$iosGrantedTips(data=>{
+          if (data.code==1) {
+            var krpano = document.getElementById("krpanoSWFObject");
+            var webvr = krpano.get("webvr");
+            webvr.entervr();
+          }
+          else{
+            this.$alert({content:'运动和方向访问失败,您需要完全关闭此应用,然后再次打开,并允许访问运动与方向'})
+          }
+        })
       }
       }
     },
     },
-    
+
     handlePassword(data) {
     handlePassword(data) {
       checkPassword(
       checkPassword(
         {
         {
@@ -186,23 +210,86 @@ export default {
       this.canLoad = true;
       this.canLoad = true;
     },
     },
     handleSelect(data) {
     handleSelect(data) {
-        this.activeItem = data;
+      this.activeItem = data;
     },
     },
-    
+
+    fixData() {
+      let tmp = [];
+      this.showInfo.scenes.forEach((item) => {
+        this.showInfo.catalogs.forEach((sub) => {
+          if (item.category == sub.id) {
+            tmp.push(sub);
+          }
+        });
+      });
+      tmp = this.$unique(tmp);
+      this.showInfo.catalogs = tmp;
+      let rootmp = [];
+      tmp.forEach((item) => {
+        this.showInfo.catalogRoot.forEach((sub) => {
+          sub.children = this.$unique(sub.children);
+          if (sub.children.indexOf(item.id) > -1) {
+            rootmp.push(sub);
+          }
+        });
+      });
+      rootmp = this.$unique(rootmp);
+
+      this.showInfo.catalogRoot = rootmp.map((item) => {
+        let temp = [];
+        item.children = this.$unique(item.children);
+        item.children.forEach((sub) => {
+          tmp.forEach((jj) => {
+            if (jj.id == sub) {
+              temp.push(sub);
+            }
+          });
+        });
+        return {
+          ...item,
+          children: temp,
+        };
+      });
+      this.showInfo.catalogs = tmp;
+
+      let cid = "c_" + this.$randomWord(true, 8, 8);
+
+      if (this.showInfo.catalogRoot.length <= 0) {
+        this.showInfo.catalogRoot.push({
+          id: "r_" + this.$randomWord(true, 8, 8),
+          name: "全部场景",
+          children: [cid],
+        });
+      }
+
+      if (this.showInfo.catalogs.length <= 0) {
+        this.showInfo.catalogs.push({
+          id: cid,
+          name: "默认二级分组",
+        });
+      }
+
+      if (this.showInfo.firstScene) {
+        this.showInfo.firstScene = this.showInfo.scenes.find(
+          (item) => item.sceneCode == this.showInfo.firstScene.sceneCode
+        );
+      }
+
+      this.$store.commit("SetShowInfo", this.showInfo);
+    },
+
     getSceneInfo() {
     getSceneInfo() {
-      checkWork("",data=>{
+      checkWork("", (data) => {
         if (data.data) {
         if (data.data) {
-          getPanoInfo(
-            "",
-            (data) => {
-              this.loadFinish = true
-              this.$store.commit("SetShowInfo", data);
-            }
-          );
-        } else{
-          this.loadFinish = true
+          getPanoInfo("", (res) => {
+            this.$store.commit("SetShowInfo", res);
+            this.fixData();
+            this.loadFinish = true;
+          });
+        } else {
+          this.loadFinish = true;
         }
         }
-      })
+      });
     },
     },
   },
   },
   watch: {
   watch: {
@@ -210,7 +297,7 @@ export default {
       deep: true,
       deep: true,
       handler: function (newVal) {
       handler: function (newVal) {
         if (newVal) {
         if (newVal) {
-          this.audioUrl = ''
+          this.audioUrl = "";
           if (newVal.hotspotType == "link") {
           if (newVal.hotspotType == "link") {
             window.open(newVal.hyperlink, "_blank");
             window.open(newVal.hyperlink, "_blank");
             return;
             return;
@@ -231,13 +318,14 @@ export default {
             this.audioUrl = newVal;
             this.audioUrl = newVal;
             return;
             return;
           }
           }
-          
+
           this.showPreview = true;
           this.showPreview = true;
         }
         }
-      }
+      },
     },
     },
     canLoad(newVal) {
     canLoad(newVal) {
       if (newVal) {
       if (newVal) {
+        this.showTips = this.localRemind
         setTimeout(() => {
         setTimeout(() => {
           this.showTips = false;
           this.showTips = false;
         }, this.showInfo.remindTime * 1000);
         }, this.showInfo.remindTime * 1000);
@@ -248,65 +336,81 @@ export default {
       immediate: true,
       immediate: true,
       handler: function (newVal) {
       handler: function (newVal) {
         if (newVal) {
         if (newVal) {
-          document.title = newVal.name || '未命名'
-          let locoR = "localRemind"+newVal.id
+          document.title = newVal.name || "无标题";
+          let locoR = "localRemind" + newVal.id;
 
 
           if (!newVal.description) {
           if (!newVal.description) {
-            this.aside.shift()
+            this.aside.shift();
           }
           }
-          if (newVal.isRemind==1) {
-            this.localRemind = localStorage.getItem(locoR) == 1 ? false : true
+          if (newVal.isRemind == 1) {
+            this.localRemind = localStorage.getItem(locoR) == 1 ? false : true;
             localStorage.setItem(locoR, 1);
             localStorage.setItem(locoR, 1);
-          }
-          else{
+          } else {
             this.localRemind = true;
             this.localRemind = true;
             localStorage.setItem(locoR, 0);
             localStorage.setItem(locoR, 0);
           }
           }
+          if (this.showInfo.firstScene) {
+            if (this.showInfo.firstScene.type == '4dkk') {
+              this.localRemind = false;
+            }
+          }
           newVal.password ? (this.showPassword = true) : this.startLoad();
           newVal.password ? (this.showPassword = true) : this.startLoad();
+          Share({
+            title: newVal.name,
+            link: newVal.share,
+            imgUrl: newVal.icon,
+            desc: newVal.description,
+          });
         }
         }
       },
       },
     },
     },
     activeItem: {
     activeItem: {
       handler(newVal) {
       handler(newVal) {
-        this.$nextTick(()=>{
+        this.$nextTick(() => {
+          if (newVal.type == "4dkk") {
             removepano("#pano");
             removepano("#pano");
             $("#pano").empty();
             $("#pano").empty();
-            window.vrInitFn = () => {
+            return;
+          }
+          removepano("#pano");
+          $smallWaiting.show()
+
+          $("#pano").empty();
+          window.vrInitFn = () => {
+            $smallWaiting.hide()
+            var krpano = document.getElementById("krpanoSWFObject");
+            __krfn.utils.initHotspot(krpano, newVal && newVal.someData, false);
+          };
+          window.vrViewFn = () => {
+            try {
+              let tmp = newVal.initVisual || {};
               var krpano = document.getElementById("krpanoSWFObject");
               var krpano = document.getElementById("krpanoSWFObject");
-              __krfn.utils.initHotspot(krpano, newVal && newVal.someData, false);
-            };
-            window.vrViewFn = () => {
-              try {
-                let tmp = newVal.initVisual||{};
-                var krpano = document.getElementById("krpanoSWFObject");
-                krpano.set("view.vlookat", tmp.vlookat||0);
-                krpano.set("view.hlookat", tmp.hlookat||0);
-                krpano.set("autorotate.enabled", Boolean(this.showInfo.isAuto));
-              } catch (error) {
-                error;
-              }
-            };
-            var settings = {
-              "events[skin_events].onxmlcomplete": "js(window.vrViewFn());",
-              "events[skin_events].onloadcomplete": "js(window.vrInitFn());",
-            };
-            if (newVal) {
-              removepano("#pano");
-              embedpano({
-                // xml: "%HTMLPATH%/static/template/tour.xml",
-                xml: `${this.$cdn}/720yun_fd_manage/${newVal.sceneCode}/vtour/tour.xml`,
-                swf: "%HTMLPATH%/static/template/tour.swf",
-                target: "pano",
-                html5: "auto",
-                mobilescale: 0.7,
-                vars: settings,
-                passQueryParameters: true,
-              });
+              krpano.set("view.vlookat", tmp.vlookat || 0);
+              krpano.set("view.hlookat", tmp.hlookat || 0);
+              krpano.set("autorotate.enabled", Boolean(this.showInfo.isAuto));
+            } catch (error) {
+              error;
             }
             }
-        })
-
+          };
+          var settings = {
+            "events[skin_events].onxmlcomplete": "js(window.vrViewFn());",
+            "events[skin_events].onloadcomplete": "js(window.vrInitFn());",
+          };
+          if (newVal) {
+            removepano("#pano");
+            embedpano({
+              // xml: "%HTMLPATH%/static/template/tour.xml",
+              xml: `${this.$cdn}/720yun_fd_manage/${newVal.sceneCode}/vtour/tour.xml`,
+              swf: "%HTMLPATH%/static/template/tour.swf",
+              target: "pano",
+              html5: "auto",
+              mobilescale: 1,
+              vars: settings,
+              passQueryParameters: true,
+            });
+          }
+        });
       },
       },
-      
     },
     },
   },
   },
   mounted() {
   mounted() {
@@ -316,6 +420,12 @@ export default {
       let idx = someData.hotspots.findIndex((item) => item.name == data);
       let idx = someData.hotspots.findIndex((item) => item.name == data);
       this.currentHotspot = someData.hotspots[idx];
       this.currentHotspot = someData.hotspots[idx];
     });
     });
+
+    this.$bus.on('isVR',(data)=>{
+      this.isVR = data
+    })
+
+    
     this.getSceneInfo();
     this.getSceneInfo();
   },
   },
 };
 };
@@ -329,30 +439,30 @@ export default {
     width: 100%;
     width: 100%;
     height: 100%;
     height: 100%;
   }
   }
-  .hasDel{
+  .hasDel {
     background: #fff;
     background: #fff;
     width: 100%;
     width: 100%;
     height: 100%;
     height: 100%;
     position: relative;
     position: relative;
-    >div{
+    > div {
       position: absolute;
       position: absolute;
       top: 50%;
       top: 50%;
       left: 50%;
       left: 50%;
-      transform: translate(-50%,-50%);
+      transform: translate(-50%, -50%);
       color: #909090;
       color: #909090;
       text-align: center;
       text-align: center;
       font-size: 18px;
       font-size: 18px;
-      >p{
+      > p {
         margin-top: 20px;
         margin-top: 20px;
       }
       }
     }
     }
   }
   }
-  >iframe{
+  > iframe {
     width: 100%;
     width: 100%;
     height: 100%;
     height: 100%;
   }
   }
 
 
-  .audio-btn{
+  .audio-btn {
     display: inline-block;
     display: inline-block;
     margin: 0 auto;
     margin: 0 auto;
     height: 36px;
     height: 36px;
@@ -375,12 +485,12 @@ export default {
     margin-top: 10px;
     margin-top: 10px;
     margin-left: 10px;
     margin-left: 10px;
     padding: 0 10px;
     padding: 0 10px;
-    &.active{
+    &.active {
       background: rgba(0, 0, 0, 0.3);
       background: rgba(0, 0, 0, 0.3);
-      border: 1px solid #1FE4DC;
-      color: #1FE4DC;
+      border: 1px solid #1fe4dc;
+      color: #1fe4dc;
     }
     }
-}
+  }
 
 
   .pano-logo {
   .pano-logo {
     position: absolute;
     position: absolute;
@@ -388,15 +498,17 @@ export default {
     left: 10px;
     left: 10px;
     > img {
     > img {
       max-width: 80px;
       max-width: 80px;
+      max-height: 80px;
+      pointer-events: none;
     }
     }
   }
   }
 
 
   .oper-tips {
   .oper-tips {
     position: absolute;
     position: absolute;
-    top: 50%;
+    top: 40%;
     left: 50%;
     left: 50%;
     transform: translate(-50%, -50%);
     transform: translate(-50%, -50%);
-    transition: all 0.3s ease;
+    transition: display 0.3s ease;
     > img {
     > img {
       max-width: 90%;
       max-width: 90%;
     }
     }
@@ -407,8 +519,7 @@ export default {
   }
   }
   .aside {
   .aside {
     position: fixed;
     position: fixed;
-    z-index: 1001;
-    right: 10px;
+    left: 10px;
     bottom: 4px;
     bottom: 4px;
     display: flex;
     display: flex;
     > li {
     > li {
@@ -437,7 +548,15 @@ export default {
     color: #909090;
     color: #909090;
     margin: 0 auto;
     margin: 0 auto;
     width: 90%;
     width: 90%;
-
+    word-break: break-all;
+    max-height: 75vh;
+    overflow-y: auto;
+    -webkit-overflow-scrolling:touch;
+    >span{
+      display: inline-block;
+      -webkit-overflow-scrolling: touch;
+      text-align: justify;
+    }
   }
   }
 }
 }
 </style>
 </style>

+ 120 - 65
src/framework/showMobile/list.vue

@@ -5,7 +5,7 @@
         <li @click="handleVR(item)" v-for="(item,i) in scenes" :key="i">
         <li @click="handleVR(item)" v-for="(item,i) in scenes" :key="i">
           <div :class="{active:selected.sceneCode==item.sceneCode}">
           <div :class="{active:selected.sceneCode==item.sceneCode}">
             <img :src="item.icon+`?${Math.random()}`" alt="" />
             <img :src="item.icon+`?${Math.random()}`" alt="" />
-            <i class="iconfont iconscene_map_3d" :class="{'iconjump':item.type!=='4dkk'}"></i>
+            <i class="iconfont" :class="item.type!='4dkk'?'iconjump':'iconscene_map_3d'"></i>
             <rollName :offset="20" :active="selected.sceneCode==item.sceneCode" class="pic-name" :myref="'subw'+item.id" :name="item.sceneTitle"/>
             <rollName :offset="20" :active="selected.sceneCode==item.sceneCode" class="pic-name" :myref="'subw'+item.id" :name="item.sceneTitle"/>
           </div>
           </div>
         </li>
         </li>
@@ -18,37 +18,36 @@
       </ul>
       </ul>
        <ul class="tap" v-if="showInfo.catalogRoot.length > 1">
        <ul class="tap" v-if="showInfo.catalogRoot.length > 1">
         <li @click="taboneActive = item" v-for="(item,i) in showInfo.catalogRoot" :key="i">
         <li @click="taboneActive = item" v-for="(item,i) in showInfo.catalogRoot" :key="i">
-          <span :title="item.name"  :class="{active:item.id == taboneActive.id}" class="btn rect">{{item.name}}</span>
             <rollName :offset="30" :mgin="20" :active="item.id == taboneActive.id" class="btn rect" :class="{active:item.id == taboneActive.id}" :myref="'zw'+item.id" :name="item.name"/>
             <rollName :offset="30" :mgin="20" :active="item.id == taboneActive.id" class="btn rect" :class="{active:item.id == taboneActive.id}" :myref="'zw'+item.id" :name="item.name"/>
         </li>
         </li>
       </ul>
       </ul>
     </div>
     </div>
     <div v-if="selected.type=='4dkk'" class="menu">
     <div v-if="selected.type=='4dkk'" class="menu">
-      <ul :class="{shouqi:shouqi}">
-        <li>
-          <i class="iconfont"  @click="showList=!showList" :class="showList?'iconnav_scene_down':'iconnav_scene_up'"></i>
-        </li>
-
-        <li class="licon">
-          <ul>
-            <li @click="handleDL" v-if="isShowDL">
-              <i class="iconfont" :class="isDaolan?'iconshow_suspension':'iconshow_playback'"></i>
-              <span title="导览" >导览</span>
-            </li>
+      <div class="menucon" :class="{shouqi:shouqi}">
+        <ul>
+          <li @click="handleDL" v-if="isShowDL">
+            <i class="iconfont" :class="isDaolan?'iconshow_suspension':'iconshow_playback'"></i>
+            <span title="导览" >导览</span>
+          </li>
+          <template v-if="currentActive!='2d'&&currentActive!='3d'">
             <li v-for="(item,i) in menu" @click="handleMenu(item)" :key="i">
             <li v-for="(item,i) in menu" @click="handleMenu(item)" :key="i">
               <i class="iconfont" :class="currentActive==item.id?item.active:item.icon"></i>
               <i class="iconfont" :class="currentActive==item.id?item.active:item.icon"></i>
               <span :title="item.name" >{{item.name}}</span>
               <span :title="item.name" >{{item.name}}</span>
               <!-- <i style="font-size:10px; margin-left:6px" v-if="item.id == 'daolan'" class="iconfont iconshow_drop-down"></i> -->
               <!-- <i style="font-size:10px; margin-left:6px" v-if="item.id == 'daolan'" class="iconfont iconshow_drop-down"></i> -->
             </li>
             </li>
-          </ul>
-        </li>
-        
+          </template>
+        </ul>
         <i  @click="shouqi = !shouqi" class="iconfont iconshow_function_collect"></i>
         <i  @click="shouqi = !shouqi" class="iconfont iconshow_function_collect"></i>
-      </ul>
+
+      </div>
+
+      <div class="scenedl">
+        <i class="iconfont"  @click="showList=!showList" :class="showList?'iconnav_scene_down':'iconnav_scene_up'"></i>
+      </div>
     </div>
     </div>
 
 
     <div class="btn dl" @click="showList=!showList" v-else>
     <div class="btn dl" @click="showList=!showList" v-else>
-      <i class="iconfont " :class="showList?'iconnav_scene_down':'iconnav_scene_up'"></i>场景导览
+      <i class="iconfont " :class="showList?'iconnav_scene_down':'iconnav_scene_up'"></i>场景导
     </div>
     </div>
   </div>
   </div>
 </template>
 </template>
@@ -188,7 +187,8 @@ export default {
       immediate:true,
       immediate:true,
       handler:function (newVal) {
       handler:function (newVal) {
           if (!newVal) {
           if (!newVal) {
-            this.handleVR(this.showInfo.scenes[0])
+            let tmp = this.showInfo.firstScene||this.showInfo.scenes[0]
+            this.handleVR(tmp)
             return
             return
           }
           }
           let val = this.showInfo.scenes.find(item=>item.sceneCode==newVal)
           let val = this.showInfo.scenes.find(item=>item.sceneCode==newVal)
@@ -263,15 +263,14 @@ export default {
   position: fixed;
   position: fixed;
   bottom: 10px;
   bottom: 10px;
   left: 0;
   left: 0;
-  z-index: 999;
-  text-align: left;
+  text-align: right;
   width: 100%;
   width: 100%;
   .dl{
   .dl{
     background: rgba(0, 0, 0, 0.3);
     background: rgba(0, 0, 0, 0.3);
     border-radius: 18px;
     border-radius: 18px;
     border: 1px solid rgba(255, 255, 255, 0.2);
     border: 1px solid rgba(255, 255, 255, 0.2);
     margin-top: 10px;
     margin-top: 10px;
-    margin-left: 10px;
+    margin-right: 10px;
     padding: 0 10px;
     padding: 0 10px;
     >i{
     >i{
       margin-right: 8px;
       margin-right: 8px;
@@ -281,67 +280,67 @@ export default {
   }
   }
 
 
   .menu{
   .menu{
-    display: inline-block;
-    margin: 10px 0 32px;
-    >ul{
+    margin: 10px 0 12px;
+    .menucon{
+      float: left;
       display: flex;
       display: flex;
       border: 1px solid rgba(255, 255, 255, 0.10196078431372549);
       border: 1px solid rgba(255, 255, 255, 0.10196078431372549);
       border-radius: 0px 24px 24px 0px;
       border-radius: 0px 24px 24px 0px;
-      background: rgba(0, 0, 0, 0.5);
+      background: rgba(0, 0, 0, 0.3);
       padding-right: 30px;
       padding-right: 30px;
-      align-items: center;
       position: relative;
       position: relative;
-      >li{
-        color: #fff;
-        margin: 0;
-        padding: 0;
-        padding-left: 10px;
-        height: 48px;
-        line-height: 48px;
-        background: none;
-        transition: 0.3s all ease;
-        >ul{
-          display: flex;
-          align-items: center;
-          >li{
+      transition: all 0.3s ease;
+      >ul{
+        display: flex;
+        overflow: hidden;
+        >li{
             color: #fff;
             color: #fff;
             margin: 0;
             margin: 0;
-            height: 48px;
-            line-height: 48px;
-            padding: 0 10px;
+            height: 46px;
+            line-height: 46px;
+            padding: 0 5px;
             background: none;
             background: none;
             >span{
             >span{
               display: inline-block;
               display: inline-block;
               margin-left: 6px;
               margin-left: 6px;
             }
             }
+            
           }
           }
-        }
       }
       }
+      >i{
+          font-size: 10px;
+          position: absolute;
+          right: 14px;
+          top: 50%;
+          transform: translateY(-50%);
+        }
+    }
 
 
-      .licon{
-        max-width: none;
+    .shouqi{
+      >ul{
+        max-width: 0;
+        width: 0;
       }
       }
-
-      &.shouqi{
-        .licon{
-          overflow: hidden;
-          width: 0;
-        }
-        >i{
-          transform: translateY(-50%) rotate(180deg);
-        }
+      >i{
+        transform: translateY(-50%) rotate(180deg);
       }
       }
-      
-      
+    }
+    .scenedl{
+      width: 48px;
+      height: 48px;
+      background: rgba(0, 0, 0, 0.3);
+      border: 1px solid rgba(255, 255, 255, 0.1);
+      display: inline-block;
+      border-radius: 50%;
+      position: relative;
+      margin-right: 10px;
       >i{
       >i{
-        font-size: 10px;
-        position: absolute;
-        right: 14px;
         top: 50%;
         top: 50%;
-        transform: translateY(-50%);
+        left: 50%;
+        position: absolute;
+        transform: translate(-50%,-50%);
+        font-size: 18px;
       }
       }
-
-
     }
     }
   }
   }
   .l-con{
   .l-con{
@@ -400,7 +399,7 @@ export default {
           }
           }
           >span{
           >span{
             display: inline-block;
             display: inline-block;
-            background: rgba(0, 0, 0, 0.5);
+            background: rgba(0, 0, 0, 0.3);
             position: absolute;
             position: absolute;
             text-overflow: ellipsis;
             text-overflow: ellipsis;
             overflow: hidden;
             overflow: hidden;
@@ -414,12 +413,13 @@ export default {
           }
           }
         }
         }
         .pic-name{
         .pic-name{
-          background: rgba(0, 0, 0, 0.5);
+          background: rgba(0, 0, 0, 0.3);
           position: absolute;
           position: absolute;
           left: 0;
           left: 0;
           bottom: 0;
           bottom: 0;
           /deep/ span{
           /deep/ span{
             word-break: keep-all;
             word-break: keep-all;
+            white-space:nowrap;
           }
           }
         }
         }
       }
       }
@@ -429,4 +429,59 @@ export default {
     }
     }
   }
   }
 }
 }
+
+@media screen and (max-width: 350px) {
+  .list{
+  .menu{
+    .menucon{
+      padding-right: 10px;
+      >ul{
+        >li{
+            color: #fff;
+            margin: 0;
+            height: 36px;
+            line-height: 36px;
+            padding: 0 4px;
+            background: none;
+            >span{
+              display: inline-block;
+              margin-left: 6px;
+            }
+            &:last-of-type{
+              padding-right: 14px;
+            }
+          }
+      }
+      >i{
+          font-size: 12px;
+          right: 8px;
+          top: 50%;
+          transform: translateY(-50%);
+        }
+    }
+
+    .shouqi{
+      padding-right: 30px;
+      >ul{
+        max-width: 0;
+        width: 0;
+      }
+      >i{
+        transform: translateY(-50%) rotate(180deg);
+      }
+    }
+    .scenedl{
+      width: 36px;
+      height: 36px;
+      >i{
+        top: 50%;
+        left: 50%;
+        position: absolute;
+        transform: translate(-50%,-50%);
+        font-size: 14px;
+      }
+    }
+  }
+}
+}
 </style>
 </style>

+ 1 - 1
src/framework/showMobile/popup/imgview.vue

@@ -55,7 +55,7 @@ export default {
     }
     }
   }
   }
   .toRight{
   .toRight{
-    left: unset;
+    left: auto;
     right: 10px;
     right: 10px;
   }
   }
   .scale{
   .scale{

+ 1 - 2
src/framework/showMobile/popup/index.vue

@@ -1,6 +1,6 @@
 <template>
 <template>
     <popup v-if="show">
     <popup v-if="show">
-      <div class="ui-message ui-message-confirm" style="width: 90%">
+      <div @touchmove.stop class="ui-message ui-message-confirm" style="width: 90%">
         <div class="ui-message-header">
         <div class="ui-message-header">
           <span>{{title}}</span>
           <span>{{title}}</span>
           <span @click="$emit('close')">
           <span @click="$emit('close')">
@@ -49,7 +49,6 @@ export default {
     }
     }
   }
   }
   .ui-message-main{
   .ui-message-main{
-    width: 330px;
     margin: 20px auto;
     margin: 20px auto;
     background: #fff;
     background: #fff;
     
     

+ 1 - 2
src/framework/showMobile/popup/password.vue

@@ -4,8 +4,7 @@
       <div class="ui-message ui-message-confirm" style="width: 90%">
       <div class="ui-message ui-message-confirm" style="width: 90%">
         <div class="ui-message-header">
         <div class="ui-message-header">
           <span>访问密码</span>
           <span>访问密码</span>
-          <span @click="$emit('close')">
-            <i class="iconfont icon_close"></i>
+          <span >
           </span>
           </span>
         </div>
         </div>
         <div class="ui-message-main re-name">
         <div class="ui-message-main re-name">

+ 33 - 3
src/framework/showMobile/popup/preview.vue

@@ -8,7 +8,24 @@
               <span>{{item.textarea}}</span>
               <span>{{item.textarea}}</span>
             </div>
             </div>
           </template>
           </template>
-          <video :poster="item.video.icon" v-else controls autoplay :src="item.video.ossPath"></video>
+
+          <video
+              v-else
+              id="myVideo"
+              ref="video"
+              webkit-playsinline='true'
+              playsinline='true'
+              x5-video-player-type='h5' 
+              x5-video-player-fullscreen='true'
+              controls
+              class="video-js"
+              :poster="item.video.icon"
+            >
+            <source
+              :src="item.video.ossPath"
+            >
+          </video>
+          <!-- <video :poster="item.video.icon"  controls autoplay :src="item.video.ossPath"></video> -->
         </div>
         </div>
       </div>
       </div>
     </popup>
     </popup>
@@ -33,8 +50,17 @@ export default {
       typeStr
       typeStr
     }
     }
   },
   },
-  methods:{
-    
+  mounted(){
+    this.$nextTick(() => {
+        try {
+          this.myPlayer = this.$video('myVideo', {
+          loop: true,
+          preload: 'auto'
+        })
+        } catch (error) {
+          error
+        }
+    })
   }
   }
 }
 }
 </script>
 </script>
@@ -63,6 +89,9 @@ export default {
     >img,>video{
     >img,>video{
       width: 100%;
       width: 100%;
     }
     }
+    >video{
+      min-height: 210px;
+    }
     .v-textarea{
     .v-textarea{
       width: 100%;
       width: 100%;
       max-height: 540px;
       max-height: 540px;
@@ -72,6 +101,7 @@ export default {
       >span{
       >span{
         font-size: 14px;
         font-size: 14px;
         color: #202020;
         color: #202020;
+        word-break: break-all;
       }
       }
     }
     }
     
     

+ 37 - 57
src/framework/showMobile/ui/Show.Header.vue

@@ -1,9 +1,12 @@
 <template>
 <template>
     <div class="header app" v-if="params.title" @touchmove.prevent>
     <div class="header app" v-if="params.title" @touchmove.prevent>
         <div class="left show" >
         <div class="left show" >
+            <div class="back" v-if="isVR" @click="handleVR(0)">
+                <i class="iconfont icon_back"></i>
+            </div>
         </div>
         </div>
         <div
         <div
-            
+            v-show="!isVR"
             class="title"
             class="title"
             :class="{up:showDescription,empty: false}"
             :class="{up:showDescription,empty: false}"
             @click="onShowDescription"
             @click="onShowDescription"
@@ -17,6 +20,7 @@
         </div>
         </div>
         <div
         <div
             class="right"
             class="right"
+            v-show="!isVR"
             :class="{ more: showMore}"
             :class="{ more: showMore}"
             @click="onShowMore"
             @click="onShowMore"
         >
         >
@@ -34,7 +38,7 @@
                                 <i class="iconfont iconshow_more_ruler"></i>
                                 <i class="iconfont iconshow_more_ruler"></i>
                                 <span>菜单</span>
                                 <span>菜单</span>
                             </li> -->
                             </li> -->
-                            <li @click="handleVR">
+                            <li @click="handleVR(1)">
                                 <i class="iconfont iconshow_more_vr"></i>
                                 <i class="iconfont iconshow_more_vr"></i>
                                 <span>VR模式</span>
                                 <span>VR模式</span>
                             </li>
                             </li>
@@ -141,7 +145,8 @@ export default {
         return {
         return {
            showDescription:false,
            showDescription:false,
            showMore:false,
            showMore:false,
-           shareURL:''
+           shareURL:'',
+           isVR:false
         }
         }
     },
     },
 
 
@@ -154,12 +159,24 @@ export default {
           this.showMore = !this.showMore
           this.showMore = !this.showMore
           this.showDescription = false
           this.showDescription = false
       },
       },
-      handleVR(){
-        let ele = document.getElementById('showifr');
-        ele.contentWindow.postMessage({
-            source: "mingyuan",
-            event: 'vr-in',
-        },"*")
+      handleVR(type){
+        this.$iosGrantedTips(data=>{
+          if (data.code==1) {
+            let ele = document.getElementById('showifr');
+            this.isVR =  !!type
+
+            this.$bus.emit('isVR',!!type)
+
+            ele.contentWindow.postMessage({
+                source: "mingyuan",
+                event: type?'vr-in': 'vr-out',
+            },"*")
+          }
+          else{
+            this.$alert({content:'运动和方向访问失败,您需要完全关闭此应用,然后再次打开,并允许访问运动与方向'})
+          }
+        })
+        
       }
       }
     },
     },
 
 
@@ -187,7 +204,7 @@ export default {
         top: 1rem;
         top: 1rem;
     }
     }
     .left {
     .left {
-        width: 1.28rem;
+        width: 40px;
         height: 100%;
         height: 100%;
         display: flex;
         display: flex;
         align-items: center;
         align-items: center;
@@ -200,8 +217,8 @@ export default {
             }
             }
         }
         }
         .back {
         .back {
-            width: 0.78rem;
-            height: 0.78rem;
+            width: 26px;
+            height: 26px;
             border-radius: 50%;
             border-radius: 50%;
             background-color: rgba(0, 0, 0, 0.3);
             background-color: rgba(0, 0, 0, 0.3);
             display: flex;
             display: flex;
@@ -209,7 +226,7 @@ export default {
             justify-content: center;
             justify-content: center;
             visibility: hidden;
             visibility: hidden;
             i {
             i {
-                font-size: 0.3rem;
+                font-size: 14px;
             }
             }
         }
         }
         .back-pano {
         .back-pano {
@@ -219,7 +236,7 @@ export default {
             align-items: center;
             align-items: center;
             padding-left: 15px;
             padding-left: 15px;
             i {
             i {
-                font-size: 0.6rem;
+                font-size: 14px;
             }
             }
         }
         }
     }
     }
@@ -359,7 +376,7 @@ export default {
             white-space: nowrap;
             white-space: nowrap;
             overflow: hidden;
             overflow: hidden;
             text-overflow: ellipsis;
             text-overflow: ellipsis;
-            max-width: 7rem;
+            max-width: 80%;
         }
         }
         i {
         i {
             transition: all 0.3s;
             transition: all 0.3s;
@@ -554,65 +571,28 @@ export default {
 
 
 @media (orientation: landscape) {
 @media (orientation: landscape) {
     .header {
     .header {
-        top: 0.2rem;
-        height: 0.7rem;
+        height: 45px;
         &.app {
         &.app {
             top: 0.2rem;
             top: 0.2rem;
         }
         }
         .left {
         .left {
-            .back-pano {
-                i {
-                    font-size: 0.5rem;
-                }
+            .back {
+                
             }
             }
         }
         }
         .right {
         .right {
             > i {
             > i {
                 font-size: 20px;
                 font-size: 20px;
             }
             }
-            > div {
-                right: 10px;
-                top: 0.75rem;
-                padding: 4px 0.2rem;
-                &::after {
-                    right: 0.23rem;
-                }
-                li {
-                    margin-top: 0.15rem;
-                    i {
-                        font-size: 0.3rem;
-                    }
-                    b {
-                        left: 0.2rem;
-                        top: 0.15rem;
-                    }
-                    span {
-                        padding-bottom: 0.15rem;
-                        margin-left: 0.5rem;
-                        font-size: 0.25rem;
-                    }
-                }
-
-                .home {
-                    a {
-                        margin-top: 0.15rem;
-                        margin-bottom: 0rem;
-                    }
-                }
-            }
+           
         }
         }
         .title {
         .title {
-            font-size: 0.3rem;
+            font-size: 14px;
         }
         }
         .content {
         .content {
-            top: 1rem;
-            left: 2rem;
-            right: 2rem;
             padding: 10px;
             padding: 10px;
 
 
             > div {
             > div {
-                max-height: 3rem;
-                font-size: 0.25rem;
                 line-height: 1.5;
                 line-height: 1.5;
             }
             }
         }
         }

+ 92 - 67
src/framework/vr/index.vue

@@ -1,6 +1,9 @@
 <template>
 <template>
   <div class="panocon">
   <div class="panocon">
     <div id="pano"></div>
     <div id="pano"></div>
+    <span v-if="!hideScale" class="scale" @click="onFullScreen">
+      <img :src="require('@/assets/images/icons/tool_full@2x.png')" alt="" />
+    </span>
   </div>
   </div>
 </template>
 </template>
 
 
@@ -9,99 +12,121 @@ import * as krfn from "@/core/index.js";
 import { getSceneInfo } from "@/api";
 import { getSceneInfo } from "@/api";
 import config from "@/config";
 import config from "@/config";
 
 
+import browser from "@/utils/browser";
+import { $smallWaiting } from "@/components/shared/loading";
 
 
 let __krfn = krfn.default;
 let __krfn = krfn.default;
-window.__krfn = __krfn
+window.__krfn = __krfn;
 
 
 window.screenshot = function () {
 window.screenshot = function () {
   let canvas = $("#krpanoSWFObject canvas")[0];
   let canvas = $("#krpanoSWFObject canvas")[0];
-  
-
-  let krpano = document.getElementById('krpanoSWFObject');
+  let krpano = document.getElementById("krpanoSWFObject");
   let data = __krfn.utils.setInitView(krpano, canvas);
   let data = __krfn.utils.setInitView(krpano, canvas);
-  return data
-}
+  return data;
+};
 
 
 export default {
 export default {
-  data(){
+  data() {
     return {
     return {
-      activeItem:'',
-      someData:'',
-    }
+      activeItem: "",
+      someData: "",
+      hideScale: browser.urlQueryValue("hideScale"),
+    };
   },
   },
-  methods:{
+  methods: {
     onFullScreen() {
     onFullScreen() {
-        let element = document.documentElement;
-        if (this.isFullscreen) {
-            if (document.exitFullscreen) {
-                document.exitFullscreen();
-            } else if (document.webkitCancelFullScreen) {
-                document.webkitCancelFullScreen();
-            } else if (document.mozCancelFullScreen) {
-                document.mozCancelFullScreen();
-            } else if (document.msExitFullscreen) {
-                document.msExitFullscreen();
-            }
-        } else {
-            if (element.requestFullscreen) {
-                element.requestFullscreen();
-            } else if (element.webkitRequestFullScreen) {
-                element.webkitRequestFullScreen();
-            } else if (element.mozRequestFullScreen) {
-                element.mozRequestFullScreen();
-            } else if (element.msRequestFullscreen) {
-                element.msRequestFullscreen();
-            }
+      let element = document.documentElement;
+      if (this.isFullscreen) {
+        if (document.exitFullscreen) {
+          document.exitFullscreen();
+        } else if (document.webkitCancelFullScreen) {
+          document.webkitCancelFullScreen();
+        } else if (document.mozCancelFullScreen) {
+          document.mozCancelFullScreen();
+        } else if (document.msExitFullscreen) {
+          document.msExitFullscreen();
+        }
+      } else {
+        if (element.requestFullscreen) {
+          element.requestFullscreen();
+        } else if (element.webkitRequestFullScreen) {
+          element.webkitRequestFullScreen();
+        } else if (element.mozRequestFullScreen) {
+          element.mozRequestFullScreen();
+        } else if (element.msRequestFullscreen) {
+          element.msRequestFullscreen();
         }
         }
-          // 改变当前全屏状态
-        // this.isFullscreen = !this.isFullscreen;
-      },
-    onclick(){
+      }
+      // 改变当前全屏状态
+      this.isFullscreen = !this.isFullscreen;
+    },
+    onclick() {
       let canvas = $("#krpanoSWFObject canvas")[0];
       let canvas = $("#krpanoSWFObject canvas")[0];
-      let krpano = document.getElementById('krpanoSWFObject');
+      let krpano = document.getElementById("krpanoSWFObject");
       __krfn.utils.setInitView(krpano, canvas);
       __krfn.utils.setInitView(krpano, canvas);
     },
     },
-    getSceneInfo(){
-      getSceneInfo({},data=>{
-        this.activeItem = data.data
-      })
-    }
+    getSceneInfo() {
+      getSceneInfo({}, (data) => {
+        this.activeItem = data.data;
+      });
+    },
   },
   },
- 
-  mounted(){
-    window.addEventListener('message',data=>{
-      if (data.data.event=="onfull") {
-        this.onFullScreen()
-      }
-      // this.onFullScreen()
 
 
-    })
- 
+  mounted() {
+    window.vrVrInitFn = () => {
+      $smallWaiting.hide();
+    };
+    var settings = {
+      "events[skin_events].onloadcomplete": "js(window.vrVrInitFn());",
+    };
+
     // this.getSceneInfo()
     // this.getSceneInfo()
-        $('#pano').empty();
-        removepano('#pano')
-            embedpano({
-              // xml: "%HTMLPATH%/static/template/tour.xml",
-              xml: `${this.$cdn}/720yun_fd_manage/${config.sceneNum}/vtour/tour.xml`,
-              swf: "%HTMLPATH%/static/template/tour.swf",
-              target: "pano",
-              html5: "auto",
-              mobilescale: 0.7,
-              webglsettings: { preserveDrawingBuffer: true },
-              passQueryParameters: true,
-            });
+    $("#pano").empty();
+    removepano("#pano");
+    $smallWaiting.show();
 
 
-  }
-}
+    embedpano({
+      // xml: "%HTMLPATH%/static/template/tour.xml",
+      xml: `${this.$cdn}/720yun_fd_manage/${config.sceneNum}/vtour/tour.xml`,
+      swf: "%HTMLPATH%/static/template/tour.swf",
+      target: "pano",
+      html5: "auto",
+      mobilescale: 1,
+      vars: settings,
+      webglsettings: { preserveDrawingBuffer: true },
+      passQueryParameters: true,
+    });
+  },
+};
 </script>
 </script>
 
 
 <style lang="less" scoped>
 <style lang="less" scoped>
-.panocon{
+.panocon {
   width: 100%;
   width: 100%;
   height: 100%;
   height: 100%;
-  #pano{
+  #pano {
     width: 100%;
     width: 100%;
     height: 100%;
     height: 100%;
   }
   }
+  .scale {
+    font-size: 0;
+    bottom: 10px;
+    right: 10px;
+    z-index: 99;
+    cursor: pointer;
+    position: absolute;
+    color: #fff;
+    width: 36px;
+    height: 36px;
+    background: rgba(0, 0, 0, 0.5);
+    padding: 10px;
+    border: 1px solid rgba(255, 255, 255, 0.2);
+    border-radius: 18px;
+    > img {
+      width: 100%;
+      height: 100%;
+      cursor: pointer;
+    }
+  }
 }
 }
 </style>
 </style>

+ 45 - 0
src/mixins/index.js

@@ -8,6 +8,9 @@ import clickoutside from "./v-clickoutside";
 import clickwindow from "./v-clickwindow";
 import clickwindow from "./v-clickwindow";
 import * as api from "../api";
 import * as api from "../api";
 
 
+import { Message } from 'element-ui';
+
+
 const MARERIAL = ["image", "pano", "scene", "audio", "video"];
 const MARERIAL = ["image", "pano", "scene", "audio", "video"];
 
 
 const MAPTABLEHEADER = {};
 const MAPTABLEHEADER = {};
@@ -41,6 +44,7 @@ Vue.prototype.$noresult = config.noresult;
 Vue.prototype.$MAPTABLEHEADER = MAPTABLEHEADER;
 Vue.prototype.$MAPTABLEHEADER = MAPTABLEHEADER;
 Vue.prototype.$MARERIALSTR = MARERIALSTR;
 Vue.prototype.$MARERIALSTR = MARERIALSTR;
 Vue.prototype.$STRSTATUS = STRSTATUS;
 Vue.prototype.$STRSTATUS = STRSTATUS;
+Vue.prototype.$msg = Message;
 
 
 
 
 Vue.prototype.$videoImg =
 Vue.prototype.$videoImg =
@@ -227,6 +231,47 @@ Vue.mixin({
       }
       }
       return array;
       return array;
     },
     },
+    $iosGrantedTips(cb) {
+      var ua = navigator.userAgent.toLowerCase();
+      if (ua.indexOf("like mac os x") > 0) {
+        var reg = /os [\d._]*/gi;
+        var verinfo = ua.match(reg);
+        var version = (verinfo + "")
+          .replace(/[^0-9|_.]/gi, "")
+          .replace(/_/gi, ".");
+        var arr = version.split(".");
+        if (arr[0] > 12 && arr[1] > 2) {
+          //对13.3以后的版本处理,包括13.3,
+          DeviceMotionEvent.requestPermission()
+            .then((permissionState) => {
+              if (permissionState == "granted") {
+                cb({
+                  msg:'授权成功',
+                  code:1
+                })
+                this.reload();
+              } else {
+                cb({
+                  msg:'授权失败',
+                  code:0
+                })
+              }
+            })
+        } 
+        else {
+          //13.3以前的版本
+          cb({
+            msg:'无需授权,直接成功',
+            code:1
+          })
+        }
+      } else{
+        cb({
+          msg:'无需授权,直接成功',
+          code:1
+        })
+      }
+    },
     $htmlEncode(str) {
     $htmlEncode(str) {
       var s = "";
       var s = "";
       if (str.length == 0) return "";
       if (str.length == 0) return "";

+ 3 - 0
src/pages/material.js

@@ -5,6 +5,8 @@ import router from '../router/material'
 import store from '../Store'
 import store from '../Store'
 import 'viewerjs/dist/viewer.css'
 import 'viewerjs/dist/viewer.css'
 import Viewer from 'v-viewer'
 import Viewer from 'v-viewer'
+
+
 Vue.use(Viewer,{
 Vue.use(Viewer,{
   defaultOptions: {
   defaultOptions: {
     toolbar: 0,
     toolbar: 0,
@@ -14,6 +16,7 @@ Vue.use(Viewer,{
 })
 })
 
 
 
 
+
 Vue.config.productionTip = false
 Vue.config.productionTip = false
 
 
 new Vue({
 new Vue({

+ 11 - 1
src/pages/showMobile.js

@@ -4,12 +4,22 @@ import App from './showMobile.vue'
 import store from '../Store'
 import store from '../Store'
 import preview from 'vue-photo-preview'
 import preview from 'vue-photo-preview'
 import 'vue-photo-preview/dist/skin.css'
 import 'vue-photo-preview/dist/skin.css'
+import Videojs from 'video.js'
+import 'video.js/dist/video-js.css'
+
 Vue.use(preview,{
 Vue.use(preview,{
   toolbar: 0,
   toolbar: 0,
   title:0,
   title:0,
-  navbar:false
+  navbar:false,
+  showHideOpacity:true,
+  arrowEl:true,
+  bgOpacity:0.8,
+  pinchToClose:false,
+  closeOnVerticalDrag:false
 })
 })
 
 
+Vue.prototype.$video = Videojs
+
 Vue.config.productionTip = false
 Vue.config.productionTip = false
 new Vue({
 new Vue({
   store,
   store,

+ 4 - 4
src/router/index.js

@@ -59,10 +59,10 @@ checkWork().then(res=>{
   
   
 })
 })
 
 
-getPanoInfo().then(response => {
-  if(response&&response.status == 1){
-    store.commit('UpdateIsShowState', true)
-  }
+getPanoInfo().then(() => {
+  store.commit('UpdateIsShowState', true)
+  // if(response&&response.status == 1){
+  // }
   OnlineDetector.valid();
   OnlineDetector.valid();
 });
 });
 
 

+ 455 - 390
src/utils/request.js

@@ -6,435 +6,500 @@
  * @Description: Request
  * @Description: Request
  */
  */
 
 
-import Vue from 'vue'
-import logger from './logger'
-import browser from './browser'
-import { base64ToBlob } from './file'
+import Vue from "vue";
+import logger from "./logger";
+import browser from "./browser";
+import { base64ToBlob } from "./file";
 import { checkLogin } from "@/api";
 import { checkLogin } from "@/api";
 import { LoginDetector } from "@/utils/starter";
 import { LoginDetector } from "@/utils/starter";
-import { $alert, $loginTips } from '@/components/shared/message'
-import { $waiting } from '@/components/shared/loading'
-
+import { $alert, $loginTips } from "@/components/shared/message";
+import { $waiting } from "@/components/shared/loading";
 
 
+let vue = new Vue();
 
 
 // 空函数
 // 空函数
-const noop = function() {}
+const noop = function() {};
 // 请求回调队列
 // 请求回调队列
-let postQueue = []
+let postQueue = [];
 
 
 export const statusCode = {
 export const statusCode = {
-    NEXT: -999, //继续执行 
-    SUCCESS: 0, //成功
-    EXCEPTION: -1, //异常错误
-    FAILURE_CODE_3001: 3001, //素材已被引用,无法删除
-    FAILURE_CODE_3002: 3002, //素材已被引用,无法删除
-    FAILURE_CODE_3003: 3003, //文件名称不允许超过50个字符
-    FAILURE_CODE_3005: 3005, //不是该用户作品
-    FAILURE_CODE_3006: 3006, //作品已被删除,无法编辑
-
+  NEXT: -999, //继续执行
+  SUCCESS: 0, //成功
+  EXCEPTION: -1, //异常错误
+  FAILURE_CODE_3001: 3001, //素材已被引用,无法删除
+  FAILURE_CODE_3002: 3002, //素材已被引用,无法删除
+  FAILURE_CODE_3003: 3003, //文件名称不允许超过50个字符
+  FAILURE_CODE_3005: 3005, //不是该用户作品
+  FAILURE_CODE_3006: 3006, //作品已被删除,无法编辑
 
 
-    
+  FAILURE_CODE_3007: 3007, //作品已被删除,无法编辑
 
 
-    FAILURE_CODE_5003: 5003, //不支持此图片
+  FAILURE_CODE_5003: 5003, //不支持此图片
 
 
-    FAILURE_CODE_7005: 7005, //审核中不能编辑
-    FAILURE_CODE_7006: 7006, //已审核不能编辑
-    FAILURE_CODE_5001: 5001, //token失效
-    FAILURE_CODE_5004: 5004 // 密码错误
-
-}
+  FAILURE_CODE_7005: 7005, //审核中不能编辑
+  FAILURE_CODE_7006: 7006, //已审核不能编辑
+  FAILURE_CODE_5001: 5001, //token失效
+  FAILURE_CODE_5004: 5004, // 密码错误
+};
 
 
 /**
 /**
  * 已知错误提示集合
  * 已知错误提示集合
  */
  */
 // const defineErrorCode = []
 // const defineErrorCode = []
 
 
-let __showNetworkError = false
+let __showNetworkError = false;
 
 
 const showLoginTips = () => {
 const showLoginTips = () => {
-    // 防止多次请求弹出
-    if (showLoginTips.__is_show) {
-        return
-    }
-
-    showLoginTips.__is_show = true
-
-    return $loginTips({
-        title: '提示',
-        okText: '去登录',
-        noText: '登录完毕,继续',
-        content: '您没有登录,请登录后再编辑',
-        okLink: '/',
-        ok: function() {
-            showLoginTips.__is_show = false
-            return false
-        },
-        no: function() {
-            checkLogin().then(response => {
-                if (response.code === statusCode.SUCCESS) {
-                    postQueue.length && postQueue.forEach(item => item())
-                    postQueue = []
-                    LoginDetector.valid();
-                    window.location.reload()
-                } else if (response.code === statusCode.FAILURE_CODE_5001) {
-                    showLoginTips()
-                }
-            })
-            showLoginTips.__is_show = false
+  // 防止多次请求弹出
+  if (showLoginTips.__is_show) {
+    return;
+  }
+
+  showLoginTips.__is_show = true;
+
+  return $loginTips({
+    title: "提示",
+    okText: "去登录",
+    noText: "登录完毕,继续",
+    content: "您没有登录,请登录后再编辑",
+    okLink: "/",
+    ok: function() {
+      showLoginTips.__is_show = false;
+      return false;
+    },
+    no: function() {
+      checkLogin().then((response) => {
+        if (response.code === statusCode.SUCCESS) {
+          postQueue.length && postQueue.forEach((item) => item());
+          postQueue = [];
+          LoginDetector.valid();
+        let url = window.location.href
+        window.location.href = url
+        } else if (response.code === statusCode.FAILURE_CODE_5001) {
+          showLoginTips();
         }
         }
-    })
+      });
+      showLoginTips.__is_show = false;
+    },
+  });
+};
+
+function getCookie(objname) {
+  //获取指定名称的cookie的值
+  var arrstr = document.cookie.split("; ");
+  for (var i = 0; i < arrstr.length; i++) {
+    var temp = arrstr[i].split("=");
+    if (temp[0] == objname) return unescape(temp[1]);
+  }
 }
 }
 
 
-
 export function getToken() {
 export function getToken() {
-    return browser.urlHasValue('token', true) || localStorage.getItem('token') || ''
+  return (
+    browser.urlHasValue("token", true) || localStorage.getItem("token") || getCookie("fdkankantoken") || ""
+  );
 }
 }
 
 
 export function statusCodesHandler(result, callback) {
 export function statusCodesHandler(result, callback) {
-    if (result.code == statusCode.FAILURE_CODE_7005) {
-        return $alert({ 
-            content: '该VR项目待审核,不可编辑。',
-            forceOK:true,
-              ok:()=>{
-                window.location.reload()
-        }})
-    }
-
-    if (result.code == statusCode.FAILURE_CODE_7006) {
-        return $alert({ 
-            content: '该VR项目已审核,不可编辑。',
-            forceOK:true,
-              ok:()=>{
-                window.location.reload()
-        }})
-    }
-
-    if (result.code == statusCode.FAILURE_CODE_3001) {
-        return $alert({ content: '素材已被引用,无法删除。' })
-    }
-
-    if (result.code == statusCode.FAILURE_CODE_3002) {
-        return $alert({ content: '请至少保留一个场景。' })
-    }
-
-    if (result.code == statusCode.FAILURE_CODE_3006) {
-        return $alert({ content: '作品已被删除,无法编辑' })
-    }
-    
-
-    if (result.code == statusCode.FAILURE_CODE_3005) {
-        return
-    }
-    
-    if (result.code == statusCode.FAILURE_CODE_3003) {
-        return statusCode.FILE
-        // return $alert({ content: '文件名称不允许超过50个字符' })
-    }
-    
-    if (result.code == statusCode.FAILURE_CODE_5003) {
-        return statusCode.FILE
-        // return $alert({ content: '不支持此图片' })
-    }
-
-    if (result.code == statusCode.FAILURE_CODE_5004) {
-        return $alert({ content: '密码错误' })
-    }
+  if (result.code == statusCode.FAILURE_CODE_7005) {
+    return $alert({
+      content: "该VR作品待审核,不可编辑。",
+      forceOK: true,
+      ok: () => {
+        let url = window.location.href
+        window.location.href = url
+      },
+    });
+  }
+
+  if (result.code == statusCode.FAILURE_CODE_7006) {
+    return $alert({
+      content: "该VR作品已审核,不可编辑。",
+      forceOK: true,
+      ok: () => {
+        window.location.reload();
+      },
+    });
+  }
+
+  if (result.code == statusCode.FAILURE_CODE_3007) {
+    return $alert({ content: "素材已被引用,无法删除。" });
+  }
+
+  if (result.code == statusCode.FAILURE_CODE_3002) {
+    return $alert({ content: "请至少保留一个场景。" });
+  }
+
+  if (result.code == statusCode.FAILURE_CODE_3006) {
+    return $alert({ content: "作品已被删除,无法编辑" });
+  }
+
+  if (result.code == statusCode.FAILURE_CODE_3005) {
+    return;
+  }
+
+  if (result.code == statusCode.FAILURE_CODE_3003) {
+    return statusCode.FILE;
+    // return $alert({ content: '文件名称不允许超过50个字符' })
+  }
+
+  if (result.code == statusCode.FAILURE_CODE_5003) {
+    return statusCode.FILE;
+    // return $alert({ content: '不支持此图片' })
+  }
+
+  if (result.code == statusCode.FAILURE_CODE_5004) {
+    return $alert({ content: "密码错误" });
+  }
+
+  if (result.code == statusCode.EXCEPTION) {
+    return !http.__loading && $alert({ content: `${result.msg},请稍后再试` });
+  }
+
+  if (result.code == statusCode.FAILURE_CODE_5001) {
+    callback(result.code);
+    return showLoginTips();
+  }
+
+  if (result.code != statusCode.SUCCESS) {
+    return $alert({ content: `${result.msg}` });
+  }
+  return statusCode.NEXT;
+}
 
 
-    if (result.code == statusCode.EXCEPTION) {
-        return !http.__loading && $alert({ content: `${result.msg},请稍后再试`})
+$.ajaxSetup({
+  headers: {},
+  beforeSend: function(xhr) {
+    const token = getToken();
+    if (token) {
+      xhr.setRequestHeader("token", token);
     }
     }
-    
-    if (result.code == statusCode.FAILURE_CODE_5001) {
-        callback(result.code)
-        return showLoginTips()
+  },
+  error: function() {
+    // 出错时默认的处理函数
+    if (__showNetworkError) {
+      return;
     }
     }
-
-    if (result.code != statusCode.SUCCESS) {
-        return $alert({ content: `${result.msg}`})
+    __showNetworkError = true;
+    $alert({
+      content: "网络异常,请稍后再试",
+      forceOK: true,
+      ok: () => {
+        __showNetworkError = false;
+      },
+    });
+    return;
+  },
+  success: function() {},
+  complete: function(data) {
+    // Post类型请求无论成功或失败都关闭等待提示
+    if (
+      this.type === "POST" &&
+      this.url.indexOf("manage/fodder/upload") == -1
+    ) {
+      let isLongpolling = "";
+      try {
+        isLongpolling = JSON.parse(this.data).islongpolling;
+      } catch (error) {
+        error;
+      }
+      http.__loading && !isLongpolling && $waiting.hide();
     }
     }
-    return statusCode.NEXT
-}
-
-$.ajaxSetup({
-    headers: {},
-    beforeSend: function(xhr) {
-        const token = getToken()
-        if (token) {
-            xhr.setRequestHeader("token", token)
-        }
-    },
-    error: function() { // 出错时默认的处理函数
-        if (__showNetworkError) {
-            return
-        }
-        __showNetworkError = true
-        $alert({content: '网络异常,请稍后再试',
-                forceOK:true,
-                ok:()=>{
-                    __showNetworkError = false
-            }})
-        return 
-    },
-    success: function() {
-
-    },
-    complete: function(data) {
-        // Post类型请求无论成功或失败都关闭等待提示
-        if (this.type === 'POST'&& this.url.indexOf('manage/fodder/upload') == -1) {
-            let isLongpolling = ''
-            try {
-                 isLongpolling = JSON.parse(this.data).islongpolling
-            } catch (error) {
-                error
-            }
-            (http.__loading && !isLongpolling) && $waiting.hide()
-        }
 
 
-        http.__loading = true
-    }
+    http.__loading = true;
+  },
 });
 });
 
 
 export const http = {
 export const http = {
-    statusCode,
-    __loading: true,
-    __request(xhr, method, url, data, done, fail) {
-        if (typeof done != 'function') {
-            done = noop
-        }
-        if (typeof fail != 'function') {
-            fail = noop
-        }
-
-        xhr.done(result => {
-            if (typeof result.code !== 'undefined') {
-                const flag = statusCodesHandler(result, function(code) {
-                    // 需要登录的状态
-                    if (code == statusCode.FAILURE_CODE_5001) {
-                        postQueue.push(function() {
-                            http[method](url, data, done, fail)
-                        })
-                        // if (url.indexOf('isLogin') == -1) {
-                        //     postQueue.push(function() {
-                        //         http[method](url, data, done, fail)
-                        //     })
-                        // }
-                    }
-                })
-
-                if (flag === statusCode.FILE) {
-                    done(result)
-                }
-
-                if (flag === statusCode.NEXT) {
-                    done(result, result.code == 0)
-                }
-
-            } else {
-                done(result)
-            }
-        })
-
-        xhr.fail(fail)
-
-        xhr.always(() => xhr = null)
-
-        return xhr
-    },
-    /**
-     * Get请求
-     * @param {String} url 请求地址
-     * @param {Object?} data 请求参数
-     * @param {Function?} done 成功回调
-     * @param {Function?} fail 失败回调
-     */
-    get(url, data = {}, done, fail) {
-        if (/\.json/.test(url)) {
-            // json文件格式自动调用getJson方法
-            return this.getJson(url, data, done, fail)
-        }
-        return this.__request($.get(url, data), 'get', url, data, done, fail)
-    },
-    /**
-     * Get Blob请求
-     * @param {String} url 请求地址
-     * @param {Object?} data 请求参数
-     * @param {Function?} done 成功回调
-     * @param {Function?} fail 失败回调
-     */
-    getText(url, data = {}, done, fail) {
-        return this.__request($.ajax({
-            url: url,
-            dataType: "text",
-        }), 'getText', url, data, done, fail)
-    },
-    /**
-     * GetJson请求 读取json文件数据
-     * @param {String} url 请求地址
-     * @param {Object?} data 请求参数
-     * @param {Function?} done 成功回调
-     * @param {Function?} fail 失败回调
-     */
-    getJson(url, data = {}, done, fail) {
-        return this.__request($.getJSON(url, data), 'get', url, data, done, fail)
-    },
-    /**
-     * Get Blob请求
-     * @param {String} url 请求地址
-     * @param {Object?} data 请求参数
-     * @param {Function?} done 成功回调
-     * @param {Function?} fail 失败回调
-     */
-    getBlob(url, data = {}, done, fail) {
-        return this.__request($.ajax({
-            url: url,
-            dataType: "blob",
-        }), 'getBlob', url, data, done, fail)
-    },
-    /**
-     * Get Arraybuffer请求
-     * @param {String} url 请求地址
-     * @param {Object?} data 请求参数
-     * @param {Function?} done 成功回调
-     * @param {Function?} fail 失败回调
-     */
-    getArraybuffer(url, data = {}, done, fail) {
-        return this.__request($.ajax({
-            url: url,
-            dataType: "arraybuffer",
-        }), 'getArraybuffer', url, data, done, fail)
-    },
-    /**
-     * Post 请求
-     * @param {String} url 请求地址
-     * @param {Object?} data 请求参数
-     * @param {Function?} done 成功回调
-     * @param {Function?} fail 失败回调
-     */
-    post(url, data = {}, done, fail) {
-        if (url.indexOf('isLogin') == -1) {
-            http.__loading && $waiting.show()
-        }
+  statusCode,
+  __loading: true,
+  __request(xhr, method, url, data, done, fail) {
+    if (typeof done != "function") {
+      done = noop;
+    }
+    if (typeof fail != "function") {
+      fail = noop;
+    }
 
 
-        return this.__request($.post(url, data), 'post', url, data, done, fail)
-    },
-    /**
-     * PostJson 请求
-     * @param {String} url 请求地址
-     * @param {Object?} data 请求参数
-     * @param {Function?} done 成功回调
-     * @param {Function?} fail 失败回调
-     */
-    postJson(url, data = {}, done, fail) {
-        (http.__loading && !data.islongpolling) && $waiting.show()
-        return this.__request($.ajax({
-            type: "POST",
-            url: url,
-            contentType: 'application/json',
-            data: JSON.stringify(data)
-        }), 'postJson', url, data, done, fail)
-    },
-    /**
-     * Post 表单 支持文件上传
-     * @param {String} url 请求地址
-     * @param {FormData?} formData 请求参数
-     * @param {Function?} done 成功回调
-     * @param {Function?} fail 失败回调
-     */
-    postForm(url, formData, done, fail, onProgress) {
-        if (typeof onProgress === "function") {
-            return this.__request($.ajax({
-                type: "POST",
-                url: url,
-                processData: false,
-                contentType: false,
-                data: formData,
-                xhr: function() {
-                    const xhr = new XMLHttpRequest();
-                    xhr.upload.addEventListener('progress', function(e) {
-                        onProgress((e.loaded / e.total) * 100 + '%')
-                    })
-                    return xhr;
-                },
-            }), 'postForm', url, formData, done, fail)
-        } else {
-            if (url.indexOf('manage/fodder/upload') == -1) {
-                http.__loading && $waiting.show()
-            }
-            return this.__request($.ajax({
-                type: "POST",
-                url: url,
-                processData: false,
-                contentType: false,
-                data: formData
-            }), 'postForm', url, formData, done, fail)
-        }
-    },
-    /**
-     * 加载图片
-     * @param {String} url 请求地址
-     * @param {Number?} retry 重试次数,默认为3
-     */
-    loadImage(url, retry = 3) {
-        const def = $.Deferred();
-        const img = new Image;
-
-        const load = () => {
-            logger.warn("Retrying load image: " + url);
-            this.loadImage(url, retry - 1).done(def.resolve.bind(def)).progress(def.notify.bind(def)).fail(def.reject.bind(def));
+    xhr.done((result) => {
+      if (typeof result.code !== "undefined") {
+        const flag = statusCodesHandler(result, function(code) {
+          // 需要登录的状态
+          if (code == statusCode.FAILURE_CODE_5001) {
+            postQueue.push(function() {
+              http[method](url, data, done, fail);
+            });
+            // if (url.indexOf('isLogin') == -1) {
+            //     postQueue.push(function() {
+            //         http[method](url, data, done, fail)
+            //     })
+            // }
+          }
+        });
+
+        if (!flag) {
+          return;
         }
         }
 
 
-        img.onerror = function() {
-            retry > 0 ? setTimeout(() => load(), 1e3) : def.reject(`[${url}]加载失败`)
+        if (flag === statusCode.FILE) {
+          done(result);
         }
         }
 
 
-        img.onload = function() {
-            def.resolve(img)
+        if (flag === statusCode.NEXT) {
+          done(result, result.code == 0);
         }
         }
+      } else {
+        done(result);
+      }
+    });
+
+    xhr.fail(fail);
+
+    xhr.always(() => (xhr = null));
+
+    return xhr;
+  },
+  /**
+   * Get请求
+   * @param {String} url 请求地址
+   * @param {Object?} data 请求参数
+   * @param {Function?} done 成功回调
+   * @param {Function?} fail 失败回调
+   */
+  get(url, data = {}, done, fail) {
+    if (/\.json/.test(url)) {
+      // json文件格式自动调用getJson方法
+      return this.getJson(url, data, done, fail);
+    }
+    return this.__request($.get(url, data), "get", url, data, done, fail);
+  },
+  /**
+   * Get Blob请求
+   * @param {String} url 请求地址
+   * @param {Object?} data 请求参数
+   * @param {Function?} done 成功回调
+   * @param {Function?} fail 失败回调
+   */
+  getText(url, data = {}, done, fail) {
+    return this.__request(
+      $.ajax({
+        url: url,
+        dataType: "text",
+      }),
+      "getText",
+      url,
+      data,
+      done,
+      fail
+    );
+  },
+  /**
+   * GetJson请求 读取json文件数据
+   * @param {String} url 请求地址
+   * @param {Object?} data 请求参数
+   * @param {Function?} done 成功回调
+   * @param {Function?} fail 失败回调
+   */
+  getJson(url, data = {}, done, fail) {
+    return this.__request($.getJSON(url, data), "get", url, data, done, fail);
+  },
+  /**
+   * Get Blob请求
+   * @param {String} url 请求地址
+   * @param {Object?} data 请求参数
+   * @param {Function?} done 成功回调
+   * @param {Function?} fail 失败回调
+   */
+  getBlob(url, data = {}, done, fail) {
+    return this.__request(
+      $.ajax({
+        url: url,
+        dataType: "blob",
+      }),
+      "getBlob",
+      url,
+      data,
+      done,
+      fail
+    );
+  },
+  /**
+   * Get Arraybuffer请求
+   * @param {String} url 请求地址
+   * @param {Object?} data 请求参数
+   * @param {Function?} done 成功回调
+   * @param {Function?} fail 失败回调
+   */
+  getArraybuffer(url, data = {}, done, fail) {
+    return this.__request(
+      $.ajax({
+        url: url,
+        dataType: "arraybuffer",
+      }),
+      "getArraybuffer",
+      url,
+      data,
+      done,
+      fail
+    );
+  },
+  /**
+   * Post 请求
+   * @param {String} url 请求地址
+   * @param {Object?} data 请求参数
+   * @param {Function?} done 成功回调
+   * @param {Function?} fail 失败回调
+   */
+  post(url, data = {}, done, fail) {
+    if (url.indexOf("isLogin") == -1) {
+      http.__loading && $waiting.show();
+    }
 
 
-        img.crossOrigin = "anonymous";
-        img.src = url;
-
-        return def;
-    },
-    /**
-     * 上传文件
-     * @param {String} url 请求地址
-     * @param {Object?} data 请求参数
-     * @param {Function?} done 成功回调
-     * @param {Function?} fail 失败回调
-     */
-    uploadFile(url, data = {}, done, fail, onProgress) {
-        const form = new FormData()
-        // if (file.needTransfer) { //ie和苹果都不支持dataURLtoFile得传送,所以只能用blob
-        //     form.append("file", common.dataURLtoBlob(file.file), file.name || file.file.name);
-        // } else {
-        //     form.append("file", file.file, file.name || file.file.name);
-        // }
-        for (let key in data) {
-            if (key == 'file') {
-                form.append("file", data[key], data.filename || data[key].name);
-            } else if (key != 'filename') {
-                form.append(key, data[key])
-            }
-        }
-        return this.postForm(url, form, done, fail, onProgress)
-    },
-    /**
-     * 上传文件
-     * @param {String} url 请求地址
-     * @param {Object?} data 请求参数 {file:'base64 string',filename:'image.jpg',...}
-     * @param {Function?} done 成功回调
-     * @param {Function?} fail 失败回调
-     */
-    uploadBlobFile(url, data = {}, done, fail) {
-        const form = new FormData()
-        for (let key in data) {
-            if (key === 'file') {
-                form.append("file", base64ToBlob(data.file), data.filename);
-            } else if (key != 'filename') {
-                form.append(key, data[key])
-            }
-        }
-        return this.postForm(url, form, done, fail)
+    return this.__request($.post(url, data), "post", url, data, done, fail);
+  },
+  /**
+   * PostJson 请求
+   * @param {String} url 请求地址
+   * @param {Object?} data 请求参数
+   * @param {Function?} done 成功回调
+   * @param {Function?} fail 失败回调
+   */
+  postJson(url, data = {}, done, fail) {
+    http.__loading && !data.islongpolling && $waiting.show();
+    return this.__request(
+      $.ajax({
+        type: "POST",
+        url: url,
+        contentType: "application/json",
+        data: JSON.stringify(data),
+      }),
+      "postJson",
+      url,
+      data,
+      done,
+      fail
+    );
+  },
+  /**
+   * Post 表单 支持文件上传
+   * @param {String} url 请求地址
+   * @param {FormData?} formData 请求参数
+   * @param {Function?} done 成功回调
+   * @param {Function?} fail 失败回调
+   */
+  postForm(url, formData, done, fail, onProgress) {
+    if (typeof onProgress === "function") {
+      return this.__request(
+        $.ajax({
+          type: "POST",
+          url: url,
+          processData: false,
+          contentType: false,
+          data: formData,
+          xhr: function() {
+            const xhr = new XMLHttpRequest();
+            xhr.upload.addEventListener("progress", function(e) {
+              onProgress((e.loaded / e.total) * 100 + "%");
+            });
+            return xhr;
+          },
+        }),
+        "postForm",
+        url,
+        formData,
+        done,
+        fail
+      );
+    } else {
+      if (url.indexOf("manage/fodder/upload") == -1) {
+        http.__loading && $waiting.show();
+      }
+      return this.__request(
+        $.ajax({
+          type: "POST",
+          url: url,
+          processData: false,
+          contentType: false,
+          data: formData,
+        }),
+        "postForm",
+        url,
+        formData,
+        done,
+        fail
+      );
+    }
+  },
+  /**
+   * 加载图片
+   * @param {String} url 请求地址
+   * @param {Number?} retry 重试次数,默认为3
+   */
+  loadImage(url, retry = 3) {
+    const def = $.Deferred();
+    const img = new Image();
+
+    const load = () => {
+      logger.warn("Retrying load image: " + url);
+      this.loadImage(url, retry - 1)
+        .done(def.resolve.bind(def))
+        .progress(def.notify.bind(def))
+        .fail(def.reject.bind(def));
+    };
+
+    img.onerror = function() {
+      retry > 0
+        ? setTimeout(() => load(), 1e3)
+        : def.reject(`[${url}]加载失败`);
+    };
+
+    img.onload = function() {
+      def.resolve(img);
+    };
+
+    img.crossOrigin = "anonymous";
+    img.src = url;
+
+    return def;
+  },
+  /**
+   * 上传文件
+   * @param {String} url 请求地址
+   * @param {Object?} data 请求参数
+   * @param {Function?} done 成功回调
+   * @param {Function?} fail 失败回调
+   */
+  uploadFile(url, data = {}, done, fail, onProgress) {
+    const form = new FormData();
+    // if (file.needTransfer) { //ie和苹果都不支持dataURLtoFile得传送,所以只能用blob
+    //     form.append("file", common.dataURLtoBlob(file.file), file.name || file.file.name);
+    // } else {
+    //     form.append("file", file.file, file.name || file.file.name);
+    // }
+    for (let key in data) {
+      if (key == "file") {
+        form.append("file", data[key], data.filename || data[key].name);
+      } else if (key != "filename") {
+        form.append(key, data[key]);
+      }
+    }
+    return this.postForm(url, form, done, fail, onProgress);
+  },
+  /**
+   * 上传文件
+   * @param {String} url 请求地址
+   * @param {Object?} data 请求参数 {file:'base64 string',filename:'image.jpg',...}
+   * @param {Function?} done 成功回调
+   * @param {Function?} fail 失败回调
+   */
+  uploadBlobFile(url, data = {}, done, fail) {
+    const form = new FormData();
+    for (let key in data) {
+      if (key === "file") {
+        form.append("file", base64ToBlob(data.file), data.filename);
+      } else if (key != "filename") {
+        form.append(key, data[key]);
+      }
     }
     }
-}
+    return this.postForm(url, form, done, fail);
+  },
+};

+ 104 - 0
src/utils/wxshare.js

@@ -0,0 +1,104 @@
+function toConfigure() {
+    return new Promise((resolve, reject) => {
+        $.ajax({
+            url: '//www.4dage.com/wechat/jssdk/share',
+            type: "get",
+            data: {
+                uri: location.href.split("#")[0],
+                name: "厦门四维时代微信公众号"
+            },
+            dataType: "jsonp",
+            //jsonpCallback: "success_jsonp",
+            success: function(data, textStatus) {
+                wx.config({
+                    debug: false,
+                    appId: data.appId,
+                    timestamp: data.timestamp,
+                    nonceStr: data.nonceStr,
+                    signature: data.signature,
+                    jsApiList: ['checkJsApi', 'onMenuShareTimeline',
+                        'onMenuShareAppMessage', 'onMenuShareQQ',
+                        'onMenuShareWeibo', 'hideMenuItems',
+                        'showMenuItems', 'hideAllNonBaseMenuItem',
+                        'showAllNonBaseMenuItem', 'translateVoice',
+                        'startRecord', 'stopRecord', 'onRecordEnd',
+                        'playVoice', 'pauseVoice', 'stopVoice',
+                        'uploadVoice', 'downloadVoice', 'chooseImage',
+                        'previewImage', 'uploadImage', 'downloadImage',
+                        'getNetworkType', 'openLocation', 'getLocation',
+                        'hideOptionMenu', 'showOptionMenu', 'closeWindow',
+                        'scanQRCode', 'chooseWXPay',
+                        'openProductSpecificView', 'addCard', 'chooseCard',
+                        'openCard'
+                    ]
+                });
+                resolve()
+            },
+            error: function(XMLHttpRequest, textStatus, errorThrown) {
+                reject("jsonp.error:" + textStatus)
+            }
+        });
+    })
+}
+
+function strToJSON(search) {
+    let args = search.substr(1).split('&')
+    let obj = {}
+    args.forEach(arg => {
+        let index = arg.indexOf('=')
+        if (!~index) {
+            obj[arg] = null
+        } else {
+            obj[arg.substr(0, index)] = arg.substr(index + 1)
+        }
+    })
+
+    return obj
+}
+
+function jsonToStr(data) {
+    let strs = []
+    Object.keys(data).forEach(k => {
+        if (data[k] !== null) {
+            strs.push(`${k}=${data[k]}`)
+        }
+    })
+    return '?' + strs.join('&')
+}
+
+
+function setup({ title, link, imgUrl, desc }) {
+    let defaultFn = () => {}
+    let defaultChar = ''
+    let search = link.substr(link.indexOf('?'))
+    let path = link.substr(0, link.indexOf('?'))
+    let data = strToJSON(search)
+
+
+
+    wx.ready(function() {
+        // 微信朋友圈
+        data.open = 'wx_friends'
+        wx.onMenuShareTimeline({ title, link: path + jsonToStr(data), imgUrl, desc });
+        // 微信好友
+        data.open = 'wx_friend'
+        wx.onMenuShareAppMessage({ title, desc, link: path + jsonToStr(data), imgUrl, type: defaultChar, dataUrl: defaultChar })
+        // 微博
+        data.open = 'weibo'
+        wx.onMenuShareWeibo({ title, desc, link: path + jsonToStr(data), imgUrl, success: defaultFn, cancel: defaultFn });
+        // 空间
+        data.open = 'qq_zone'
+        wx.onMenuShareQZone({ title, desc, link: path + jsonToStr(data), imgUrl, success: defaultFn, cancel: defaultFn });
+        // QQ好友
+        data.open = 'qq'
+        wx.onMenuShareQQ({ title, desc, link: path + jsonToStr(data), imgUrl, success: defaultFn, cancel: defaultFn });
+        wx.error(function(e) {})
+    })
+}
+
+export default async (args) => {
+    if (typeof wx != "undefined") { //需要引入 https://res.wx.qq.com/open/js/jweixin-1.2.0.js
+        await toConfigure()
+        setup(args)
+    }
+}

+ 4 - 0
src/views/base/EditPanel/logo.vue

@@ -82,6 +82,10 @@ export default {
     width: 100px;
     width: 100px;
     height: 100px;
     height: 100px;
     overflow: hidden;
     overflow: hidden;
+    >img{
+      max-width: 100px;
+      max-height: 100px;
+    }
   }
   }
   .upload-con {
   .upload-con {
     flex: 1;
     flex: 1;

+ 3 - 3
src/views/base/Toolbar.vue

@@ -31,7 +31,7 @@
               type="text"
               type="text"
               class="ui-input"
               class="ui-input"
               maxlength="50"
               maxlength="50"
-              placeholder="VR楼盘项目标题限50字"
+              placeholder="作品标题,限50字"
             />
             />
           </div>
           </div>
           <div class="ui-title" style="margin-top:10px"><span>简介</span></div>
           <div class="ui-title" style="margin-top:10px"><span>简介</span></div>
@@ -41,7 +41,7 @@
               @blur="$store.commit('SetInfo',info)"
               @blur="$store.commit('SetInfo',info)"
               style="height:110px;"
               style="height:110px;"
               maxlength="500"
               maxlength="500"
-              placeholder="请填写简介限500字"
+              placeholder="作品简介,限500字"
               type="text"
               type="text"
               class="ui-input ui-textarea"
               class="ui-input ui-textarea"
             />
             />
@@ -123,7 +123,7 @@ export default {
       key:'',
       key:'',
       clickFrom:'',
       clickFrom:'',
       paging: {
       paging: {
-        pageSize: 12,
+        pageSize: 8,
         pageNum: 1,
         pageNum: 1,
         total: 0,
         total: 0,
         showSize: 4,
         showSize: 4,

+ 6 - 1
src/views/hotspot/EditPanel.vue

@@ -297,6 +297,11 @@ export default {
         this.cancel()
         this.cancel()
       }) 
       }) 
 
 
+    this.$nextTick(()=>{
+      if (this.editTitle != '编辑') {
+        this.addhotspot(this.hotStyle[0])
+      }
+    })
   },
   },
 
 
   methods: {
   methods: {
@@ -492,7 +497,7 @@ export default {
             }
             }
             li {
             li {
                 position: relative;
                 position: relative;
-                cursor: pointer;
+                // cursor: pointer;
                 padding: 0;
                 padding: 0;
                 display: flex;
                 display: flex;
                 align-items: center;
                 align-items: center;

+ 24 - 5
src/views/hotspot/Setting.vue

@@ -13,7 +13,7 @@
         </button>
         </button>
       </li>
       </li>
       <li app-border class="list">
       <li app-border class="list">
-        <div class="tips" v-if="someData.hotspots.length>0">当前场景热点({{ someData.hotspots.length }})</div>
+        <div class="tips" v-if="someData.hotspots.length>0">当前全景图热点({{ someData.hotspots.length }})</div>
         <div class="hots">
         <div class="hots">
           <ul v-if="someData.hotspots.length > 0">
           <ul v-if="someData.hotspots.length > 0">
             <li
             <li
@@ -38,7 +38,7 @@
                 v-clickoutside="clickoutside"
                 v-clickoutside="clickoutside"
                 :class="{ active: deleIndex == key }"
                 :class="{ active: deleIndex == key }"
                 @click.stop="deleteHot(item)"
                 @click.stop="deleteHot(item)"
-                >确定删除</a
+                >删除</a
               >
               >
             </li>
             </li>
           </ul>
           </ul>
@@ -70,6 +70,7 @@ export default {
   computed: {
   computed: {
     ...mapGetters({
     ...mapGetters({
       activeItem: "activeItem",
       activeItem: "activeItem",
+      hotspot:'hotspot',
       info:"info"
       info:"info"
     }),
     }),
   },
   },
@@ -79,7 +80,7 @@ export default {
       showPanel: false,
       showPanel: false,
       someData: { hotspots: [] },
       someData: { hotspots: [] },
       deleIndex: -1,
       deleIndex: -1,
-      editTitle: "新增",
+      editTitle: "编辑",
     };
     };
   },
   },
   watch: {
   watch: {
@@ -103,7 +104,25 @@ export default {
   mounted() {
   mounted() {
     this.$bus.on("openHotspot", (data) => {
     this.$bus.on("openHotspot", (data) => {
       let idx = this.someData.hotspots.findIndex((item) => item.name == data);
       let idx = this.someData.hotspots.findIndex((item) => item.name == data);
+      let beforeIdx = this.someData.hotspots.findIndex((item) => item.name == this.hotspot.name);
+      if (beforeIdx == idx) {
+        return
+      }
+      if (this.editTitle == '新增') {
+        if (this.showPanel) {
+          return this.$confirm({
+              content: "热点内容未编辑完,确定要关闭吗",
+              ok: () => {
+                this.deleteKRHotspot(this.hotspot)
+                this.open(this.someData.hotspots[idx]);
+              }
+          });
+        }
+
+      }
+
       this.open(this.someData.hotspots[idx]);
       this.open(this.someData.hotspots[idx]);
+
     });
     });
   },
   },
   methods: {
   methods: {
@@ -118,7 +137,7 @@ export default {
               this.deleteKRHotspot(data.data)
               this.deleteKRHotspot(data.data)
               this.$bus.emit('addhotspot',data.data)
               this.$bus.emit('addhotspot',data.data)
               let idx = this.someData.hotspots.findIndex(item=>item.name == data.data.name)
               let idx = this.someData.hotspots.findIndex(item=>item.name == data.data.name)
-              this.someData.hotspots[idx] =data.data 
+              this.someData.hotspots[idx] =data.data
           }
           }
           else{
           else{
               this.deleteKRHotspot(data.data)
               this.deleteKRHotspot(data.data)
@@ -193,7 +212,7 @@ export default {
         image:[],
         image:[],
         audio:'',
         audio:'',
         video:''
         video:''
-      }
+      }      
 
 
       this.$store.commit("SetHotspot", temp);
       this.$store.commit("SetHotspot", temp);
       this.showPanel = true;
       this.showPanel = true;

+ 12 - 7
src/views/hotspot/hotspotType/audio.vue

@@ -43,7 +43,7 @@ export default {
       isShowSelect:false,
       isShowSelect:false,
       list:[],
       list:[],
       paging: {
       paging: {
-        pageSize: 12,
+        pageSize: 8,
         pageNum: 1,
         pageNum: 1,
         total: 0,
         total: 0,
         showSize: 4,
         showSize: 4,
@@ -79,12 +79,15 @@ export default {
           type:this.type
           type:this.type
         },
         },
         (data) => {
         (data) => {
-          this.paging.pageNum = data.data.pageNum;
-          this.paging.pageSize = data.data.pageSize;
-          this.paging.total = data.data.total;
-          this.list = data.data.list.map(i=>{
-            i.fileSize = changeByteUnit(Number(i.fileSize))
-            return i
+          this.list = [];
+          setTimeout(() => {
+            this.paging.pageNum = data.data.pageNum;
+            this.paging.pageSize = data.data.pageSize;
+            this.paging.total = data.data.total;
+            this.list = data.data.list.map(i=>{
+              i.fileSize = changeByteUnit(Number(i.fileSize))
+              return i
+            })
           })
           })
         }
         }
       );
       );
@@ -138,6 +141,8 @@ export default {
       z-index: 9;
       z-index: 9;
       background: rgba(0, 0, 0, 0.5);
       background: rgba(0, 0, 0, 0.5);
       >.ui-button{
       >.ui-button{
+        display: flex;
+        align-items: center;
         width: auto;
         width: auto;
         padding: 0 10px;
         padding: 0 10px;
         margin: 0;
         margin: 0;

+ 3 - 1
src/views/hotspot/hotspotType/image.vue

@@ -45,7 +45,7 @@ export default {
       isShowSelect:false,
       isShowSelect:false,
       list:[],
       list:[],
       paging: {
       paging: {
-        pageSize: 12,
+        pageSize: 8,
         pageNum: 1,
         pageNum: 1,
         total: 0,
         total: 0,
         showSize: 4,
         showSize: 4,
@@ -154,6 +154,8 @@ export default {
       z-index: 9;
       z-index: 9;
       background: rgba(0, 0, 0, 0.5);
       background: rgba(0, 0, 0, 0.5);
       >.ui-button{
       >.ui-button{
+        display: flex;
+        align-items: center;
         width: auto;
         width: auto;
         padding: 0 10px;
         padding: 0 10px;
         margin: 0;
         margin: 0;

+ 2 - 2
src/views/hotspot/hotspotType/scene.vue

@@ -89,8 +89,8 @@ export default {
     white-space: break-spaces;
     white-space: break-spaces;
   }
   }
   .iconedit_case_delete{
   .iconedit_case_delete{
-    left: unset;
-    top: unset;
+    left: auto;
+    top: auto;
     right: 10px;
     right: 10px;
     bottom: 10px;
     bottom: 10px;
     border-radius: 50%;
     border-radius: 50%;

+ 5 - 1
src/views/hotspot/hotspotType/video.vue

@@ -31,6 +31,7 @@
 <script>
 <script>
 import { getMaterialList} from "@/api";
 import { getMaterialList} from "@/api";
 import Table from "@/components/tableSelect";
 import Table from "@/components/tableSelect";
+import { changeByteUnit } from '@/utils/file'
 
 
 export default {
 export default {
   components:{Table},
   components:{Table},
@@ -42,7 +43,7 @@ export default {
       isShowSelect:false,
       isShowSelect:false,
       list:[],
       list:[],
       paging: {
       paging: {
-        pageSize: 12,
+        pageSize: 8,
         pageNum: 1,
         pageNum: 1,
         total: 0,
         total: 0,
         showSize: 4,
         showSize: 4,
@@ -84,6 +85,7 @@ export default {
        
        
           this.list =data.data.list.map(i=>{
           this.list =data.data.list.map(i=>{
             i.icon = i.ossPath+this.$videoImg
             i.icon = i.ossPath+this.$videoImg
+            i.fileSize = changeByteUnit(Number(i.fileSize))
             return i
             return i
           })
           })
         }
         }
@@ -138,6 +140,8 @@ export default {
       z-index: 9;
       z-index: 9;
       background: rgba(0, 0, 0, 0.5);
       background: rgba(0, 0, 0, 0.5);
       >.ui-button{
       >.ui-button{
+        display: flex;
+        align-items: center;
         width: auto;
         width: auto;
         padding: 0 10px;
         padding: 0 10px;
         margin: 0;
         margin: 0;

+ 1 - 0
src/views/information/Setting.vue

@@ -61,6 +61,7 @@ export default {
     handleSelect(data){
     handleSelect(data){
       this.info.firstScene = data
       this.info.firstScene = data
       this.$store.commit("SetInfo", this.info);
       this.$store.commit("SetInfo", this.info);
+      console.log(this.info.firstScene);
       this.showInitScene=false
       this.showInitScene=false
     }
     }
   },
   },

+ 8 - 6
src/views/information/Toolbar.vue

@@ -295,8 +295,10 @@ export default {
 
 
     delFirstScene(){
     delFirstScene(){
         if (this.info.firstScene) {
         if (this.info.firstScene) {
-          let firIdx = this.info.scenes.findIndex(item=>item.sceneCode == this.info.firstScene.sceneCode);
-          (firIdx>-1)&&(this.info.firstScene='')
+          let firIdx = this.info.scenes.find(item=>{
+            return item.sceneCode == this.info.firstScene.sceneCode
+          });
+          !firIdx&&(this.info.firstScene='')
         }
         }
     },
     },
 
 
@@ -324,11 +326,11 @@ export default {
       this.$confirm({
       this.$confirm({
         content: `${item.type=='4dkk'?'场景':'全景图'}“${item.sceneTitle}”下所有设置也都将会被删除,是否删除?`,
         content: `${item.type=='4dkk'?'场景':'全景图'}“${item.sceneTitle}”下所有设置也都将会被删除,是否删除?`,
         ok: () => {
         ok: () => {
-          this.delFirstScene()
-          let idx = this.info.scenes.findIndex(ele=>ele.id==item.id)
+          let idx = this.info.scenes.findIndex(ele=>ele.sceneCode==item.sceneCode)
           this.info.scenes.splice(idx,1)
           this.info.scenes.splice(idx,1)
-          this.$bus.emit('scenesChange')
+          this.delFirstScene()
           this.$store.commit("SetInfo", this.info);
           this.$store.commit("SetInfo", this.info);
+          this.$bus.emit('scenesChange')
           this.$tips({ content: "删除成功", icon: "ok" });
           this.$tips({ content: "删除成功", icon: "ok" });
         },
         },
       });
       });
@@ -385,7 +387,7 @@ export default {
       }
       }
       > .icon_forward {
       > .icon_forward {
         right: 40px;
         right: 40px;
-        left: unset;
+        left: auto;
       }
       }
       .sub-menu {
       .sub-menu {
         max-width: calc(100% - 70px);
         max-width: calc(100% - 70px);

+ 9 - 7
src/views/information/index.vue

@@ -140,7 +140,7 @@ export default {
       },
       },
       key: "",
       key: "",
       paging: {
       paging: {
-        pageSize: 12,
+        pageSize: 8,
         pageNum: 1,
         pageNum: 1,
         total: 0,
         total: 0,
         showSize: 4,
         showSize: 4,
@@ -158,7 +158,7 @@ export default {
     showList(newVal) {
     showList(newVal) {
       if (!newVal) {
       if (!newVal) {
         this.paging = {
         this.paging = {
-          pageSize: 12,
+          pageSize: 8,
           pageNum: 1,
           pageNum: 1,
           total: 0,
           total: 0,
           showSize: 4,
           showSize: 4,
@@ -178,7 +178,6 @@ export default {
     },
     },
     handleSelect(data) {
     handleSelect(data) {
      let params = ''
      let params = ''
-     let id = this.info.scenes.length+1
       if (this.type == "scene") {
       if (this.type == "scene") {
         params = data.map((item) => {
         params = data.map((item) => {
           return {
           return {
@@ -187,7 +186,7 @@ export default {
             sceneTitle: item.sceneName,
             sceneTitle: item.sceneName,
             type: "4dkk",
             type: "4dkk",
             category:this.activeCataLog.id,
             category:this.activeCataLog.id,
-            id
+            id:'s_'+this.$randomWord(true,8,8)
           };
           };
         });
         });
       } else {
       } else {
@@ -198,15 +197,17 @@ export default {
             sceneTitle: item.name,
             sceneTitle: item.name,
             category:this.activeCataLog.id,
             category:this.activeCataLog.id,
             type: "pano",
             type: "pano",
-            id
+            id:'s_'+this.$randomWord(true,8,8)
           };
           };
         });
         });
       }
       }
 
 
-      params.forEach(item => {
+      params.forEach((item,i) => {
         let temp = this.info.scenes.find(sub=>sub.sceneCode == item.sceneCode)
         let temp = this.info.scenes.find(sub=>sub.sceneCode == item.sceneCode)
         if (temp) {
         if (temp) {
-            this.$tips({ content: `${item.type=='4dkk'?'场景':'全景图'}${item.sceneTitle}已存在,不可重复添加`, icon: "ok" });
+            setTimeout(() => {
+              this.$msg(`${item.type=='4dkk'?'场景':'全景图'}${item.sceneTitle}已存在,不可重复添加`);
+            }, i*100);
             return
             return
         }
         }
         !temp&&this.info.scenes.push(item)
         !temp&&this.info.scenes.push(item)
@@ -243,6 +244,7 @@ export default {
         return this.$alert({ content: "请输入名字" });
         return this.$alert({ content: "请输入名字" });
       }
       }
       this.$tips({ content: "重命名成功", icon: "ok" });
       this.$tips({ content: "重命名成功", icon: "ok" });
+      this.$store.commit("SetInfo", this.info);
       this.showRename = false;
       this.showRename = false;
     },
     },
 
 

+ 195 - 130
src/views/material/audio/index.vue

@@ -1,7 +1,7 @@
 <template>
 <template>
   <div class="panorama con">
   <div class="panorama con">
     <div class="top">
     <div class="top">
-      <crumbs :list="tablist"/>
+      <crumbs :list="tablist" />
       <!-- <audio controls :src="`https://houseoss.4dkankan.com/chuanshan/audio/testaudio.mp3`"></audio> -->
       <!-- <audio controls :src="`https://houseoss.4dkankan.com/chuanshan/audio/testaudio.mp3`"></audio> -->
       <div class="filter">
       <div class="filter">
         <div>
         <div>
@@ -10,17 +10,30 @@
             v-model="searchKey"
             v-model="searchKey"
             @keyup.enter="(paging.current = 1) && getMaterialList()"
             @keyup.enter="(paging.current = 1) && getMaterialList()"
             placeholder="搜索素材"
             placeholder="搜索素材"
-          >
-          <i @click="(paging.current = 1) && getMaterialList()" class="iconfont iconbs_search"></i>
+          />
+          <i
+            @click="(paging.current = 1) && getMaterialList()"
+            class="iconfont iconbs_search"
+          ></i>
         </div>
         </div>
       </div>
       </div>
     </div>
     </div>
     <div class="btn">
     <div class="btn">
-      <button @mouseover.stop="showList=true"  @click="$refs.uploadFile.click();" class="ui-button ui-button-rect submit"><span>上传素材</span><i class="iconfont iconbs_upload"></i>
-        <upload ref="uploadFile"
+      <button
+        @mouseover.stop="showList = true"
+        @click="$refs.uploadFile.click()"
+        class="ui-button ui-button-rect submit"
+      >
+        <span>上传素材</span><i class="iconfont iconbs_upload"></i>
+        <upload
+          ref="uploadFile"
           :failString="'格式错误,请上传20MB以内、mp3格式的音频'"
           :failString="'格式错误,请上传20MB以内、mp3格式的音频'"
           :limitFailStr="'过大,请上传20MB以内、mp3格式的音频'"
           :limitFailStr="'过大,请上传20MB以内、mp3格式的音频'"
-         accept-type="audio/mp3" media-type="audio" :limit="20"  @file-change="onFileChange"></upload>
+          accept-type="audio/mp3"
+          media-type="audio"
+          :limit="20"
+          @file-change="onFileChange"
+        ></upload>
         <template v-if="showList">
         <template v-if="showList">
           <UploadList
           <UploadList
             @close="
             @close="
@@ -35,11 +48,23 @@
       </button>
       </button>
     </div>
     </div>
     <div class="list">
     <div class="list">
-      <tableList v-if="list.length>0" @selection-change="data=>{selectedArr=data}" :header='tabHeader' :showLine='true' :selection='false' :data='list' class="table-list" >
-        <div slot-scope="{data}" slot="header">
-          {{data.name}}
+      <tableList
+        v-if="list.length > 0"
+        @selection-change="
+          (data) => {
+            selectedArr = data;
+          }
+        "
+        :header="tabHeader"
+        :showLine="true"
+        :selection="false"
+        :data="list"
+        class="table-list"
+      >
+        <div slot-scope="{ data }" slot="header">
+          {{ data.name }}
         </div>
         </div>
-        <div slot-scope="{data,item,sub}" slot="item" style="width:100%">
+        <div slot-scope="{ data, item, sub }" slot="item" style="width: 100%">
           <div class="handle" v-if="sub.canclick">
           <div class="handle" v-if="sub.canclick">
             <i
             <i
               class="iconfont iconbs_list_edit hover-tips"
               class="iconfont iconbs_list_edit hover-tips"
@@ -55,126 +80,154 @@
               </div>
               </div>
             </i>
             </i>
           </div>
           </div>
-          <div class="audio" v-else-if="sub.type=='audio'" >
-            <v-audio :vkey="item.id" :idleft="`_${$randomWord(true,8,8)}`" :idright="`_${$randomWord(true,8,8)}`" :myAudioUrl="data"></v-audio>
+          <div class="audio" v-else-if="sub.type == 'audio'">
+            <v-audio
+              :vkey="item.id"
+              :idleft="`_${$randomWord(true, 8, 8)}`"
+              :idright="`_${$randomWord(true, 8, 8)}`"
+              :myAudioUrl="data"
+            ></v-audio>
           </div>
           </div>
-          <span v-else @click="sub.fontweight&&($bus.emit('toggleAudio',item.ossPath))" :style="{fontWeight:sub.fontweight,color:'#202020'}">{{data||'-'}}</span>
+          <span
+            v-else
+            @click="sub.fontweight && $bus.emit('toggleAudio', item.id)"
+            :style="{ fontWeight: sub.fontweight, color: '#202020' }"
+            >{{ data || "-" }}</span
+          >
         </div>
         </div>
       </tableList>
       </tableList>
       <div class="nodata" v-if="list.length == 0">
       <div class="nodata" v-if="list.length == 0">
-        <img :src="$noresult" alt="">
-        <span>{{isClickSearch?'未搜索到结果':'暂无素材,快去上传吧'}}</span>
+        <img :src="$noresult" alt="" />
+        <span>{{
+          isClickSearch ? "未搜索到结果" : "暂无素材,快去上传吧"
+        }}</span>
       </div>
       </div>
     </div>
     </div>
     <div class="paging">
     <div class="paging">
       <Paging
       <Paging
-        v-if="paging.total>0"
+        v-if="paging.total > 0"
         :paging="paging"
         :paging="paging"
         @changeCurrent="changeCurrent"
         @changeCurrent="changeCurrent"
       />
       />
     </div>
     </div>
 
 
-      
-    <rename :item="popupItem" :show='showRename' @rename="handleRename" @close="showRename=false" />
-
+    <rename
+      :item="popupItem"
+      :show="showRename"
+      @rename="handleRename"
+      @close="showRename = false"
+    />
   </div>
   </div>
 </template>
 </template>
 
 
 <script>
 <script>
-import tableList from '@/components/table'
-import crumbs from '@/components/crumbs'
-import {data} from './audio'
-import rename from '../popup/rename'
-import Paging from '../components/paging'
-import vAudio from '@/components/audio'
+import tableList from "@/components/table";
+import crumbs from "@/components/crumbs";
+import { data } from "./audio";
+import rename from "../popup/rename";
+import Paging from "../components/paging";
+import vAudio from "@/components/audio";
 
 
 import Upload from "@/components/shared/uploads/UploadMultiple";
 import Upload from "@/components/shared/uploads/UploadMultiple";
-import { changeByteUnit } from '@/utils/file'
+import { changeByteUnit } from "@/utils/file";
 import UploadList from "../components/uploadList";
 import UploadList from "../components/uploadList";
 
 
-const TYPE = 'audio'
+const TYPE = "audio";
 
 
 import {
 import {
   getMaterialList,
   getMaterialList,
   uploadMaterial,
   uploadMaterial,
   editMaterial,
   editMaterial,
-  delMaterial
+  delMaterial,
 } from "@/api";
 } from "@/api";
 
 
 export default {
 export default {
-  components:{
+  components: {
     tableList,
     tableList,
     crumbs,
     crumbs,
     rename,
     rename,
     Paging,
     Paging,
     Upload,
     Upload,
     vAudio,
     vAudio,
-    UploadList
-
+    UploadList,
   },
   },
-  data(){
+  data() {
     return {
     return {
-      showRename:false,
-      showList:false,
-      popupItem:'',
+      showRename: false,
+      showList: false,
+      popupItem: "",
       tabHeader: data,
       tabHeader: data,
       selectedArr: [],
       selectedArr: [],
-      searchKey:'',
-      tablist:[{
-        name:'音频',
-        id:TYPE
-      }],
-      list:[],
-      uploadList:[],
-      isClickSearch:'',
+      searchKey: "",
+      tablist: [
+        {
+          name: "音频",
+          id: TYPE,
+        },
+      ],
+      list: [],
+      uploadList: [],
+      isClickSearch: "",
       paging: {
       paging: {
-        pageSize: 12,
+        pageSize: 8,
         pageNum: 1,
         pageNum: 1,
         total: 0,
         total: 0,
         showSize: 4,
         showSize: 4,
-        current: 1
-      }
-    }
+        current: 1,
+      },
+    };
   },
   },
   mounted() {
   mounted() {
     this.getMaterialList();
     this.getMaterialList();
   },
   },
-  watch:{
-    'paging.pageNum':function () {
-      this.getMaterialList()
-    }
+  watch: {
+    "paging.pageNum": function () {
+      this.getMaterialList();
+    },
+    "$route.name": function (newVal) {
+      console.log(newVal);
+    },
   },
   },
-  methods:{
-    handleRename(data){
-      editMaterial({
-          id:this.popupItem.id,
-          name:data
-        },()=>{
-          this.$tips({ content: "修改成功",icon:'ok'});
-          this.showRename = false
-          this.popupItem = ''
+  methods: {
+    stopAllAudio() {
+      Array.from($("audio")).forEach((item) => {
+        if (!item.paused) {
+          item.pause();
+        }
+      });
+    },
+    handleRename(data) {
+      editMaterial(
+        {
+          id: this.popupItem.id,
+          name: data,
+        },
+        () => {
+          this.$msg.success("修改成功");
+          this.showRename = false;
+          this.popupItem = "";
           this.getMaterialList();
           this.getMaterialList();
-
-        });
+        }
+      );
     },
     },
-     delUploadItem(index){
-      ~index && this.uploadList.splice(index, 1)
+    delUploadItem(index) {
+      ~index && this.uploadList.splice(index, 1);
     },
     },
-    del(item){
+    del(item) {
       this.$confirm({
       this.$confirm({
-          content: "是否删除?",
-          ok: () => {
-              delMaterial(item.id,()=>{
-                this.$tips({ content: "删除成功",icon:'ok' });
-                this.getMaterialList();
-              });
-          }
+        content: "确定要删除素材吗?",
+        ok: () => {
+          delMaterial(item.id, () => {
+            this.$msg.success("删除成功");
+            this.getMaterialList();
+          });
+        },
       });
       });
     },
     },
     onFileChange(file) {
     onFileChange(file) {
-      let canUploadList = []
-      for (let i = 0; i < file.files.length; i++) {
-        let item = file.files[i];
+      let canUploadList = [];
+
+      file.files.forEach((item, i) => {
         let tmp = {
         let tmp = {
           statusStr: "上传中",
           statusStr: "上传中",
           status: 4,
           status: 4,
@@ -183,57 +236,71 @@ export default {
         };
         };
 
 
         if (item.name.toLowerCase().indexOf("mp3") <= -1) {
         if (item.name.toLowerCase().indexOf("mp3") <= -1) {
-          return this.$alert({
-              content: `“${item.name}”格式错误,请上传20MB以内、mp3格式的音频`
-          });
+          setTimeout(() => {
+            this.$msg({
+              message: `“${item.name}”格式错误,请上传20MB以内、mp3格式的音频`,
+              type: "error",
+            });
+          }, i * 100);
+          return;
         }
         }
-        
-        let tname= item.name.substring(0, item.name.lastIndexOf("."));
-        
+
+        let tname = item.name.substring(0, item.name.lastIndexOf("."));
+
         if (tname.length > 50) {
         if (tname.length > 50) {
-          return this.$alert({
-              content: `“${item.name}”名称过长,请上传标题在50字以内的音频`
+          setTimeout(() => {
+            this.$msg({
+              message: `“${item.name}”名称过长,请上传标题在50字以内的音频`,
+              type: "error",
             });
             });
+          }, i * 100);
+          return;
         }
         }
-        
-        this.uploadList.push(tmp)
+
+        this.uploadList.push(tmp);
         canUploadList.push({
         canUploadList.push({
           file: item,
           file: item,
           list: { ...tmp },
           list: { ...tmp },
         });
         });
-      }
-
+      });
 
 
-      let p = []
-      canUploadList.forEach(i => {
-        let promise = new Promise((resolve)=>{
+      let p = [];
+      canUploadList.forEach((i) => {
+        let promise = new Promise((resolve) => {
           resolve(i);
           resolve(i);
-        })
-        p.push(promise)
-      })
+        });
+        p.push(promise);
+      });
 
 
-    Promise.all(p).then(result=>{
-        let pp = []
-        p.length>0&&result.forEach(data => {
-              let params = {}
-              params['file'] = data.file
-              let promise = new Promise((resolve, reject) => {
-                uploadMaterial(params, {
+      Promise.all(p).then((result) => {
+        let pp = [];
+        p.length > 0 &&
+          result.forEach((data) => {
+            let params = {};
+            params["file"] = data.file;
+            let promise = new Promise((resolve, reject) => {
+              uploadMaterial(
+                params,
+                {
                   type: TYPE,
                   type: TYPE,
                   uid: data.list.uid,
                   uid: data.list.uid,
-                }, response => {
+                },
+                (response) => {
                   resolve(response);
                   resolve(response);
-                },(err)=>{
-                  reject(err)
-                })
-              }) 
-              pp.push(promise)
-        });
-        pp.length>0&& Promise.all(pp).then((response) => {
+                },
+                (err) => {
+                  reject(err);
+                }
+              );
+            });
+            pp.push(promise);
+          });
+        pp.length > 0 &&
+          Promise.all(pp).then((response) => {
             if (response.length > 0) {
             if (response.length > 0) {
-              this.uploadList.forEach(item=>{
-                item.status = 5
-              }) 
+              this.uploadList.forEach((item) => {
+                item.status = 5;
+              });
 
 
               response.forEach((item) => {
               response.forEach((item) => {
                 let idx = this.uploadList.findIndex(
                 let idx = this.uploadList.findIndex(
@@ -241,52 +308,50 @@ export default {
                 );
                 );
                 if (item.code == 0) {
                 if (item.code == 0) {
                   if (idx > -1) {
                   if (idx > -1) {
-                    this.uploadList.splice(idx,1)
+                    this.uploadList.splice(idx, 1);
                   }
                   }
                 }
                 }
               });
               });
               this.getMaterialList();
               this.getMaterialList();
             }
             }
           });
           });
-      })
+      });
     },
     },
-    changeCurrent(data){
-      this.paging.pageNum = data
+    changeCurrent(data) {
+      this.paging.pageNum = data;
     },
     },
     getMaterialList() {
     getMaterialList() {
-      this.isClickSearch = !!this.searchKey
+      this.isClickSearch = !!this.searchKey;
       getMaterialList(
       getMaterialList(
         {
         {
           pageNum: this.paging.pageNum,
           pageNum: this.paging.pageNum,
           pageSize: this.paging.pageSize,
           pageSize: this.paging.pageSize,
           searchKey: this.searchKey,
           searchKey: this.searchKey,
-          type:TYPE
+          type: TYPE,
         },
         },
         (data) => {
         (data) => {
-          this.list = []
+          this.list = [];
           setTimeout(() => {
           setTimeout(() => {
-            this.list = data.data.list.map(i=>{
-              i.fileSize = changeByteUnit(Number(i.fileSize))
-              return i
-            })
-            
+            this.list = data.data.list.map((i) => {
+              i.fileSize = changeByteUnit(Number(i.fileSize));
+              return i;
+            });
+
             this.paging.pageNum = data.data.pageNum;
             this.paging.pageNum = data.data.pageNum;
             this.paging.pageSize = data.data.pageSize;
             this.paging.pageSize = data.data.pageSize;
             this.paging.total = data.data.total;
             this.paging.total = data.data.total;
           });
           });
-
         }
         }
       );
       );
-    }
-  }
-}
+    },
+  },
+};
 </script>
 </script>
 
 
 <style lang="less" scoped>
 <style lang="less" scoped>
-.panorama{
-  
+.panorama {
 }
 }
 </style>
 </style>
 <style lang="less" scoped>
 <style lang="less" scoped>
-@import '../style.less';
+@import "../style.less";
 </style>
 </style>

+ 3 - 0
src/views/material/components/paging.vue

@@ -129,6 +129,9 @@ export default {
   .number span {
   .number span {
     margin: 0 5px;
     margin: 0 5px;
     cursor: pointer;
     cursor: pointer;
+    &:first-of-type{
+      margin-left: 0;
+    }
   }
   }
   div {
   div {
     display: inline-block;
     display: inline-block;

+ 27 - 20
src/views/material/image/index.vue

@@ -144,7 +144,6 @@ import {
 
 
 const TYPE = "image";
 const TYPE = "image";
 
 
-
 export default {
 export default {
   components: {
   components: {
     tableList,
     tableList,
@@ -174,7 +173,7 @@ export default {
       list: [],
       list: [],
       uploadList: [],
       uploadList: [],
       paging: {
       paging: {
-        pageSize: 12,
+        pageSize: 8,
         pageNum: 1,
         pageNum: 1,
         total: 0,
         total: 0,
         showSize: 4,
         showSize: 4,
@@ -188,7 +187,7 @@ export default {
   watch: {
   watch: {
     "paging.pageNum": function () {
     "paging.pageNum": function () {
       this.getMaterialList();
       this.getMaterialList();
-    }
+    },
   },
   },
   methods: {
   methods: {
     viewImg(id) {
     viewImg(id) {
@@ -202,23 +201,23 @@ export default {
           name: data,
           name: data,
         },
         },
         () => {
         () => {
-          this.$tips({ content: "修改成功", icon: "ok" });
+          this.$msg.success("修改成功");
           this.showRename = false;
           this.showRename = false;
           this.popupItem = "";
           this.popupItem = "";
           this.getMaterialList();
           this.getMaterialList();
         }
         }
       );
       );
     },
     },
-    
+
     delUploadItem(index) {
     delUploadItem(index) {
       ~index && this.uploadList.splice(index, 1);
       ~index && this.uploadList.splice(index, 1);
     },
     },
     del(item) {
     del(item) {
       this.$confirm({
       this.$confirm({
-        content: "是否删除?",
+        content: "确定要删除素材吗?",
         ok: () => {
         ok: () => {
           delMaterial(item.id, () => {
           delMaterial(item.id, () => {
-            this.$tips({ content: "删除成功", icon: "ok" });
+            this.$msg.success("删除成功");
             this.getMaterialList();
             this.getMaterialList();
           });
           });
         },
         },
@@ -226,8 +225,8 @@ export default {
     },
     },
     onFileChange(file) {
     onFileChange(file) {
       let canUploadList = [];
       let canUploadList = [];
-      for (let i = 0; i < file.files.length; i++) {
-        let item = file.files[i];
+
+      file.files.forEach((item, i) => {
         let tmp = {
         let tmp = {
           statusStr: "上传中",
           statusStr: "上传中",
           status: 4,
           status: 4,
@@ -235,22 +234,30 @@ export default {
           name: item.name,
           name: item.name,
         };
         };
         if (item.type.indexOf("jpeg") <= -1 && item.type.indexOf("png") <= -1) {
         if (item.type.indexOf("jpeg") <= -1 && item.type.indexOf("png") <= -1) {
-          return this.$alert({
-            content: `“${item.name}”格式错误,请上传10MB以内、jpg/png格式的图片`,
-          });
+          setTimeout(() => {
+            this.$msg({
+              message: `“${item.name}”格式错误,请上传10MB以内、jpg/png格式的图片`,
+              type: "error",
+            });
+          }, i * 100);
+          return;
         }
         }
         let tname = item.name.substring(0, item.name.lastIndexOf("."));
         let tname = item.name.substring(0, item.name.lastIndexOf("."));
         if (tname.length > 50) {
         if (tname.length > 50) {
-          return this.$alert({
-            content: `“${item.name}”名称过长,请上传标题在50字以内的图片`,
-          });
+          setTimeout(() => {
+            this.$msg({
+              message: `“${item.name}”名称过长,请上传标题在50字以内的图片`,
+              type: "error",
+            });
+          }, i * 100);
+          return;
         }
         }
         this.uploadList.push(tmp);
         this.uploadList.push(tmp);
         canUploadList.push({
         canUploadList.push({
           file: item,
           file: item,
           list: { ...tmp },
           list: { ...tmp },
         });
         });
-      }
+      });
 
 
       let p = [];
       let p = [];
       canUploadList.forEach((i) => {
       canUploadList.forEach((i) => {
@@ -286,16 +293,16 @@ export default {
         pp.length > 0 &&
         pp.length > 0 &&
           Promise.all(pp).then((response) => {
           Promise.all(pp).then((response) => {
             if (response.length > 0) {
             if (response.length > 0) {
-              this.uploadList.forEach(item=>{
-                item.status = 5
-              }) 
+              this.uploadList.forEach((item) => {
+                item.status = 5;
+              });
               response.forEach((item) => {
               response.forEach((item) => {
                 let idx = this.uploadList.findIndex(
                 let idx = this.uploadList.findIndex(
                   (sub) => sub.uid == item.data.tempId
                   (sub) => sub.uid == item.data.tempId
                 );
                 );
                 if (item.code == 0) {
                 if (item.code == 0) {
                   if (idx > -1) {
                   if (idx > -1) {
-                    this.uploadList.splice(idx,1)
+                    this.uploadList.splice(idx, 1);
                   }
                   }
                 }
                 }
               });
               });

+ 26 - 16
src/views/material/pano/index.vue

@@ -197,7 +197,7 @@ export default {
       uploadList: [],
       uploadList: [],
       isClickSearch: "",
       isClickSearch: "",
       paging: {
       paging: {
-        pageSize: 12,
+        pageSize: 8,
         pageNum: 1,
         pageNum: 1,
         total: 0,
         total: 0,
         showSize: 4,
         showSize: 4,
@@ -241,7 +241,7 @@ export default {
           name: data,
           name: data,
         },
         },
         () => {
         () => {
-          this.$tips({ content: "修改成功", icon: "ok" });
+          this.$msg.success("修改成功");
           this.showRename = false;
           this.showRename = false;
           this.popupItem = "";
           this.popupItem = "";
           this.getMaterialList();
           this.getMaterialList();
@@ -262,7 +262,7 @@ export default {
               icon: res.data,
               icon: res.data,
             },
             },
             () => {
             () => {
-              this.$tips({ content: "设置成功", icon: "ok" });
+              this.$msg.success("设置成功");
               this.showCover = false;
               this.showCover = false;
               this.popupItem = "";
               this.popupItem = "";
               this.getMaterialList();
               this.getMaterialList();
@@ -306,10 +306,10 @@ export default {
     },
     },
     del(item) {
     del(item) {
       this.$confirm({
       this.$confirm({
-        content: "是否删除?",
+        content: "确定要删除素材吗?",
         ok: () => {
         ok: () => {
           delMaterial(item.id, () => {
           delMaterial(item.id, () => {
-            this.$tips({ content: "删除成功", icon: "ok" });
+            this.$msg.success("删除成功");
             this.getMaterialList();
             this.getMaterialList();
           });
           });
         },
         },
@@ -317,8 +317,7 @@ export default {
     },
     },
     onFileChange(file) {
     onFileChange(file) {
       let canUploadList = [];
       let canUploadList = [];
-      for (let i = 0; i < file.files.length; i++) {
-        let item = file.files[i];
+      file.files.forEach((item,i)=>{
         let tmp = {
         let tmp = {
           statusStr: "上传中",
           statusStr: "上传中",
           status: 4,
           status: 4,
@@ -326,22 +325,32 @@ export default {
           name: item.name,
           name: item.name,
         };
         };
         if (item.type.indexOf("jpeg") <= -1) {
         if (item.type.indexOf("jpeg") <= -1) {
-          return this.$alert({
-            content: `“${item.name}”格式错误,请上传2:1、120MB以内、jpg格式的全景图片`,
-          });
+          setTimeout(() => {
+            this.$msg({
+              message: `“${item.name}”格式错误,请上传2:1、120MB以内、jpg格式的全景图片`,
+              type: 'error'
+            });
+          }, i*100);
+          return
         }
         }
         let tname = item.name.substring(0, item.name.lastIndexOf("."));
         let tname = item.name.substring(0, item.name.lastIndexOf("."));
+
         if (tname.length > 50) {
         if (tname.length > 50) {
-          return this.$alert({
-            content: `“${item.name}”名称过长,请上传标题在50字以内的全景图片`,
-          });
+          setTimeout(() => {
+            this.$msg({
+              message: `“${item.name}”名称过长,请上传标题在50字以内的全景图片`,
+              type: 'error'
+            });
+          }, i*100);
+          return
         }
         }
         this.uploadList.push(tmp);
         this.uploadList.push(tmp);
         canUploadList.push({
         canUploadList.push({
           file: item,
           file: item,
           list: { ...tmp },
           list: { ...tmp },
         });
         });
-      }
+      })
+
 
 
       let p = [];
       let p = [];
       canUploadList.forEach((i) => {
       canUploadList.forEach((i) => {
@@ -359,8 +368,9 @@ export default {
                 (sub) => sub.uid == data.list.uid
                 (sub) => sub.uid == data.list.uid
               );
               );
               ~idx && this.uploadList.splice(idx, 1);
               ~idx && this.uploadList.splice(idx, 1);
-              return this.$alert({
-                content: `“${data.file.name}”格式错误,请上传2:1、120MB以内、jpg格式的全景图片`,
+              return this.$msg({
+                message: `“${data.file.name}”格式错误,请上传2:1、120MB以内、jpg格式的全景图片`,
+                type: 'error'
               });
               });
             }
             }
             let params = {};
             let params = {};

+ 1 - 4
src/views/material/popup/cover.vue

@@ -10,7 +10,7 @@
         <div class="ui-message-main re-name">
         <div class="ui-message-main re-name">
           <div>
           <div>
             <span class="remark">从全景截图作为封面</span>
             <span class="remark">从全景截图作为封面</span>
-            <iframe id="ifrcover" :src="'./vr.html?vr='+item.sceneCode" frameborder="0"></iframe>
+            <iframe id="ifrcover" :src="'./vr.html?hideScale=1&vr='+item.sceneCode" frameborder="0"></iframe>
             <button @click="onClick" class="ui-button ui-button-rect submit" >
             <button @click="onClick" class="ui-button ui-button-rect submit" >
               截图
               截图
             </button>
             </button>
@@ -81,9 +81,6 @@ export default {
   }
   }
   .ui-message-header{
   .ui-message-header{
     border-bottom: 1px solid #EBEBEB;
     border-bottom: 1px solid #EBEBEB;
-    >span{
-     margin-left: 30px;
-    }
   }
   }
   .ui-message-main{
   .ui-message-main{
     display: flex;
     display: flex;

+ 3 - 9
src/views/material/popup/preview.vue

@@ -15,10 +15,7 @@
              </span>
              </span>
           </template>
           </template>
           <template v-else-if="item.type=='pano'">
           <template v-else-if="item.type=='pano'">
-            <iframe ref="pifr" :src="'./vr.html?vr='+item.sceneCode" frameborder="0"></iframe>
-            <span class="scale" @click="onFullScreen">
-               <img :src="require('@/assets/images/icons/tool_full@2x.png')" alt="">
-             </span>
+            <iframe ref="pifr" allowfullscreen='true' :src="'./vr.html?vr='+item.sceneCode" frameborder="0"></iframe>
           </template>
           </template>
           <video v-else controls autoplay :src="item.ossPath"></video>
           <video v-else controls autoplay :src="item.ossPath"></video>
         </div>
         </div>
@@ -50,9 +47,6 @@ export default {
     viewImg(){
     viewImg(){
       const viewer = this.$el.querySelector('.v-image').$viewer
       const viewer = this.$el.querySelector('.v-image').$viewer
       viewer.show()
       viewer.show()
-    },
-    onFullScreen() {
-      this.$refs.pifr.contentWindow.postMessage({event:'onfull'},'*')
     }
     }
   }
   }
 }
 }
@@ -61,8 +55,8 @@ export default {
 <style lang="less" scoped>
 <style lang="less" scoped>
 .ui-message-confirm{
 .ui-message-confirm{
   border-radius: 0;
   border-radius: 0;
-  top: unset;
-  left: unset;
+  top: auto;
+  left: auto;
   transform: none;
   transform: none;
   .icon_close{
   .icon_close{
     color: #909090;
     color: #909090;

+ 1 - 0
src/views/material/popup/share.vue

@@ -110,6 +110,7 @@ export default {
         margin-bottom: 10px;
         margin-bottom: 10px;
         >img{
         >img{
           width: 150px;
           width: 150px;
+          border: 1px solid #ccc;
         }
         }
         .ui-button{
         .ui-button{
           min-width: 104px;
           min-width: 104px;

+ 4 - 1
src/views/material/style.less

@@ -1,6 +1,5 @@
 @color:#1FE4DC;
 @color:#1FE4DC;
 .con {
 .con {
-  padding: 24px 30px;
   .top {
   .top {
     display: flex;
     display: flex;
     justify-content: space-between;
     justify-content: space-between;
@@ -249,3 +248,7 @@
 }
 }
 
 
 }
 }
+
+.panorama{
+  padding: 24px 30px;
+}

+ 186 - 136
src/views/material/video/index.vue

@@ -1,7 +1,7 @@
 <template>
 <template>
   <div class="panorama con">
   <div class="panorama con">
     <div class="top">
     <div class="top">
-      <crumbs :list="tablist"/>
+      <crumbs :list="tablist" />
       <div class="filter">
       <div class="filter">
         <div>
         <div>
           <input
           <input
@@ -9,19 +9,30 @@
             v-model="searchKey"
             v-model="searchKey"
             @keyup.enter="(paging.current = 1) && getMaterialList()"
             @keyup.enter="(paging.current = 1) && getMaterialList()"
             placeholder="搜索素材"
             placeholder="搜索素材"
-          >
-          <i @click="(paging.current = 1) && getMaterialList()" class="iconfont iconbs_search"></i>
+          />
+          <i
+            @click="(paging.current = 1) && getMaterialList()"
+            class="iconfont iconbs_search"
+          ></i>
         </div>
         </div>
       </div>
       </div>
     </div>
     </div>
     <div class="btn">
     <div class="btn">
-                
-
-      <button @mouseover.stop="showList=true"  @click="$refs.uploadFile.click();" class="ui-button ui-button-rect submit"><span>上传素材</span><i class="iconfont iconbs_upload"></i>
-        <upload ref="uploadFile"
-        :failString="'格式错误,请上传200MB以内、mp4格式的视频'"
-        :limitFailStr="'过大,请上传200MB以内、mp4格式的视频'"
-         accept-type="video/mp4" media-type="video" :limit="200"  @file-change="onFileChange"></upload>
+      <button
+        @mouseover.stop="showList = true"
+        @click="$refs.uploadFile.click()"
+        class="ui-button ui-button-rect submit"
+      >
+        <span>上传素材</span><i class="iconfont iconbs_upload"></i>
+        <upload
+          ref="uploadFile"
+          :failString="'格式错误,请上传200MB以内、mp4格式的视频'"
+          :limitFailStr="'过大,请上传200MB以内、mp4格式的视频'"
+          accept-type="video/mp4"
+          media-type="video"
+          :limit="200"
+          @file-change="onFileChange"
+        ></upload>
         <template v-if="showList">
         <template v-if="showList">
           <UploadList
           <UploadList
             @close="
             @close="
@@ -36,11 +47,22 @@
       </button>
       </button>
     </div>
     </div>
     <div class="list">
     <div class="list">
-      <tableList @selection-change="data=>{selectedArr=data}" :header='tabHeader' :showLine='true' :selection='false' :data='list' class="table-list" >
-        <div slot-scope="{data}" slot="header">
-          {{data.name}}
+      <tableList
+        @selection-change="
+          (data) => {
+            selectedArr = data;
+          }
+        "
+        :header="tabHeader"
+        :showLine="true"
+        :selection="false"
+        :data="list"
+        class="table-list"
+      >
+        <div slot-scope="{ data }" slot="header">
+          {{ data.name }}
         </div>
         </div>
-        <div slot-scope="{data,item,sub}" slot="item" style="width:100%">
+        <div slot-scope="{ data, item, sub }" slot="item" style="width: 100%">
           <div class="handle" v-if="sub.canclick">
           <div class="handle" v-if="sub.canclick">
             <i
             <i
               class="iconfont iconbs_list_edit hover-tips"
               class="iconfont iconbs_list_edit hover-tips"
@@ -56,131 +78,149 @@
               </div>
               </div>
             </i>
             </i>
           </div>
           </div>
-          <div class="img" v-else-if="sub.type=='image'" 
+          <div
+            class="img"
+            v-else-if="sub.type == 'image'"
             @click="(showPreview = true), (popupItem = item)"
             @click="(showPreview = true), (popupItem = item)"
           >
           >
-            <img :src="`${data}`||$thumb" alt="">
+            <img :src="`${data}` || $thumb" alt="" />
           </div>
           </div>
-          <span v-else @click="sub.fontweight&&((showPreview = true), (popupItem = item))" :style="{fontWeight:sub.fontweight,color:'#202020'}">{{data||'-'}}</span>
+          <span
+            v-else
+            @click="
+              sub.fontweight && ((showPreview = true), (popupItem = item))
+            "
+            :style="{ fontWeight: sub.fontweight, color: '#202020' }"
+            >{{ data || "-" }}</span
+          >
         </div>
         </div>
       </tableList>
       </tableList>
       <div class="nodata" v-if="list.length == 0">
       <div class="nodata" v-if="list.length == 0">
-        <img :src="$noresult" alt="">
-        <span>{{isClickSearch?'未搜索到结果':'暂无素材,快去上传吧'}}</span>
+        <img :src="$noresult" alt="" />
+        <span>{{
+          isClickSearch ? "未搜索到结果" : "暂无素材,快去上传吧"
+        }}</span>
       </div>
       </div>
     </div>
     </div>
     <div class="paging">
     <div class="paging">
       <Paging
       <Paging
-        v-if="paging.total>0"
+        v-if="paging.total > 0"
         :paging="paging"
         :paging="paging"
         @changeCurrent="changeCurrent"
         @changeCurrent="changeCurrent"
       />
       />
     </div>
     </div>
 
 
-    <rename :item="popupItem" :show='showRename' @rename="handleRename" @close="showRename=false" />
+    <rename
+      :item="popupItem"
+      :show="showRename"
+      @rename="handleRename"
+      @close="showRename = false"
+    />
     <preview
     <preview
-          :item="popupItem"
-          :show="showPreview"
-          @close="showPreview = false"
-        />
+      :item="popupItem"
+      :show="showPreview"
+      @close="showPreview = false"
+    />
   </div>
   </div>
 </template>
 </template>
 
 
 <script>
 <script>
-import tableList from '@/components/table'
-import crumbs from '@/components/crumbs'
-import {data} from './video'
-import rename from '../popup/rename'
-import Paging from '../components/paging'
+import tableList from "@/components/table";
+import crumbs from "@/components/crumbs";
+import { data } from "./video";
+import rename from "../popup/rename";
+import Paging from "../components/paging";
 import Upload from "@/components/shared/uploads/UploadMultiple";
 import Upload from "@/components/shared/uploads/UploadMultiple";
-import { changeByteUnit } from '@/utils/file'
+import { changeByteUnit } from "@/utils/file";
 import preview from "../popup/preview";
 import preview from "../popup/preview";
 import UploadList from "../components/uploadList";
 import UploadList from "../components/uploadList";
 
 
-
 import {
 import {
   getMaterialList,
   getMaterialList,
   uploadMaterial,
   uploadMaterial,
   editMaterial,
   editMaterial,
-  delMaterial
+  delMaterial,
 } from "@/api";
 } from "@/api";
 
 
-
-const TYPE = 'video'
+const TYPE = "video";
 
 
 export default {
 export default {
-  components:{
+  components: {
     tableList,
     tableList,
     preview,
     preview,
     crumbs,
     crumbs,
     rename,
     rename,
     Paging,
     Paging,
     UploadList,
     UploadList,
-    Upload
+    Upload,
   },
   },
-  data(){
+  data() {
     return {
     return {
-      showRename:false,
-      showList:false,      
+      showRename: false,
+      showList: false,
       showPreview: false,
       showPreview: false,
       popupItem: "",
       popupItem: "",
-      isClickSearch:'',
+      isClickSearch: "",
       tabHeader: data,
       tabHeader: data,
       selectedArr: [],
       selectedArr: [],
-      searchKey:'',
-      tablist:[{
-        name:'视频',
-        id:TYPE
-      }],
-      list:[],
-      uploadList:[],
+      searchKey: "",
+      tablist: [
+        {
+          name: "视频",
+          id: TYPE,
+        },
+      ],
+      list: [],
+      uploadList: [],
       paging: {
       paging: {
-        pageSize: 12,
+        pageSize: 8,
         pageNum: 1,
         pageNum: 1,
         total: 0,
         total: 0,
         showSize: 4,
         showSize: 4,
-        current: 1
-      }
-    }
+        current: 1,
+      },
+    };
   },
   },
   mounted() {
   mounted() {
     this.getMaterialList();
     this.getMaterialList();
   },
   },
-  watch:{
-    'paging.pageNum':function () {
-      this.getMaterialList()
-    }
+  watch: {
+    "paging.pageNum": function () {
+      this.getMaterialList();
+    },
   },
   },
-  methods:{
-    handleRename(data){
-      editMaterial({
-          id:this.popupItem.id,
-          name:data
-        },()=>{
-          this.$tips({ content: "修改成功",icon:'ok'});
-          this.showRename = false
-          this.popupItem = ''
-          this.getMaterialList()
-        });
+  methods: {
+    handleRename(data) {
+      editMaterial(
+        {
+          id: this.popupItem.id,
+          name: data,
+        },
+        () => {
+          this.$msg.success("修改成功");
+          this.showRename = false;
+          this.popupItem = "";
+          this.getMaterialList();
+        }
+      );
     },
     },
-    delUploadItem(index){
-      ~index && this.uploadList.splice(index, 1)
+    delUploadItem(index) {
+      ~index && this.uploadList.splice(index, 1);
     },
     },
-    del(item){
+    del(item) {
       this.$confirm({
       this.$confirm({
-          content: "是否删除?",
-          ok: () => {
-              delMaterial(item.id,()=>{
-                this.$tips({ content: "删除成功",icon:'ok' });
-                this.getMaterialList()
-              });
-          }
+        content: "确定要删除素材吗?",
+        ok: () => {
+          delMaterial(item.id, () => {
+            this.$msg.success("删除成功");
+            this.getMaterialList();
+          });
+        },
       });
       });
     },
     },
     onFileChange(file) {
     onFileChange(file) {
-      let canUploadList = []
-      for (let i = 0; i < file.files.length; i++) {
-        let item = file.files[i];
+      let canUploadList = [];
+      file.files.forEach((item, i) => {
         let tmp = {
         let tmp = {
           statusStr: "上传中",
           statusStr: "上传中",
           status: 4,
           status: 4,
@@ -188,106 +228,116 @@ export default {
           name: item.name,
           name: item.name,
         };
         };
         if (item.type.indexOf("mp4") <= -1) {
         if (item.type.indexOf("mp4") <= -1) {
-          return this.$alert({
-              content: `“${item.name}”格式错误,请上传200MB以内、mp4格式的视频`
-          });
+          setTimeout(() => {
+            this.$msg({
+              message: `“${item.name}”格式错误,请上传200MB以内、mp4格式的视频`,
+              type: "error",
+            });
+          }, 100);
+          return;
         }
         }
-        let tname= item.name.substring(0, item.name.lastIndexOf("."));
-         if (tname.length > 50) {
-          return this.$alert({
-              content: `“${item.name}”名称过长,请上传标题在50字以内的视频`
+        let tname = item.name.substring(0, item.name.lastIndexOf("."));
+        if (tname.length > 50) {
+          setTimeout(() => {
+            this.$msg({
+              message: `“${item.name}”名称过长,请上传标题在50字以内的视频`,
+              type: "error",
             });
             });
+          }, 100);
+          return;
         }
         }
-        this.uploadList.push(tmp)
+        this.uploadList.push(tmp);
         canUploadList.push({
         canUploadList.push({
           file: item,
           file: item,
           list: { ...tmp },
           list: { ...tmp },
         });
         });
-      }
-
+      });
 
 
-      let p = []
-      canUploadList.forEach(i => {
-        let promise = new Promise((resolve)=>{
-            resolve(i)
-        })
-        p.push(promise)
-      })
+      let p = [];
+      canUploadList.forEach((i) => {
+        let promise = new Promise((resolve) => {
+          resolve(i);
+        });
+        p.push(promise);
+      });
 
 
-    Promise.all(p).then(result=>{
-        let pp = []
-        p.length>0&&result.forEach(data => {
-              let params = {}
-              params['file'] = data.file
-              let promise = new Promise((resolve, reject) => {
-                uploadMaterial(params, {
+      Promise.all(p).then((result) => {
+        let pp = [];
+        p.length > 0 &&
+          result.forEach((data) => {
+            let params = {};
+            params["file"] = data.file;
+            let promise = new Promise((resolve, reject) => {
+              uploadMaterial(
+                params,
+                {
                   type: TYPE,
                   type: TYPE,
                   uid: data.list.uid,
                   uid: data.list.uid,
-                }, response => {
+                },
+                (response) => {
                   resolve(response);
                   resolve(response);
-                },(err)=>{
-                  reject(err)
-                })
-              }) 
-              pp.push(promise)
-        });
-        pp.length>0&& Promise.all(pp).then((response) => {
+                },
+                (err) => {
+                  reject(err);
+                }
+              );
+            });
+            pp.push(promise);
+          });
+        pp.length > 0 &&
+          Promise.all(pp).then((response) => {
             if (response.length > 0) {
             if (response.length > 0) {
-              this.uploadList.forEach(item=>{
-                item.status = 5
-              }) 
+              this.uploadList.forEach((item) => {
+                item.status = 5;
+              });
               response.forEach((item, i) => {
               response.forEach((item, i) => {
                 let idx = this.uploadList.findIndex(
                 let idx = this.uploadList.findIndex(
                   (sub) => sub.uid == item.data.tempId
                   (sub) => sub.uid == item.data.tempId
                 );
                 );
                 if (item.code == 0) {
                 if (item.code == 0) {
                   if (idx > -1) {
                   if (idx > -1) {
-                    this.uploadList.splice(idx,1)
+                    this.uploadList.splice(idx, 1);
                   }
                   }
                 }
                 }
               });
               });
               this.getMaterialList();
               this.getMaterialList();
             }
             }
           });
           });
-      })
+      });
     },
     },
-    changeCurrent(data){
-      this.paging.pageNum = data
+    changeCurrent(data) {
+      this.paging.pageNum = data;
     },
     },
     getMaterialList() {
     getMaterialList() {
-      this.isClickSearch = !!this.searchKey
+      this.isClickSearch = !!this.searchKey;
       getMaterialList(
       getMaterialList(
         {
         {
           pageNum: this.paging.pageNum,
           pageNum: this.paging.pageNum,
           pageSize: this.paging.pageSize,
           pageSize: this.paging.pageSize,
           searchKey: this.searchKey,
           searchKey: this.searchKey,
-          type:TYPE
+          type: TYPE,
         },
         },
         (data) => {
         (data) => {
-          
-          this.list = data.data.list.map(i=>{
-            i.icon = i.ossPath+this.$videoImg
-            i.fileSize = changeByteUnit(Number(i.fileSize))
-            return i
-          })
-          
+          this.list = data.data.list.map((i) => {
+            i.icon = i.ossPath + this.$videoImg;
+            i.fileSize = changeByteUnit(Number(i.fileSize));
+            return i;
+          });
+
           this.paging.pageNum = data.data.pageNum;
           this.paging.pageNum = data.data.pageNum;
           this.paging.pageSize = data.data.pageSize;
           this.paging.pageSize = data.data.pageSize;
           this.paging.total = data.data.total;
           this.paging.total = data.data.total;
-
-          
         }
         }
       );
       );
-    }
-  }
-}
+    },
+  },
+};
 </script>
 </script>
 
 
 <style lang="less" scoped>
 <style lang="less" scoped>
-.panorama{
-  
+.panorama {
 }
 }
 </style>
 </style>
 <style lang="less" scoped>
 <style lang="less" scoped>
-@import '../style.less';
+@import "../style.less";
 </style>
 </style>

+ 15 - 7
src/views/material/works/index.vue

@@ -29,7 +29,7 @@
           <img class="real" :src="item.icon||$thumb" alt="" />
           <img class="real" :src="item.icon||$thumb" alt="" />
         </div>
         </div>
         <div class="li-info">
         <div class="li-info">
-          <span class="shenglve"  @click="handlePreview(item)">{{item.name||'无标题'}}</span>
+          <span class="shenglve" :title="item.name" @click="handlePreview(item)">{{item.name||'无标题'}}</span>
           <div>
           <div>
             <span>{{item.createTime}}</span>
             <span>{{item.createTime}}</span>
             <div>
             <div>
@@ -42,7 +42,9 @@
     </ul>
     </ul>
     <div class="nodata" v-if="list.length == 0">
     <div class="nodata" v-if="list.length == 0">
         <img :src="$noresult" alt="">
         <img :src="$noresult" alt="">
-        <span>暂无作品</span>
+        <span>
+          {{isClickSearch ? "未搜索到结果" : "暂无作品"}}
+        </span>
       </div>
       </div>
     <div class="paging">
     <div class="paging">
       <Paging
       <Paging
@@ -56,7 +58,7 @@
       v-if="showItem"
       v-if="showItem"
       :name="showItem.name"
       :name="showItem.name"
       :show="showPreview"
       :show="showPreview"
-      :ifr="`./show.html?id=${showItem.id}&vr=${showItem.firstScene?showItem.firstScene.sceneCode:(showItem.scenes[0]?showItem.scenes[0].sceneCode:'')}`"
+      :ifr="`./show.html?id=${showItem.id}`"
       @close="showPreview = false"
       @close="showPreview = false"
     />
     />
   </div>
   </div>
@@ -88,8 +90,9 @@ export default {
       showPreview:false,
       showPreview:false,
       showItem:'',
       showItem:'',
       shareItem:'',
       shareItem:'',
+      isClickSearch: "",
       paging: {
       paging: {
-        pageSize: 12,
+        pageSize: 8,
         pageNum: 1,
         pageNum: 1,
         total: 0,
         total: 0,
         showSize: 4,
         showSize: 4,
@@ -156,6 +159,7 @@ export default {
       });
       });
     },
     },
     getWorksList() {
     getWorksList() {
+      this.isClickSearch = !!this.searchKey;
       getWorksList(
       getWorksList(
         {
         {
           pageNum: this.paging.pageNum,
           pageNum: this.paging.pageNum,
@@ -209,9 +213,13 @@ export default {
       box-shadow: 0px 1px 6px rgba(0, 0, 0, 0.16);
       box-shadow: 0px 1px 6px rgba(0, 0, 0, 0.16);
       background: #fff;
       background: #fff;
       position: relative;
       position: relative;
-      &:not(&:nth-of-type(4n)){
-        margin-right: @gap;
+      margin-right: @gap;
+
+      &:nth-of-type(4n){
+        margin-right: 0;
       }
       }
+
+     
       &:hover{
       &:hover{
         .img{
         .img{
           .real{
           .real{
@@ -252,7 +260,7 @@ export default {
       }
       }
       .img{
       .img{
         width: 100%;
         width: 100%;
-        height: 285px;
+        height: 300px;
         position: relative;
         position: relative;
         overflow: hidden;
         overflow: hidden;
         cursor: pointer;
         cursor: pointer;