rindy %!s(int64=2) %!d(string=hai) anos
achega
29bfd763d9
Modificáronse 42 ficheiros con 26223 adicións e 0 borrados
  1. 3 0
      .browserslistrc
  2. 2 0
      .env
  3. 0 0
      .env.development
  4. 3 0
      .env.staging
  5. 23 0
      .gitignore
  6. 19 0
      README.md
  7. 3 0
      babel.config.js
  8. 1 0
      jsconfig.json
  9. 25 0
      package.json
  10. BIN=BIN
      public/favicon.ico
  11. 16 0
      public/smart-bim.html
  12. 10 0
      public/smart-laser-bim.html
  13. 29 0
      public/smart-laser.html
  14. 11 0
      public/static/lib/animate/animate.min.css
  15. 109 0
      public/static/lib/flexible.min.js
  16. 7 0
      public/static/lib/flv.min.js
  17. 539 0
      public/static/lib/iconfont/demo.css
  18. 3385 0
      public/static/lib/iconfont/demo_index.html
  19. 571 0
      public/static/lib/iconfont/iconfont.css
  20. 1 0
      public/static/lib/iconfont/iconfont.js
  21. 982 0
      public/static/lib/iconfont/iconfont.json
  22. BIN=BIN
      public/static/lib/iconfont/iconfont.ttf
  23. BIN=BIN
      public/static/lib/iconfont/iconfont.woff
  24. BIN=BIN
      public/static/lib/iconfont/iconfont.woff2
  25. 1 0
      public/static/lib/jweixin-1.0.0.js
  26. 22 0
      public/static/lib/mobile-detect.js
  27. 13 0
      public/static/lib/swiper/swiper.css
  28. 10663 0
      public/static/lib/swiper/swiper.js
  29. 10 0
      public/static/lib/vconsole.js
  30. 146 0
      public/test-bim.html
  31. 0 0
      src/assets/index.scss
  32. 0 0
      src/pages/bim.js
  33. 0 0
      src/pages/laser-bim.js
  34. 0 0
      src/pages/laser.js
  35. 149 0
      src/utils/ConvertViews.js
  36. 360 0
      src/utils/browser.js
  37. 109 0
      src/utils/common.js
  38. 122 0
      src/utils/file.js
  39. 140 0
      src/utils/request.js
  40. 252 0
      src/utils/string.js
  41. 56 0
      vue.config.js
  42. 8441 0
      yarn.lock

+ 3 - 0
.browserslistrc

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

+ 2 - 0
.env

@@ -0,0 +1,2 @@
+# 静态资源目录
+VUE_APP_STATIC_DIR=resource

+ 0 - 0
.env.development


+ 3 - 0
.env.staging

@@ -0,0 +1,3 @@
+NODE_ENV=production
+# 静态资源地址
+VUE_APP_CDN_URL=https://4dkk.4dage.com/v4-test/www/

+ 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?

+ 19 - 0
README.md

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

+ 3 - 0
babel.config.js

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

+ 1 - 0
jsconfig.json

@@ -0,0 +1 @@
+{}

+ 25 - 0
package.json

@@ -0,0 +1,25 @@
+{
+  "name": "@kankan/smart-bim",
+  "private": true,
+  "version": "1.0.0",
+  "scripts": {
+    "serve": "vue-cli-service serve",
+    "build": "vue-cli-service build"
+  },
+  "dependencies": {
+    "axios": "^0.21.1",
+    "core-js": "^3.6.5",
+    "vue": "^3.2.26",
+    "vue-i18n": "9",
+    "vue-router": "4.0.12",
+    "vuejs3-datepicker": "^1.0.12"
+  },
+  "devDependencies": {
+    "@intlify/vue-i18n-loader": "^4.2.0",
+    "@vue/cli-plugin-babel": "~4.5.0",
+    "@vue/cli-service": "~4.5.0",
+    "@vue/compiler-sfc": "^3.0.0",
+    "sass": "^1.26.5",
+    "sass-loader": "^8.0.2"
+  }
+}

BIN=BIN
public/favicon.ico


+ 16 - 0
public/smart-bim.html

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

+ 10 - 0
public/smart-laser-bim.html

@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<html lang="en">
+    <head>
+        <title>BIM</title>
+        <meta charset="utf-8" />
+        <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0" />
+    </head>
+    <body></body>
+ 
+</html>

+ 29 - 0
public/smart-laser.html

@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html lang="">
+    <head>
+        <meta charset="utf-8" />
+        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+        <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
+        <title></title>
+        <style>
+            html,
+            body {
+                width: 100%;
+                height: 100%;
+                margin: 0;
+                overflow: hidden;
+            }
+            #app {
+                width: 100%;
+                height: 100%;
+            }
+        </style>
+    </head>
+
+    <body>
+        <noscript>
+            <strong>We're sorry but doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
+        </noscript>
+        <div id="app"></div>
+    </body>
+</html>

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 11 - 0
public/static/lib/animate/animate.min.css


+ 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'] = {}));

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 7 - 0
public/static/lib/flv.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;
+}

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 3385 - 0
public/static/lib/iconfont/demo_index.html


+ 571 - 0
public/static/lib/iconfont/iconfont.css

@@ -0,0 +1,571 @@
+@font-face {
+  font-family: "iconfont"; /* Project id 2596172 */
+  src: url('iconfont.woff2?t=1659061669448') format('woff2'),
+       url('iconfont.woff?t=1659061669448') format('woff'),
+       url('iconfont.ttf?t=1659061669448') format('truetype');
+}
+
+.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-show_share:before {
+  content: "\e690";
+}
+
+.icon-show_more_ruler:before {
+  content: "\e67b";
+}
+
+.icon-transparency:before {
+  content: "\e6d7";
+}
+
+.icon-mosaic_e:before {
+  content: "\e6d2";
+}
+
+.icon-eraser:before {
+  content: "\e6d3";
+}
+
+.icon-video2:before {
+  content: "\e6d4";
+}
+
+.icon-down:before {
+  content: "\e6d5";
+}
+
+.icon-qingkong-copy-copy:before {
+  content: "\e68f";
+}
+
+.icon-_qq:before {
+  content: "\e64b";
+}
+
+.icon-_friend:before {
+  content: "\e64c";
+}
+
+.icon-link1:before {
+  content: "\e6ff";
+}
+
+.icon-icon_share_facebook:before {
+  content: "\e745";
+}
+
+.icon-icon_share_whatsapp:before {
+  content: "\e746";
+}
+
+.icon-_wechat:before {
+  content: "\e64a";
+}
+
+.icon-watermark:before {
+  content: "\e6cb";
+}
+
+.icon-camera_h:before {
+  content: "\e6c7";
+}
+
+.icon-a-1V1:before {
+  content: "\e6c8";
+}
+
+.icon-hengbiaoEN:before {
+  content: "\e6b9";
+}
+
+.icon-hot_spot:before {
+  content: "\e6b8";
+}
+
+.icon-foot:before {
+  content: "\e6ba";
+}
+
+.icon-music-t:before {
+  content: "\e6b7";
+}
+
+.icon-yes:before {
+  content: "\e6b5";
+}
+
+.icon-no:before {
+  content: "\e6b6";
+}
+
+.icon-floor_rename:before {
+  content: "\e75b";
+}
+
+.icon-play_stop:before {
+  content: "\e6b4";
+}
+
+.icon-scene_auto:before {
+  content: "\e721";
+}
+
+.icon-compass:before {
+  content: "\e6b3";
+}
+
+.icon-h-d:before {
+  content: "\e6b2";
+}
+
+.icon-scene_screen:before {
+  content: "\e717";
+}
+
+.icon-scene_full:before {
+  content: "\e712";
+}
+
+.icon-scene_window:before {
+  content: "\e713";
+}
+
+.icon-_back:before {
+  content: "\e609";
+}
+
+.icon-show_back:before {
+  content: "\e678";
+}
+
+.icon-show_more_share:before {
+  content: "\e680";
+}
+
+.icon-show_more_finish:before {
+  content: "\e67a";
+}
+
+.icon-show_more_music:before {
+  content: "\e67c";
+}
+
+.icon-show_map_collect:before {
+  content: "\e679";
+}
+
+.icon-data-j:before {
+  content: "\e6b1";
+}
+
+.icon-cancel:before {
+  content: "\e688";
+}
+
+.icon-affirm:before {
+  content: "\e689";
+}
+
+.icon-checkbox_p:before {
+  content: "\e6b0";
+}
+
+.icon-left:before {
+  content: "\e6ae";
+}
+
+.icon-right:before {
+  content: "\e6af";
+}
+
+.icon-_loading_:before {
+  content: "\e627";
+}
+
+.icon-show_function_collect:before {
+  content: "\e687";
+}
+
+.icon-show_more:before {
+  content: "\e67e";
+}
+
+.icon-d-r:before {
+  content: "\e68d";
+}
+
+.icon-up-a:before {
+  content: "\e68e";
+}
+
+.icon-fanzhuan:before {
+  content: "\e6fa";
+}
+
+.icon-cad-neiqiang:before {
+  content: "\e698";
+}
+
+.icon-cad-waiqiang:before {
+  content: "\e69a";
+}
+
+.icon-cad-shuangkaimen:before {
+  content: "\e69b";
+}
+
+.icon-cad-zimumen:before {
+  content: "\e69c";
+}
+
+.icon-cad-men:before {
+  content: "\e69d";
+}
+
+.icon-cad-yimen:before {
+  content: "\e69e";
+}
+
+.icon-cad-zhediemen:before {
+  content: "\e69f";
+}
+
+.icon-cad-luodichuang:before {
+  content: "\e6a0";
+}
+
+.icon-cad-chuang:before {
+  content: "\e6a1";
+}
+
+.icon-cad-piaochuang:before {
+  content: "\e6a2";
+}
+
+.icon-cad-uxingchuang:before {
+  content: "\e6a4";
+}
+
+.icon-cad-lxingchuang:before {
+  content: "\e6a5";
+}
+
+.icon-cad-lpiaochuang:before {
+  content: "\e6a6";
+}
+
+.icon-cad-upiaochuang:before {
+  content: "\e6a7";
+}
+
+.icon-cad-liang:before {
+  content: "\e6a8";
+}
+
+.icon-cad-yandao:before {
+  content: "\e6a9";
+}
+
+.icon-cad-zhuzi:before {
+  content: "\e6aa";
+}
+
+.icon-cad-dianti:before {
+  content: "\e6ab";
+}
+
+.icon-cad-loudao:before {
+  content: "\e6ac";
+}
+
+.icon-cad-dange:before {
+  content: "\e6ad";
+}
+
+.icon-cad-yakou:before {
+  content: "\e699";
+}
+
+.icon-more:before {
+  content: "\e600";
+}
+
+.icon-mosaic1:before {
+  content: "\e697";
+}
+
+.icon-hengbiaoCN:before {
+  content: "\e6a3";
+}
+
+.icon-nor:before {
+  content: "\e696";
+}
+
+.icon-checkbox1:before {
+  content: "\e65d";
+}
+
+.icon-rotate:before {
+  content: "\e695";
+}
+
+.icon-adapt:before {
+  content: "\e692";
+}
+
+.icon-recover:before {
+  content: "\e693";
+}
+
+.icon-repeal:before {
+  content: "\e694";
+}
+
+.icon-reset:before {
+  content: "\e65a";
+}
+
+.icon-course1:before {
+  content: "\e68c";
+}
+
+.icon-publish:before {
+  content: "\e68a";
+}
+
+.icon-save:before {
+  content: "\e68b";
+}
+
+.icon-checkbox:before {
+  content: "\e649";
+}
+
+.icon-mosaic:before {
+  content: "\e646";
+}
+
+.icon-media:before {
+  content: "\e647";
+}
+
+.icon-pic:before {
+  content: "\e648";
+}
+
+.icon-eye_f:before {
+  content: "\e644";
+}
+
+.icon-eye_c:before {
+  content: "\e645";
+}
+
+.icon-size-o:before {
+  content: "\e640";
+}
+
+.icon-size-f:before {
+  content: "\e641";
+}
+
+.icon-magnify:before {
+  content: "\e642";
+}
+
+.icon-reduce:before {
+  content: "\e643";
+}
+
+.icon-video1:before {
+  content: "\e63b";
+}
+
+.icon-uploading_s:before {
+  content: "\e63c";
+}
+
+.icon-path:before {
+  content: "\e63d";
+}
+
+.icon-record:before {
+  content: "\e63e";
+}
+
+.icon-clear:before {
+  content: "\e63f";
+}
+
+.icon-pause:before {
+  content: "\e636";
+}
+
+.icon-preview:before {
+  content: "\e63a";
+}
+
+.icon-full:before {
+  content: "\e638";
+}
+
+.icon-add:before {
+  content: "\e631";
+}
+
+.icon-del:before {
+  content: "\e632";
+}
+
+.icon-close:before {
+  content: "\e633";
+}
+
+.icon-web:before {
+  content: "\e635";
+}
+
+.icon-music:before {
+  content: "\e637";
+}
+
+.icon-uploading1:before {
+  content: "\e639";
+}
+
+.icon-state_e:before {
+  content: "\e624";
+}
+
+.icon-state_f:before {
+  content: "\e625";
+}
+
+.icon-state_s:before {
+  content: "\e626";
+}
+
+.icon-vip_uploading:before {
+  content: "\e623";
+}
+
+.icon-eye-n:before {
+  content: "\e621";
+}
+
+.icon-eye-s:before {
+  content: "\e622";
+}
+
+.icon-course:before {
+  content: "\e620";
+}
+
+.icon-edit:before {
+  content: "\e61f";
+}
+
+.icon-help:before {
+  content: "\e615";
+}
+
+.icon-rule:before {
+  content: "\e617";
+}
+
+.icon-link:before {
+  content: "\e618";
+}
+
+.icon-uploading:before {
+  content: "\e619";
+}
+
+.icon-vr:before {
+  content: "\e61a";
+}
+
+.icon-complete:before {
+  content: "\e61b";
+}
+
+.icon-download:before {
+  content: "\e61c";
+}
+
+.icon-pull-down:before {
+  content: "\e61d";
+}
+
+.icon-pull-up:before {
+  content: "\e61e";
+}
+
+.icon-updown:before {
+  content: "\e613";
+}
+
+.icon-scene:before {
+  content: "\e614";
+}
+
+.icon-message:before {
+  content: "\e60c";
+}
+
+.icon-basic:before {
+  content: "\e60d";
+}
+
+.icon-hotspot:before {
+  content: "\e60e";
+}
+
+.icon-guide:before {
+  content: "\e60f";
+}
+
+.icon-wander:before {
+  content: "\e610";
+}
+
+.icon-house:before {
+  content: "\e611";
+}
+
+.icon-video:before {
+  content: "\e612";
+}
+
+.icon-show_3d_normal:before {
+  content: "\e677";
+}
+
+.icon-show_plane_normal:before {
+  content: "\e67d";
+}
+
+.icon-show_roaming_selected:before {
+  content: "\e682";
+}
+
+.icon-show_plane_selected:before {
+  content: "\e684";
+}
+
+.icon-show_3d_selected:before {
+  content: "\e685";
+}
+
+.icon-show_roaming_normal:before {
+  content: "\e686";
+}
+

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 0
public/static/lib/iconfont/iconfont.js


+ 982 - 0
public/static/lib/iconfont/iconfont.json

@@ -0,0 +1,982 @@
+{
+  "id": "2596172",
+  "name": "四维看看编辑器V4",
+  "font_family": "iconfont",
+  "css_prefix_text": "icon-",
+  "description": "四维看看编辑器设计优化",
+  "glyphs": [
+    {
+      "icon_id": "20600368",
+      "name": "show_share",
+      "font_class": "show_share",
+      "unicode": "e690",
+      "unicode_decimal": 59024
+    },
+    {
+      "icon_id": "19543928",
+      "name": "show_more_ruler",
+      "font_class": "show_more_ruler",
+      "unicode": "e67b",
+      "unicode_decimal": 59003
+    },
+    {
+      "icon_id": "30499411",
+      "name": "transparency",
+      "font_class": "transparency",
+      "unicode": "e6d7",
+      "unicode_decimal": 59095
+    },
+    {
+      "icon_id": "30490892",
+      "name": "mosaic_e",
+      "font_class": "mosaic_e",
+      "unicode": "e6d2",
+      "unicode_decimal": 59090
+    },
+    {
+      "icon_id": "30490893",
+      "name": "eraser",
+      "font_class": "eraser",
+      "unicode": "e6d3",
+      "unicode_decimal": 59091
+    },
+    {
+      "icon_id": "30490894",
+      "name": "video",
+      "font_class": "video2",
+      "unicode": "e6d4",
+      "unicode_decimal": 59092
+    },
+    {
+      "icon_id": "30490946",
+      "name": "down",
+      "font_class": "down",
+      "unicode": "e6d5",
+      "unicode_decimal": 59093
+    },
+    {
+      "icon_id": "3141534",
+      "name": "清空",
+      "font_class": "qingkong-copy-copy",
+      "unicode": "e68f",
+      "unicode_decimal": 59023
+    },
+    {
+      "icon_id": "7878582",
+      "name": "QQ",
+      "font_class": "_qq",
+      "unicode": "e64b",
+      "unicode_decimal": 58955
+    },
+    {
+      "icon_id": "7878584",
+      "name": "朋友",
+      "font_class": "_friend",
+      "unicode": "e64c",
+      "unicode_decimal": 58956
+    },
+    {
+      "icon_id": "14887802",
+      "name": "link",
+      "font_class": "link1",
+      "unicode": "e6ff",
+      "unicode_decimal": 59135
+    },
+    {
+      "icon_id": "26296900",
+      "name": "icon_share_facebook",
+      "font_class": "icon_share_facebook",
+      "unicode": "e745",
+      "unicode_decimal": 59205
+    },
+    {
+      "icon_id": "26296901",
+      "name": "icon_share_whatsapp",
+      "font_class": "icon_share_whatsapp",
+      "unicode": "e746",
+      "unicode_decimal": 59206
+    },
+    {
+      "icon_id": "7878583",
+      "name": "微信",
+      "font_class": "_wechat",
+      "unicode": "e64a",
+      "unicode_decimal": 58954
+    },
+    {
+      "icon_id": "30230568",
+      "name": "watermark",
+      "font_class": "watermark",
+      "unicode": "e6cb",
+      "unicode_decimal": 59083
+    },
+    {
+      "icon_id": "30230353",
+      "name": "camera_h",
+      "font_class": "camera_h",
+      "unicode": "e6c7",
+      "unicode_decimal": 59079
+    },
+    {
+      "icon_id": "30230374",
+      "name": "1V1",
+      "font_class": "a-1V1",
+      "unicode": "e6c8",
+      "unicode_decimal": 59080
+    },
+    {
+      "icon_id": "12324810",
+      "name": "横标EN",
+      "font_class": "hengbiaoEN",
+      "unicode": "e6b9",
+      "unicode_decimal": 59065
+    },
+    {
+      "icon_id": "22788718",
+      "name": "hot_spot",
+      "font_class": "hot_spot",
+      "unicode": "e6b8",
+      "unicode_decimal": 59064
+    },
+    {
+      "icon_id": "29982018",
+      "name": "foot",
+      "font_class": "foot",
+      "unicode": "e6ba",
+      "unicode_decimal": 59066
+    },
+    {
+      "icon_id": "29365471",
+      "name": "music-t",
+      "font_class": "music-t",
+      "unicode": "e6b7",
+      "unicode_decimal": 59063
+    },
+    {
+      "icon_id": "29346730",
+      "name": "yes",
+      "font_class": "yes",
+      "unicode": "e6b5",
+      "unicode_decimal": 59061
+    },
+    {
+      "icon_id": "29346731",
+      "name": "no",
+      "font_class": "no",
+      "unicode": "e6b6",
+      "unicode_decimal": 59062
+    },
+    {
+      "icon_id": "20764383",
+      "name": "floor_rename",
+      "font_class": "floor_rename",
+      "unicode": "e75b",
+      "unicode_decimal": 59227
+    },
+    {
+      "icon_id": "29255507",
+      "name": "play_stop",
+      "font_class": "play_stop",
+      "unicode": "e6b4",
+      "unicode_decimal": 59060
+    },
+    {
+      "icon_id": "16303117",
+      "name": "scene_auto",
+      "font_class": "scene_auto",
+      "unicode": "e721",
+      "unicode_decimal": 59169
+    },
+    {
+      "icon_id": "28895680",
+      "name": "compass",
+      "font_class": "compass",
+      "unicode": "e6b3",
+      "unicode_decimal": 59059
+    },
+    {
+      "icon_id": "28351771",
+      "name": "h-d",
+      "font_class": "h-d",
+      "unicode": "e6b2",
+      "unicode_decimal": 59058
+    },
+    {
+      "icon_id": "16270567",
+      "name": "scene_screen",
+      "font_class": "scene_screen",
+      "unicode": "e717",
+      "unicode_decimal": 59159
+    },
+    {
+      "icon_id": "15936377",
+      "name": "scene_full",
+      "font_class": "scene_full",
+      "unicode": "e712",
+      "unicode_decimal": 59154
+    },
+    {
+      "icon_id": "15936378",
+      "name": "scene_window",
+      "font_class": "scene_window",
+      "unicode": "e713",
+      "unicode_decimal": 59155
+    },
+    {
+      "icon_id": "7857935",
+      "name": "返回",
+      "font_class": "_back",
+      "unicode": "e609",
+      "unicode_decimal": 58889
+    },
+    {
+      "icon_id": "20066553",
+      "name": "show_back",
+      "font_class": "show_back",
+      "unicode": "e678",
+      "unicode_decimal": 59000
+    },
+    {
+      "icon_id": "20066555",
+      "name": "show_more_share",
+      "font_class": "show_more_share",
+      "unicode": "e680",
+      "unicode_decimal": 59008
+    },
+    {
+      "icon_id": "19543927",
+      "name": "show_more_finish",
+      "font_class": "show_more_finish",
+      "unicode": "e67a",
+      "unicode_decimal": 59002
+    },
+    {
+      "icon_id": "19543929",
+      "name": "show_more_music",
+      "font_class": "show_more_music",
+      "unicode": "e67c",
+      "unicode_decimal": 59004
+    },
+    {
+      "icon_id": "19543926",
+      "name": "show_map_collect",
+      "font_class": "show_map_collect",
+      "unicode": "e679",
+      "unicode_decimal": 59001
+    },
+    {
+      "icon_id": "27985200",
+      "name": "data-j",
+      "font_class": "data-j",
+      "unicode": "e6b1",
+      "unicode_decimal": 59057
+    },
+    {
+      "icon_id": "26690641",
+      "name": "cancel",
+      "font_class": "cancel",
+      "unicode": "e688",
+      "unicode_decimal": 59016
+    },
+    {
+      "icon_id": "26690677",
+      "name": "affirm",
+      "font_class": "affirm",
+      "unicode": "e689",
+      "unicode_decimal": 59017
+    },
+    {
+      "icon_id": "27896904",
+      "name": "checkbox_p",
+      "font_class": "checkbox_p",
+      "unicode": "e6b0",
+      "unicode_decimal": 59056
+    },
+    {
+      "icon_id": "27765016",
+      "name": "left",
+      "font_class": "left",
+      "unicode": "e6ae",
+      "unicode_decimal": 59054
+    },
+    {
+      "icon_id": "27765017",
+      "name": "right",
+      "font_class": "right",
+      "unicode": "e6af",
+      "unicode_decimal": 59055
+    },
+    {
+      "icon_id": "7858065",
+      "name": "loading",
+      "font_class": "_loading_",
+      "unicode": "e627",
+      "unicode_decimal": 58919
+    },
+    {
+      "icon_id": "20066572",
+      "name": "show_function_collect",
+      "font_class": "show_function_collect",
+      "unicode": "e687",
+      "unicode_decimal": 59015
+    },
+    {
+      "icon_id": "19543931",
+      "name": "show_more",
+      "font_class": "show_more",
+      "unicode": "e67e",
+      "unicode_decimal": 59006
+    },
+    {
+      "icon_id": "26914809",
+      "name": "d-r",
+      "font_class": "d-r",
+      "unicode": "e68d",
+      "unicode_decimal": 59021
+    },
+    {
+      "icon_id": "26914810",
+      "name": "up-a",
+      "font_class": "up-a",
+      "unicode": "e68e",
+      "unicode_decimal": 59022
+    },
+    {
+      "icon_id": "14510564",
+      "name": "edit_mirror",
+      "font_class": "fanzhuan",
+      "unicode": "e6fa",
+      "unicode_decimal": 59130
+    },
+    {
+      "icon_id": "27294582",
+      "name": "neiqiang",
+      "font_class": "cad-neiqiang",
+      "unicode": "e698",
+      "unicode_decimal": 59032
+    },
+    {
+      "icon_id": "27294583",
+      "name": "waiqiang",
+      "font_class": "cad-waiqiang",
+      "unicode": "e69a",
+      "unicode_decimal": 59034
+    },
+    {
+      "icon_id": "27294616",
+      "name": "shuangkaimen",
+      "font_class": "cad-shuangkaimen",
+      "unicode": "e69b",
+      "unicode_decimal": 59035
+    },
+    {
+      "icon_id": "27294617",
+      "name": "zimumen",
+      "font_class": "cad-zimumen",
+      "unicode": "e69c",
+      "unicode_decimal": 59036
+    },
+    {
+      "icon_id": "27294618",
+      "name": "men",
+      "font_class": "cad-men",
+      "unicode": "e69d",
+      "unicode_decimal": 59037
+    },
+    {
+      "icon_id": "27294620",
+      "name": "yimen",
+      "font_class": "cad-yimen",
+      "unicode": "e69e",
+      "unicode_decimal": 59038
+    },
+    {
+      "icon_id": "27294621",
+      "name": "zhediemen",
+      "font_class": "cad-zhediemen",
+      "unicode": "e69f",
+      "unicode_decimal": 59039
+    },
+    {
+      "icon_id": "27294699",
+      "name": "luodichuang",
+      "font_class": "cad-luodichuang",
+      "unicode": "e6a0",
+      "unicode_decimal": 59040
+    },
+    {
+      "icon_id": "27294700",
+      "name": "chuang",
+      "font_class": "cad-chuang",
+      "unicode": "e6a1",
+      "unicode_decimal": 59041
+    },
+    {
+      "icon_id": "27294701",
+      "name": "piaochuang",
+      "font_class": "cad-piaochuang",
+      "unicode": "e6a2",
+      "unicode_decimal": 59042
+    },
+    {
+      "icon_id": "27294702",
+      "name": "uxingchuang",
+      "font_class": "cad-uxingchuang",
+      "unicode": "e6a4",
+      "unicode_decimal": 59044
+    },
+    {
+      "icon_id": "27294703",
+      "name": "lxingchuang",
+      "font_class": "cad-lxingchuang",
+      "unicode": "e6a5",
+      "unicode_decimal": 59045
+    },
+    {
+      "icon_id": "27294704",
+      "name": "lpiaochuang",
+      "font_class": "cad-lpiaochuang",
+      "unicode": "e6a6",
+      "unicode_decimal": 59046
+    },
+    {
+      "icon_id": "27294705",
+      "name": "upiaochuang",
+      "font_class": "cad-upiaochuang",
+      "unicode": "e6a7",
+      "unicode_decimal": 59047
+    },
+    {
+      "icon_id": "27294743",
+      "name": "liang",
+      "font_class": "cad-liang",
+      "unicode": "e6a8",
+      "unicode_decimal": 59048
+    },
+    {
+      "icon_id": "27294744",
+      "name": "yandao",
+      "font_class": "cad-yandao",
+      "unicode": "e6a9",
+      "unicode_decimal": 59049
+    },
+    {
+      "icon_id": "27294745",
+      "name": "zhuzi",
+      "font_class": "cad-zhuzi",
+      "unicode": "e6aa",
+      "unicode_decimal": 59050
+    },
+    {
+      "icon_id": "27294746",
+      "name": "dianti",
+      "font_class": "cad-dianti",
+      "unicode": "e6ab",
+      "unicode_decimal": 59051
+    },
+    {
+      "icon_id": "27294747",
+      "name": "loudao",
+      "font_class": "cad-loudao",
+      "unicode": "e6ac",
+      "unicode_decimal": 59052
+    },
+    {
+      "icon_id": "27297593",
+      "name": "dange",
+      "font_class": "cad-dange",
+      "unicode": "e6ad",
+      "unicode_decimal": 59053
+    },
+    {
+      "icon_id": "27294584",
+      "name": "yakou",
+      "font_class": "cad-yakou",
+      "unicode": "e699",
+      "unicode_decimal": 59033
+    },
+    {
+      "icon_id": "11304931",
+      "name": "more read",
+      "font_class": "more",
+      "unicode": "e600",
+      "unicode_decimal": 58880
+    },
+    {
+      "icon_id": "27264933",
+      "name": "mosaic",
+      "font_class": "mosaic1",
+      "unicode": "e697",
+      "unicode_decimal": 59031
+    },
+    {
+      "icon_id": "12324809",
+      "name": "横标CN",
+      "font_class": "hengbiaoCN",
+      "unicode": "e6a3",
+      "unicode_decimal": 59043
+    },
+    {
+      "icon_id": "27200779",
+      "name": "nor",
+      "font_class": "nor",
+      "unicode": "e696",
+      "unicode_decimal": 59030
+    },
+    {
+      "icon_id": "25671886",
+      "name": "checkbox",
+      "font_class": "checkbox1",
+      "unicode": "e65d",
+      "unicode_decimal": 58973
+    },
+    {
+      "icon_id": "27198807",
+      "name": "rotate",
+      "font_class": "rotate",
+      "unicode": "e695",
+      "unicode_decimal": 59029
+    },
+    {
+      "icon_id": "27198774",
+      "name": "adapt",
+      "font_class": "adapt",
+      "unicode": "e692",
+      "unicode_decimal": 59026
+    },
+    {
+      "icon_id": "27198776",
+      "name": "recover",
+      "font_class": "recover",
+      "unicode": "e693",
+      "unicode_decimal": 59027
+    },
+    {
+      "icon_id": "27198777",
+      "name": "repeal",
+      "font_class": "repeal",
+      "unicode": "e694",
+      "unicode_decimal": 59028
+    },
+    {
+      "icon_id": "25654903",
+      "name": "reset",
+      "font_class": "reset",
+      "unicode": "e65a",
+      "unicode_decimal": 58970
+    },
+    {
+      "icon_id": "26971297",
+      "name": "course",
+      "font_class": "course1",
+      "unicode": "e68c",
+      "unicode_decimal": 59020
+    },
+    {
+      "icon_id": "26950708",
+      "name": "publish",
+      "font_class": "publish",
+      "unicode": "e68a",
+      "unicode_decimal": 59018
+    },
+    {
+      "icon_id": "26950711",
+      "name": "save",
+      "font_class": "save",
+      "unicode": "e68b",
+      "unicode_decimal": 59019
+    },
+    {
+      "icon_id": "23842269",
+      "name": "sel",
+      "font_class": "checkbox",
+      "unicode": "e649",
+      "unicode_decimal": 58953
+    },
+    {
+      "icon_id": "23786361",
+      "name": "mosaic",
+      "font_class": "mosaic",
+      "unicode": "e646",
+      "unicode_decimal": 58950
+    },
+    {
+      "icon_id": "23786362",
+      "name": "media",
+      "font_class": "media",
+      "unicode": "e647",
+      "unicode_decimal": 58951
+    },
+    {
+      "icon_id": "23786363",
+      "name": "pic",
+      "font_class": "pic",
+      "unicode": "e648",
+      "unicode_decimal": 58952
+    },
+    {
+      "icon_id": "23783948",
+      "name": "eye_f",
+      "font_class": "eye_f",
+      "unicode": "e644",
+      "unicode_decimal": 58948
+    },
+    {
+      "icon_id": "23783949",
+      "name": "eye_c",
+      "font_class": "eye_c",
+      "unicode": "e645",
+      "unicode_decimal": 58949
+    },
+    {
+      "icon_id": "23783512",
+      "name": "size-o",
+      "font_class": "size-o",
+      "unicode": "e640",
+      "unicode_decimal": 58944
+    },
+    {
+      "icon_id": "23783513",
+      "name": "size-f",
+      "font_class": "size-f",
+      "unicode": "e641",
+      "unicode_decimal": 58945
+    },
+    {
+      "icon_id": "23783514",
+      "name": "magnify",
+      "font_class": "magnify",
+      "unicode": "e642",
+      "unicode_decimal": 58946
+    },
+    {
+      "icon_id": "23783515",
+      "name": "reduce",
+      "font_class": "reduce",
+      "unicode": "e643",
+      "unicode_decimal": 58947
+    },
+    {
+      "icon_id": "23781429",
+      "name": "video",
+      "font_class": "video1",
+      "unicode": "e63b",
+      "unicode_decimal": 58939
+    },
+    {
+      "icon_id": "23781430",
+      "name": "uploading_s",
+      "font_class": "uploading_s",
+      "unicode": "e63c",
+      "unicode_decimal": 58940
+    },
+    {
+      "icon_id": "23781431",
+      "name": "path",
+      "font_class": "path",
+      "unicode": "e63d",
+      "unicode_decimal": 58941
+    },
+    {
+      "icon_id": "23781432",
+      "name": "record",
+      "font_class": "record",
+      "unicode": "e63e",
+      "unicode_decimal": 58942
+    },
+    {
+      "icon_id": "23781433",
+      "name": "clear",
+      "font_class": "clear",
+      "unicode": "e63f",
+      "unicode_decimal": 58943
+    },
+    {
+      "icon_id": "23773343",
+      "name": "pause",
+      "font_class": "pause",
+      "unicode": "e636",
+      "unicode_decimal": 58934
+    },
+    {
+      "icon_id": "23773344",
+      "name": "preview",
+      "font_class": "preview",
+      "unicode": "e63a",
+      "unicode_decimal": 58938
+    },
+    {
+      "icon_id": "23773141",
+      "name": "full",
+      "font_class": "full",
+      "unicode": "e638",
+      "unicode_decimal": 58936
+    },
+    {
+      "icon_id": "23773068",
+      "name": "add",
+      "font_class": "add",
+      "unicode": "e631",
+      "unicode_decimal": 58929
+    },
+    {
+      "icon_id": "23773069",
+      "name": "del",
+      "font_class": "del",
+      "unicode": "e632",
+      "unicode_decimal": 58930
+    },
+    {
+      "icon_id": "23773070",
+      "name": "close",
+      "font_class": "close",
+      "unicode": "e633",
+      "unicode_decimal": 58931
+    },
+    {
+      "icon_id": "23773072",
+      "name": "web",
+      "font_class": "web",
+      "unicode": "e635",
+      "unicode_decimal": 58933
+    },
+    {
+      "icon_id": "23773074",
+      "name": "music",
+      "font_class": "music",
+      "unicode": "e637",
+      "unicode_decimal": 58935
+    },
+    {
+      "icon_id": "23773076",
+      "name": "uploading",
+      "font_class": "uploading1",
+      "unicode": "e639",
+      "unicode_decimal": 58937
+    },
+    {
+      "icon_id": "22132762",
+      "name": "state_e",
+      "font_class": "state_e",
+      "unicode": "e624",
+      "unicode_decimal": 58916
+    },
+    {
+      "icon_id": "22132763",
+      "name": "state_f",
+      "font_class": "state_f",
+      "unicode": "e625",
+      "unicode_decimal": 58917
+    },
+    {
+      "icon_id": "22132764",
+      "name": "state_s",
+      "font_class": "state_s",
+      "unicode": "e626",
+      "unicode_decimal": 58918
+    },
+    {
+      "icon_id": "22130256",
+      "name": "vip_uploading",
+      "font_class": "vip_uploading",
+      "unicode": "e623",
+      "unicode_decimal": 58915
+    },
+    {
+      "icon_id": "22099675",
+      "name": "eye-n",
+      "font_class": "eye-n",
+      "unicode": "e621",
+      "unicode_decimal": 58913
+    },
+    {
+      "icon_id": "22099676",
+      "name": "eye-s",
+      "font_class": "eye-s",
+      "unicode": "e622",
+      "unicode_decimal": 58914
+    },
+    {
+      "icon_id": "22099634",
+      "name": "course",
+      "font_class": "course",
+      "unicode": "e620",
+      "unicode_decimal": 58912
+    },
+    {
+      "icon_id": "22099525",
+      "name": "edit",
+      "font_class": "edit",
+      "unicode": "e61f",
+      "unicode_decimal": 58911
+    },
+    {
+      "icon_id": "22099475",
+      "name": "help",
+      "font_class": "help",
+      "unicode": "e615",
+      "unicode_decimal": 58901
+    },
+    {
+      "icon_id": "22099478",
+      "name": "rule",
+      "font_class": "rule",
+      "unicode": "e617",
+      "unicode_decimal": 58903
+    },
+    {
+      "icon_id": "22099479",
+      "name": "link",
+      "font_class": "link",
+      "unicode": "e618",
+      "unicode_decimal": 58904
+    },
+    {
+      "icon_id": "22099480",
+      "name": "uploading",
+      "font_class": "uploading",
+      "unicode": "e619",
+      "unicode_decimal": 58905
+    },
+    {
+      "icon_id": "22099481",
+      "name": "vr",
+      "font_class": "vr",
+      "unicode": "e61a",
+      "unicode_decimal": 58906
+    },
+    {
+      "icon_id": "22099484",
+      "name": "complete",
+      "font_class": "complete",
+      "unicode": "e61b",
+      "unicode_decimal": 58907
+    },
+    {
+      "icon_id": "22099499",
+      "name": "download",
+      "font_class": "download",
+      "unicode": "e61c",
+      "unicode_decimal": 58908
+    },
+    {
+      "icon_id": "22099518",
+      "name": "pull-down",
+      "font_class": "pull-down",
+      "unicode": "e61d",
+      "unicode_decimal": 58909
+    },
+    {
+      "icon_id": "22099519",
+      "name": "pull-up",
+      "font_class": "pull-up",
+      "unicode": "e61e",
+      "unicode_decimal": 58910
+    },
+    {
+      "icon_id": "22099070",
+      "name": "updown",
+      "font_class": "updown",
+      "unicode": "e613",
+      "unicode_decimal": 58899
+    },
+    {
+      "icon_id": "22099071",
+      "name": "scene",
+      "font_class": "scene",
+      "unicode": "e614",
+      "unicode_decimal": 58900
+    },
+    {
+      "icon_id": "22099025",
+      "name": "message",
+      "font_class": "message",
+      "unicode": "e60c",
+      "unicode_decimal": 58892
+    },
+    {
+      "icon_id": "22099028",
+      "name": "basic",
+      "font_class": "basic",
+      "unicode": "e60d",
+      "unicode_decimal": 58893
+    },
+    {
+      "icon_id": "22099032",
+      "name": "hotspot",
+      "font_class": "hotspot",
+      "unicode": "e60e",
+      "unicode_decimal": 58894
+    },
+    {
+      "icon_id": "22099035",
+      "name": "guide",
+      "font_class": "guide",
+      "unicode": "e60f",
+      "unicode_decimal": 58895
+    },
+    {
+      "icon_id": "22099060",
+      "name": "wander",
+      "font_class": "wander",
+      "unicode": "e610",
+      "unicode_decimal": 58896
+    },
+    {
+      "icon_id": "22099068",
+      "name": "house",
+      "font_class": "house",
+      "unicode": "e611",
+      "unicode_decimal": 58897
+    },
+    {
+      "icon_id": "22099069",
+      "name": "video",
+      "font_class": "video",
+      "unicode": "e612",
+      "unicode_decimal": 58898
+    },
+    {
+      "icon_id": "20066551",
+      "name": "show_3d_normal",
+      "font_class": "show_3d_normal",
+      "unicode": "e677",
+      "unicode_decimal": 58999
+    },
+    {
+      "icon_id": "20066554",
+      "name": "show_plane_normal",
+      "font_class": "show_plane_normal",
+      "unicode": "e67d",
+      "unicode_decimal": 59005
+    },
+    {
+      "icon_id": "20066556",
+      "name": "show_roaming_selected",
+      "font_class": "show_roaming_selected",
+      "unicode": "e682",
+      "unicode_decimal": 59010
+    },
+    {
+      "icon_id": "20066557",
+      "name": "show_plane_selected",
+      "font_class": "show_plane_selected",
+      "unicode": "e684",
+      "unicode_decimal": 59012
+    },
+    {
+      "icon_id": "20066558",
+      "name": "show_3d_selected",
+      "font_class": "show_3d_selected",
+      "unicode": "e685",
+      "unicode_decimal": 59013
+    },
+    {
+      "icon_id": "20066559",
+      "name": "show_roaming_normal",
+      "font_class": "show_roaming_normal",
+      "unicode": "e686",
+      "unicode_decimal": 59014
+    }
+  ]
+}

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


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


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


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 0
public/static/lib/jweixin-1.0.0.js


+ 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('pg.html') !== -1) {
+            newLink = orgLink.replace('pg.html', 'mg.html')
+        }
+    } else {
+        if (orgLink.indexOf('mg.html') !== -1) {
+            newLink = orgLink.replace('mg.html', 'pg.html')
+        }
+    }
+    if (newLink) {
+        win.location.href = newLink
+    }
+}(window))

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 13 - 0
public/static/lib/swiper/swiper.css


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 10663 - 0
public/static/lib/swiper/swiper.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 10 - 0
public/static/lib/vconsole.js


+ 146 - 0
public/test-bim.html

@@ -0,0 +1,146 @@
+<!DOCTYPE html>
+<html lang="en">
+  <!-- 本DEMO中将演示如何通过API设置自定义模型显示视角及工具条上的HOME视图 -->
+
+  <head>
+    <meta charset="utf-8" />
+    <title>自定义HOME视图</title>
+    <style type="text/css">
+      * {
+        margin: 0;
+        padding: 0;
+      }
+
+      html,
+      body {
+        height: 100%;
+      }
+
+      .buttons {
+        font-size: 0;
+      }
+
+      .button {
+        margin: 5px 0 5px 5px;
+        width: 100px;
+        height: 30px;
+        border-radius: 3px;
+        border: none;
+        background: #32d3a6;
+        color: #ffffff;
+      }
+
+      .main {
+        display: flex;
+        flex-direction: column;
+        overflow: hidden;
+        height: 100%;
+      }
+
+      #domId {
+        flex: 1;
+      }
+    </style>
+  </head>
+
+  <body>
+    <!-- 定义DOM元素,用于在该DOM元素中显示模型或图纸 -->
+    <div class="main">
+      <div class="buttons">
+        <button class="button" id="btnCustomView" onclick="customView()">
+          设置HOME视图
+        </button>
+      </div>
+      <!-- 定义DOM元素,用于在该DOM元素中显示模型或图纸 -->
+      <div id="domId"></div>
+    </div>
+    <!-- 引用BIMFACE的JavaScript显示组件库 -->
+    <script src="https://static.bimface.com/api/BimfaceSDKLoader/BimfaceSDKLoader@latest-release.js"></script>
+    <script>
+      let viewToken = "4fce28d46f8d45f09d0e8556b7f08e52";
+      // 声明Viewer及App
+      let viewer3D;
+      let app;
+      let viewAdded = false;
+      let cameraState = {
+        name: "persp",
+        position: {
+          x: -15290.504153609158,
+          y: -11705.98598911822,
+          z: 6547.152792941356,
+        },
+        target: {
+          x: 35869.08012166626,
+          y: 23950.30963410126,
+          z: -9486.25721153848,
+        },
+        up: {
+          x: 0,
+          y: -0.0000036732050934432307,
+          z: 0.9999999999932538,
+        },
+        fov: 45,
+      };
+      // 配置JSSDK加载项
+      window.onload = function () {
+        let loaderConfig = new BimfaceSDKLoaderConfig();
+        loaderConfig.viewToken = viewToken;
+        BimfaceSDKLoader.load(loaderConfig, successCallback, failureCallback);
+      };
+      // 加载成功回调函数
+      let worldPosition = new Array();
+      function successCallback(viewMetaData) {
+        let dom4Show = document.getElementById("domId");
+        // 设置WebApplication3D的配置项
+        let webAppConfig =
+          new Glodon.Bimface.Application.WebApplicationRfaConfig();
+        webAppConfig.domElement = dom4Show;
+        webAppConfig.EnableFamilyList = false;
+        // 设置模型爆炸配置项
+        webAppConfig.enableExplosion = true;
+        // 创建WebApplication3D,用以显示模型
+        app = new Glodon.Bimface.Application.WebApplicationRfa(webAppConfig);
+        app.addView(viewToken);
+        viewer3D = app.getViewer();
+        // 监听添加view完成的事件
+        viewer3D.addEventListener(
+          Glodon.Bimface.Viewer.Viewer3DEvent.ViewAdded,
+          function () {
+            setCameraStatus();
+            //自适应屏幕大小
+            window.onresize = function () {
+              viewer3D.resize(
+                document.documentElement.clientWidth,
+                document.documentElement.clientHeight - 40
+              );
+            };
+            viewAdded = true;
+            // 渲染3D模型
+            viewer3D.render();
+          }
+        );
+      }
+
+      // 加载失败回调函数
+      function failureCallback(error) {
+        console.log(error);
+      }
+      function setCameraStatus() {
+        viewer3D.setCameraStatus(cameraState);
+      }
+
+      // ************************** 设置自定义HOME视图 **************************
+      let homeview;
+      function customView() {
+        if (!viewAdded) {
+          return;
+        } else {
+          homeview = viewer3D.getCameraStatus();
+          viewer3D.recordCustomHomeview(homeview);
+          window.alert(JSON.stringify(homeview));
+          viewer3D.render();
+        }
+      }
+    </script>
+  </body>
+</html>

+ 0 - 0
src/assets/index.scss


+ 0 - 0
src/pages/bim.js


+ 0 - 0
src/pages/laser-bim.js


+ 0 - 0
src/pages/laser.js


+ 149 - 0
src/utils/ConvertViews.js

@@ -0,0 +1,149 @@
+export default class ConvertViews {
+    constructor() {
+        this.sourceApp = null
+        this.targetApp = null
+        this.player1 = null
+        this.player2 = null
+        this.KanKan = null
+    }
+
+    bind(options = { sourceApp: null, targetApp: null }) {
+        if (options.sourceApp) {
+            this.sourceApp = options.sourceApp
+            this.player1 = this.sourceApp.core.get('Player')
+            //this.player1.model.addEventListener('gotPanos', this.init.bind(this))
+        } else if (options.targetApp) {
+            this.targetApp = options.targetApp
+            this.player2 = this.targetApp.core.get('Player')
+            //this.player2.model.addEventListener('gotPanos', this.init.bind(this))
+        }
+        if (this.sourceApp && this.targetApp) {
+            // 两个实例都加载完了,可以进行特性处理
+            this.init()
+            this.applyDiff(options.sourceApp || options.targetApp)
+        }
+    }
+
+    init() {
+        if (!this.player1.model.panos.list.length || !this.player2.model.panos.list.length) return
+
+        this.diffLon = this.computeAveDiffLon()
+        this.diffQuaternion = new this.KanKan.THREE.Quaternion().setFromAxisAngle(new this.KanKan.THREE.Vector3(0, 1, 0), this.diffLon)
+        this.diffQuaternionInvert = this.diffQuaternion.clone().invert()
+    }
+
+    computeAveDiffLon() {
+        //获取两个场景的lon偏差值
+        //需要点的个数>1, 且两个场景点一一对应,位置接近且顺序一致
+
+        let diffLonAve = 0,
+            diffLons = []
+
+        let panoPos1 = this.player1.model.panos.list.map(e => e.position)
+        let panoPos2 = this.player2.model.panos.list.map(e => e.position)
+        let length = panoPos1.length
+
+        //挑选连续的两个点为向量来计算,如有123个漫游点,则选取12 23 31作为向量
+
+        let index = 0
+        while (index < length) {
+            let pos11 = new this.KanKan.THREE.Vector3().copy(panoPos1[index])
+            let pos12 = new this.KanKan.THREE.Vector3().copy(panoPos1[(index + 1) % length])
+            let pos21 = new this.KanKan.THREE.Vector3().copy(panoPos2[index])
+            let pos22 = new this.KanKan.THREE.Vector3().copy(panoPos2[(index + 1) % length])
+            let vec1 = new this.KanKan.THREE.Vector3().subVectors(pos11, pos12).setY(0)
+            let vec2 = new this.KanKan.THREE.Vector3().subVectors(pos21, pos22).setY(0)
+            let diffLon = this.KanKan.Utils.math.getAngle(vec1, vec2, 'z')
+            diffLons.push(diffLon)
+            diffLonAve += diffLon
+            index++
+        }
+
+        console.log('diffLons', diffLons)
+        diffLonAve /= length
+        console.log('diffLonAve', diffLonAve)
+        return /* KanKan.THREE.MathUtils.radToDeg( */ diffLonAve /* ) */
+    }
+
+    applyDiff(app) {
+        //sourcePlayer -> targetPlayer
+        if (!this.player1 || !this.player2 || this.targetApp.config.num == this.sourceApp.config.num) return //场景码相同的话返回
+        if (this.player1.mode != this.player2.mode) return
+
+        let player1, player2, quaternion //player1为要改变的, player2是参照
+        if (app == this.sourceApp) {
+            player1 = this.player1
+            player2 = this.player2
+            quaternion = this.diffQuaternion
+        } else {
+            player1 = this.player2
+            player2 = this.player1
+            quaternion = this.diffQuaternionInvert
+        }
+
+        let control1 = player1.cameraControls.activeControl
+        let control2 = player2.cameraControls.activeControl
+        //if(!control1 || !control2)return
+
+        player1.quaternion.copy(player2.quaternion).premultiply(quaternion)
+
+        if (player1.mode == 'panorama') {
+            //平移
+            let dir = new this.KanKan.THREE.Vector3().subVectors(control2.target, player2.position)
+            dir.applyQuaternion(quaternion)
+            let target1 = new this.KanKan.THREE.Vector3().addVectors(player1.position, dir)
+            control1.lookAt(target1)
+            control1.target.copy(target1)
+        } else if (control2) {
+            //修改target,保证target在panos之间的相对位置一样
+            //console.log('target', control2.target.clone())
+            //console.log('position', control2.target.clone())
+            let vec = new this.KanKan.THREE.Vector3().subVectors(control2.target, player2.model.panos.list[0].position)
+            vec.applyQuaternion(quaternion)
+            control1.target.addVectors(player1.model.panos.list[0].position, vec)
+            player1.target.copy(control1.target)
+            //修改position,保证方向一样
+            let dir = new this.KanKan.THREE.Vector3().subVectors(control2.camera.position /* player2.position */, control2.target)
+            dir.applyQuaternion(quaternion)
+            player1.position = new this.KanKan.THREE.Vector3().addVectors(control1.target, dir)
+
+            control1.camera.position.copy(player1.position)
+        }
+        control1.camera.quaternion.copy(player1.quaternion)
+    }
+
+    /* applyDiff(app, data) {
+        //sourcePlayer -> targetPlayer
+
+        let quaternion
+        if (data.quaternion) {
+            quaternion = new this.KanKan.THREE.Quaternion().copy(data.quaternion)
+            data.quaternion = quaternion
+        } else if (data.info && data.info.quaternion) {
+            //飞出
+            quaternion = new this.KanKan.THREE.Quaternion(data.info.quaternion._x, data.info.quaternion._y, data.info.quaternion._z, data.info.quaternion._w)
+            data.info.quaternion = quaternion
+            //let radius = data.info.position.distanceTo(data.info.target)
+        }
+        if (!quaternion) return
+
+        if (app == this.sourceApp) {
+            quaternion.premultiply(this.diffQuaternionInvert)
+        } else {
+            quaternion.premultiply(this.diffQuaternion)
+        }
+
+        if (data.info && data.info.quaternion) {
+            //飞出
+            let dir = new this.KanKan.THREE.Vector3().subVectors(data.info.position, data.info.target)
+            dir.applyQuaternion(app == this.sourceApp ? this.diffQuaternionInvert : this.diffQuaternion)
+            data.info.position = new this.KanKan.THREE.Vector3().addVectors(data.info.target, dir)
+        }
+
+         
+
+        //先不管飞出后的位置平移
+
+        //位置参照第一个漫游点。保持相机相对第一个漫游点的位移和
+    } */
+}

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 360 - 0
src/utils/browser.js


+ 109 - 0
src/utils/common.js

@@ -0,0 +1,109 @@
+import { getApp } from '@/app'
+export default {
+    deepExtend: function e(t) {
+        t = t || {}
+        for (var i = 1; i < arguments.length; i++) {
+            var n = arguments[i]
+            if (n) for (var r in n) n.hasOwnProperty(r) && ('object' == typeof n[r] ? (t[r] = e(t[r], n[r])) : (t[r] = n[r]))
+        }
+        return t
+    },
+    changeUrl(name) {
+        if (name.indexOf('http') != -1) {
+            return name
+        } else {
+            if ((typeof name === 'string' && name.substring(0, 4) == 'blob') || (typeof name === 'string' && name.substring(0, 10) == 'data:image')) {
+                return name
+            } else {
+                return getApp().resource.getUserResourceURL(name)
+            }
+        }
+    },
+    getRandomSid() {
+        //5-7位随机字符串 + 6位时间    为热点准备
+        var pre = this.randomWord(true, 5, 7)
+        var post = new Date().getTime() + ''
+        var len = post.length
+        post = post.substring(len - 8, len - 5) + post.substring(len - 3, len) //其实还是有可能重复的....
+        return pre + post
+    },
+    randomWord(randomFlag, min, max) {
+        //随机字符串
+        var str = '',
+            range = min,
+            arr = [
+                '0',
+                '1',
+                '2',
+                '3',
+                '4',
+                '5',
+                '6',
+                '7',
+                '8',
+                '9',
+                'a',
+                'b',
+                'c',
+                'd',
+                'e',
+                'f',
+                'g',
+                'h',
+                'i',
+                'j',
+                'k',
+                'l',
+                'm',
+                'n',
+                'o',
+                'p',
+                'q',
+                'r',
+                's',
+                't',
+                'u',
+                'v',
+                'w',
+                'x',
+                'y',
+                'z',
+                'A',
+                'B',
+                'C',
+                'D',
+                'E',
+                'F',
+                'G',
+                'H',
+                'I',
+                'J',
+                'K',
+                'L',
+                'M',
+                'N',
+                'O',
+                'P',
+                'Q',
+                'R',
+                'S',
+                'T',
+                'U',
+                'V',
+                'W',
+                'X',
+                'Y',
+                'Z'
+            ]
+
+        if (randomFlag) {
+            // 随机长度
+            range = Math.round(Math.random() * (max - min)) + min
+        }
+        for (var i = 0; i < range; i++) {
+            var pos = Math.round(Math.random() * (arr.length - 1))
+            str += arr[pos]
+        }
+        return str
+    }
+}

+ 122 - 0
src/utils/file.js

@@ -0,0 +1,122 @@
+// import { i18n } from "@/lang/index"
+// 媒体名称
+export const mediaTypes = {
+    // image: i18n.t("common.photo"),
+    // video: i18n.t("common.video"),
+    // audio: i18n.t("common.voice"),
+}
+
+// 媒体扩展类型
+export const mediaMimes = {
+    image: ['jpg', 'png', 'jpeg', 'bmp', 'gif'],
+    audio: ['mp3', 'aac', 'ogg', 'wav' /* , "m4a" */],
+    video: ['mp4', 'mov', 'quicktime', 'webm' /* "rmvb", "wmv" */] //ios:mov
+}
+
+// 媒体大小显示(MB)
+export const mediaMaxSize = {
+    image: 10,
+    video: 20,
+    audio: 5
+}
+
+/**
+ * 获取媒体扩展类型
+ * @param {Stirng} filename 文件名称
+ */
+export const getMime = filename => {
+    if (!filename || filename.indexOf('.') === -1) {
+        return ''
+    }
+
+    return filename
+        .split('.')
+        .pop()
+        .toLowerCase()
+}
+
+/**
+ * 在路径中获取文件名
+ * @param {*} path
+ */
+export const getFilename = path => {
+    const segment = (path || '').split('/')
+    return segment[segment.length - 1]
+}
+
+/**
+ * 检测媒体文件是否超过预设限制
+ * @param {String} type 媒体类型
+ * @param {Number} size 文件大小
+ */
+export const checkSizeLimit = (type, size) => {
+    size = size / 1024 / 1024
+
+    return size <= mediaMaxSize[type]
+}
+
+export const checkSizeLimitFree = (size, limit) => {
+    size = size / 1024 / 1024
+
+    return size <= limit
+}
+
+/**
+ * 检测媒体类型
+ * @param {String} type 媒体类型
+ * @param {String} filename 文件名称
+ */
+export const checkMediaMime = (type, filename) => {
+    const mime = getMime(filename)
+    const find = mediaMimes[type]
+    if (!find) {
+        return false
+    }
+
+    return find.indexOf(mime) !== -1
+}
+
+export const checkMediaMimeByAccept = (accept, filename) => {
+    let mime = getMime(filename)
+    let type = accept
+    if (type && type.indexOf('jpg') == -1 && type.indexOf('jpeg') != -1) {
+        type += ',image/jpg'
+    }
+    return (type || '').indexOf(mime) != -1
+}
+
+export const base64ToBlob = base64 => {
+    let arr = base64.split(','),
+        mime = arr[0].match(/:(.*?);/)[1],
+        bstr = atob(arr[1]),
+        n = bstr.length,
+        u8arr = new Uint8Array(n)
+    while (n--) {
+        u8arr[n] = bstr.charCodeAt(n)
+    }
+    return new Blob([u8arr], { type: mime })
+}
+
+export const base64ToDataURL = base64 => {
+    return window.URL.createObjectURL(base64ToBlob(base64))
+}
+
+export const blobToDataURL = blob => {
+    return window.URL.createObjectURL(blob)
+}
+
+export const blobToBase64 = function(blob) {
+    return new Promise(resolve => {
+        var reader = new FileReader()
+        reader.onload = function() {
+            resolve(reader.result)
+        }
+        reader.readAsDataURL(blob)
+    })
+}
+
+export function convertBlob2File(blob, name) {
+    return new File([blob], name, {
+        type: blob.type
+    })
+}

+ 140 - 0
src/utils/request.js

@@ -0,0 +1,140 @@
+/*
+ * @Author: Rindy
+ * @Date: 2021-04-25 15:58:21
+ * @LastEditors: Rindy
+ * @LastEditTime: 2021-05-08 15:49:54
+ * @Description: 注释
+ */
+
+import axios from 'axios'
+
+// TextDecoder polyfills for lower browser
+if (undefined === window.TextEncoder) {
+    window.TextEncoder = class _TextEncoder {
+        encode(s) {
+            return unescape(encodeURIComponent(s))
+                .split('')
+                .map(function(val) {
+                    return val.charCodeAt()
+                })
+        }
+    }
+    window.TextDecoder = class _TextDecoder {
+        decode(code_arr) {
+            return decodeURIComponent(escape(String.fromCharCode.apply(null, code_arr)))
+        }
+    }
+}
+
+const fetch = axios.create()
+
+fetch.interceptors.request.use(
+    config => {
+        config.headers['token'] = 123
+
+        return config
+    },
+    error => {
+        return Promise.reject(error)
+    }
+)
+fetch.interceptors.response.use(
+    response => {
+        // 正常的文件流
+        if (!/json/gi.test(response.headers['content-type'])) {
+            return response.data
+        }
+
+        // 以文件流方式请求但是返回json,需要解析为JSON对象
+        if (response.request.responseType === 'arraybuffer') {
+            let enc = new TextDecoder('utf-8')
+            let res = JSON.parse(enc.decode(new Uint8Array(response.data)))
+            return res
+        }
+
+        return response.data
+    },
+    error => {
+        console.error(error)
+    }
+)
+
+const http = {
+    retry(func, retries = 0, delay = 1000) {
+        return new Promise((resolve, reject) => {
+            func()
+                .then(resolve)
+                .catch(error => {
+                    if (retries <= 1) {
+                        reject(error)
+                    } else {
+                        setTimeout(() => {
+                            http.retry(func, retries - 1, delay)
+                                .then(resolve)
+                                .catch(reject)
+                        }, delay)
+                    }
+                })
+        })
+    },
+    get(url) {
+        return fetch.get(url)
+    },
+    getImage(url, retries = 3) {
+        return http.retry(
+            () =>
+                new Promise((resolve, reject) => {
+                    let img = new Image()
+                    img.src = url
+                    img.crossOrigin = 'anonymous'
+                    img.onload = function() {
+                        resolve(img)
+                    }
+                    img.onerror = function() {
+                        reject(`[${url}] load fail`)
+                    }
+                }),
+            retries
+        )
+    },
+    getBueffer(url) {
+        return fetch.get(url, {
+            responseType: 'arraybuffer'
+        })
+    },
+    getBlob(url) {
+        return fetch.get(url, {
+            responseType: 'blob'
+        })
+    },
+    post(url, data) {
+        return fetch.post(url, data)
+    },
+    postFile(url, data) {
+        const form = new FormData()
+        let cb = null
+        if (data.onUploadProgress) {
+            cb = data.onUploadProgress
+            delete data.onUploadProgress
+        }
+        for (let key in data) {
+            // if (key === 'files' && data[key].length > 0) {
+            //     for (let i = 0; i < data[key].length; i++) {
+            //         form.append(key, data[key][i])
+            //     }
+            // } else {
+            //     form.append(key, data[key])
+            // }
+            form.append(key, data[key])
+        }
+
+        return fetch.post(url, form, {
+            headers: {
+                'Content-Type': 'multipart/form-data'
+            },
+            onUploadProgress: cb
+        })
+    }
+}
+
+export { http, fetch }

+ 252 - 0
src/utils/string.js

@@ -0,0 +1,252 @@
+class CutString {
+    constructor(string, limit) {
+        // temparary node to parse the html tags in the string
+        this.tempDiv = document.createElement('div')
+        this.tempDiv.id = 'TempNodeForTest'
+        this.tempDiv.innerHTML = string
+        // while parsing text no of characters parsed
+        this.charCount = 0
+        this.limit = limit
+    }
+
+    cut() {
+        var newDiv = document.createElement('div')
+        this.searchEnd(this.tempDiv, newDiv)
+        return newDiv.innerHTML
+    }
+
+    searchEnd(parseDiv, newParent) {
+        var ele
+        var newEle
+        for (var j = 0; j < parseDiv.childNodes.length; j++) {
+            ele = parseDiv.childNodes[j]
+            // not text node
+            if (ele.nodeType != 3) {
+                newEle = ele.cloneNode(true)
+                newParent.appendChild(newEle)
+                if (ele.childNodes.length === 0) continue
+                newEle.innerHTML = ''
+                var res = this.searchEnd(ele, newEle)
+                if (res) return res
+                else {
+                    continue
+                }
+            }
+            if (ele.nodeValue.length + this.charCount >= this.limit) {
+                newEle = ele.cloneNode(true)
+                newEle.nodeValue = ele.nodeValue.substr(0, this.limit - this.charCount)
+                newParent.appendChild(newEle)
+                return true
+            }
+            newEle = ele.cloneNode(true)
+            newParent.appendChild(newEle)
+            this.charCount += ele.nodeValue.length
+        }
+        return false
+    }
+}
+
+export function defaults(newVal, oldVal, callback) {
+    let value
+    if (newVal === null || newVal === undefined) {
+        value = oldVal
+    } else {
+        value = newVal
+    }
+
+    if (callback) {
+        value = callback(value)
+    }
+
+    return value
+}
+
+/**
+ * html字符串裁剪
+ * @param {String} html
+ * @param {Number} length
+ */
+export function htmlCut(html, length) {
+    return new CutString(html, length).cut()
+}
+
+export function timeFormat(second) {
+    //秒
+    var str = '' //不支持大于60分钟的时间哟
+    var minute = parseInt(second / 60)
+    if (minute < 10) str += '0'
+    str += minute
+    second = parseInt(second % 60) + ''
+    if (second.length == 1) second = '0' + second
+    str = str + ':' + second
+    return str
+}
+
+export function monthDayFormat(date) {
+    //秒
+    if (date.indexOf('T') != -1) {
+        return date.substring(5, 10)
+    }
+}
+
+/**
+ * html字符串转文本
+ *  @param {String} html
+ */
+export const html2Text = (function() {
+    const div = document.createElement('div')
+    return function(html) {
+        if (!html) {
+            return ''
+        }
+        div.innerHTML = html
+        return div.innerText
+    }
+})()
+
+/**
+ * 计算字符串长度(英文占1个字符,中文汉字占2个字符)
+ * @param {*} str
+ */
+export function getCharLength(str = '') {
+    let len = 0
+    for (let i = 0; i < str.length; i++) {
+        if (str.charCodeAt(i) > 127 || str.charCodeAt(i) == 94) {
+            len += 2
+        } else {
+            len++
+        }
+    }
+    return len
+}
+
+/**
+ * 添加url请求参数
+ * @param {String} url 地址
+ * @param {Object} params 参数列表
+ */
+export function addQueryParams(url, params = {}) {
+    if (!url) {
+        return ''
+    }
+    let has = url.indexOf('?') > -1
+    let arr = []
+    for (let key in params) {
+        if (!url.match('&' + key + '|\\?' + key)) {
+            arr.push(`${key}=${params[key]}`)
+        }
+    }
+    if (arr.length) {
+        return `${url}${has ? '&' : '?'}${arr.join('&')}`
+    }
+
+    return url
+}
+
+export function randomWord(randomFlag, min, max) {
+    let str = ''
+    let range = min
+    let arr = [
+        '0',
+        '1',
+        '2',
+        '3',
+        '4',
+        '5',
+        '6',
+        '7',
+        '8',
+        '9',
+        'a',
+        'b',
+        'c',
+        'd',
+        'e',
+        'f',
+        'g',
+        'h',
+        'i',
+        'j',
+        'k',
+        'l',
+        'm',
+        'n',
+        'o',
+        'p',
+        'q',
+        'r',
+        's',
+        't',
+        'u',
+        'v',
+        'w',
+        'x',
+        'y',
+        'z',
+        'A',
+        'B',
+        'C',
+        'D',
+        'E',
+        'F',
+        'G',
+        'H',
+        'I',
+        'J',
+        'K',
+        'L',
+        'M',
+        'N',
+        'O',
+        'P',
+        'Q',
+        'R',
+        'S',
+        'T',
+        'U',
+        'V',
+        'W',
+        'X',
+        'Y',
+        'Z'
+    ]
+    // 随机产生
+    if (randomFlag) {
+        range = Math.round(Math.random() * (max - min)) + min
+    }
+    for (var i = 0; i < range; i++) {
+        let pos = Math.round(Math.random() * (arr.length - 1))
+        str += arr[pos]
+    }
+    return str
+}
+/**
+ * 密码加密
+ * @param {String} pwd
+ */
+export function password(pwd) {
+    const NUM = 2
+    const front = randomWord(false, 8)
+    const middle = randomWord(false, 8)
+    const end = randomWord(false, 8)
+
+    let str = Base64.encode(pwd)
+    let str1 = str.substring(0, NUM)
+    let str2 = str.substring(NUM)
+
+    return front + str2 + middle + str1 + end
+}
+
+/**
+ * 删除输入法表情符号
+ * @param {*} content
+ */
+export function removeEmoji(content = '') {
+    return content.replace(/[\ud800-\udbff][\udc00-\udfff]/g, function(char) {
+        if (char.length === 2) {
+            return ''
+        } else {
+            return char
+        }
+    })
+}

+ 56 - 0
vue.config.js

@@ -0,0 +1,56 @@
+const pkg = require('./package.json')
+const path = require('path')
+const localIP = require('ip').address()
+const isPord = process.env.NODE_ENV !== 'development'
+const isDev = process.env.NODE_ENV === 'development'
+if (isDev) {
+    process.env.VUE_APP_VERSION = pkg.version + '-' + Date.now()
+} else {
+    process.env.VUE_APP_VERSION = pkg.version
+}
+
+const devServer = {
+    disableHostCheck: true,
+    headers: {
+        'Cache-Control': 'no-store'
+    },
+    proxy: {
+        '/service': {
+            target: 'https://v4-test.4dkankan.com/',
+            changeOrigin: true
+        },
+        '/sdk': {
+            target: `http://${localIP}:3099/dist/`,
+            changeOrigin: true
+        }
+    }
+}
+
+const config = {
+    assetsDir: 'static',
+    publicPath: process.env.VUE_APP_CDN_URL,
+    outputDir: 'dist',//isDev ? 'dist' : path.resolve('../../dist/siter'),
+    productionSourceMap: isDev,
+    pages: {
+        'smart-bim': 'src/pages/bim.js',
+        'smart-laser': 'src/pages/laser.js',
+        'smart-laser-bim': 'src/pages/laser-bim.js',
+    },
+    css: {
+        extract: false,
+        loaderOptions: {
+            scss: {}
+        }
+    },
+    devServer: devServer,
+    configureWebpack: {
+        resolve: {
+            symlinks: false,
+            alias: {
+                vue: path.resolve(`../../node_modules/vue`)
+            }
+        }
+    }
+}
+
+module.exports = config

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 8441 - 0
yarn.lock