tremble hace 4 años
commit
0fa4e577e6
Se han modificado 100 ficheros con 59167 adiciones y 0 borrados
  1. 3 0
      .browserslistrc
  2. 5 0
      .env
  3. 5 0
      .env.uat
  4. 17 0
      .eslintrc.js
  5. 23 0
      .gitignore
  6. 24 0
      README.md
  7. 5 0
      babel.config.js
  8. 12002 0
      package-lock.json
  9. 32 0
      package.json
  10. 33 0
      public/edit.html
  11. BIN
      public/favicon.ico
  12. 34 0
      public/show.html
  13. 175 0
      public/static/css/alivideo.css
  14. 4663 0
      public/static/css/redefine.css
  15. 1523 0
      public/static/css/response.css
  16. 1311 0
      public/static/css/zui-theme.css
  17. 17 0
      public/static/css/zui.min.css
  18. BIN
      public/static/fonts/captcha.ttf
  19. BIN
      public/static/fonts/zenicon.woff
  20. BIN
      public/static/images/kr/close.png
  21. BIN
      public/static/images/kr/left-white.png
  22. BIN
      public/static/images/kr/radar-active.png
  23. BIN
      public/static/images/kr/radar-out.png
  24. BIN
      public/static/images/kr/right-white.png
  25. BIN
      public/static/images/kr/tourpoint.png
  26. BIN
      public/static/images/kr/vr-btn-scene.png
  27. BIN
      public/static/images/loading.gif
  28. BIN
      public/static/images/skin1/bgmusic-close.png
  29. BIN
      public/static/images/skin1/bgmusic-open.png
  30. BIN
      public/static/images/skin1/commentclose.png
  31. BIN
      public/static/images/skin1/footmark.png
  32. BIN
      public/static/images/skin1/full-screen.png
  33. BIN
      public/static/images/skin1/full-stop.png
  34. BIN
      public/static/images/skin1/gyro-close.png
  35. BIN
      public/static/images/skin1/gyro-open.png
  36. BIN
      public/static/images/skin1/iconfont-link.png
  37. BIN
      public/static/images/skin1/more.png
  38. BIN
      public/static/images/skin1/music-close.png
  39. BIN
      public/static/images/skin1/music-open.png
  40. BIN
      public/static/images/skin1/radar.png
  41. BIN
      public/static/images/skin1/radar_open.png
  42. BIN
      public/static/images/skin1/vr-btn-comment.png
  43. BIN
      public/static/images/skin1/vr-btn-desc.png
  44. BIN
      public/static/images/skin1/vr-btn-good-click.png
  45. BIN
      public/static/images/skin1/vr-btn-good.png
  46. BIN
      public/static/images/skin1/vr-btn-scene.png
  47. BIN
      public/static/images/skin1/vr-btn-share.png
  48. BIN
      public/static/images/skin1/vrmode.png
  49. BIN
      public/static/img/g.png
  50. 4336 0
      public/static/js/alivideo.js
  51. 5 0
      public/static/js/jquery-1.9.1.js
  52. 22 0
      public/static/js/object.js
  53. 271 0
      public/static/js/uhweb.js
  54. 518 0
      public/static/js/vrshow.js
  55. 6448 0
      public/static/js/zui.js
  56. 755 0
      public/static/lib/Tween.js
  57. 11 0
      public/static/lib/animate/animate.min.css
  58. 1 0
      public/static/lib/base64.min.js
  59. 90 0
      public/static/lib/bytebuffer.min.js
  60. 7 0
      public/static/lib/clipboard.min.js
  61. 7 0
      public/static/lib/events.js
  62. 90 0
      public/static/lib/flexible.js
  63. 109 0
      public/static/lib/flexible.min.js
  64. 4 0
      public/static/lib/howler.min.js
  65. 539 0
      public/static/lib/iconfont/demo.css
  66. 5161 0
      public/static/lib/iconfont/demo_index.html
  67. 885 0
      public/static/lib/iconfont/iconfont.css
  68. BIN
      public/static/lib/iconfont/iconfont.eot
  69. 1 0
      public/static/lib/iconfont/iconfont.js
  70. 1528 0
      public/static/lib/iconfont/iconfont.json
  71. 677 0
      public/static/lib/iconfont/iconfont.svg
  72. BIN
      public/static/lib/iconfont/iconfont.ttf
  73. BIN
      public/static/lib/iconfont/iconfont.woff
  74. BIN
      public/static/lib/iconfont/iconfont.woff2
  75. 539 0
      public/static/lib/iconfontQJ/demo.css
  76. 676 0
      public/static/lib/iconfontQJ/demo_index.html
  77. 105 0
      public/static/lib/iconfontQJ/iconfont.css
  78. BIN
      public/static/lib/iconfontQJ/iconfont.eot
  79. 1 0
      public/static/lib/iconfontQJ/iconfont.js
  80. 163 0
      public/static/lib/iconfontQJ/iconfont.json
  81. 92 0
      public/static/lib/iconfontQJ/iconfont.svg
  82. BIN
      public/static/lib/iconfontQJ/iconfont.ttf
  83. BIN
      public/static/lib/iconfontQJ/iconfont.woff
  84. BIN
      public/static/lib/iconfontQJ/iconfont.woff2
  85. 4 0
      public/static/lib/jquery-2.1.1.min.js
  86. 9 0
      public/static/lib/jquery.ajax.arraybuffer.min.js
  87. 1 0
      public/static/lib/jquery.easing.min.js
  88. 14 0
      public/static/lib/krpano/js/tour.js
  89. 5 0
      public/static/lib/mCustomScrollbar/jquery.mCustomScrollbar.concat.min.js
  90. 1 0
      public/static/lib/mCustomScrollbar/jquery.mCustomScrollbar.min.css
  91. 22 0
      public/static/lib/mobile-detect.js
  92. 3 0
      public/static/lib/mobile-detect.min.bak.js
  93. 11869 0
      public/static/lib/panovideo/flv.js
  94. 7 0
      public/static/lib/panovideo/flv.min.js
  95. 3247 0
      public/static/lib/panovideo/jsmpeg.min.js
  96. 108 0
      public/static/lib/protobuf.min.js
  97. 8 0
      public/static/lib/quill/quill.min.js
  98. 950 0
      public/static/lib/quill/quill.snow.css
  99. 6 0
      public/static/lib/recorder.mp3.min.js
  100. 0 0
      public/static/lib/scrollbar/jroll.2.6.5.min.js

+ 3 - 0
.browserslistrc

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

+ 5 - 0
.env

@@ -0,0 +1,5 @@
+VUE_APP_MAIN_COLOR=''
+VUE_APP_STATIC_DIR=static
+VUE_APP_INNERNET=https://fcb.intranet.4dkankan.com
+VUE_APP_CDN=https://oss-xiaoan.oss-cn-shenzhen.aliyuncs.com
+VUE_APP_PROXY_URL=''

+ 5 - 0
.env.uat

@@ -0,0 +1,5 @@
+VUE_APP_MAIN_COLOR=''
+VUE_APP_STATIC_DIR=static
+VUE_APP_INNERNET=https://vr-mc01-uat.fcb.com.cn
+VUE_APP_CDN=https://vr-web02-uat.fcb.com.cn
+VUE_APP_PROXY_URL=''

+ 17 - 0
.eslintrc.js

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

+ 23 - 0
.gitignore

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

+ 24 - 0
README.md

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

+ 5 - 0
babel.config.js

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

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 12002 - 0
package-lock.json


+ 32 - 0
package.json

@@ -0,0 +1,32 @@
+{
+  "name": "code2.6",
+  "version": "0.1.0",
+  "private": true,
+  "scripts": {
+    "serve": "vue-cli-service serve",
+    "build": "vue-cli-service build",
+    "build-uat": "vue-cli-service build --mode uat",
+    "lint": "vue-cli-service lint"
+  },
+  "dependencies": {
+    "core-js": "^3.8.2",
+    "vue": "^2.6.12",
+    "vue-cropperjs": "^4.2.0",
+    "vue-i18n": "^8.22.3",
+    "vue-router": "^3.4.9",
+    "vuedraggable": "^2.24.3",
+    "vuex": "^3.6.0"
+  },
+  "devDependencies": {
+    "@vue/cli-plugin-babel": "^4.5.9",
+    "@vue/cli-plugin-eslint": "^4.5.9",
+    "@vue/cli-plugin-router": "^4.5.9",
+    "@vue/cli-service": "^4.5.9",
+    "babel-eslint": "^10.1.0",
+    "eslint": "^6.8.0",
+    "eslint-plugin-vue": "^6.2.2",
+    "less": "^3.13.1",
+    "less-loader": "^5.0.0",
+    "vue-template-compiler": "^2.6.12"
+  }
+}

+ 33 - 0
public/edit.html

@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html lang="zh">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width,initial-scale=1.0">
+    <link rel="icon" href="./favicon.ico" />
+    <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/animate/animate.min.css"/>
+    <link rel="stylesheet" href="<%= VUE_APP_STATIC_DIR %>/lib/quill/quill.snow.css"/>
+    <link rel="stylesheet" href="<%= VUE_APP_STATIC_DIR %>/lib/mCustomScrollbar/jquery.mCustomScrollbar.min.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="stylesheet" href="<%= VUE_APP_STATIC_DIR %>/lib/webuploader/webuploader.css"/>
+    <link rel="stylesheet" href="<%= VUE_APP_STATIC_DIR %>/lib/swiper/swiper.min.css"/>
+    <title>VR楼盘项目编辑器</title>
+  </head>
+  <body>
+    <div id="app"></div>
+    <!-- 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/krpano/js/tour.js"></script>
+    <script src="<%= VUE_APP_STATIC_DIR %>/lib/mCustomScrollbar/jquery.mCustomScrollbar.concat.min.js"></script>
+    <script src="<%= VUE_APP_STATIC_DIR %>/lib/scrollbar/perfect-scrollbar.min.js"></script>
+    <script>
+      function postMsg(data) {
+        window.parent.postMessage(data,'*')
+      }
+    </script>
+  </body>
+</html>

BIN
public/favicon.ico


+ 34 - 0
public/show.html

@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html lang="zh">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width,initial-scale=1.0">
+    <link rel="icon" href="./favicon.ico" />
+    <link rel="stylesheet" href="<%= VUE_APP_STATIC_DIR %>/lib/iconfont/iconfont.css"/>
+    <link rel="stylesheet" href="<%= VUE_APP_STATIC_DIR %>/lib/animate/animate.min.css"/>
+    <link rel="stylesheet" href="<%= VUE_APP_STATIC_DIR %>/lib/quill/quill.snow.css"/>
+    <link rel="stylesheet" href="<%= VUE_APP_STATIC_DIR %>/lib/mCustomScrollbar/jquery.mCustomScrollbar.min.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="stylesheet" href="<%= VUE_APP_STATIC_DIR %>/lib/webuploader/webuploader.css"/>
+    <link rel="stylesheet" href="<%= VUE_APP_STATIC_DIR %>/lib/swiper/swiper.min.css"/>
+    <title>VR楼盘</title>
+  </head>
+  <body>
+    <div id="app"></div>
+    <!-- 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/krpano/js/tour.js"></script>
+    <script src="<%= VUE_APP_STATIC_DIR %>/lib/mCustomScrollbar/jquery.mCustomScrollbar.concat.min.js"></script>
+    <script src="<%= VUE_APP_STATIC_DIR %>/lib/scrollbar/perfect-scrollbar.min.js"></script>
+    <script>
+      function postMsg(data) {
+        window.parent.postMessage(data,'*')
+      }
+    </script>
+  </body>
+</html>

+ 175 - 0
public/static/css/alivideo.css

@@ -0,0 +1,175 @@
+/**
+ * @fileoverview 默认皮肤的样式
+ * @author 首作<aloysious.ld@taobao.com>
+ * @date 2015-01-12
+ *
+ * 约定:
+ * 1. 这个文件只定义所有ui组件的尺寸、在prite图中的位置(background、width、height);
+ * 2. 与layout相关的属性(position、margin等)不在此定义,而交由js的layout模块完成;
+ * 3. 对于复杂的ui组件,其内层的所有样式都可以在这个文件定制(如进度条、音量控制条);
+ * 4. 在首次迭代中,这个文件开发者会手动编辑,以后与sprite图相关的属性应由代码自动化生成。
+ */
+.prism-player .prism-big-play-btn {
+  width: 90px;
+  height: 90px;
+  background: url("//gw.alicdn.com/tps/TB1YuE3KFXXXXaAXFXXXXXXXXXX-256-512.png") no-repeat -2px -2px;
+}
+.prism-player .prism-play-btn {
+  width: 27px;
+  height: 30px;
+  background: url("//gw.alicdn.com/tps/TB1YuE3KFXXXXaAXFXXXXXXXXXX-256-512.png") no-repeat -2px -250px;
+}
+.prism-player .prism-live-display {
+  width: 56px;
+  height: 19px;
+  background: url("//gw.alicdn.com/tps/TB1YuE3KFXXXXaAXFXXXXXXXXXX-256-512.png") no-repeat -186px -2px;
+}
+.prism-player .prism-play-btn.playing {
+  width: 27px;
+  height: 30px;
+  background: url("//gw.alicdn.com/tps/TB1YuE3KFXXXXaAXFXXXXXXXXXX-256-512.png") no-repeat -208px -269px;
+}
+.prism-player .prism-fullscreen-btn {
+  width: 30px;
+  height: 30px;
+  background: url("//gw.alicdn.com/tps/TB1YuE3KFXXXXaAXFXXXXXXXXXX-256-512.png") no-repeat -124px -190px;
+}
+.prism-player .prism-fullscreen-btn.fullscreen {
+  width: 30px;
+  height: 30px;
+  background: url("//gw.alicdn.com/tps/TB1YuE3KFXXXXaAXFXXXXXXXXXX-256-512.png") no-repeat -161px -183px;
+}
+.prism-player .prism-volume {
+  width: 33px;
+  height: 30px;
+  background: url("//gw.alicdn.com/tps/TB1YuE3KFXXXXaAXFXXXXXXXXXX-256-512.png") no-repeat -199px -119px;
+}
+.prism-player .prism-volume.mute {
+  width: 33px;
+  height: 30px;
+  background: url("//gw.alicdn.com/tps/TB1YuE3KFXXXXaAXFXXXXXXXXXX-256-512.png") no-repeat -164px -151px;
+}
+.prism-player {
+  background-color: #000;
+  position: relative;
+  /* bigPlayButton */
+  /* controlBar */
+  /* playButton */
+  /* liveDisplay */
+  /* timeDisplay */
+  /* fullscreenButton */
+  /* volume */
+  /* progress */
+}
+.prism-player .prism-cover {
+  width: 100%;
+  height: 100%;
+  background-color: #000;
+  background-repeat: no-repeat;
+  background-position: center;
+  background-size: contain;
+  position: absolute;
+  top: 0;
+  left: 0;
+}
+.prism-player .prism-controlbar {
+  width: 100%;
+  height: 61px;
+  position: relative;
+  z-index: 1;
+}
+.prism-player .prism-controlbar .prism-controlbar-bg {
+  background-color: #262626;
+  width: 100%;
+  height: 50px;
+  position: absolute;
+  bottom: 0;
+  left: 0;
+  z-index: -1;
+}
+.prism-player .prism-time-display {
+  height: 33px;
+  line-height: 33px;
+  color: #666666;
+}
+.prism-player .prism-time-display .current-time {
+  color: #fff;
+}
+.prism-player .prism-progress {
+  width: 100%;
+  height: 6px;
+  margin-top: 5px;
+  background-color: #363636;
+  position: relative;
+}
+.prism-player .prism-progress .prism-progress-loaded {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 0;
+  height: 100%;
+  background-color: #7e2c1f;
+}
+.prism-player .prism-progress .prism-progress-played {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 0;
+  height: 100%;
+  background-color: #ee2a10;
+}
+.prism-player .prism-progress .prism-progress-cursor {
+  position: absolute;
+  width: 8px;
+  height: 8px;
+  top: -5px;
+  left: 0;
+  margin-left: -8px;
+  background-color: #5b5b5b;
+  border: 4px solid #fff;
+  border-radius: 8px;
+  -webkit-box-shadow: 0 0 5px #000;
+  box-shadow: 0 0 5px #000;
+  overflow: hidden;
+  -webkit-box-sizing: content-box;
+  -moz-box-sizing: content-box;
+  box-sizing: content-box;
+}
+:-webkit-full-screen {
+  width: 100%!important;
+  height: 100%!important;
+}
+:-moz-full-screen {
+  width: 100%!important;
+  height: 100%!important;
+}
+:-ms-full-screen {
+  width: 100%!important;
+  height: 100%!important;
+}
+:-ms-fullscreen {
+  width: 100%!important;
+  height: 100%!important;
+}
+:fullscreen {
+  width: 100%!important;
+  height: 100%!important;
+}
+body.prism-full-window {
+  padding: 0;
+  margin: 0;
+  height: 100%;
+  overflow-y: auto;
+}
+.prism-fullscreen {
+  position: fixed;
+  overflow: hidden;
+  z-index: 99999;
+  left: 0;
+  top: 0;
+  bottom: 0;
+  right: 0;
+  width: 100% !important;
+  height: 100% !important;
+  _position: absolute;
+}

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 4663 - 0
public/static/css/redefine.css


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 1523 - 0
public/static/css/response.css


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 1311 - 0
public/static/css/zui-theme.css


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 17 - 0
public/static/css/zui.min.css


BIN
public/static/fonts/captcha.ttf


BIN
public/static/fonts/zenicon.woff


BIN
public/static/images/kr/close.png


BIN
public/static/images/kr/left-white.png


BIN
public/static/images/kr/radar-active.png


BIN
public/static/images/kr/radar-out.png


BIN
public/static/images/kr/right-white.png


BIN
public/static/images/kr/tourpoint.png


BIN
public/static/images/kr/vr-btn-scene.png


BIN
public/static/images/loading.gif


BIN
public/static/images/skin1/bgmusic-close.png


BIN
public/static/images/skin1/bgmusic-open.png


BIN
public/static/images/skin1/commentclose.png


BIN
public/static/images/skin1/footmark.png


BIN
public/static/images/skin1/full-screen.png


BIN
public/static/images/skin1/full-stop.png


BIN
public/static/images/skin1/gyro-close.png


BIN
public/static/images/skin1/gyro-open.png


BIN
public/static/images/skin1/iconfont-link.png


BIN
public/static/images/skin1/more.png


BIN
public/static/images/skin1/music-close.png


BIN
public/static/images/skin1/music-open.png


BIN
public/static/images/skin1/radar.png


BIN
public/static/images/skin1/radar_open.png


BIN
public/static/images/skin1/vr-btn-comment.png


BIN
public/static/images/skin1/vr-btn-desc.png


BIN
public/static/images/skin1/vr-btn-good-click.png


BIN
public/static/images/skin1/vr-btn-good.png


BIN
public/static/images/skin1/vr-btn-scene.png


BIN
public/static/images/skin1/vr-btn-share.png


BIN
public/static/images/skin1/vrmode.png


BIN
public/static/img/g.png


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 4336 - 0
public/static/js/alivideo.js


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 5 - 0
public/static/js/jquery-1.9.1.js


+ 22 - 0
public/static/js/object.js

@@ -0,0 +1,22 @@
+//flag 标识是否从预览页打开 true
+function obj_buildframes(oid,sceneName){
+	var krpano = document.getElementById('krpanoSWFObject');
+	var objs = getObj(oid,sceneName);
+	for(var i=0 ; i<objs.length; i++){
+		var fname = 'frame'+i;
+		krpano.call('addplugin('+fname+');'+
+				 'plugin['+fname+'].loadstyle(frame);'+
+				 'set(plugin['+fname+'].url,'+objs[i].imgsrc+');');
+	}
+	toggleBtns(false);
+	krpano.call("set(currentframe,0);set(framecount,"+objs.length+");set(oldmousex,0);showframe(0);");
+}
+function getObj(oid,sceneName){
+	var objs = data.hotspot[sceneName]['obj'];
+	for(var i= 0 ; i< objs.length;i++){
+		var o = objs[i];
+		if (o.objid == oid) {
+			return o.objs;
+		}
+	}
+}

+ 271 - 0
public/static/js/uhweb.js

@@ -0,0 +1,271 @@
+/**
+ *UHWEB JS
+ */
+(function (w, d, undefined) {
+    /*
+     *生成全局遮罩层
+     */
+    //document.writeln('<div id="div_Mask" style="width:100%;position:absolute; z-index:99999; top:0; left:0; background:#E6E6E6; height:' + 0/*document.documentElement.clientHeight*/ + 'px;"><div style="z-index:99999;font-size:12px;color: #ce8f22;position:absolute;top:0px;right:0px;padding:2px 10px 2px 10px;">' +
+    //    '加载中,请稍候......</div></div>');
+    //document.close();
+
+    /**
+     * 定义全局作用域变量UHWEB
+     */
+    w.UHWEB = (function (w, d, undefined) {
+        /**
+         *是否是IE浏览器
+         */
+        var isIE = (navigator.userAgent.toLowerCase().indexOf('msie') != -1),
+            /**
+             * 创建UHWEB对象的临时变量
+             */
+            U,
+            /**
+             * 缓存document.getElementsByTagName
+             */
+            queryTag = function (tag) {
+                return this.getElementsByTagName(tag);
+            },
+            /**
+             * 缓存document.createElement
+             */
+            createEl = function (tag) {
+                return this.createElement(tag);
+            },
+            /**
+             * 是否是服务器模式,uhweb可在静态环境和服务器环境运行
+             */
+            isServer = !(d.domain == ''),
+            /**
+             * 业务js,就是定义在uhweb.js的script节点上的bizjs属性
+             */
+            bizJs,
+            /**
+             *业务css,就是定义在uhweb.js的script节点上的bizcss属性
+             */
+            bizCss,
+            /**
+             * 是否是客户端缓存服务端
+             */
+            clientCache,
+            isLoginPage = "false",
+
+        /*
+         * 调试模式,静态模式或者服务器模式下在url后拼接uhweb-debug=true即可开启调试模式.
+         * 要查看调试信息,请开启浏览器控制台
+         */
+            _DEBUG = false;
+        if (!isServer || w.location.search.indexOf('uhweb-debug=true') > 0) {
+            _DEBUG = true;
+        }
+
+        /**
+         * 获取uhweb所在的根目录
+         * @return {String}
+         */
+        var getRoot = function () {
+            var s = queryTag.call(d, 'script'),
+                /**
+                 * 某些情况时需要添加例外
+                 */
+                id = 0;
+            var p = s[id].src, sign = "uhweb.js", realpath = "uhweb/uhweb.js";
+            if (p.lastIndexOf(sign) > 0) {
+                bizJs = s[id].getAttribute('bizjs');
+                isLoginPage = s[id].getAttribute('isLoginPage');
+                bizCss = s[id].getAttribute('bizcss');
+                clientCache = s[id].getAttribute('CacheServer');
+                return p.replace(realpath, '');
+            } else {
+                throw '引入的uhweb.js的script节点必须放在页面引用的第一个script节点上!';
+            }
+        };
+        var head = queryTag.call(d, 'HEAD').item(0),
+        //静态运行时加载js
+            local = function (url, func) {
+                var s = createEl.call(d, 'script');
+                s.language = 'javascript';
+                s.type = 'text/javascript';
+                s.async = false;
+                s['src'] = url;
+                s.onload = s.onreadystatechange = function () {
+                    var st = this.readyState;
+                    if (!st || st == 'loaded' || st == 'complete') {
+                        _U.log('finishLoad js file ' + url);
+                        s.onload = s.onreadystatechange = null;
+                        if (func) {
+                            func.delay(10);
+                        }
+                    }
+                };
+                head.appendChild(s);
+                return s;
+            },
+        //服务器模式时加载js
+            server = function (url, func) {
+                var req = ((w.ActiveXObject) ? new ActiveXObject('MsXml2.XmlHttp') : new XMLHttpRequest());
+                req.open('get', url, false);
+                req.setRequestHeader('Content-Type', 'text/plain;charset=gb2312');
+                req.send(null);
+                if (req.readyState == 4) {
+                    if (req.status == 200) {
+                        if (req.responseText != '') {
+                            if (isIE) {
+                                execScript(req.responseText);
+                            } else {
+                                w.eval(req.responseText);
+                            }
+                            if (func)func();
+                        }
+                    }
+                }
+            };
+        U = {
+            //版本号
+            ver: 'V1.0',
+            //全局根目录
+            root: getRoot(),
+            isLoginPage : isLoginPage,
+            //是否是开发模式
+            isDev: (typeof jQuery === 'undefined'),
+            //是否是服务器端运行
+            isServer: isServer,
+            //调试开关
+            debug: _DEBUG,
+            //加载js
+            loadJs: function (url, f) {
+                (isServer) ? server(url, f) : local(url, f);
+            },
+            //加载css
+            loadCss: function (url) {
+                var link = createEl.call(d, 'link');
+                link.href = url;
+                link.type = 'text/css';
+                link.rel = 'stylesheet';
+                head.appendChild(link);
+            },
+            //初始化配置文件
+            initCfg: function (cfg) {
+                var me = this;
+                me.config = cfg;
+                if (me.process) {
+                    me.process();
+                } else {
+                    _U.loadCss('../uhweb/styles/' + _U.getCfg('style').sys_style + '/uhweb_min.css');
+                }
+                //加载业务js文件
+                var bizjs = (bizJs) ? eval(bizJs) : [], url, bizcss = (bizCss) ? eval(bizCss) : [];
+                for (i = 0; i < bizjs.length; i++) {
+                    url = me.root + bizjs[i];
+                    _U.log('add bizjs ' + url, 'uhweb');
+                    me.loadJs(url);
+                }
+                for (i = 0; i < bizcss.length; i++) {
+                    url = me.root + bizcss[i];
+                    _U.log('add bizcss ' + url, 'uhweb');
+                    me.loadCss(url);
+                }
+            },
+            //获取配置信息
+            getCfg: function (name) {
+                return this.config[name];
+            }
+        };
+        //实现默认的浅拷贝
+        U.mix = function (o) {
+            var me = this;
+            for (var k in o) {
+                if (me[k]) {
+                    me.warn('UHWEB对象已经有属性[' + k + ']!', 'uhweb');
+                } else {
+                    me[k] = o[k];
+                }
+            }
+        };
+        U.getParamFromUrl = function (param) {
+            var query = window.location.search;
+            var v = query.match(new RegExp("(^|&)" + param + "=([^&]*)(&|$)", "i"));
+            if (v != null) {
+                v = unescape(v[2]);
+            }
+            return v;
+        };
+        //全局屏蔽一些按键
+        U.shielding = function () {
+            var s = _U.getCfg('shields');
+            $(window).addEvent((Browser.firefox) ? 'keypress' : 'keydown', function (e) {
+                var k = e.key, c = e.control, el = $(e.target);
+                if ((k == 'f5' || (c && k == 'r')) && s.f5) {
+                    e.stop();
+                    return false;
+                } else if (k == 'backspace' && s.backspace) {
+                    var type = el.get('type') || el.get('tag');
+                    if (!['button', 'text', 'password', 'textarea', 'submit'].contains(type)) {
+                        e.stop();
+                        return false;
+                    }
+                }
+            });
+            if (s.contextMenu) {
+                $(document).oncontextmenu = function (e) {
+                    return false;
+                }
+            }
+        };
+        //统一处理iframe的初始化以及跳转
+        //解决按下backspace或者浏览器回退键会使iframe变为空白的问题
+        U.setIfrSrc = function (ifr, src) {
+            ifr.src = src;
+            ifr.contentWindow.location.replace(src);
+            /*//要注意跨域的问题.可能无跨域问题
+             Function.attempt(function () {
+             }, function () {
+
+             })*/
+        };
+        return U;
+    })(w, d, undefined);
+    /**
+     * 新增一个别名,减少字符开销
+     */
+    var _U = w._U = w.Uhweb = w.UHWEB,
+        /**
+         *日志输出级别,为兼容,暂支持4种级别
+         */
+        mtd = ['log', 'warn', 'error', 'info'];
+    /**
+     * 隐藏蒙版,框架启动加载完毕之后会调用
+     */
+    for (var k = 0; k < mtd.length; k++) {
+        _U[mtd[k]] = (function (c) {
+            return function (msg, src) {
+                U_LOG(msg, c, src);
+            }
+        })(mtd[k]);
+    }
+    /**
+     * 日志输出
+     * @param msg 要输出的信息
+     * @param cat 级别
+     * @param src 信息来源
+     */
+    function U_LOG(msg, cat, src) {
+        if (_U.debug) {
+            msg = ((src) ? src : 'SYSTEM') + ': ' + msg;
+            if (w['console'] !== undefined && console.log) {
+                console[cat && console[cat] ? cat : 'log'](msg);
+            }
+        }
+    }
+
+    _U.process = function () {
+
+    };
+
+    //加载子界面.
+    _U.initSubPage = function (ns, func) {
+        $.fn[ns] = {};
+        func($, $.fn[ns], _U);
+    };
+})(window, document, undefined);

+ 518 - 0
public/static/js/vrshow.js

@@ -0,0 +1,518 @@
+var pk_works_main;
+var mapModalEl;
+var _user_view_uuid;
+var _name;
+var _userList;
+var plugins_init_function = new Array();//接收显示时的init方法
+
+//krpano loadcomplete调用
+function showPanoBtns(sceneCount){
+    if (sceneCount > 1) {
+        $(".vrshow_container_3_min .img_desc_container_min:eq(0)").show();
+    }else{
+        $(".vrshow_container_3_min .img_desc_container_min:eq(0)").hide();
+    }
+    $("#panoBtns").show();
+}
+
+function fullscreen(el){
+    //krpano.call("switch(fullscreen);");
+    //launchFullScreen(document.documentElement);
+    if($(el).hasClass('btn_fullscreen')){
+        launchFullScreen(document.getElementById('fullscreenid'));
+        var krpano = document.getElementById('krpanoSWFObject');
+        krpano.call("skin_showthumbs(false);");
+    }else{
+        exitFullscreen();
+    }
+    toggleFullscreenBtn(el);
+}
+
+function launchFullScreen(element) {
+    if(element.requestFullscreen) {
+        element.requestFullscreen();
+    } else if(element.mozRequestFullScreen) {
+        element.mozRequestFullScreen();
+    } else if(element.webkitRequestFullscreen) {
+        element.webkitRequestFullscreen();
+    } else if(element.msRequestFullscreen) {
+        element.msRequestFullscreen();
+    }
+}
+
+function exitFullscreen() {
+    if (document.exitFullscreen) {
+        document.exitFullscreen();
+    }
+    else if (document.mozCancelFullScreen) {
+        document.mozCancelFullScreen();
+    }
+    else if (document.webkitCancelFullScreen) {
+        document.webkitCancelFullScreen();
+    }
+    else if (document.msExitFullscreen) {
+        document.msExitFullscreen();
+    }
+}
+
+function toggleFullscreenBtn(el){
+    if($(el).hasClass("btn_fullscreen")){
+        $(el).removeClass("btn_fullscreen");
+        $(el).addClass("btn_fullscreen_off");
+    }else{
+        $(el).removeClass("btn_fullscreen_off");
+        $(el).addClass("btn_fullscreen");
+    }
+}
+
+function toggleBtns(flag){
+    if(flag){
+        $("#panoBtns").show();
+    }else{
+        $("#panoBtns").hide();
+        var krpano = document.getElementById('krpanoSWFObject');
+        krpano.call('skin_showthumbs(false);');
+    }
+}
+
+function showWebVR(){
+    var krpano = document.getElementById('krpanoSWFObject');
+    var webvr = krpano.get("webvr");
+    webvr.entervr();
+}
+
+
+
+function showthumbs(){
+    var krpano = document.getElementById('krpanoSWFObject');
+    krpano.call("skin_showthumbs();");
+}
+
+
+
+function hidePictext() {
+    $('#pictextModal').modal('hide');
+    toggleBtns(true);
+}
+
+function showPictext(title,content) {
+    toggleBtns(false);
+    //var data = $("body").data("panoData");
+    // $('#pictextWorkName').text('');
+    // $('#pictextContent').text('');
+    $('#pictextWorkName').text(title);
+    $('#pictextContent').html(imgtext_decode(content));
+    //$('#pictextContent').append(content);
+    $('#pictextModal').modal("show");
+}
+
+//krpano调用 初始化高级设置
+function initAdvancedSetting(sceneName){
+    //initViewSetting(sceneName);
+    initEffectSetting(sceneName);
+    initHotspotSetting(sceneName);
+    initSandTableSetting(sceneName);
+    initTourGuideSetting(sceneName);
+    //作者信息 TODO
+    // initAuthourInfo(sceneName);
+}
+
+function initTourGuideSetting(sceneName){
+    var krpano = document.getElementById('krpanoSWFObject');
+    var tourGuideObj = $("body").data("panoData").tour_guide;
+    if(tourGuideObj.points.length > 0){
+        $('#pano .vrshow_tour_btn').show();
+    }else{
+        $('#pano .vrshow_tour_btn').hide();
+    }
+}
+
+var lsTourGuideObj = null;
+function startTourGuide(){
+    toggleBtns(false);
+    lsTourGuideObj = $("body").data("panoData").tour_guide;
+    var krpano = document.getElementById('krpanoSWFObject');
+    //krpano.call('showlog(true)');
+    var curSceneName = krpano.get('xml.scene');
+    var firstPoint = lsTourGuideObj.points[0];
+    if(lsTourGuideObj.useStartImg){
+        krpano.call('show_tour_guide_alert('+lsTourGuideObj.startImgUrl+');');
+    }
+    if(this.sceneName != curSceneName){
+        krpano.call('loadscene('+firstPoint.sceneName+', null, MERGE);');
+    }
+    var curfov = krpano.get('view.fov');
+    krpano.call('lookto('+firstPoint.ath+','+firstPoint.atv+','+curfov+',smooth(720,-720,720),true,true,js(looktoCallBack('+1+')));');
+}
+
+function looktoCallBack(idx){
+    var krpano = document.getElementById('krpanoSWFObject');
+    if(idx < lsTourGuideObj.points.length){
+        var pointObj = lsTourGuideObj.points[idx];
+        var curSceneName = krpano.get('xml.scene');
+        var curfov = krpano.get('view.fov');
+        if(pointObj.sceneName != curSceneName){
+            krpano.call('loadscene('+pointObj.sceneName+', null, MERGE);');
+            krpano.call('lookto('+pointObj.ath+','+pointObj.atv+','+curfov+',smooth(720,-720,720),true,true,js(looktoCallBack('+(parseInt(idx)+1)+')));');
+        }else{
+            krpano.call('lookto('+pointObj.ath+','+pointObj.atv+','+curfov+',tween(easeInOutQuad,'+parseInt(pointObj.moveTime)+'),true,true,js(looktoCallBack('+(parseInt(idx)+1)+')));');
+        }
+    }else{
+        if(lsTourGuideObj.useEndImg){
+            krpano.call('show_tour_guide_alert('+lsTourGuideObj.endImgUrl+');');
+        }
+        toggleBtns(true);
+    }
+}
+
+function initSandTableSetting(sceneName){
+    var krpano = document.getElementById('krpanoSWFObject');
+    var sandTableObj = $("body").data("panoData").sand_table;
+    var existFlag = false;
+    $(sandTableObj.sandTables).each(function(idx){
+        if(this.sceneOpt[sceneName]){
+            //设置背景图片
+            krpano.set("layer[map].url",this.imgPath);
+            $.each(this.sceneOpt,function(sceneName,value){
+                var spotName = 'spot_'+sceneName;
+                addRadarSpot(spotName,value.krpLeft,value.krpTop);
+            });
+            var hlookatIncre = krpano.get('view.hlookat') - this.sceneOpt[sceneName].hlookat;
+            krpano.call('activatespot('+(parseFloat(this.sceneOpt[sceneName].rotate)+parseFloat(hlookatIncre))+');');
+            existFlag = true;
+            return false;
+        }
+    });
+    if(!existFlag){
+        $('.vrshow_radar_btn').hide();
+        krpano.set('layer[mapcontainer].visible',false);
+    }else{
+        $('.vrshow_radar_btn').show();
+        if(sandTableObj.isOpen){
+            krpano.set('layer[mapcontainer].visible',true);
+        }
+    }
+}
+
+function toggleKrpSandTable(){
+    var krpano = document.getElementById('krpanoSWFObject');
+    var isVisible = krpano.get('layer[mapcontainer].visible');
+    if(isVisible){
+        krpano.set('layer[mapcontainer].visible',false);
+    }else{
+        krpano.set('layer[mapcontainer].visible',true);
+    }
+}
+
+function addRadarSpot(name,x,y){
+    //console.log(x+','+y);
+    var krpano = document.getElementById('krpanoSWFObject');
+    krpano.call('addlayer('+name+');');
+    krpano.set('layer['+name+'].style','spot');
+    krpano.set('layer['+name+'].x',x);
+    krpano.set('layer['+name+'].y',y);
+    krpano.set('layer['+name+'].parent','radarmask');
+    krpano.call('layer['+name+'].loadstyle(spot);');
+    //krpano.set('layer['+name+'].keep','true');
+    //krpano.set('layer['+name+'].visible','true');
+}
+
+function initHotspotSetting(sceneName){
+    var krpano = document.getElementById('krpanoSWFObject');
+    var hotspotObj = ($("body").data("panoData").hotspot)[sceneName];
+    if(hotspotObj){
+        $.each(hotspotObj,function(key,value){
+            if(key == 'scene'){
+                $(value).each(function(idx){
+                    krpano.call('addSceneChangeHotSpot("'+this.imgPath+'","'+ (this.name) +'",'+this.linkedscene+','+(this.ath)+','+(this.atv)+','+this.isDynamic+',false,true)');
+                });
+            }else if(key == 'link'){
+                $(value).each(function(idx){
+                    krpano.call('addLinkHotSpot("'+this.imgPath+'","'+ (this.name) +'",'+html_encode(this.hotspotTitle)+','+(this.ath)+','+(this.atv)+','+this.isDynamic+',false,true,'+this.link+','+this.isShowSpotName+')');
+                });
+            }else if(key == 'image'){
+                $(value).each(function(idx){
+                    krpano.call('addImgHotSpot("'+this.imgPath+'","'+ (this.name) +'",'+html_encode(this.hotspotTitle)+','+(this.ath)+','+(this.atv)+','+this.isDynamic+',false,true,'+this.galleryName+','+this.isShowSpotName+')');
+                });
+            }else if(key == 'text'){
+                $(value).each(function(idx){
+                    krpano.call('addWordHotSpot("'+this.imgPath+'","'+ (this.name) +'",'+html_encode(this.hotspotTitle)+','+(this.ath)+','+(this.atv)+','+this.isDynamic+',false,true,'+html_encode(this.wordContent)+','+this.isShowSpotName+')');
+                });
+            }else if(key == 'voice'){
+                $(value).each(function(idx){
+                    krpano.call('addVoiceHotSpot("'+this.imgPath+'","'+ (this.name) +'",'+html_encode(this.hotspotTitle)+','+(this.ath)+','+(this.atv)+','+this.isDynamic+',false,true,'+this.musicSrc+','+this.isShowSpotName+')');
+                });
+            }else if(key == 'around'){
+                $(value).each(function(idx){
+                    krpano.call('addAroundHotSpot("'+this.imgPath+'","'+ (this.name) +'",'+html_encode(this.hotspotTitle)+','+(this.ath)+','+(this.atv)+','+this.isDynamic+',false,true,'+this.aroundPath+','+this.fileCount+','+this.isShowSpotName+')');
+                });
+            }else if(key == 'imgtext'){
+                $(value).each(function(idx){
+                    krpano.call('addImgTextHotSpot("'+this.imgPath+'","'+ (this.name) +'",'+html_encode(this.hotspotTitle)+','+(this.ath)+','+(this.atv)+','+this.isDynamic+',false,true,'+imgtext_encode(this.imgtext_wordContent)+','+this.isShowSpotName+')');
+                });
+            }else if(key == 'obj'){
+                $(value).each(function(idx){
+                    krpano.call('addObjHotSpot("'+this.imgPath+'","'+ (this.name) +'",'+html_encode(this.hotspotTitle)+','+(this.ath)+','+(this.atv)+','+this.isDynamic+',false,true,'+this.objid+','+this.isShowSpotName+')');
+                });
+            }else if(key == 'video'){
+                $(value).each(function(idx){
+                    krpano.call('addVideoHotSpot("'+this.imgPath+'","'+ (this.name) +'",'+html_encode(this.hotspotTitle)+','+(this.ath)+','+(this.atv)+','+this.isDynamic+',false,true,'+this.location+','+this.isShowSpotName+')');
+                });
+            }
+        });
+    }
+}
+
+function initEffectSetting(sceneName){
+    var krpano = document.getElementById('krpanoSWFObject');
+    var effectObj = null;
+    var effectData = $("body").data("panoData").special_effects;
+    $(effectData.effectSettings).each(function(idx){
+        if(this.sceneName == sceneName){
+            effectObj = this;
+            return false;
+        }
+    });
+    if(effectObj){
+        if(effectObj.isOpen){
+            if(effectObj.effectType == 'sunshine'){
+                //krpano.set('lensflares[obj].item[lensitemobj].scene',sceneName);
+                //krpano.set('lensflares[obj].item[lensitemobj].ath',effectObj.ath);
+                //krpano.set('lensflares[obj].item[lensitemobj].atv',effectObj.atv);
+                krpano.call('addLensflares('+effectObj.ath+','+effectObj.atv+')');
+            }else{
+                krpano.call('addEffect("'+effectObj.effectType+'","'+effectObj.effectImgPath+'")');
+            }
+        }
+    }
+}
+
+function littlePlaneOpen(sceneName){
+    var krpano = document.getElementById('krpanoSWFObject');
+    var lookatObj = null;
+    var angleData = $("body").data("panoData").angle_of_view;
+    $(angleData.viewSettings).each(function(idx){
+        if(this.sceneName == sceneName){
+            lookatObj = this;
+            return false;
+        }
+    });
+    if(lookatObj){
+        krpano.set('view.vlookat',lookatObj.vlookat);
+        krpano.set('view.hlookat',lookatObj.hlookat);
+        krpano.set('view.fov',lookatObj.fov);
+        krpano.set('view.fovmax',lookatObj.fovmax);
+        if(lookatObj.hlookatmin){
+            krpano.set('view.hlookatmin',lookatObj.hlookatmin);
+        }
+        if(lookatObj.hlookatmax){
+            krpano.set('view.hlookatmax',lookatObj.hlookatmax);
+        }
+        krpano.call('skin_setup_littleplanetintro('+lookatObj.fovmin+','+(-1*lookatObj.vlookatmax)+','+(-1*lookatObj.vlookatmin)+','+(lookatObj.keepView ? "off" : "0.0")+');');
+    }else{
+        krpano.call('skin_setup_littleplanetintro(5,-90,90,"0.0");');
+    }
+}
+
+//场景载入时加载视角设置
+function initViewSetting(sceneName){
+    var krpano = document.getElementById('krpanoSWFObject');
+    var lookatObj = null;
+    var angleData = $("body").data("panoData").angle_of_view;
+    $(angleData.viewSettings).each(function(idx){
+        if(this.sceneName == sceneName){
+            lookatObj = this;
+            return false;
+        }
+    });
+    if(lookatObj){
+        krpano.set('view.vlookat',lookatObj.vlookat);
+        krpano.set('view.hlookat',lookatObj.hlookat);
+        krpano.set('view.fov',lookatObj.fov);
+        krpano.set('view.fovmin',lookatObj.fovmin);
+        krpano.set('view.fovmax',lookatObj.fovmax);
+        krpano.set('view.vlookatmin',-1*lookatObj.vlookatmax);
+        krpano.set('view.vlookatmax',-1*lookatObj.vlookatmin);
+        krpano.set('autorotate.horizon',lookatObj.keepView ? "off" : "0.0");
+        if(lookatObj.hlookatmin){
+            krpano.set('view.hlookatmin',lookatObj.hlookatmin);
+        }
+        if(lookatObj.hlookatmax){
+            krpano.set('view.hlookatmax',lookatObj.hlookatmax);
+        }
+    }
+}
+
+function loadGallery(){
+    var krpano = document.getElementById('krpanoSWFObject');
+    var hotspotObj = $("body").data("panoData").hotspot;
+    //var xmlStr = '';
+    $.each(hotspotObj,function(sceneName,value){
+        if(value){
+            $(value.image).each(function(idx){
+                var xmlStr = '<gallery name="'+this.galleryName+'" title="">';
+                $(this.imgs).each(function(idx){
+                    xmlStr += '<img name="img'+idx+'" url="'+this.src+'" title="" />';
+                });
+                xmlStr += '</gallery>';
+                krpano.call('loadxml('+xmlStr+');');
+            });
+        }
+    });
+}
+
+function reloadGallery(gallery){
+    var krpano = document.getElementById('krpanoSWFObject');
+    var ua = window.navigator.userAgent.toLowerCase();
+    if(typeof(wx)!='undefined' && ua.match(/MicroMessenger/i) == 'micromessenger'){
+        //整合gallery的图片到数组 
+        var urls = new Array();
+        for(var i=0; i<krpano.get('gallery['+gallery+'].img.count'); i++){
+            urls.push(krpano.get('gallery['+gallery+'].img['+i+'].url'));
+        }
+        wx.previewImage({
+            current: krpano.get('gallery['+gallery+'].img[0].url'), // 当前显示图片的http链接
+            urls: urls // 需要预览的图片http链接列表
+        }); 
+    }
+    else{
+        toggleBtns();
+        krpano.call('show_gallery('+gallery+')');   
+    }
+}
+
+function getWorkPrivacyFlag(){
+    var privacy_flag = '0';
+
+    return privacy_flag;
+}
+
+
+
+function initPano(){//TODO
+   
+   if(data.pk_works_main == undefined){
+       window.location.href = '/404.html';
+       return ;
+   }
+   //微信分享
+   // initWxConfig(data);
+   // initQQShare(data);
+   //存储作者的信息
+   // _user_view_uuid = data.user_view_uuid;
+   _user_view_uuid = "admin";
+
+   _name = data.name;
+   document.title = _name;
+   //$("#thumb_img").attr("src",data.absolutelocation);
+   //var descContent='';
+   //if(data.profile){
+   //    descContent = data.profile;
+   //}else{
+   //    descContent = data.name;
+   //}
+   //$("head").append('<meta name="description" content="'+descContent+'"/>');
+
+   $("body").data("panoData",data);
+   pk_works_main = data.pk_works_main;
+   var settings = {};
+   settings["events[skin_events].onloadcomplete"] = "skin_showloading(false);";
+   settings["onstart"] = '';
+   
+   //是否开始时弹出场景选择
+   if (data.scenechoose=='1') {
+       settings["events[skin_events].onloadcomplete"] += "open_show_scene_thumb();";
+   }
+   
+   //统计人气
+   if(data.browsing_num!='0'){
+       $("#user_viewNum").text(parseInt(data.browsing_num)+1);
+   }else{
+       $("#user_viewNum").text("1");
+   }
+   //启动画面
+   var loadingObj = data.loading_img;
+   if (loadingObj && loadingObj.useLoading) {
+       settings["onstart"] += "showloadingimg('" + loadingObj.loadingImgPathWebsite + "','" + loadingObj.loadingImgPathMobile + "');";
+   }
+   for(var i=0 ; i<plugins_init_function.length;i++){
+        plugins_init_function[i](data,settings);
+   }
+   if(data.scene_group.sceneGroups.length>0) {
+         $(".vrshow_container_3_min .img_desc_container_min:eq(0) img").attr('src',data.scene_group.sceneGroups[0].imgPath);
+    }
+   settings['skin_settings.littleplanetintro'] = data.littleplanet=="1" ? true : false;
+
+   settings['autorotate.enabled'] = data.autorotate=="1" ? true : false;
+   embedpano({
+       swf: "tour.swf",
+       xml: "tour.xml",
+       target: "pano",
+       html5:'prefer',
+       //flash:'only',
+       wmode:'opaque-flash',
+       mobilescale:0.7,
+       vars: settings
+   });
+}
+function html_encode(str)
+  {
+    var s = "";
+    if (str.length == 0) return "";
+    s = str.replace(/\'/g, "&#39;");
+    s = s.replace(/\"/g, "&quot;");
+    s = s.replace(/\(/g, "(");
+    s = s.replace(/\)/g, ")");
+    s = s.replace(/,/g, ",");
+    return s;
+  }
+function imgtext_encode(str){
+     var s = "";
+    if (str.length == 0) return "";
+    s = str.replace(/\'/g, "&#39;");
+    s = s.replace(/\"/g, "&quot;");
+    s = s.replace(/\(/g, "(");
+    s = s.replace(/\)/g, ")");
+    s = s.replace(/\,/g,"%2C");
+    return s;
+}
+function imgtext_decode(str){
+     var s = "";
+    if (str.length == 0) return "";
+    s = str.replace(/&quot;/g, "\"");
+     s = s.replace(/%2C/g,",");
+    return s;
+}
+
+function showFullscreenBtn(){
+    $(".btn_fullscreen").show();
+}
+
+
+
+function radarRotate(sceneName,hlookat){
+
+}
+
+function openSpeechVoiceBtn(){
+    var voiceOff = $('.btn_music_off');
+    voiceOff.removeClass('btn_music_off');
+    voiceOff.addClass('btn_music');
+}
+var player ;
+function playvideo(url){
+   var location = window.location.href;
+   url = location.substring(0,location.lastIndexOf("\/")+1)+url;
+   player = new prismplayer({
+      id: "J_prismPlayer", // 容器id
+      source:url,
+      autoplay: true,      // 自动播放
+      width: "100%",       // 播放器宽度
+      height: "400px"      // 播放器高度
+    });
+   $("#video_player_modal").modal('show');
+}
+function close_video_player(){
+    player.pause();
+    $("#video_player_modal").modal('hide');
+}

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 6448 - 0
public/static/js/zui.js


+ 755 - 0
public/static/lib/Tween.js

@@ -0,0 +1,755 @@
+/**
+ * Tween.js - Licensed under the MIT license
+ * https://github.com/sole/tween.js
+ * ----------------------------------------------
+ *
+ * See https://github.com/sole/tween.js/graphs/contributors for the full list of contributors.
+ * Thank you all, you're awesome!
+ */
+
+// Date.now shim for (ahem) Internet Explo(d|r)er
+if ( Date.now === undefined ) {
+
+	Date.now = function () {
+
+		return new Date().valueOf();
+
+	};
+
+}
+
+var TWEEN = TWEEN || ( function () {
+
+	var _tweens = [];
+
+	return {
+
+		REVISION: '14',
+
+		getAll: function () {
+
+			return _tweens;
+
+		},
+
+		removeAll: function () {
+
+			_tweens = [];
+
+		},
+
+		add: function ( tween ) {
+
+			_tweens.push( tween );
+
+		},
+
+		remove: function ( tween ) {
+
+			var i = _tweens.indexOf( tween );
+
+			if ( i !== -1 ) {
+
+				_tweens.splice( i, 1 );
+
+			}
+
+		},
+
+		update: function ( time ) {
+
+			if ( _tweens.length === 0 ) return false;
+
+			var i = 0;
+
+			time = time !== undefined ? time : ( typeof window !== 'undefined' && window.performance !== undefined && window.performance.now !== undefined ? window.performance.now() : Date.now() );
+
+			while ( i < _tweens.length ) {
+
+				if ( _tweens[ i ].update( time ) ) {
+
+					i++;
+
+				} else {
+
+					_tweens.splice( i, 1 );
+
+				}
+
+			}
+
+			return true;
+
+		}
+	};
+
+} )();
+
+TWEEN.Tween = function ( object ) {
+
+	var _object = object;
+	var _valuesStart = {};
+	var _valuesEnd = {};
+	var _valuesStartRepeat = {};
+	var _duration = 1000;
+	var _repeat = 0;
+	var _yoyo = false;
+	var _isPlaying = false;
+	var _reversed = false;
+	var _delayTime = 0;
+	var _startTime = null;
+	var _easingFunction = TWEEN.Easing.Linear.None;
+	var _interpolationFunction = TWEEN.Interpolation.Linear;
+	var _chainedTweens = [];
+	var _onStartCallback = null;
+	var _onStartCallbackFired = false;
+	var _onUpdateCallback = null;
+	var _onCompleteCallback = null;
+	var _onStopCallback = null;
+
+	// Set all starting values present on the target object
+	for ( var field in object ) {
+
+		_valuesStart[ field ] = parseFloat(object[field], 10);
+
+	}
+
+	this.to = function ( properties, duration ) {
+
+		if ( duration !== undefined ) {
+
+			_duration = duration;
+
+		}
+
+		_valuesEnd = properties;
+
+		return this;
+
+	};
+
+	this.start = function ( time ) {
+
+		TWEEN.add( this );
+
+		_isPlaying = true;
+
+		_onStartCallbackFired = false;
+
+		_startTime = time !== undefined ? time : ( typeof window !== 'undefined' && window.performance !== undefined && window.performance.now !== undefined ? window.performance.now() : Date.now() );
+		_startTime += _delayTime;
+
+		for ( var property in _valuesEnd ) {
+
+			// check if an Array was provided as property value
+			if ( _valuesEnd[ property ] instanceof Array ) {
+
+				if ( _valuesEnd[ property ].length === 0 ) {
+
+					continue;
+
+				}
+
+				// create a local copy of the Array with the start value at the front
+				_valuesEnd[ property ] = [ _object[ property ] ].concat( _valuesEnd[ property ] );
+
+			}
+
+			_valuesStart[ property ] = _object[ property ];
+
+			if( ( _valuesStart[ property ] instanceof Array ) === false ) {
+				_valuesStart[ property ] *= 1.0; // Ensures we're using numbers, not strings
+			}
+
+			_valuesStartRepeat[ property ] = _valuesStart[ property ] || 0;
+
+		}
+
+		return this;
+
+	};
+
+	this.stop = function () {
+
+		if ( !_isPlaying ) {
+			return this;
+		}
+
+		TWEEN.remove( this );
+		_isPlaying = false;
+
+		if ( _onStopCallback !== null ) {
+
+			_onStopCallback.call( _object );
+
+		}
+
+		this.stopChainedTweens();
+		return this;
+
+	};
+
+	this.stopChainedTweens = function () {
+
+		for ( var i = 0, numChainedTweens = _chainedTweens.length; i < numChainedTweens; i++ ) {
+
+			_chainedTweens[ i ].stop();
+
+		}
+
+	};
+
+	this.delay = function ( amount ) {
+
+		_delayTime = amount;
+		return this;
+
+	};
+
+	this.repeat = function ( times ) {
+
+		_repeat = times;
+		return this;
+
+	};
+
+	this.yoyo = function( yoyo ) {
+
+		_yoyo = yoyo;
+		return this;
+
+	};
+
+
+	this.easing = function ( easing ) {
+
+		_easingFunction = easing;
+		return this;
+
+	};
+
+	this.interpolation = function ( interpolation ) {
+
+		_interpolationFunction = interpolation;
+		return this;
+
+	};
+
+	this.chain = function () {
+
+		_chainedTweens = arguments;
+		return this;
+
+	};
+
+	this.onStart = function ( callback ) {
+
+		_onStartCallback = callback;
+		return this;
+
+	};
+
+	this.onUpdate = function ( callback ) {
+
+		_onUpdateCallback = callback;
+		return this;
+
+	};
+
+	this.onComplete = function ( callback ) {
+
+		_onCompleteCallback = callback;
+		return this;
+
+	};
+
+	this.onStop = function ( callback ) {
+
+		_onStopCallback = callback;
+		return this;
+
+	};
+
+	this.update = function ( time ) {
+
+		var property;
+
+		if ( time < _startTime ) {
+
+			return true;
+
+		}
+
+		if ( _onStartCallbackFired === false ) {
+
+			if ( _onStartCallback !== null ) {
+
+				_onStartCallback.call( _object );
+
+			}
+
+			_onStartCallbackFired = true;
+
+		}
+
+		var elapsed = ( time - _startTime ) / _duration;
+		elapsed = elapsed > 1 ? 1 : elapsed;
+
+		var value = _easingFunction( elapsed );
+
+		for ( property in _valuesEnd ) {
+
+			var start = _valuesStart[ property ] || 0;
+			var end = _valuesEnd[ property ];
+
+			if ( end instanceof Array ) {
+
+				_object[ property ] = _interpolationFunction( end, value );
+
+			} else {
+
+				// Parses relative end values with start as base (e.g.: +10, -3)
+				if ( typeof(end) === "string" ) {
+					end = start + parseFloat(end, 10);
+				}
+
+				// protect against non numeric properties.
+				if ( typeof(end) === "number" ) {
+					_object[ property ] = start + ( end - start ) * value;
+				}
+
+			}
+
+		}
+
+		if ( _onUpdateCallback !== null ) {
+
+			_onUpdateCallback.call( _object, value );
+
+		}
+
+		if ( elapsed == 1 ) {
+
+			if ( _repeat > 0 ) {
+
+				if( isFinite( _repeat ) ) {
+					_repeat--;
+				}
+
+				// reassign starting values, restart by making startTime = now
+				for( property in _valuesStartRepeat ) {
+
+					if ( typeof( _valuesEnd[ property ] ) === "string" ) {
+						_valuesStartRepeat[ property ] = _valuesStartRepeat[ property ] + parseFloat(_valuesEnd[ property ], 10);
+					}
+
+					if (_yoyo) {
+						var tmp = _valuesStartRepeat[ property ];
+						_valuesStartRepeat[ property ] = _valuesEnd[ property ];
+						_valuesEnd[ property ] = tmp;
+					}
+
+					_valuesStart[ property ] = _valuesStartRepeat[ property ];
+
+				}
+
+				if (_yoyo) {
+					_reversed = !_reversed;
+				}
+
+				_startTime = time + _delayTime;
+
+				return true;
+
+			} else {
+
+				if ( _onCompleteCallback !== null ) {
+
+					_onCompleteCallback.call( _object );
+
+				}
+
+				for ( var i = 0, numChainedTweens = _chainedTweens.length; i < numChainedTweens; i++ ) {
+
+					_chainedTweens[ i ].start( time );
+
+				}
+
+				return false;
+
+			}
+
+		}
+
+		return true;
+
+	};
+
+};
+
+
+TWEEN.Easing = {
+
+	Linear: {
+
+		None: function ( k ) {
+
+			return k;
+
+		}
+
+	},
+
+	Quadratic: {
+
+		In: function ( k ) {
+
+			return k * k;
+
+		},
+
+		Out: function ( k ) {
+
+			return k * ( 2 - k );
+
+		},
+
+		InOut: function ( k ) {
+
+			if ( ( k *= 2 ) < 1 ) return 0.5 * k * k;
+			return - 0.5 * ( --k * ( k - 2 ) - 1 );
+
+		}
+
+	},
+
+	Cubic: {
+
+		In: function ( k ) {
+
+			return k * k * k;
+
+		},
+
+		Out: function ( k ) {
+
+			return --k * k * k + 1;
+
+		},
+
+		InOut: function ( k ) {
+
+			if ( ( k *= 2 ) < 1 ) return 0.5 * k * k * k;
+			return 0.5 * ( ( k -= 2 ) * k * k + 2 );
+
+		}
+
+	},
+
+	Quartic: {
+
+		In: function ( k ) {
+
+			return k * k * k * k;
+
+		},
+
+		Out: function ( k ) {
+
+			return 1 - ( --k * k * k * k );
+
+		},
+
+		InOut: function ( k ) {
+
+			if ( ( k *= 2 ) < 1) return 0.5 * k * k * k * k;
+			return - 0.5 * ( ( k -= 2 ) * k * k * k - 2 );
+
+		}
+
+	},
+
+	Quintic: {
+
+		In: function ( k ) {
+
+			return k * k * k * k * k;
+
+		},
+
+		Out: function ( k ) {
+
+			return --k * k * k * k * k + 1;
+
+		},
+
+		InOut: function ( k ) {
+
+			if ( ( k *= 2 ) < 1 ) return 0.5 * k * k * k * k * k;
+			return 0.5 * ( ( k -= 2 ) * k * k * k * k + 2 );
+
+		}
+
+	},
+
+	Sinusoidal: {
+
+		In: function ( k ) {
+
+			return 1 - Math.cos( k * Math.PI / 2 );
+
+		},
+
+		Out: function ( k ) {
+
+			return Math.sin( k * Math.PI / 2 );
+
+		},
+
+		InOut: function ( k ) {
+
+			return 0.5 * ( 1 - Math.cos( Math.PI * k ) );
+
+		}
+
+	},
+
+	Exponential: {
+
+		In: function ( k ) {
+
+			return k === 0 ? 0 : Math.pow( 1024, k - 1 );
+
+		},
+
+		Out: function ( k ) {
+
+			return k === 1 ? 1 : 1 - Math.pow( 2, - 10 * k );
+
+		},
+
+		InOut: function ( k ) {
+
+			if ( k === 0 ) return 0;
+			if ( k === 1 ) return 1;
+			if ( ( k *= 2 ) < 1 ) return 0.5 * Math.pow( 1024, k - 1 );
+			return 0.5 * ( - Math.pow( 2, - 10 * ( k - 1 ) ) + 2 );
+
+		}
+
+	},
+
+	Circular: {
+
+		In: function ( k ) {
+
+			return 1 - Math.sqrt( 1 - k * k );
+
+		},
+
+		Out: function ( k ) {
+
+			return Math.sqrt( 1 - ( --k * k ) );
+
+		},
+
+		InOut: function ( k ) {
+
+			if ( ( k *= 2 ) < 1) return - 0.5 * ( Math.sqrt( 1 - k * k) - 1);
+			return 0.5 * ( Math.sqrt( 1 - ( k -= 2) * k) + 1);
+
+		}
+
+	},
+
+	Elastic: {
+
+		In: function ( k ) {
+
+			var s, a = 0.1, p = 0.4;
+			if ( k === 0 ) return 0;
+			if ( k === 1 ) return 1;
+			if ( !a || a < 1 ) { a = 1; s = p / 4; }
+			else s = p * Math.asin( 1 / a ) / ( 2 * Math.PI );
+			return - ( a * Math.pow( 2, 10 * ( k -= 1 ) ) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) );
+
+		},
+
+		Out: function ( k ) {
+
+			var s, a = 0.1, p = 0.4;
+			if ( k === 0 ) return 0;
+			if ( k === 1 ) return 1;
+			if ( !a || a < 1 ) { a = 1; s = p / 4; }
+			else s = p * Math.asin( 1 / a ) / ( 2 * Math.PI );
+			return ( a * Math.pow( 2, - 10 * k) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) + 1 );
+
+		},
+
+		InOut: function ( k ) {
+
+			var s, a = 0.1, p = 0.4;
+			if ( k === 0 ) return 0;
+			if ( k === 1 ) return 1;
+			if ( !a || a < 1 ) { a = 1; s = p / 4; }
+			else s = p * Math.asin( 1 / a ) / ( 2 * Math.PI );
+			if ( ( k *= 2 ) < 1 ) return - 0.5 * ( a * Math.pow( 2, 10 * ( k -= 1 ) ) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) );
+			return a * Math.pow( 2, -10 * ( k -= 1 ) ) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) * 0.5 + 1;
+
+		}
+
+	},
+
+	Back: {
+
+		In: function ( k ) {
+
+			var s = 1.70158;
+			return k * k * ( ( s + 1 ) * k - s );
+
+		},
+
+		Out: function ( k ) {
+
+			var s = 1.70158;
+			return --k * k * ( ( s + 1 ) * k + s ) + 1;
+
+		},
+
+		InOut: function ( k ) {
+
+			var s = 1.70158 * 1.525;
+			if ( ( k *= 2 ) < 1 ) return 0.5 * ( k * k * ( ( s + 1 ) * k - s ) );
+			return 0.5 * ( ( k -= 2 ) * k * ( ( s + 1 ) * k + s ) + 2 );
+
+		}
+
+	},
+
+	Bounce: {
+
+		In: function ( k ) {
+
+			return 1 - TWEEN.Easing.Bounce.Out( 1 - k );
+
+		},
+
+		Out: function ( k ) {
+
+			if ( k < ( 1 / 2.75 ) ) {
+
+				return 7.5625 * k * k;
+
+			} else if ( k < ( 2 / 2.75 ) ) {
+
+				return 7.5625 * ( k -= ( 1.5 / 2.75 ) ) * k + 0.75;
+
+			} else if ( k < ( 2.5 / 2.75 ) ) {
+
+				return 7.5625 * ( k -= ( 2.25 / 2.75 ) ) * k + 0.9375;
+
+			} else {
+
+				return 7.5625 * ( k -= ( 2.625 / 2.75 ) ) * k + 0.984375;
+
+			}
+
+		},
+
+		InOut: function ( k ) {
+
+			if ( k < 0.5 ) return TWEEN.Easing.Bounce.In( k * 2 ) * 0.5;
+			return TWEEN.Easing.Bounce.Out( k * 2 - 1 ) * 0.5 + 0.5;
+
+		}
+
+	}
+
+};
+
+TWEEN.Interpolation = {
+
+	Linear: function ( v, k ) {
+
+		var m = v.length - 1, f = m * k, i = Math.floor( f ), fn = TWEEN.Interpolation.Utils.Linear;
+
+		if ( k < 0 ) return fn( v[ 0 ], v[ 1 ], f );
+		if ( k > 1 ) return fn( v[ m ], v[ m - 1 ], m - f );
+
+		return fn( v[ i ], v[ i + 1 > m ? m : i + 1 ], f - i );
+
+	},
+
+	Bezier: function ( v, k ) {
+
+		var b = 0, n = v.length - 1, pw = Math.pow, bn = TWEEN.Interpolation.Utils.Bernstein, i;
+
+		for ( i = 0; i <= n; i++ ) {
+			b += pw( 1 - k, n - i ) * pw( k, i ) * v[ i ] * bn( n, i );
+		}
+
+		return b;
+
+	},
+
+	CatmullRom: function ( v, k ) {
+
+		var m = v.length - 1, f = m * k, i = Math.floor( f ), fn = TWEEN.Interpolation.Utils.CatmullRom;
+
+		if ( v[ 0 ] === v[ m ] ) {
+
+			if ( k < 0 ) i = Math.floor( f = m * ( 1 + k ) );
+
+			return fn( v[ ( i - 1 + m ) % m ], v[ i ], v[ ( i + 1 ) % m ], v[ ( i + 2 ) % m ], f - i );
+
+		} else {
+
+			if ( k < 0 ) return v[ 0 ] - ( fn( v[ 0 ], v[ 0 ], v[ 1 ], v[ 1 ], -f ) - v[ 0 ] );
+			if ( k > 1 ) return v[ m ] - ( fn( v[ m ], v[ m ], v[ m - 1 ], v[ m - 1 ], f - m ) - v[ m ] );
+
+			return fn( v[ i ? i - 1 : 0 ], v[ i ], v[ m < i + 1 ? m : i + 1 ], v[ m < i + 2 ? m : i + 2 ], f - i );
+
+		}
+
+	},
+
+	Utils: {
+
+		Linear: function ( p0, p1, t ) {
+
+			return ( p1 - p0 ) * t + p0;
+
+		},
+
+		Bernstein: function ( n , i ) {
+
+			var fc = TWEEN.Interpolation.Utils.Factorial;
+			return fc( n ) / fc( i ) / fc( n - i );
+
+		},
+
+		Factorial: ( function () {
+
+			var a = [ 1 ];
+
+			return function ( n ) {
+
+				var s = 1, i;
+				if ( a[ n ] ) return a[ n ];
+				for ( i = n; i > 1; i-- ) s *= i;
+				return a[ n ] = s;
+
+			};
+
+		} )(),
+
+		CatmullRom: function ( p0, p1, p2, p3, t ) {
+
+			var v0 = ( p2 - p0 ) * 0.5, v1 = ( p3 - p1 ) * 0.5, t2 = t * t, t3 = t * t2;
+			return ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;
+
+		}
+
+	}
+
+};

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 11 - 0
public/static/lib/animate/animate.min.css


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 1 - 0
public/static/lib/base64.min.js


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 90 - 0
public/static/lib/bytebuffer.min.js


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 7 - 0
public/static/lib/clipboard.min.js


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 7 - 0
public/static/lib/events.js


+ 90 - 0
public/static/lib/flexible.js

@@ -0,0 +1,90 @@
+;
+(function(win) {
+    var doc = win.document;
+    var docEl = doc.documentElement;
+    var metaEl = doc.querySelector('meta[name="viewport"]');
+    var dpr = 0;
+    var scale = 0;
+    var tid;
+    var flexible = {};
+    if (metaEl) {
+        console.warn('将根据已有的meta标签来设置缩放比例');
+        var match = metaEl.getAttribute('content').match(/initial-scale=([d.]+)/);
+        if (match) {
+            scale = parseFloat(match[1]);
+            dpr = parseInt(1 / scale);
+        }
+    }
+    if (!dpr && !scale) {
+        var isIPhone = win.navigator.appVersion.match(/iphone/gi);
+        var devicePixelRatio = win.devicePixelRatio;
+        if (isIPhone) {
+            // iOS下,对于2和3的屏,用2倍的方案,其余的用1倍方案
+            if (devicePixelRatio >= 3 && (!dpr || dpr >= 3)) {
+                dpr = 3;
+            } else if (devicePixelRatio >= 2 && (!dpr || dpr >= 2)) {
+                dpr = 2;
+            } else {
+                dpr = 1;
+            }
+        } else {
+            // 其他设备下,仍旧使用1倍的方案
+            dpr = 1;
+        }
+        scale = 1 / dpr;
+    }
+    docEl.setAttribute('data-dpr', dpr);
+    if (!metaEl) {
+        metaEl = doc.createElement('meta');
+        metaEl.setAttribute('name', 'viewport');
+        metaEl.setAttribute('content', 'initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no');
+        if (docEl.firstElementChild) {
+            docEl.firstElementChild.appendChild(metaEl);
+        } else {
+            var wrap = doc.createElement('div');
+            wrap.appendChild(metaEl);
+            doc.write(wrap.innerHTML);
+        }
+    }
+
+    function refreshRem() {
+        var width = docEl && docEl.clientWidth || doc.body.clientWidth || win.innerWidth;
+        var rem = width / 10;
+        docEl.style.fontSize = rem + 'px';
+        flexible.rem = win.rem = rem;
+    }
+    win.addEventListener('resize', function() {
+        clearTimeout(tid);
+        tid = setTimeout(refreshRem, 300);
+    }, false);
+    win.addEventListener('pageshow', function(e) {
+        if (e.persisted) {
+            clearTimeout(tid);
+            tid = setTimeout(refreshRem, 300);
+        }
+    }, false);
+
+    if (doc.readyState === 'complete') {
+        doc.body.style.fontSize = 12 * dpr + 'px';
+    } else {
+        doc.addEventListener('DOMContentLoaded', function(e) {
+            doc.body.style.fontSize = 12 * dpr + 'px';
+        }, false);
+    }
+    refreshRem();
+    flexible.rem2px = function(d) {
+        var val = parseFloat(d) * this.rem;
+        if (typeof d === 'string' && d.match(/rem$/)) {
+            val += 'px';
+        }
+        return val;
+    }
+    flexible.px2rem = function(d) {
+        var val = parseFloat(d) / this.rem;
+        if (typeof d === 'string' && d.match(/px$/)) {
+            val += 'rem';
+        }
+        return val;
+    }
+    win.flexible = flexible;
+})(window);

+ 109 - 0
public/static/lib/flexible.min.js

@@ -0,0 +1,109 @@
+(function(win, lib) {
+    var doc = win.document;
+    var docEl = doc.documentElement;
+    var metaEl = doc.querySelector('meta[name="viewport"]');
+    var flexibleEl = doc.querySelector('meta[name="flexible"]');
+    var dpr = 0;
+    var scale = 0;
+    var tid;
+    var flexible = lib.flexible || (lib.flexible = {});
+     
+    if (metaEl) {
+        console.warn('将根据已有的meta标签来设置缩放比例');
+        var match = metaEl.getAttribute('content').match(/initial\-scale=([\d\.]+)/);
+        if (match) {
+            scale = parseFloat(match[1]);
+            dpr = parseInt(1 / scale);
+        }
+    } else if (flexibleEl) {
+        var content = flexibleEl.getAttribute('content');
+        if (content) {
+            var initialDpr = content.match(/initial\-dpr=([\d\.]+)/);
+            var maximumDpr = content.match(/maximum\-dpr=([\d\.]+)/);
+            if (initialDpr) {
+                dpr = parseFloat(initialDpr[1]);
+                scale = parseFloat((1 / dpr).toFixed(2));   
+            }
+            if (maximumDpr) {
+                dpr = parseFloat(maximumDpr[1]);
+                scale = parseFloat((1 / dpr).toFixed(2));   
+            }
+        }
+    }
+    if (!dpr && !scale) {
+        var isAndroid = win.navigator.appVersion.match(/android/gi);
+        var isIPhone = win.navigator.appVersion.match(/iphone/gi);
+        var devicePixelRatio = win.devicePixelRatio;
+        if (isIPhone) {
+            // iOS下,对于2和3的屏,用2倍的方案,其余的用1倍方案
+            if (devicePixelRatio >= 3 && (!dpr || dpr >= 3)) {               
+                dpr = 3;
+            } else if (devicePixelRatio >= 2 && (!dpr || dpr >= 2)){
+                dpr = 2;
+            } else {
+                dpr = 1;
+            }
+        } else {
+            // 其他设备下,仍旧使用1倍的方案
+            dpr = 1;
+        }
+        scale = 1 / dpr;
+    }
+    docEl.setAttribute('data-dpr', dpr);
+    if (!metaEl) {
+        metaEl = doc.createElement('meta');
+        metaEl.setAttribute('name', 'viewport');
+        metaEl.setAttribute('content', 'initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no');
+        if (docEl.firstElementChild) {
+            docEl.firstElementChild.appendChild(metaEl);
+        } else {
+            var wrap = doc.createElement('div');
+            wrap.appendChild(metaEl);
+            doc.write(wrap.innerHTML);
+        }
+    }
+    function refreshRem(){
+        var width = docEl.getBoundingClientRect().width;
+        if (width / dpr > 540) {
+            width = 540 * dpr;
+        }
+        var rem = width / 10;
+        docEl.style.fontSize = rem + 'px';
+        flexible.rem = win.rem = rem;
+    }
+    win.addEventListener('resize', function() {
+        clearTimeout(tid);
+        tid = setTimeout(refreshRem, 300);
+    }, false);
+    win.addEventListener('pageshow', function(e) {
+        if (e.persisted) {
+            clearTimeout(tid);
+            tid = setTimeout(refreshRem, 300);
+        }
+    }, false);
+    if (doc.readyState === 'complete') {
+        doc.body.style.fontSize = 12 * dpr + 'px';
+    } else {
+        doc.addEventListener('DOMContentLoaded', function(e) {
+            doc.body.style.fontSize = 12 * dpr + 'px';
+        }, false);
+    }
+     
+    refreshRem();
+    flexible.dpr = win.dpr = dpr;
+    flexible.refreshRem = refreshRem;
+    flexible.rem2px = function(d) {
+        var val = parseFloat(d) * this.rem;
+        if (typeof d === 'string' && d.match(/rem$/)) {
+            val += 'px';
+        }
+        return val;
+    }
+    flexible.px2rem = function(d) {
+        var val = parseFloat(d) / this.rem;
+        if (typeof d === 'string' && d.match(/px$/)) {
+            val += 'rem';
+        }
+        return val;
+    }
+})(window, window['lib'] || (window['lib'] = {}));

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 4 - 0
public/static/lib/howler.min.js


+ 539 - 0
public/static/lib/iconfont/demo.css

@@ -0,0 +1,539 @@
+/* Logo 字体 */
+@font-face {
+  font-family: "iconfont logo";
+  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');
+  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');
+}
+
+.logo {
+  font-family: "iconfont logo";
+  font-size: 160px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+/* tabs */
+.nav-tabs {
+  position: relative;
+}
+
+.nav-tabs .nav-more {
+  position: absolute;
+  right: 0;
+  bottom: 0;
+  height: 42px;
+  line-height: 42px;
+  color: #666;
+}
+
+#tabs {
+  border-bottom: 1px solid #eee;
+}
+
+#tabs li {
+  cursor: pointer;
+  width: 100px;
+  height: 40px;
+  line-height: 40px;
+  text-align: center;
+  font-size: 16px;
+  border-bottom: 2px solid transparent;
+  position: relative;
+  z-index: 1;
+  margin-bottom: -1px;
+  color: #666;
+}
+
+
+#tabs .active {
+  border-bottom-color: #f00;
+  color: #222;
+}
+
+.tab-container .content {
+  display: none;
+}
+
+/* 页面布局 */
+.main {
+  padding: 30px 100px;
+  width: 960px;
+  margin: 0 auto;
+}
+
+.main .logo {
+  color: #333;
+  text-align: left;
+  margin-bottom: 30px;
+  line-height: 1;
+  height: 110px;
+  margin-top: -50px;
+  overflow: hidden;
+  *zoom: 1;
+}
+
+.main .logo a {
+  font-size: 160px;
+  color: #333;
+}
+
+.helps {
+  margin-top: 40px;
+}
+
+.helps pre {
+  padding: 20px;
+  margin: 10px 0;
+  border: solid 1px #e7e1cd;
+  background-color: #fffdef;
+  overflow: auto;
+}
+
+.icon_lists {
+  width: 100% !important;
+  overflow: hidden;
+  *zoom: 1;
+}
+
+.icon_lists li {
+  width: 100px;
+  margin-bottom: 10px;
+  margin-right: 20px;
+  text-align: center;
+  list-style: none !important;
+  cursor: default;
+}
+
+.icon_lists li .code-name {
+  line-height: 1.2;
+}
+
+.icon_lists .icon {
+  display: block;
+  height: 100px;
+  line-height: 100px;
+  font-size: 42px;
+  margin: 10px auto;
+  color: #333;
+  -webkit-transition: font-size 0.25s linear, width 0.25s linear;
+  -moz-transition: font-size 0.25s linear, width 0.25s linear;
+  transition: font-size 0.25s linear, width 0.25s linear;
+}
+
+.icon_lists .icon:hover {
+  font-size: 100px;
+}
+
+.icon_lists .svg-icon {
+  /* 通过设置 font-size 来改变图标大小 */
+  width: 1em;
+  /* 图标和文字相邻时,垂直对齐 */
+  vertical-align: -0.15em;
+  /* 通过设置 color 来改变 SVG 的颜色/fill */
+  fill: currentColor;
+  /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示
+      normalize.css 中也包含这行 */
+  overflow: hidden;
+}
+
+.icon_lists li .name,
+.icon_lists li .code-name {
+  color: #666;
+}
+
+/* markdown 样式 */
+.markdown {
+  color: #666;
+  font-size: 14px;
+  line-height: 1.8;
+}
+
+.highlight {
+  line-height: 1.5;
+}
+
+.markdown img {
+  vertical-align: middle;
+  max-width: 100%;
+}
+
+.markdown h1 {
+  color: #404040;
+  font-weight: 500;
+  line-height: 40px;
+  margin-bottom: 24px;
+}
+
+.markdown h2,
+.markdown h3,
+.markdown h4,
+.markdown h5,
+.markdown h6 {
+  color: #404040;
+  margin: 1.6em 0 0.6em 0;
+  font-weight: 500;
+  clear: both;
+}
+
+.markdown h1 {
+  font-size: 28px;
+}
+
+.markdown h2 {
+  font-size: 22px;
+}
+
+.markdown h3 {
+  font-size: 16px;
+}
+
+.markdown h4 {
+  font-size: 14px;
+}
+
+.markdown h5 {
+  font-size: 12px;
+}
+
+.markdown h6 {
+  font-size: 12px;
+}
+
+.markdown hr {
+  height: 1px;
+  border: 0;
+  background: #e9e9e9;
+  margin: 16px 0;
+  clear: both;
+}
+
+.markdown p {
+  margin: 1em 0;
+}
+
+.markdown>p,
+.markdown>blockquote,
+.markdown>.highlight,
+.markdown>ol,
+.markdown>ul {
+  width: 80%;
+}
+
+.markdown ul>li {
+  list-style: circle;
+}
+
+.markdown>ul li,
+.markdown blockquote ul>li {
+  margin-left: 20px;
+  padding-left: 4px;
+}
+
+.markdown>ul li p,
+.markdown>ol li p {
+  margin: 0.6em 0;
+}
+
+.markdown ol>li {
+  list-style: decimal;
+}
+
+.markdown>ol li,
+.markdown blockquote ol>li {
+  margin-left: 20px;
+  padding-left: 4px;
+}
+
+.markdown code {
+  margin: 0 3px;
+  padding: 0 5px;
+  background: #eee;
+  border-radius: 3px;
+}
+
+.markdown strong,
+.markdown b {
+  font-weight: 600;
+}
+
+.markdown>table {
+  border-collapse: collapse;
+  border-spacing: 0px;
+  empty-cells: show;
+  border: 1px solid #e9e9e9;
+  width: 95%;
+  margin-bottom: 24px;
+}
+
+.markdown>table th {
+  white-space: nowrap;
+  color: #333;
+  font-weight: 600;
+}
+
+.markdown>table th,
+.markdown>table td {
+  border: 1px solid #e9e9e9;
+  padding: 8px 16px;
+  text-align: left;
+}
+
+.markdown>table th {
+  background: #F7F7F7;
+}
+
+.markdown blockquote {
+  font-size: 90%;
+  color: #999;
+  border-left: 4px solid #e9e9e9;
+  padding-left: 0.8em;
+  margin: 1em 0;
+}
+
+.markdown blockquote p {
+  margin: 0;
+}
+
+.markdown .anchor {
+  opacity: 0;
+  transition: opacity 0.3s ease;
+  margin-left: 8px;
+}
+
+.markdown .waiting {
+  color: #ccc;
+}
+
+.markdown h1:hover .anchor,
+.markdown h2:hover .anchor,
+.markdown h3:hover .anchor,
+.markdown h4:hover .anchor,
+.markdown h5:hover .anchor,
+.markdown h6:hover .anchor {
+  opacity: 1;
+  display: inline-block;
+}
+
+.markdown>br,
+.markdown>p>br {
+  clear: both;
+}
+
+
+.hljs {
+  display: block;
+  background: white;
+  padding: 0.5em;
+  color: #333333;
+  overflow-x: auto;
+}
+
+.hljs-comment,
+.hljs-meta {
+  color: #969896;
+}
+
+.hljs-string,
+.hljs-variable,
+.hljs-template-variable,
+.hljs-strong,
+.hljs-emphasis,
+.hljs-quote {
+  color: #df5000;
+}
+
+.hljs-keyword,
+.hljs-selector-tag,
+.hljs-type {
+  color: #a71d5d;
+}
+
+.hljs-literal,
+.hljs-symbol,
+.hljs-bullet,
+.hljs-attribute {
+  color: #0086b3;
+}
+
+.hljs-section,
+.hljs-name {
+  color: #63a35c;
+}
+
+.hljs-tag {
+  color: #333333;
+}
+
+.hljs-title,
+.hljs-attr,
+.hljs-selector-id,
+.hljs-selector-class,
+.hljs-selector-attr,
+.hljs-selector-pseudo {
+  color: #795da3;
+}
+
+.hljs-addition {
+  color: #55a532;
+  background-color: #eaffea;
+}
+
+.hljs-deletion {
+  color: #bd2c00;
+  background-color: #ffecec;
+}
+
+.hljs-link {
+  text-decoration: underline;
+}
+
+/* 代码高亮 */
+/* PrismJS 1.15.0
+https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
+/**
+ * prism.js default theme for JavaScript, CSS and HTML
+ * Based on dabblet (http://dabblet.com)
+ * @author Lea Verou
+ */
+code[class*="language-"],
+pre[class*="language-"] {
+  color: black;
+  background: none;
+  text-shadow: 0 1px white;
+  font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
+  text-align: left;
+  white-space: pre;
+  word-spacing: normal;
+  word-break: normal;
+  word-wrap: normal;
+  line-height: 1.5;
+
+  -moz-tab-size: 4;
+  -o-tab-size: 4;
+  tab-size: 4;
+
+  -webkit-hyphens: none;
+  -moz-hyphens: none;
+  -ms-hyphens: none;
+  hyphens: none;
+}
+
+pre[class*="language-"]::-moz-selection,
+pre[class*="language-"] ::-moz-selection,
+code[class*="language-"]::-moz-selection,
+code[class*="language-"] ::-moz-selection {
+  text-shadow: none;
+  background: #b3d4fc;
+}
+
+pre[class*="language-"]::selection,
+pre[class*="language-"] ::selection,
+code[class*="language-"]::selection,
+code[class*="language-"] ::selection {
+  text-shadow: none;
+  background: #b3d4fc;
+}
+
+@media print {
+
+  code[class*="language-"],
+  pre[class*="language-"] {
+    text-shadow: none;
+  }
+}
+
+/* Code blocks */
+pre[class*="language-"] {
+  padding: 1em;
+  margin: .5em 0;
+  overflow: auto;
+}
+
+:not(pre)>code[class*="language-"],
+pre[class*="language-"] {
+  background: #f5f2f0;
+}
+
+/* Inline code */
+:not(pre)>code[class*="language-"] {
+  padding: .1em;
+  border-radius: .3em;
+  white-space: normal;
+}
+
+.token.comment,
+.token.prolog,
+.token.doctype,
+.token.cdata {
+  color: slategray;
+}
+
+.token.punctuation {
+  color: #999;
+}
+
+.namespace {
+  opacity: .7;
+}
+
+.token.property,
+.token.tag,
+.token.boolean,
+.token.number,
+.token.constant,
+.token.symbol,
+.token.deleted {
+  color: #905;
+}
+
+.token.selector,
+.token.attr-name,
+.token.string,
+.token.char,
+.token.builtin,
+.token.inserted {
+  color: #690;
+}
+
+.token.operator,
+.token.entity,
+.token.url,
+.language-css .token.string,
+.style .token.string {
+  color: #9a6e3a;
+  background: hsla(0, 0%, 100%, .5);
+}
+
+.token.atrule,
+.token.attr-value,
+.token.keyword {
+  color: #07a;
+}
+
+.token.function,
+.token.class-name {
+  color: #DD4A68;
+}
+
+.token.regex,
+.token.important,
+.token.variable {
+  color: #e90;
+}
+
+.token.important,
+.token.bold {
+  font-weight: bold;
+}
+
+.token.italic {
+  font-style: italic;
+}
+
+.token.entity {
+  cursor: help;
+}

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 5161 - 0
public/static/lib/iconfont/demo_index.html


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 885 - 0
public/static/lib/iconfont/iconfont.css


BIN
public/static/lib/iconfont/iconfont.eot


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 1 - 0
public/static/lib/iconfont/iconfont.js


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 1528 - 0
public/static/lib/iconfont/iconfont.json


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 677 - 0
public/static/lib/iconfont/iconfont.svg


BIN
public/static/lib/iconfont/iconfont.ttf


BIN
public/static/lib/iconfont/iconfont.woff


BIN
public/static/lib/iconfont/iconfont.woff2


+ 539 - 0
public/static/lib/iconfontQJ/demo.css

@@ -0,0 +1,539 @@
+/* Logo 字体 */
+@font-face {
+  font-family: "iconfont logo";
+  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');
+  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');
+}
+
+.logo {
+  font-family: "iconfont logo";
+  font-size: 160px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+/* tabs */
+.nav-tabs {
+  position: relative;
+}
+
+.nav-tabs .nav-more {
+  position: absolute;
+  right: 0;
+  bottom: 0;
+  height: 42px;
+  line-height: 42px;
+  color: #666;
+}
+
+#tabs {
+  border-bottom: 1px solid #eee;
+}
+
+#tabs li {
+  cursor: pointer;
+  width: 100px;
+  height: 40px;
+  line-height: 40px;
+  text-align: center;
+  font-size: 16px;
+  border-bottom: 2px solid transparent;
+  position: relative;
+  z-index: 1;
+  margin-bottom: -1px;
+  color: #666;
+}
+
+
+#tabs .active {
+  border-bottom-color: #f00;
+  color: #222;
+}
+
+.tab-container .content {
+  display: none;
+}
+
+/* 页面布局 */
+.main {
+  padding: 30px 100px;
+  width: 960px;
+  margin: 0 auto;
+}
+
+.main .logo {
+  color: #333;
+  text-align: left;
+  margin-bottom: 30px;
+  line-height: 1;
+  height: 110px;
+  margin-top: -50px;
+  overflow: hidden;
+  *zoom: 1;
+}
+
+.main .logo a {
+  font-size: 160px;
+  color: #333;
+}
+
+.helps {
+  margin-top: 40px;
+}
+
+.helps pre {
+  padding: 20px;
+  margin: 10px 0;
+  border: solid 1px #e7e1cd;
+  background-color: #fffdef;
+  overflow: auto;
+}
+
+.icon_lists {
+  width: 100% !important;
+  overflow: hidden;
+  *zoom: 1;
+}
+
+.icon_lists li {
+  width: 100px;
+  margin-bottom: 10px;
+  margin-right: 20px;
+  text-align: center;
+  list-style: none !important;
+  cursor: default;
+}
+
+.icon_lists li .code-name {
+  line-height: 1.2;
+}
+
+.icon_lists .icon {
+  display: block;
+  height: 100px;
+  line-height: 100px;
+  font-size: 42px;
+  margin: 10px auto;
+  color: #333;
+  -webkit-transition: font-size 0.25s linear, width 0.25s linear;
+  -moz-transition: font-size 0.25s linear, width 0.25s linear;
+  transition: font-size 0.25s linear, width 0.25s linear;
+}
+
+.icon_lists .icon:hover {
+  font-size: 100px;
+}
+
+.icon_lists .svg-icon {
+  /* 通过设置 font-size 来改变图标大小 */
+  width: 1em;
+  /* 图标和文字相邻时,垂直对齐 */
+  vertical-align: -0.15em;
+  /* 通过设置 color 来改变 SVG 的颜色/fill */
+  fill: currentColor;
+  /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示
+      normalize.css 中也包含这行 */
+  overflow: hidden;
+}
+
+.icon_lists li .name,
+.icon_lists li .code-name {
+  color: #666;
+}
+
+/* markdown 样式 */
+.markdown {
+  color: #666;
+  font-size: 14px;
+  line-height: 1.8;
+}
+
+.highlight {
+  line-height: 1.5;
+}
+
+.markdown img {
+  vertical-align: middle;
+  max-width: 100%;
+}
+
+.markdown h1 {
+  color: #404040;
+  font-weight: 500;
+  line-height: 40px;
+  margin-bottom: 24px;
+}
+
+.markdown h2,
+.markdown h3,
+.markdown h4,
+.markdown h5,
+.markdown h6 {
+  color: #404040;
+  margin: 1.6em 0 0.6em 0;
+  font-weight: 500;
+  clear: both;
+}
+
+.markdown h1 {
+  font-size: 28px;
+}
+
+.markdown h2 {
+  font-size: 22px;
+}
+
+.markdown h3 {
+  font-size: 16px;
+}
+
+.markdown h4 {
+  font-size: 14px;
+}
+
+.markdown h5 {
+  font-size: 12px;
+}
+
+.markdown h6 {
+  font-size: 12px;
+}
+
+.markdown hr {
+  height: 1px;
+  border: 0;
+  background: #e9e9e9;
+  margin: 16px 0;
+  clear: both;
+}
+
+.markdown p {
+  margin: 1em 0;
+}
+
+.markdown>p,
+.markdown>blockquote,
+.markdown>.highlight,
+.markdown>ol,
+.markdown>ul {
+  width: 80%;
+}
+
+.markdown ul>li {
+  list-style: circle;
+}
+
+.markdown>ul li,
+.markdown blockquote ul>li {
+  margin-left: 20px;
+  padding-left: 4px;
+}
+
+.markdown>ul li p,
+.markdown>ol li p {
+  margin: 0.6em 0;
+}
+
+.markdown ol>li {
+  list-style: decimal;
+}
+
+.markdown>ol li,
+.markdown blockquote ol>li {
+  margin-left: 20px;
+  padding-left: 4px;
+}
+
+.markdown code {
+  margin: 0 3px;
+  padding: 0 5px;
+  background: #eee;
+  border-radius: 3px;
+}
+
+.markdown strong,
+.markdown b {
+  font-weight: 600;
+}
+
+.markdown>table {
+  border-collapse: collapse;
+  border-spacing: 0px;
+  empty-cells: show;
+  border: 1px solid #e9e9e9;
+  width: 95%;
+  margin-bottom: 24px;
+}
+
+.markdown>table th {
+  white-space: nowrap;
+  color: #333;
+  font-weight: 600;
+}
+
+.markdown>table th,
+.markdown>table td {
+  border: 1px solid #e9e9e9;
+  padding: 8px 16px;
+  text-align: left;
+}
+
+.markdown>table th {
+  background: #F7F7F7;
+}
+
+.markdown blockquote {
+  font-size: 90%;
+  color: #999;
+  border-left: 4px solid #e9e9e9;
+  padding-left: 0.8em;
+  margin: 1em 0;
+}
+
+.markdown blockquote p {
+  margin: 0;
+}
+
+.markdown .anchor {
+  opacity: 0;
+  transition: opacity 0.3s ease;
+  margin-left: 8px;
+}
+
+.markdown .waiting {
+  color: #ccc;
+}
+
+.markdown h1:hover .anchor,
+.markdown h2:hover .anchor,
+.markdown h3:hover .anchor,
+.markdown h4:hover .anchor,
+.markdown h5:hover .anchor,
+.markdown h6:hover .anchor {
+  opacity: 1;
+  display: inline-block;
+}
+
+.markdown>br,
+.markdown>p>br {
+  clear: both;
+}
+
+
+.hljs {
+  display: block;
+  background: white;
+  padding: 0.5em;
+  color: #333333;
+  overflow-x: auto;
+}
+
+.hljs-comment,
+.hljs-meta {
+  color: #969896;
+}
+
+.hljs-string,
+.hljs-variable,
+.hljs-template-variable,
+.hljs-strong,
+.hljs-emphasis,
+.hljs-quote {
+  color: #df5000;
+}
+
+.hljs-keyword,
+.hljs-selector-tag,
+.hljs-type {
+  color: #a71d5d;
+}
+
+.hljs-literal,
+.hljs-symbol,
+.hljs-bullet,
+.hljs-attribute {
+  color: #0086b3;
+}
+
+.hljs-section,
+.hljs-name {
+  color: #63a35c;
+}
+
+.hljs-tag {
+  color: #333333;
+}
+
+.hljs-title,
+.hljs-attr,
+.hljs-selector-id,
+.hljs-selector-class,
+.hljs-selector-attr,
+.hljs-selector-pseudo {
+  color: #795da3;
+}
+
+.hljs-addition {
+  color: #55a532;
+  background-color: #eaffea;
+}
+
+.hljs-deletion {
+  color: #bd2c00;
+  background-color: #ffecec;
+}
+
+.hljs-link {
+  text-decoration: underline;
+}
+
+/* 代码高亮 */
+/* PrismJS 1.15.0
+https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
+/**
+ * prism.js default theme for JavaScript, CSS and HTML
+ * Based on dabblet (http://dabblet.com)
+ * @author Lea Verou
+ */
+code[class*="language-"],
+pre[class*="language-"] {
+  color: black;
+  background: none;
+  text-shadow: 0 1px white;
+  font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
+  text-align: left;
+  white-space: pre;
+  word-spacing: normal;
+  word-break: normal;
+  word-wrap: normal;
+  line-height: 1.5;
+
+  -moz-tab-size: 4;
+  -o-tab-size: 4;
+  tab-size: 4;
+
+  -webkit-hyphens: none;
+  -moz-hyphens: none;
+  -ms-hyphens: none;
+  hyphens: none;
+}
+
+pre[class*="language-"]::-moz-selection,
+pre[class*="language-"] ::-moz-selection,
+code[class*="language-"]::-moz-selection,
+code[class*="language-"] ::-moz-selection {
+  text-shadow: none;
+  background: #b3d4fc;
+}
+
+pre[class*="language-"]::selection,
+pre[class*="language-"] ::selection,
+code[class*="language-"]::selection,
+code[class*="language-"] ::selection {
+  text-shadow: none;
+  background: #b3d4fc;
+}
+
+@media print {
+
+  code[class*="language-"],
+  pre[class*="language-"] {
+    text-shadow: none;
+  }
+}
+
+/* Code blocks */
+pre[class*="language-"] {
+  padding: 1em;
+  margin: .5em 0;
+  overflow: auto;
+}
+
+:not(pre)>code[class*="language-"],
+pre[class*="language-"] {
+  background: #f5f2f0;
+}
+
+/* Inline code */
+:not(pre)>code[class*="language-"] {
+  padding: .1em;
+  border-radius: .3em;
+  white-space: normal;
+}
+
+.token.comment,
+.token.prolog,
+.token.doctype,
+.token.cdata {
+  color: slategray;
+}
+
+.token.punctuation {
+  color: #999;
+}
+
+.namespace {
+  opacity: .7;
+}
+
+.token.property,
+.token.tag,
+.token.boolean,
+.token.number,
+.token.constant,
+.token.symbol,
+.token.deleted {
+  color: #905;
+}
+
+.token.selector,
+.token.attr-name,
+.token.string,
+.token.char,
+.token.builtin,
+.token.inserted {
+  color: #690;
+}
+
+.token.operator,
+.token.entity,
+.token.url,
+.language-css .token.string,
+.style .token.string {
+  color: #9a6e3a;
+  background: hsla(0, 0%, 100%, .5);
+}
+
+.token.atrule,
+.token.attr-value,
+.token.keyword {
+  color: #07a;
+}
+
+.token.function,
+.token.class-name {
+  color: #DD4A68;
+}
+
+.token.regex,
+.token.important,
+.token.variable {
+  color: #e90;
+}
+
+.token.important,
+.token.bold {
+  font-weight: bold;
+}
+
+.token.italic {
+  font-style: italic;
+}
+
+.token.entity {
+  cursor: help;
+}

+ 676 - 0
public/static/lib/iconfontQJ/demo_index.html

@@ -0,0 +1,676 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8"/>
+  <title>IconFont Demo</title>
+  <link rel="shortcut icon" href="https://img.alicdn.com/tps/i4/TB1_oz6GVXXXXaFXpXXJDFnIXXX-64-64.ico" type="image/x-icon"/>
+  <link rel="stylesheet" href="https://g.alicdn.com/thx/cube/1.3.2/cube.min.css">
+  <link rel="stylesheet" href="demo.css">
+  <link rel="stylesheet" href="iconfont.css">
+  <script src="iconfont.js"></script>
+  <!-- jQuery -->
+  <script src="https://a1.alicdn.com/oss/uploads/2018/12/26/7bfddb60-08e8-11e9-9b04-53e73bb6408b.js"></script>
+  <!-- 代码高亮 -->
+  <script src="https://a1.alicdn.com/oss/uploads/2018/12/26/a3f714d0-08e6-11e9-8a15-ebf944d7534c.js"></script>
+</head>
+<body>
+  <div class="main">
+    <h1 class="logo"><a href="https://www.iconfont.cn/" title="iconfont 首页" target="_blank">&#xe86b;</a></h1>
+    <div class="nav-tabs">
+      <ul id="tabs" class="dib-box">
+        <li class="dib active"><span>Unicode</span></li>
+        <li class="dib"><span>Font class</span></li>
+        <li class="dib"><span>Symbol</span></li>
+      </ul>
+      
+      <a href="https://www.iconfont.cn/manage/index?manage_type=myprojects&projectId=2342812" target="_blank" class="nav-more">查看项目</a>
+      
+    </div>
+    <div class="tab-container">
+      <div class="content unicode" style="display: block;">
+          <ul class="icon_lists dib-box">
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe749;</span>
+                <div class="name">预览</div>
+                <div class="code-name">&amp;#xe749;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe74a;</span>
+                <div class="name">场景导航</div>
+                <div class="code-name">&amp;#xe74a;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe729;</span>
+                <div class="name">jump_edit</div>
+                <div class="code-name">&amp;#xe729;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe733;</span>
+                <div class="name">mod_help</div>
+                <div class="code-name">&amp;#xe733;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe673;</span>
+                <div class="name">show_drop-down</div>
+                <div class="code-name">&amp;#xe673;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe609;</span>
+                <div class="name">返回</div>
+                <div class="code-name">&amp;#xe609;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe627;</span>
+                <div class="name">前往</div>
+                <div class="code-name">&amp;#xe627;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe63a;</span>
+                <div class="name">勾</div>
+                <div class="code-name">&amp;#xe63a;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe64a;</span>
+                <div class="name">+</div>
+                <div class="code-name">&amp;#xe64a;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe628;</span>
+                <div class="name">search</div>
+                <div class="code-name">&amp;#xe628;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe671;</span>
+                <div class="name">勾选</div>
+                <div class="code-name">&amp;#xe671;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe600;</span>
+                <div class="name">more read</div>
+                <div class="code-name">&amp;#xe600;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe6ca;</span>
+                <div class="name">close</div>
+                <div class="code-name">&amp;#xe6ca;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe6e3;</span>
+                <div class="name">scene_map_3d</div>
+                <div class="code-name">&amp;#xe6e3;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe703;</span>
+                <div class="name">photoview</div>
+                <div class="code-name">&amp;#xe703;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe726;</span>
+                <div class="name">exit_dot</div>
+                <div class="code-name">&amp;#xe726;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe727;</span>
+                <div class="name">panorama_dot</div>
+                <div class="code-name">&amp;#xe727;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe728;</span>
+                <div class="name">Jump</div>
+                <div class="code-name">&amp;#xe728;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe617;</span>
+                <div class="name">热点</div>
+                <div class="code-name">&amp;#xe617;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe629;</span>
+                <div class="name">保存</div>
+                <div class="code-name">&amp;#xe629;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe62b;</span>
+                <div class="name">初始画面</div>
+                <div class="code-name">&amp;#xe62b;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe672;</span>
+                <div class="name">基础设置</div>
+                <div class="code-name">&amp;#xe672;</div>
+              </li>
+          
+          </ul>
+          <div class="article markdown">
+          <h2 id="unicode-">Unicode 引用</h2>
+          <hr>
+
+          <p>Unicode 是字体在网页端最原始的应用方式,特点是:</p>
+          <ul>
+            <li>兼容性最好,支持 IE6+,及所有现代浏览器。</li>
+            <li>支持按字体的方式去动态调整图标大小,颜色等等。</li>
+            <li>但是因为是字体,所以不支持多色。只能使用平台里单色的图标,就算项目里有多色图标也会自动去色。</li>
+          </ul>
+          <blockquote>
+            <p>注意:新版 iconfont 支持多色图标,这些多色图标在 Unicode 模式下将不能使用,如果有需求建议使用symbol 的引用方式</p>
+          </blockquote>
+          <p>Unicode 使用步骤如下:</p>
+          <h3 id="-font-face">第一步:拷贝项目下面生成的 <code>@font-face</code></h3>
+<pre><code class="language-css"
+>@font-face {
+  font-family: 'iconfont';
+  src: url('iconfont.eot');
+  src: url('iconfont.eot?#iefix') format('embedded-opentype'),
+      url('iconfont.woff2') format('woff2'),
+      url('iconfont.woff') format('woff'),
+      url('iconfont.ttf') format('truetype'),
+      url('iconfont.svg#iconfont') format('svg');
+}
+</code></pre>
+          <h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
+<pre><code class="language-css"
+>.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+</code></pre>
+          <h3 id="-">第三步:挑选相应图标并获取字体编码,应用于页面</h3>
+<pre>
+<code class="language-html"
+>&lt;span class="iconfont"&gt;&amp;#x33;&lt;/span&gt;
+</code></pre>
+          <blockquote>
+            <p>"iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。</p>
+          </blockquote>
+          </div>
+      </div>
+      <div class="content font-class">
+        <ul class="icon_lists dib-box">
+          
+          <li class="dib">
+            <span class="icon iconfont iconyulan"></span>
+            <div class="name">
+              预览
+            </div>
+            <div class="code-name">.iconyulan
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iconchangjingdaohang"></span>
+            <div class="name">
+              场景导航
+            </div>
+            <div class="code-name">.iconchangjingdaohang
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iconjump_edit"></span>
+            <div class="name">
+              jump_edit
+            </div>
+            <div class="code-name">.iconjump_edit
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iconmod_help"></span>
+            <div class="name">
+              mod_help
+            </div>
+            <div class="code-name">.iconmod_help
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iconshow_drop-down"></span>
+            <div class="name">
+              show_drop-down
+            </div>
+            <div class="code-name">.iconshow_drop-down
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon_back"></span>
+            <div class="name">
+              返回
+            </div>
+            <div class="code-name">.icon_back
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon_forward"></span>
+            <div class="name">
+              前往
+            </div>
+            <div class="code-name">.icon_forward
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon_yes"></span>
+            <div class="name">
+              勾
+            </div>
+            <div class="code-name">.icon_yes
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon_plus"></span>
+            <div class="name">
+              +
+            </div>
+            <div class="code-name">.icon_plus
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iconsearch"></span>
+            <div class="name">
+              search
+            </div>
+            <div class="code-name">.iconsearch
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon_gou"></span>
+            <div class="name">
+              勾选
+            </div>
+            <div class="code-name">.icon_gou
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iconmore"></span>
+            <div class="name">
+              more read
+            </div>
+            <div class="code-name">.iconmore
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iconclose"></span>
+            <div class="name">
+              close
+            </div>
+            <div class="code-name">.iconclose
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iconscene_map_3d"></span>
+            <div class="name">
+              scene_map_3d
+            </div>
+            <div class="code-name">.iconscene_map_3d
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iconphotoview"></span>
+            <div class="name">
+              photoview
+            </div>
+            <div class="code-name">.iconphotoview
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iconexit_dot"></span>
+            <div class="name">
+              exit_dot
+            </div>
+            <div class="code-name">.iconexit_dot
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iconpanorama_dot"></span>
+            <div class="name">
+              panorama_dot
+            </div>
+            <div class="code-name">.iconpanorama_dot
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iconjump"></span>
+            <div class="name">
+              Jump
+            </div>
+            <div class="code-name">.iconjump
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon_hotpoint"></span>
+            <div class="name">
+              热点
+            </div>
+            <div class="code-name">.icon_hotpoint
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon_save"></span>
+            <div class="name">
+              保存
+            </div>
+            <div class="code-name">.icon_save
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon_screen"></span>
+            <div class="name">
+              初始画面
+            </div>
+            <div class="code-name">.icon_screen
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon_base"></span>
+            <div class="name">
+              基础设置
+            </div>
+            <div class="code-name">.icon_base
+            </div>
+          </li>
+          
+        </ul>
+        <div class="article markdown">
+        <h2 id="font-class-">font-class 引用</h2>
+        <hr>
+
+        <p>font-class 是 Unicode 使用方式的一种变种,主要是解决 Unicode 书写不直观,语意不明确的问题。</p>
+        <p>与 Unicode 使用方式相比,具有如下特点:</p>
+        <ul>
+          <li>兼容性良好,支持 IE8+,及所有现代浏览器。</li>
+          <li>相比于 Unicode 语意明确,书写更直观。可以很容易分辨这个 icon 是什么。</li>
+          <li>因为使用 class 来定义图标,所以当要替换图标时,只需要修改 class 里面的 Unicode 引用。</li>
+          <li>不过因为本质上还是使用的字体,所以多色图标还是不支持的。</li>
+        </ul>
+        <p>使用步骤如下:</p>
+        <h3 id="-fontclass-">第一步:引入项目下面生成的 fontclass 代码:</h3>
+<pre><code class="language-html">&lt;link rel="stylesheet" href="./iconfont.css"&gt;
+</code></pre>
+        <h3 id="-">第二步:挑选相应图标并获取类名,应用于页面:</h3>
+<pre><code class="language-html">&lt;span class="iconfont iconxxx"&gt;&lt;/span&gt;
+</code></pre>
+        <blockquote>
+          <p>"
+            iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。</p>
+        </blockquote>
+      </div>
+      </div>
+      <div class="content symbol">
+          <ul class="icon_lists dib-box">
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iconyulan"></use>
+                </svg>
+                <div class="name">预览</div>
+                <div class="code-name">#iconyulan</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iconchangjingdaohang"></use>
+                </svg>
+                <div class="name">场景导航</div>
+                <div class="code-name">#iconchangjingdaohang</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iconjump_edit"></use>
+                </svg>
+                <div class="name">jump_edit</div>
+                <div class="code-name">#iconjump_edit</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iconmod_help"></use>
+                </svg>
+                <div class="name">mod_help</div>
+                <div class="code-name">#iconmod_help</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iconshow_drop-down"></use>
+                </svg>
+                <div class="name">show_drop-down</div>
+                <div class="code-name">#iconshow_drop-down</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon_back"></use>
+                </svg>
+                <div class="name">返回</div>
+                <div class="code-name">#icon_back</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon_forward"></use>
+                </svg>
+                <div class="name">前往</div>
+                <div class="code-name">#icon_forward</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon_yes"></use>
+                </svg>
+                <div class="name">勾</div>
+                <div class="code-name">#icon_yes</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon_plus"></use>
+                </svg>
+                <div class="name">+</div>
+                <div class="code-name">#icon_plus</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iconsearch"></use>
+                </svg>
+                <div class="name">search</div>
+                <div class="code-name">#iconsearch</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon_gou"></use>
+                </svg>
+                <div class="name">勾选</div>
+                <div class="code-name">#icon_gou</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iconmore"></use>
+                </svg>
+                <div class="name">more read</div>
+                <div class="code-name">#iconmore</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iconclose"></use>
+                </svg>
+                <div class="name">close</div>
+                <div class="code-name">#iconclose</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iconscene_map_3d"></use>
+                </svg>
+                <div class="name">scene_map_3d</div>
+                <div class="code-name">#iconscene_map_3d</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iconphotoview"></use>
+                </svg>
+                <div class="name">photoview</div>
+                <div class="code-name">#iconphotoview</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iconexit_dot"></use>
+                </svg>
+                <div class="name">exit_dot</div>
+                <div class="code-name">#iconexit_dot</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iconpanorama_dot"></use>
+                </svg>
+                <div class="name">panorama_dot</div>
+                <div class="code-name">#iconpanorama_dot</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iconjump"></use>
+                </svg>
+                <div class="name">Jump</div>
+                <div class="code-name">#iconjump</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon_hotpoint"></use>
+                </svg>
+                <div class="name">热点</div>
+                <div class="code-name">#icon_hotpoint</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon_save"></use>
+                </svg>
+                <div class="name">保存</div>
+                <div class="code-name">#icon_save</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon_screen"></use>
+                </svg>
+                <div class="name">初始画面</div>
+                <div class="code-name">#icon_screen</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon_base"></use>
+                </svg>
+                <div class="name">基础设置</div>
+                <div class="code-name">#icon_base</div>
+            </li>
+          
+          </ul>
+          <div class="article markdown">
+          <h2 id="symbol-">Symbol 引用</h2>
+          <hr>
+
+          <p>这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇<a href="">文章</a>
+            这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点:</p>
+          <ul>
+            <li>支持多色图标了,不再受单色限制。</li>
+            <li>通过一些技巧,支持像字体那样,通过 <code>font-size</code>, <code>color</code> 来调整样式。</li>
+            <li>兼容性较差,支持 IE9+,及现代浏览器。</li>
+            <li>浏览器渲染 SVG 的性能一般,还不如 png。</li>
+          </ul>
+          <p>使用步骤如下:</p>
+          <h3 id="-symbol-">第一步:引入项目下面生成的 symbol 代码:</h3>
+<pre><code class="language-html">&lt;script src="./iconfont.js"&gt;&lt;/script&gt;
+</code></pre>
+          <h3 id="-css-">第二步:加入通用 CSS 代码(引入一次就行):</h3>
+<pre><code class="language-html">&lt;style&gt;
+.icon {
+  width: 1em;
+  height: 1em;
+  vertical-align: -0.15em;
+  fill: currentColor;
+  overflow: hidden;
+}
+&lt;/style&gt;
+</code></pre>
+          <h3 id="-">第三步:挑选相应图标并获取类名,应用于页面:</h3>
+<pre><code class="language-html">&lt;svg class="icon" aria-hidden="true"&gt;
+  &lt;use xlink:href="#icon-xxx"&gt;&lt;/use&gt;
+&lt;/svg&gt;
+</code></pre>
+          </div>
+      </div>
+
+    </div>
+  </div>
+  <script>
+  $(document).ready(function () {
+      $('.tab-container .content:first').show()
+
+      $('#tabs li').click(function (e) {
+        var tabContent = $('.tab-container .content')
+        var index = $(this).index()
+
+        if ($(this).hasClass('active')) {
+          return
+        } else {
+          $('#tabs li').removeClass('active')
+          $(this).addClass('active')
+
+          tabContent.hide().eq(index).fadeIn()
+        }
+      })
+    })
+  </script>
+</body>
+</html>

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 105 - 0
public/static/lib/iconfontQJ/iconfont.css


BIN
public/static/lib/iconfontQJ/iconfont.eot


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 1 - 0
public/static/lib/iconfontQJ/iconfont.js


+ 163 - 0
public/static/lib/iconfontQJ/iconfont.json

@@ -0,0 +1,163 @@
+{
+  "id": "2342812",
+  "name": "全景编辑器",
+  "font_family": "iconfont",
+  "css_prefix_text": "icon",
+  "description": "",
+  "glyphs": [
+    {
+      "icon_id": "19580805",
+      "name": "预览",
+      "font_class": "yulan",
+      "unicode": "e749",
+      "unicode_decimal": 59209
+    },
+    {
+      "icon_id": "19580806",
+      "name": "场景导航",
+      "font_class": "changjingdaohang",
+      "unicode": "e74a",
+      "unicode_decimal": 59210
+    },
+    {
+      "icon_id": "17372574",
+      "name": "jump_edit",
+      "font_class": "jump_edit",
+      "unicode": "e729",
+      "unicode_decimal": 59177
+    },
+    {
+      "icon_id": "17740785",
+      "name": "mod_help",
+      "font_class": "mod_help",
+      "unicode": "e733",
+      "unicode_decimal": 59187
+    },
+    {
+      "icon_id": "19543922",
+      "name": "show_drop-down",
+      "font_class": "show_drop-down",
+      "unicode": "e673",
+      "unicode_decimal": 58995
+    },
+    {
+      "icon_id": "7857935",
+      "name": "返回",
+      "font_class": "_back",
+      "unicode": "e609",
+      "unicode_decimal": 58889
+    },
+    {
+      "icon_id": "7858493",
+      "name": "前往",
+      "font_class": "_forward",
+      "unicode": "e627",
+      "unicode_decimal": 58919
+    },
+    {
+      "icon_id": "7859032",
+      "name": "勾",
+      "font_class": "_yes",
+      "unicode": "e63a",
+      "unicode_decimal": 58938
+    },
+    {
+      "icon_id": "7878603",
+      "name": "+",
+      "font_class": "_plus",
+      "unicode": "e64a",
+      "unicode_decimal": 58954
+    },
+    {
+      "icon_id": "9143956",
+      "name": "search",
+      "font_class": "search",
+      "unicode": "e628",
+      "unicode_decimal": 58920
+    },
+    {
+      "icon_id": "9669413",
+      "name": "勾选",
+      "font_class": "_gou",
+      "unicode": "e671",
+      "unicode_decimal": 58993
+    },
+    {
+      "icon_id": "11304931",
+      "name": "more read",
+      "font_class": "more",
+      "unicode": "e600",
+      "unicode_decimal": 58880
+    },
+    {
+      "icon_id": "14382984",
+      "name": "close",
+      "font_class": "close",
+      "unicode": "e6ca",
+      "unicode_decimal": 59082
+    },
+    {
+      "icon_id": "14383009",
+      "name": "scene_map_3d",
+      "font_class": "scene_map_3d",
+      "unicode": "e6e3",
+      "unicode_decimal": 59107
+    },
+    {
+      "icon_id": "15091728",
+      "name": "photoview",
+      "font_class": "photoview",
+      "unicode": "e703",
+      "unicode_decimal": 59139
+    },
+    {
+      "icon_id": "16803890",
+      "name": "exit_dot",
+      "font_class": "exit_dot",
+      "unicode": "e726",
+      "unicode_decimal": 59174
+    },
+    {
+      "icon_id": "16803891",
+      "name": "panorama_dot",
+      "font_class": "panorama_dot",
+      "unicode": "e727",
+      "unicode_decimal": 59175
+    },
+    {
+      "icon_id": "16804008",
+      "name": "Jump",
+      "font_class": "jump",
+      "unicode": "e728",
+      "unicode_decimal": 59176
+    },
+    {
+      "icon_id": "7858053",
+      "name": "热点",
+      "font_class": "_hotpoint",
+      "unicode": "e617",
+      "unicode_decimal": 58903
+    },
+    {
+      "icon_id": "7858512",
+      "name": "保存",
+      "font_class": "_save",
+      "unicode": "e629",
+      "unicode_decimal": 58921
+    },
+    {
+      "icon_id": "7858528",
+      "name": "初始画面",
+      "font_class": "_screen",
+      "unicode": "e62b",
+      "unicode_decimal": 58923
+    },
+    {
+      "icon_id": "9845309",
+      "name": "基础设置",
+      "font_class": "_base",
+      "unicode": "e672",
+      "unicode_decimal": 58994
+    }
+  ]
+}

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 92 - 0
public/static/lib/iconfontQJ/iconfont.svg


BIN
public/static/lib/iconfontQJ/iconfont.ttf


BIN
public/static/lib/iconfontQJ/iconfont.woff


BIN
public/static/lib/iconfontQJ/iconfont.woff2


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 4 - 0
public/static/lib/jquery-2.1.1.min.js


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 9 - 0
public/static/lib/jquery.ajax.arraybuffer.min.js


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 1 - 0
public/static/lib/jquery.easing.min.js


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 14 - 0
public/static/lib/krpano/js/tour.js


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 5 - 0
public/static/lib/mCustomScrollbar/jquery.mCustomScrollbar.concat.min.js


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 1 - 0
public/static/lib/mCustomScrollbar/jquery.mCustomScrollbar.min.css


+ 22 - 0
public/static/lib/mobile-detect.js

@@ -0,0 +1,22 @@
+(function(win) {
+    var orgLink = win.location.href
+    var newLink = ''
+    if (orgLink.indexOf('&mobile=true') != -1) {
+        Object.defineProperty(navigator, 'userAgent', {
+            value: "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1",
+            writable: false
+        })
+    }
+    else if (/iPhone|iPad|Android/i.test(win.navigator.userAgent)) {
+        if (orgLink.indexOf('pc.html') !== -1) {
+            newLink = orgLink.replace('pc.html', 'mobile.html')
+        }
+    } else {
+        if (orgLink.indexOf('mobile.html') !== -1) {
+            newLink = orgLink.replace('mobile.html', 'pc.html')
+        }
+    }
+    if (newLink) {
+        win.location.href = newLink
+    }
+}(window))

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 3 - 0
public/static/lib/mobile-detect.min.bak.js


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 11869 - 0
public/static/lib/panovideo/flv.js


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 7 - 0
public/static/lib/panovideo/flv.min.js


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 3247 - 0
public/static/lib/panovideo/jsmpeg.min.js


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 108 - 0
public/static/lib/protobuf.min.js


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 8 - 0
public/static/lib/quill/quill.min.js


+ 950 - 0
public/static/lib/quill/quill.snow.css

@@ -0,0 +1,950 @@
+/*!
+ * Quill Editor v1.3.6
+ * https://quilljs.com/
+ * Copyright (c) 2014, Jason Chen
+ * Copyright (c) 2013, salesforce.com
+ */
+ .ql-container {
+    box-sizing: border-box;
+    font-family: Helvetica, Arial, sans-serif;
+    font-size: 13px;
+    height: 100%;
+    margin: 0px;
+    position: relative;
+  }
+  .ql-container.ql-disabled .ql-tooltip {
+    visibility: hidden;
+  }
+  .ql-container.ql-disabled .ql-editor ul[data-checked] > li::before {
+    pointer-events: none;
+  }
+  .ql-clipboard {
+    left: -100000px;
+    height: 1px;
+    overflow-y: hidden;
+    position: absolute;
+    top: 50%;
+  }
+  .ql-clipboard p {
+    margin: 0;
+    padding: 0;
+  }
+  .ql-editor {
+    box-sizing: border-box;
+    line-height: 1.42;
+    height: 100%;
+    outline: none;
+    overflow-y: auto;
+    padding: 12px 15px;
+    tab-size: 4;
+    -moz-tab-size: 4;
+    text-align: left;
+    white-space: pre-wrap;
+    word-wrap: break-word;
+  }
+  .ql-editor > * {
+    cursor: text;
+  }
+  .ql-editor p,
+  .ql-editor ol,
+  .ql-editor ul,
+  .ql-editor pre,
+  .ql-editor blockquote,
+  .ql-editor h1,
+  .ql-editor h2,
+  .ql-editor h3,
+  .ql-editor h4,
+  .ql-editor h5,
+  .ql-editor h6 {
+    margin: 0;
+    padding: 0;
+    counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9;
+  }
+  .ql-editor ol,
+  .ql-editor ul {
+    padding-left: 1.5em;
+  }
+  .ql-editor ol > li,
+  .ql-editor ul > li {
+    list-style-type: none;
+  }
+  .ql-editor ul > li::before {
+    content: '\2022';
+  }
+  .ql-editor ul[data-checked=true],
+  .ql-editor ul[data-checked=false] {
+    pointer-events: none;
+  }
+  .ql-editor ul[data-checked=true] > li *,
+  .ql-editor ul[data-checked=false] > li * {
+    pointer-events: all;
+  }
+  .ql-editor ul[data-checked=true] > li::before,
+  .ql-editor ul[data-checked=false] > li::before {
+    color: #777;
+    cursor: pointer;
+    pointer-events: all;
+  }
+  .ql-editor ul[data-checked=true] > li::before {
+    content: '\2611';
+  }
+  .ql-editor ul[data-checked=false] > li::before {
+    content: '\2610';
+  }
+  .ql-editor li::before {
+    display: inline-block;
+    white-space: nowrap;
+    width: 1.2em;
+  }
+  .ql-editor li:not(.ql-direction-rtl)::before {
+    margin-left: -1.5em;
+    margin-right: 0.3em;
+    text-align: right;
+  }
+  .ql-editor li.ql-direction-rtl::before {
+    margin-left: 0.3em;
+    margin-right: -1.5em;
+  }
+  .ql-editor ol li:not(.ql-direction-rtl),
+  .ql-editor ul li:not(.ql-direction-rtl) {
+    padding-left: 1.5em;
+  }
+  .ql-editor ol li.ql-direction-rtl,
+  .ql-editor ul li.ql-direction-rtl {
+    padding-right: 1.5em;
+  }
+  .ql-editor ol li {
+    counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9;
+    counter-increment: list-0;
+  }
+  .ql-editor ol li:before {
+    content: counter(list-0, decimal) '. ';
+  }
+  .ql-editor ol li.ql-indent-1 {
+    counter-increment: list-1;
+  }
+  .ql-editor ol li.ql-indent-1:before {
+    content: counter(list-1, lower-alpha) '. ';
+  }
+  .ql-editor ol li.ql-indent-1 {
+    counter-reset: list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9;
+  }
+  .ql-editor ol li.ql-indent-2 {
+    counter-increment: list-2;
+  }
+  .ql-editor ol li.ql-indent-2:before {
+    content: counter(list-2, lower-roman) '. ';
+  }
+  .ql-editor ol li.ql-indent-2 {
+    counter-reset: list-3 list-4 list-5 list-6 list-7 list-8 list-9;
+  }
+  .ql-editor ol li.ql-indent-3 {
+    counter-increment: list-3;
+  }
+  .ql-editor ol li.ql-indent-3:before {
+    content: counter(list-3, decimal) '. ';
+  }
+  .ql-editor ol li.ql-indent-3 {
+    counter-reset: list-4 list-5 list-6 list-7 list-8 list-9;
+  }
+  .ql-editor ol li.ql-indent-4 {
+    counter-increment: list-4;
+  }
+  .ql-editor ol li.ql-indent-4:before {
+    content: counter(list-4, lower-alpha) '. ';
+  }
+  .ql-editor ol li.ql-indent-4 {
+    counter-reset: list-5 list-6 list-7 list-8 list-9;
+  }
+  .ql-editor ol li.ql-indent-5 {
+    counter-increment: list-5;
+  }
+  .ql-editor ol li.ql-indent-5:before {
+    content: counter(list-5, lower-roman) '. ';
+  }
+  .ql-editor ol li.ql-indent-5 {
+    counter-reset: list-6 list-7 list-8 list-9;
+  }
+  .ql-editor ol li.ql-indent-6 {
+    counter-increment: list-6;
+  }
+  .ql-editor ol li.ql-indent-6:before {
+    content: counter(list-6, decimal) '. ';
+  }
+  .ql-editor ol li.ql-indent-6 {
+    counter-reset: list-7 list-8 list-9;
+  }
+  .ql-editor ol li.ql-indent-7 {
+    counter-increment: list-7;
+  }
+  .ql-editor ol li.ql-indent-7:before {
+    content: counter(list-7, lower-alpha) '. ';
+  }
+  .ql-editor ol li.ql-indent-7 {
+    counter-reset: list-8 list-9;
+  }
+  .ql-editor ol li.ql-indent-8 {
+    counter-increment: list-8;
+  }
+  .ql-editor ol li.ql-indent-8:before {
+    content: counter(list-8, lower-roman) '. ';
+  }
+  .ql-editor ol li.ql-indent-8 {
+    counter-reset: list-9;
+  }
+  .ql-editor ol li.ql-indent-9 {
+    counter-increment: list-9;
+  }
+  .ql-editor ol li.ql-indent-9:before {
+    content: counter(list-9, decimal) '. ';
+  }
+  .ql-editor .ql-indent-1:not(.ql-direction-rtl) {
+    padding-left: 3em;
+  }
+  .ql-editor li.ql-indent-1:not(.ql-direction-rtl) {
+    padding-left: 4.5em;
+  }
+  .ql-editor .ql-indent-1.ql-direction-rtl.ql-align-right {
+    padding-right: 3em;
+  }
+  .ql-editor li.ql-indent-1.ql-direction-rtl.ql-align-right {
+    padding-right: 4.5em;
+  }
+  .ql-editor .ql-indent-2:not(.ql-direction-rtl) {
+    padding-left: 6em;
+  }
+  .ql-editor li.ql-indent-2:not(.ql-direction-rtl) {
+    padding-left: 7.5em;
+  }
+  .ql-editor .ql-indent-2.ql-direction-rtl.ql-align-right {
+    padding-right: 6em;
+  }
+  .ql-editor li.ql-indent-2.ql-direction-rtl.ql-align-right {
+    padding-right: 7.5em;
+  }
+  .ql-editor .ql-indent-3:not(.ql-direction-rtl) {
+    padding-left: 9em;
+  }
+  .ql-editor li.ql-indent-3:not(.ql-direction-rtl) {
+    padding-left: 10.5em;
+  }
+  .ql-editor .ql-indent-3.ql-direction-rtl.ql-align-right {
+    padding-right: 9em;
+  }
+  .ql-editor li.ql-indent-3.ql-direction-rtl.ql-align-right {
+    padding-right: 10.5em;
+  }
+  .ql-editor .ql-indent-4:not(.ql-direction-rtl) {
+    padding-left: 12em;
+  }
+  .ql-editor li.ql-indent-4:not(.ql-direction-rtl) {
+    padding-left: 13.5em;
+  }
+  .ql-editor .ql-indent-4.ql-direction-rtl.ql-align-right {
+    padding-right: 12em;
+  }
+  .ql-editor li.ql-indent-4.ql-direction-rtl.ql-align-right {
+    padding-right: 13.5em;
+  }
+  .ql-editor .ql-indent-5:not(.ql-direction-rtl) {
+    padding-left: 15em;
+  }
+  .ql-editor li.ql-indent-5:not(.ql-direction-rtl) {
+    padding-left: 16.5em;
+  }
+  .ql-editor .ql-indent-5.ql-direction-rtl.ql-align-right {
+    padding-right: 15em;
+  }
+  .ql-editor li.ql-indent-5.ql-direction-rtl.ql-align-right {
+    padding-right: 16.5em;
+  }
+  .ql-editor .ql-indent-6:not(.ql-direction-rtl) {
+    padding-left: 18em;
+  }
+  .ql-editor li.ql-indent-6:not(.ql-direction-rtl) {
+    padding-left: 19.5em;
+  }
+  .ql-editor .ql-indent-6.ql-direction-rtl.ql-align-right {
+    padding-right: 18em;
+  }
+  .ql-editor li.ql-indent-6.ql-direction-rtl.ql-align-right {
+    padding-right: 19.5em;
+  }
+  .ql-editor .ql-indent-7:not(.ql-direction-rtl) {
+    padding-left: 21em;
+  }
+  .ql-editor li.ql-indent-7:not(.ql-direction-rtl) {
+    padding-left: 22.5em;
+  }
+  .ql-editor .ql-indent-7.ql-direction-rtl.ql-align-right {
+    padding-right: 21em;
+  }
+  .ql-editor li.ql-indent-7.ql-direction-rtl.ql-align-right {
+    padding-right: 22.5em;
+  }
+  .ql-editor .ql-indent-8:not(.ql-direction-rtl) {
+    padding-left: 24em;
+  }
+  .ql-editor li.ql-indent-8:not(.ql-direction-rtl) {
+    padding-left: 25.5em;
+  }
+  .ql-editor .ql-indent-8.ql-direction-rtl.ql-align-right {
+    padding-right: 24em;
+  }
+  .ql-editor li.ql-indent-8.ql-direction-rtl.ql-align-right {
+    padding-right: 25.5em;
+  }
+  .ql-editor .ql-indent-9:not(.ql-direction-rtl) {
+    padding-left: 27em;
+  }
+  .ql-editor li.ql-indent-9:not(.ql-direction-rtl) {
+    padding-left: 28.5em;
+  }
+  .ql-editor .ql-indent-9.ql-direction-rtl.ql-align-right {
+    padding-right: 27em;
+  }
+  .ql-editor li.ql-indent-9.ql-direction-rtl.ql-align-right {
+    padding-right: 28.5em;
+  }
+  .ql-editor .ql-video {
+    display: block;
+    max-width: 100%;
+  }
+  .ql-editor .ql-video.ql-align-center {
+    margin: 0 auto;
+  }
+  .ql-editor .ql-video.ql-align-right {
+    margin: 0 0 0 auto;
+  }
+  .ql-editor .ql-bg-black {
+    background-color: #000;
+  }
+  .ql-editor .ql-bg-red {
+    background-color: #e60000;
+  }
+  .ql-editor .ql-bg-orange {
+    background-color: #f90;
+  }
+  .ql-editor .ql-bg-yellow {
+    background-color: #ff0;
+  }
+  .ql-editor .ql-bg-green {
+    background-color: #008a00;
+  }
+  .ql-editor .ql-bg-blue {
+    background-color: #06c;
+  }
+  .ql-editor .ql-bg-purple {
+    background-color: #93f;
+  }
+  .ql-editor .ql-color-white {
+    color: #fff;
+  }
+  .ql-editor .ql-color-red {
+    color: #e60000;
+  }
+  .ql-editor .ql-color-orange {
+    color: #f90;
+  }
+  .ql-editor .ql-color-yellow {
+    color: #ff0;
+  }
+  .ql-editor .ql-color-green {
+    color: #008a00;
+  }
+  .ql-editor .ql-color-blue {
+    color: #06c;
+  }
+  .ql-editor .ql-color-purple {
+    color: #93f;
+  }
+  .ql-editor .ql-font-serif {
+    font-family: Georgia, Times New Roman, serif;
+  }
+  .ql-editor .ql-font-monospace {
+    font-family: Monaco, Courier New, monospace;
+  }
+  .ql-editor .ql-size-small {
+    font-size: 0.75em;
+  }
+  .ql-editor .ql-size-large {
+    font-size: 1.5em;
+  }
+  .ql-editor .ql-size-huge {
+    font-size: 2.5em;
+  }
+  .ql-editor .ql-direction-rtl {
+    direction: rtl;
+    text-align: inherit;
+  }
+  .ql-editor .ql-align-center {
+    text-align: center;
+  }
+  .ql-editor .ql-align-justify {
+    text-align: justify;
+  }
+  .ql-editor .ql-align-right {
+    text-align: right;
+  }
+  .ql-editor.ql-blank::before {
+    color: rgba(0,0,0,0.6);
+    content: attr(data-placeholder);
+    font-style: normal;
+    left: 15px;
+    pointer-events: none;
+    position: absolute;
+    right: 15px;
+    color: #c7c7c7;
+  }
+  .ql-snow.ql-toolbar:after,
+  .ql-snow .ql-toolbar:after {
+    clear: both;
+    content: '';
+    display: table;
+  }
+  .ql-snow.ql-toolbar button,
+  .ql-snow .ql-toolbar button {
+    background: none;
+    border: none;
+    cursor: pointer;
+    display: inline-block;
+    float: left;
+    height: 24px;
+    padding: 3px 5px;
+    width: 28px;
+  }
+  .ql-snow.ql-toolbar button svg,
+  .ql-snow .ql-toolbar button svg {
+    float: left;
+    height: 100%;
+  }
+  .ql-snow.ql-toolbar button:active:hover,
+  .ql-snow .ql-toolbar button:active:hover {
+    outline: none;
+  }
+  .ql-snow.ql-toolbar input.ql-image[type=file],
+  .ql-snow .ql-toolbar input.ql-image[type=file] {
+    display: none;
+  }
+  .ql-snow.ql-toolbar button:hover,
+  .ql-snow .ql-toolbar button:hover,
+  .ql-snow.ql-toolbar button:focus,
+  .ql-snow .ql-toolbar button:focus,
+  .ql-snow.ql-toolbar button.ql-active,
+  .ql-snow .ql-toolbar button.ql-active,
+  .ql-snow.ql-toolbar .ql-picker-label:hover,
+  .ql-snow .ql-toolbar .ql-picker-label:hover,
+  .ql-snow.ql-toolbar .ql-picker-label.ql-active,
+  .ql-snow .ql-toolbar .ql-picker-label.ql-active,
+  .ql-snow.ql-toolbar .ql-picker-item:hover,
+  .ql-snow .ql-toolbar .ql-picker-item:hover,
+  .ql-snow.ql-toolbar .ql-picker-item.ql-selected,
+  .ql-snow .ql-toolbar .ql-picker-item.ql-selected {
+    color: #06c;
+  }
+  .ql-snow.ql-toolbar button:hover .ql-fill,
+  .ql-snow .ql-toolbar button:hover .ql-fill,
+  .ql-snow.ql-toolbar button:focus .ql-fill,
+  .ql-snow .ql-toolbar button:focus .ql-fill,
+  .ql-snow.ql-toolbar button.ql-active .ql-fill,
+  .ql-snow .ql-toolbar button.ql-active .ql-fill,
+  .ql-snow.ql-toolbar .ql-picker-label:hover .ql-fill,
+  .ql-snow .ql-toolbar .ql-picker-label:hover .ql-fill,
+  .ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-fill,
+  .ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-fill,
+  .ql-snow.ql-toolbar .ql-picker-item:hover .ql-fill,
+  .ql-snow .ql-toolbar .ql-picker-item:hover .ql-fill,
+  .ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-fill,
+  .ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-fill,
+  .ql-snow.ql-toolbar button:hover .ql-stroke.ql-fill,
+  .ql-snow .ql-toolbar button:hover .ql-stroke.ql-fill,
+  .ql-snow.ql-toolbar button:focus .ql-stroke.ql-fill,
+  .ql-snow .ql-toolbar button:focus .ql-stroke.ql-fill,
+  .ql-snow.ql-toolbar button.ql-active .ql-stroke.ql-fill,
+  .ql-snow .ql-toolbar button.ql-active .ql-stroke.ql-fill,
+  .ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill,
+  .ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill,
+  .ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill,
+  .ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill,
+  .ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill,
+  .ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill,
+  .ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill,
+  .ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill {
+    fill: #06c;
+  }
+  .ql-snow.ql-toolbar button:hover .ql-stroke,
+  .ql-snow .ql-toolbar button:hover .ql-stroke,
+  .ql-snow.ql-toolbar button:focus .ql-stroke,
+  .ql-snow .ql-toolbar button:focus .ql-stroke,
+  .ql-snow.ql-toolbar button.ql-active .ql-stroke,
+  .ql-snow .ql-toolbar button.ql-active .ql-stroke,
+  .ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke,
+  .ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke,
+  .ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke,
+  .ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke,
+  .ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke,
+  .ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke,
+  .ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke,
+  .ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke,
+  .ql-snow.ql-toolbar button:hover .ql-stroke-miter,
+  .ql-snow .ql-toolbar button:hover .ql-stroke-miter,
+  .ql-snow.ql-toolbar button:focus .ql-stroke-miter,
+  .ql-snow .ql-toolbar button:focus .ql-stroke-miter,
+  .ql-snow.ql-toolbar button.ql-active .ql-stroke-miter,
+  .ql-snow .ql-toolbar button.ql-active .ql-stroke-miter,
+  .ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke-miter,
+  .ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke-miter,
+  .ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter,
+  .ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter,
+  .ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke-miter,
+  .ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke-miter,
+  .ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter,
+  .ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter {
+    stroke: #06c;
+  }
+  @media (pointer: coarse) {
+    .ql-snow.ql-toolbar button:hover:not(.ql-active),
+    .ql-snow .ql-toolbar button:hover:not(.ql-active) {
+      color: #444;
+    }
+    .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-fill,
+    .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-fill,
+    .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill,
+    .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill {
+      fill: #444;
+    }
+    .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke,
+    .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke,
+    .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter,
+    .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter {
+      stroke: #444;
+    }
+  }
+  .ql-snow {
+    box-sizing: border-box;
+  }
+  .ql-snow * {
+    box-sizing: border-box;
+  }
+  .ql-snow .ql-hidden {
+    display: none;
+  }
+  .ql-snow .ql-out-bottom,
+  .ql-snow .ql-out-top {
+    visibility: hidden;
+  }
+  .ql-snow .ql-tooltip {
+    position: absolute;
+    transform: translateY(10px);
+  }
+  .ql-snow .ql-tooltip a {
+    cursor: pointer;
+    text-decoration: none;
+  }
+  .ql-snow .ql-tooltip.ql-flip {
+    transform: translateY(-10px);
+  }
+  .ql-snow .ql-formats {
+    display: inline-block;
+    vertical-align: middle;
+  }
+  .ql-snow .ql-formats:after {
+    clear: both;
+    content: '';
+    display: table;
+  }
+  .ql-snow .ql-stroke {
+    fill: none;
+    stroke: #444;
+    stroke-linecap: round;
+    stroke-linejoin: round;
+    stroke-width: 2;
+  }
+  .ql-snow .ql-stroke-miter {
+    fill: none;
+    stroke: #444;
+    stroke-miterlimit: 10;
+    stroke-width: 2;
+  }
+  .ql-snow .ql-fill,
+  .ql-snow .ql-stroke.ql-fill {
+    fill: #444;
+  }
+  .ql-snow .ql-empty {
+    fill: none;
+  }
+  .ql-snow .ql-even {
+    fill-rule: evenodd;
+  }
+  .ql-snow .ql-thin,
+  .ql-snow .ql-stroke.ql-thin {
+    stroke-width: 1;
+  }
+  .ql-snow .ql-transparent {
+    opacity: 0.4;
+  }
+  .ql-snow .ql-direction svg:last-child {
+    display: none;
+  }
+  .ql-snow .ql-direction.ql-active svg:last-child {
+    display: inline;
+  }
+  .ql-snow .ql-direction.ql-active svg:first-child {
+    display: none;
+  }
+  .ql-snow .ql-editor h1 {
+    font-size: 2em;
+  }
+  .ql-snow .ql-editor h2 {
+    font-size: 1.5em;
+  }
+  .ql-snow .ql-editor h3 {
+    font-size: 1.17em;
+  }
+  .ql-snow .ql-editor h4 {
+    font-size: 1em;
+  }
+  .ql-snow .ql-editor h5 {
+    font-size: 0.83em;
+  }
+  .ql-snow .ql-editor h6 {
+    font-size: 0.67em;
+  }
+  .ql-snow .ql-editor a {
+    text-decoration: underline;
+  }
+  .ql-snow .ql-editor blockquote {
+    border-left: 4px solid #ccc;
+    margin-bottom: 5px;
+    margin-top: 5px;
+    padding-left: 16px;
+  }
+  .ql-snow .ql-editor code,
+  .ql-snow .ql-editor pre {
+    background-color: #f0f0f0;
+    border-radius: 3px;
+  }
+  .ql-snow .ql-editor pre {
+    white-space: pre-wrap;
+    margin-bottom: 5px;
+    margin-top: 5px;
+    padding: 5px 10px;
+  }
+  .ql-snow .ql-editor code {
+    font-size: 85%;
+    padding: 2px 4px;
+  }
+  .ql-snow .ql-editor pre.ql-syntax {
+    background-color: #23241f;
+    color: #f8f8f2;
+    overflow: visible;
+  }
+  .ql-snow .ql-editor img {
+    max-width: 100%;
+  }
+  .ql-snow .ql-picker {
+    color: #444;
+    display: inline-block;
+    float: left;
+    font-size: 14px;
+    font-weight: 500;
+    height: 24px;
+    position: relative;
+    vertical-align: middle;
+  }
+  .ql-snow .ql-picker-label {
+    cursor: pointer;
+    display: inline-block;
+    height: 100%;
+    padding-left: 8px;
+    padding-right: 2px;
+    position: relative;
+    width: 100%;
+  }
+  .ql-snow .ql-picker-label::before {
+    display: inline-block;
+    line-height: 22px;
+  }
+  .ql-snow .ql-picker-options {
+    background-color: #fff;
+    display: none;
+    min-width: 100%;
+    padding: 4px 8px;
+    position: absolute;
+    white-space: nowrap;
+  }
+  .ql-snow .ql-picker-options .ql-picker-item {
+    cursor: pointer;
+    display: block;
+    padding-bottom: 5px;
+    padding-top: 5px;
+  }
+  .ql-snow .ql-picker.ql-expanded .ql-picker-label {
+    color: #ccc;
+    z-index: 2;
+  }
+  .ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-fill {
+    fill: #ccc;
+  }
+  .ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-stroke {
+    stroke: #ccc;
+  }
+  .ql-snow .ql-picker.ql-expanded .ql-picker-options {
+    display: block;
+    margin-top: -1px;
+    top: 100%;
+    z-index: 1;
+  }
+  .ql-snow .ql-color-picker,
+  .ql-snow .ql-icon-picker {
+    width: 28px;
+  }
+  .ql-snow .ql-color-picker .ql-picker-label,
+  .ql-snow .ql-icon-picker .ql-picker-label {
+    padding: 2px 4px;
+  }
+  .ql-snow .ql-color-picker .ql-picker-label svg,
+  .ql-snow .ql-icon-picker .ql-picker-label svg {
+    right: 4px;
+  }
+  .ql-snow .ql-icon-picker .ql-picker-options {
+    padding: 4px 0px;
+  }
+  .ql-snow .ql-icon-picker .ql-picker-item {
+    height: 24px;
+    width: 24px;
+    padding: 2px 4px;
+  }
+  .ql-snow .ql-color-picker .ql-picker-options {
+    padding: 3px 5px;
+    width: 152px;
+  }
+  .ql-snow .ql-color-picker .ql-picker-item {
+    border: 1px solid transparent;
+    float: left;
+    height: 16px;
+    margin: 2px;
+    padding: 0px;
+    width: 16px;
+  }
+  .ql-snow .ql-picker:not(.ql-color-picker):not(.ql-icon-picker) svg {
+    position: absolute;
+    margin-top: -9px;
+    right: 0;
+    top: 50%;
+    width: 18px;
+  }
+  .ql-snow .ql-picker.ql-header .ql-picker-label[data-label]:not([data-label=''])::before,
+  .ql-snow .ql-picker.ql-font .ql-picker-label[data-label]:not([data-label=''])::before,
+  .ql-snow .ql-picker.ql-size .ql-picker-label[data-label]:not([data-label=''])::before,
+  .ql-snow .ql-picker.ql-header .ql-picker-item[data-label]:not([data-label=''])::before,
+  .ql-snow .ql-picker.ql-font .ql-picker-item[data-label]:not([data-label=''])::before,
+  .ql-snow .ql-picker.ql-size .ql-picker-item[data-label]:not([data-label=''])::before {
+    content: attr(data-label);
+  }
+  .ql-snow .ql-picker.ql-header {
+    width: 98px;
+  }
+  .ql-snow .ql-picker.ql-header .ql-picker-label::before,
+  .ql-snow .ql-picker.ql-header .ql-picker-item::before {
+    content: 'Normal';
+  }
+  .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="1"]::before,
+  .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before {
+    content: 'Heading 1';
+  }
+  .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="2"]::before,
+  .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before {
+    content: 'Heading 2';
+  }
+  .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="3"]::before,
+  .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before {
+    content: 'Heading 3';
+  }
+  .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="4"]::before,
+  .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before {
+    content: 'Heading 4';
+  }
+  .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="5"]::before,
+  .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before {
+    content: 'Heading 5';
+  }
+  .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="6"]::before,
+  .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before {
+    content: 'Heading 6';
+  }
+  .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before {
+    font-size: 2em;
+  }
+  .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before {
+    font-size: 1.5em;
+  }
+  .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before {
+    font-size: 1.17em;
+  }
+  .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before {
+    font-size: 1em;
+  }
+  .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before {
+    font-size: 0.83em;
+  }
+  .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before {
+    font-size: 0.67em;
+  }
+  .ql-snow .ql-picker.ql-font {
+    width: 108px;
+  }
+  .ql-snow .ql-picker.ql-font .ql-picker-label::before,
+  .ql-snow .ql-picker.ql-font .ql-picker-item::before {
+    content: 'Sans Serif';
+  }
+  .ql-snow .ql-picker.ql-font .ql-picker-label[data-value=serif]::before,
+  .ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]::before {
+    content: 'Serif';
+  }
+  .ql-snow .ql-picker.ql-font .ql-picker-label[data-value=monospace]::before,
+  .ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before {
+    content: 'Monospace';
+  }
+  .ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]::before {
+    font-family: Georgia, Times New Roman, serif;
+  }
+  .ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before {
+    font-family: Monaco, Courier New, monospace;
+  }
+  .ql-snow .ql-picker.ql-size {
+    width: 98px;
+  }
+  .ql-snow .ql-picker.ql-size .ql-picker-label::before,
+  .ql-snow .ql-picker.ql-size .ql-picker-item::before {
+    content: 'Normal';
+  }
+  .ql-snow .ql-picker.ql-size .ql-picker-label[data-value=small]::before,
+  .ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]::before {
+    content: 'Small';
+  }
+  .ql-snow .ql-picker.ql-size .ql-picker-label[data-value=large]::before,
+  .ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]::before {
+    content: 'Large';
+  }
+  .ql-snow .ql-picker.ql-size .ql-picker-label[data-value=huge]::before,
+  .ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]::before {
+    content: 'Huge';
+  }
+  .ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]::before {
+    font-size: 10px;
+  }
+  .ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]::before {
+    font-size: 18px;
+  }
+  .ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]::before {
+    font-size: 32px;
+  }
+  .ql-snow .ql-color-picker.ql-background .ql-picker-item {
+    background-color: #fff;
+  }
+  .ql-snow .ql-color-picker.ql-color .ql-picker-item {
+    background-color: #000;
+  }
+  .ql-toolbar.ql-snow {
+    border: 1px solid #ccc;
+    box-sizing: border-box;
+    font-family: 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif;
+    padding: 8px;
+  }
+  .ql-toolbar.ql-snow .ql-formats {
+    margin-right: 15px;
+  }
+  .ql-toolbar.ql-snow .ql-picker-label {
+    border: 1px solid transparent;
+  }
+  .ql-toolbar.ql-snow .ql-picker-options {
+    border: 1px solid transparent;
+    box-shadow: rgba(0,0,0,0.2) 0 2px 8px;
+  }
+  .ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-label {
+    border-color: #ccc;
+  }
+  .ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-options {
+    border-color: #ccc;
+  }
+  .ql-toolbar.ql-snow .ql-color-picker .ql-picker-item.ql-selected,
+  .ql-toolbar.ql-snow .ql-color-picker .ql-picker-item:hover {
+    border-color: #000;
+  }
+  .ql-toolbar.ql-snow + .ql-container.ql-snow {
+    border-top: 0px;
+  }
+  .ql-snow .ql-tooltip {
+    background-color: #fff;
+    border: 1px solid #ccc;
+    box-shadow: 0px 0px 5px #ddd;
+    color: #444;
+    padding: 5px 12px;
+    white-space: nowrap;
+  }
+  .ql-snow .ql-tooltip::before {
+    content: "Visit URL:";
+    line-height: 26px;
+    margin-right: 8px;
+  }
+  .ql-snow .ql-tooltip input[type=text] {
+    display: none;
+    border: 1px solid #ccc;
+    font-size: 13px;
+    height: 26px;
+    margin: 0px;
+    padding: 3px 5px;
+    width: 170px;
+  }
+  .ql-snow .ql-tooltip a.ql-preview {
+    display: inline-block;
+    max-width: 200px;
+    overflow-x: hidden;
+    text-overflow: ellipsis;
+    vertical-align: top;
+  }
+  .ql-snow .ql-tooltip a.ql-action::after {
+    border-right: 1px solid #ccc;
+    content: 'Edit';
+    margin-left: 16px;
+    padding-right: 8px;
+  }
+  .ql-snow .ql-tooltip a.ql-remove::before {
+    content: 'Remove';
+    margin-left: 8px;
+  }
+  .ql-snow .ql-tooltip a {
+    line-height: 26px;
+  }
+  .ql-snow .ql-tooltip.ql-editing a.ql-preview,
+  .ql-snow .ql-tooltip.ql-editing a.ql-remove {
+    display: none;
+  }
+  .ql-snow .ql-tooltip.ql-editing input[type=text] {
+    display: inline-block;
+  }
+  .ql-snow .ql-tooltip.ql-editing a.ql-action::after {
+    border-right: 0px;
+    content: 'Save';
+    padding-right: 0px;
+  }
+  .ql-snow .ql-tooltip[data-mode=link]::before {
+    content: "Enter link:";
+  }
+  .ql-snow .ql-tooltip[data-mode=formula]::before {
+    content: "Enter formula:";
+  }
+  .ql-snow .ql-tooltip[data-mode=video]::before {
+    content: "Enter video:";
+  }
+  .ql-snow a {
+    color: #06c;
+  }
+  .ql-container.ql-snow {
+    border: 1px solid #ccc;
+  }
+
+  .ql-editor a{
+      color: #02c8ae;
+  }

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 6 - 0
public/static/lib/recorder.mp3.min.js


+ 0 - 0
public/static/lib/scrollbar/jroll.2.6.5.min.js


Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio