This commit is contained in:
zyl
2025-12-10 09:40:39 +08:00
188 changed files with 4175 additions and 2854 deletions

View File

@ -1 +1 @@
<!DOCTYPE html><html><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge,chrome=1"><meta name=viewport content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"><link rel=icon href=favicon.ico><title>后台管理</title><script src=./reconnecting-websocket.js></script><link href=static/css/app.425905c8.css rel=preload as=style><link href=static/css/chunk-elementUI.68c70ad5.css rel=preload as=style><link href=static/css/chunk-libs.3dfb7769.css rel=preload as=style><link href=static/js/app.a42dddd9.js rel=preload as=script><link href=static/js/chunk-elementUI.a9f82b5b.js rel=preload as=script><link href=static/js/chunk-libs.8de98ba2.js rel=preload as=script><link href=static/css/chunk-elementUI.68c70ad5.css rel=stylesheet><link href=static/css/chunk-libs.3dfb7769.css rel=stylesheet><link href=static/css/app.425905c8.css rel=stylesheet></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><script>(function(e){function t(t){for(var r,c,a=t[0],f=t[1],i=t[2],l=0,d=[];l<a.length;l++)c=a[l],Object.prototype.hasOwnProperty.call(o,c)&&o[c]&&d.push(o[c][0]),o[c]=0;for(r in f)Object.prototype.hasOwnProperty.call(f,r)&&(e[r]=f[r]);s&&s(t);while(d.length)d.shift()();return u.push.apply(u,i||[]),n()}function n(){for(var e,t=0;t<u.length;t++){for(var n=u[t],r=!0,c=1;c<n.length;c++){var a=n[c];0!==o[a]&&(r=!1)}r&&(u.splice(t--,1),e=f(f.s=n[0]))}return e}var r={},c={runtime:0},o={runtime:0},u=[];function a(e){return f.p+"static/js/"+({}[e]||e)+"."+{"chunk-4f9321d9":"807bff37","chunk-6337fcfc":"ce706d4d","chunk-0efffb9c":"d572da12","chunk-4b70cc7c":"232e9b3d","chunk-69ab8e14":"e2ed086d","chunk-94d3c3c4":"d08f8612"}[e]+".js"}function f(t){if(r[t])return r[t].exports;var n=r[t]={i:t,l:!1,exports:{}};return e[t].call(n.exports,n,n.exports,f),n.l=!0,n.exports}f.e=function(e){var t=[],n={"chunk-4f9321d9":1,"chunk-0efffb9c":1,"chunk-4b70cc7c":1,"chunk-69ab8e14":1,"chunk-94d3c3c4":1};c[e]?t.push(c[e]):0!==c[e]&&n[e]&&t.push(c[e]=new Promise((function(t,n){for(var r="static/css/"+({}[e]||e)+"."+{"chunk-4f9321d9":"f84b7bf2","chunk-6337fcfc":"31d6cfe0","chunk-0efffb9c":"83e65de7","chunk-4b70cc7c":"55335688","chunk-69ab8e14":"e18a06cd","chunk-94d3c3c4":"3c7f5ad9"}[e]+".css",o=f.p+r,u=document.getElementsByTagName("link"),a=0;a<u.length;a++){var i=u[a],l=i.getAttribute("data-href")||i.getAttribute("href");if("stylesheet"===i.rel&&(l===r||l===o))return t()}var d=document.getElementsByTagName("style");for(a=0;a<d.length;a++){i=d[a],l=i.getAttribute("data-href");if(l===r||l===o)return t()}var s=document.createElement("link");s.rel="stylesheet",s.type="text/css",s.onload=t,s.onerror=function(t){var r=t&&t.target&&t.target.src||o,u=new Error("Loading CSS chunk "+e+" failed.\n("+r+")");u.code="CSS_CHUNK_LOAD_FAILED",u.request=r,delete c[e],s.parentNode.removeChild(s),n(u)},s.href=o;var h=document.getElementsByTagName("head")[0];h.appendChild(s)})).then((function(){c[e]=0})));var r=o[e];if(0!==r)if(r)t.push(r[2]);else{var u=new Promise((function(t,n){r=o[e]=[t,n]}));t.push(r[2]=u);var i,l=document.createElement("script");l.charset="utf-8",l.timeout=120,f.nc&&l.setAttribute("nonce",f.nc),l.src=a(e);var d=new Error;i=function(t){l.onerror=l.onload=null,clearTimeout(s);var n=o[e];if(0!==n){if(n){var r=t&&("load"===t.type?"missing":t.type),c=t&&t.target&&t.target.src;d.message="Loading chunk "+e+" failed.\n("+r+": "+c+")",d.name="ChunkLoadError",d.type=r,d.request=c,n[1](d)}o[e]=void 0}};var s=setTimeout((function(){i({type:"timeout",target:l})}),12e4);l.onerror=l.onload=i,document.head.appendChild(l)}return Promise.all(t)},f.m=e,f.c=r,f.d=function(e,t,n){f.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},f.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},f.t=function(e,t){if(1&t&&(e=f(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(f.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)f.d(n,r,function(t){return e[t]}.bind(null,r));return n},f.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return f.d(t,"a",t),t},f.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},f.p="",f.oe=function(e){throw console.error(e),e};var i=window["webpackJsonp"]=window["webpackJsonp"]||[],l=i.push.bind(i);i.push=t,i=i.slice();for(var d=0;d<i.length;d++)t(i[d]);var s=l;n()})([]);</script><script src=static/js/chunk-elementUI.a9f82b5b.js></script><script src=static/js/chunk-libs.8de98ba2.js></script><script src=static/js/app.a42dddd9.js></script></body><script src=./echarts.min.js></script></html>
<!DOCTYPE html><html><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge,chrome=1"><meta name=viewport content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"><link rel=icon href=favicon.ico><title>后台管理</title><script src=./reconnecting-websocket.js></script><link href=static/css/app.425905c8.css rel=preload as=style><link href=static/css/chunk-elementUI.68c70ad5.css rel=preload as=style><link href=static/css/chunk-libs.3dfb7769.css rel=preload as=style><link href=static/js/app.78bded60.js rel=preload as=script><link href=static/js/chunk-elementUI.a9f82b5b.js rel=preload as=script><link href=static/js/chunk-libs.8de98ba2.js rel=preload as=script><link href=static/css/chunk-elementUI.68c70ad5.css rel=stylesheet><link href=static/css/chunk-libs.3dfb7769.css rel=stylesheet><link href=static/css/app.425905c8.css rel=stylesheet></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><script>(function(e){function t(t){for(var r,o,a=t[0],f=t[1],i=t[2],l=0,d=[];l<a.length;l++)o=a[l],Object.prototype.hasOwnProperty.call(c,o)&&c[o]&&d.push(c[o][0]),c[o]=0;for(r in f)Object.prototype.hasOwnProperty.call(f,r)&&(e[r]=f[r]);s&&s(t);while(d.length)d.shift()();return u.push.apply(u,i||[]),n()}function n(){for(var e,t=0;t<u.length;t++){for(var n=u[t],r=!0,o=1;o<n.length;o++){var a=n[o];0!==c[a]&&(r=!1)}r&&(u.splice(t--,1),e=f(f.s=n[0]))}return e}var r={},o={runtime:0},c={runtime:0},u=[];function a(e){return f.p+"static/js/"+({}[e]||e)+"."+{"chunk-6337fcfc":"ce706d4d","chunk-0efffb9c":"d572da12","chunk-3f6a3efe":"544dc7d3","chunk-69ab8e14":"e2ed086d","chunk-82667e48":"8fce4055","chunk-94d3c3c4":"d08f8612"}[e]+".js"}function f(t){if(r[t])return r[t].exports;var n=r[t]={i:t,l:!1,exports:{}};return e[t].call(n.exports,n,n.exports,f),n.l=!0,n.exports}f.e=function(e){var t=[],n={"chunk-0efffb9c":1,"chunk-3f6a3efe":1,"chunk-69ab8e14":1,"chunk-82667e48":1,"chunk-94d3c3c4":1};o[e]?t.push(o[e]):0!==o[e]&&n[e]&&t.push(o[e]=new Promise((function(t,n){for(var r="static/css/"+({}[e]||e)+"."+{"chunk-6337fcfc":"31d6cfe0","chunk-0efffb9c":"83e65de7","chunk-3f6a3efe":"9af9c8c9","chunk-69ab8e14":"e18a06cd","chunk-82667e48":"8b1ab571","chunk-94d3c3c4":"3c7f5ad9"}[e]+".css",c=f.p+r,u=document.getElementsByTagName("link"),a=0;a<u.length;a++){var i=u[a],l=i.getAttribute("data-href")||i.getAttribute("href");if("stylesheet"===i.rel&&(l===r||l===c))return t()}var d=document.getElementsByTagName("style");for(a=0;a<d.length;a++){i=d[a],l=i.getAttribute("data-href");if(l===r||l===c)return t()}var s=document.createElement("link");s.rel="stylesheet",s.type="text/css",s.onload=t,s.onerror=function(t){var r=t&&t.target&&t.target.src||c,u=new Error("Loading CSS chunk "+e+" failed.\n("+r+")");u.code="CSS_CHUNK_LOAD_FAILED",u.request=r,delete o[e],s.parentNode.removeChild(s),n(u)},s.href=c;var h=document.getElementsByTagName("head")[0];h.appendChild(s)})).then((function(){o[e]=0})));var r=c[e];if(0!==r)if(r)t.push(r[2]);else{var u=new Promise((function(t,n){r=c[e]=[t,n]}));t.push(r[2]=u);var i,l=document.createElement("script");l.charset="utf-8",l.timeout=120,f.nc&&l.setAttribute("nonce",f.nc),l.src=a(e);var d=new Error;i=function(t){l.onerror=l.onload=null,clearTimeout(s);var n=c[e];if(0!==n){if(n){var r=t&&("load"===t.type?"missing":t.type),o=t&&t.target&&t.target.src;d.message="Loading chunk "+e+" failed.\n("+r+": "+o+")",d.name="ChunkLoadError",d.type=r,d.request=o,n[1](d)}c[e]=void 0}};var s=setTimeout((function(){i({type:"timeout",target:l})}),12e4);l.onerror=l.onload=i,document.head.appendChild(l)}return Promise.all(t)},f.m=e,f.c=r,f.d=function(e,t,n){f.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},f.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},f.t=function(e,t){if(1&t&&(e=f(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(f.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)f.d(n,r,function(t){return e[t]}.bind(null,r));return n},f.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return f.d(t,"a",t),t},f.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},f.p="",f.oe=function(e){throw console.error(e),e};var i=window["webpackJsonp"]=window["webpackJsonp"]||[],l=i.push.bind(i);i.push=t,i=i.slice();for(var d=0;d<i.length;d++)t(i[d]);var s=l;n()})([]);</script><script src=static/js/chunk-elementUI.a9f82b5b.js></script><script src=static/js/chunk-libs.8de98ba2.js></script><script src=static/js/app.78bded60.js></script></body><script src=./echarts.min.js></script></html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
.el-row[data-v-78d0d29f]{margin-bottom:20px}.el-row[data-v-78d0d29f]:last-child{margin-bottom:0}.el-col[data-v-78d0d29f]{border-radius:4px}.grid-content[data-v-78d0d29f]{background:#fff;border:1px solid #f3f4f6;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05),0 0 0 transparent,0 0 0 transparent;box-shadow:0 1px 2px rgba(0,0,0,.05),0 0 0 transparent,0 0 0 transparent;border-radius:8px}.userNum[data-v-78d0d29f]{height:10vh;line-height:10vh;min-height:60px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:10px}.userNum .img[data-v-78d0d29f]{width:48px;height:48px;margin-left:15px;line-height:100%}.userNum .img .svg-icon[data-v-78d0d29f]{width:100%;height:100%;vertical-align:baseline!important}.userNum .numCon[data-v-78d0d29f]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;line-height:1}.userNum .numCon div[data-v-78d0d29f]:first-child{width:100px;height:20px;line-height:20px;font-size:14px;font-weight:400;color:#6b7280;text-align:left;margin-top:2vh}.userNum .numCon div[data-v-78d0d29f]:last-child{width:100px;height:32px;font-size:24px;font-weight:400;color:#1d2129;margin-top:5px}.search[data-v-78d0d29f]{height:8vh;min-height:45px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:10px}.search .el-input[data-v-78d0d29f]{width:15vw;margin-left:20px;min-width:170px}.search .el-select[data-v-78d0d29f]{width:16vw;min-width:160px}.search .addUser[data-v-78d0d29f]{position:absolute;right:160px}.search .delUser[data-v-78d0d29f]{position:absolute;right:30px}.table[data-v-78d0d29f]{height:65vh}.table .title[data-v-78d0d29f]{width:100%;height:50px;padding:0 20px;line-height:50px;color:#1d2129;font-size:16px;font-weight:400;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;border-bottom:1px solid #f3f4f6}.table .title .totalNum[data-v-78d0d29f]{color:#6b7280;font-size:14px;font-weight:400}.table .tabCon[data-v-78d0d29f]{width:100%;padding:20px 20px 0 20px;height:100%}.table .tabCon .state[data-v-78d0d29f]{width:40px;height:24px;display:inline-block;opacity:1;border-radius:12px;background:rgba(0,180,42,.1);color:#00b42a;font-size:12px;font-weight:400}.table .tabCon .puase[data-v-78d0d29f]{background:rgba(245,63,63,.1);color:#f53f3f}.table .tabCon .el-table[data-v-78d0d29f]{height:calc(100% - 100px)!important}.el-table thead tr[data-v-78d0d29f],[data-v-78d0d29f] .el-table thead th{background-color:#f9fafb!important}[data-v-78d0d29f] .el-table--border td,[data-v-78d0d29f] .el-table--border th,[data-v-78d0d29f] .el-table__body-wrapper .el-table--border.is-scrolling-left~.el-table__fixed{border-right:unset!important}.el-table--border[data-v-78d0d29f],.el-table--group[data-v-78d0d29f]{border:unset!important}.el-table[data-v-78d0d29f]:before,[data-v-78d0d29f] .el-table--border:after,[data-v-78d0d29f] .el-table--group:after{background-color:unset!important}[data-v-78d0d29f] .el-table .el-table__body-wrapper td,[data-v-78d0d29f] .el-table .el-table__body-wrapper th.is-leaf{border-bottom:unset!important}.el-pagination[data-v-78d0d29f]{position:absolute;right:30px;margin-top:10px}[data-v-78d0d29f] .el-pager li{border:1px solid #d1d5db;border-radius:4px}[data-v-78d0d29f] .el-pager li.active{background:#165dff!important;color:#fff!important;border:unset!important}[data-v-78d0d29f] .el-dialog__title{padding:2px 10px;border-left:3px solid #165dff;font-size:16px;font-weight:400;color:#1d2129}[data-v-78d0d29f] .avatar-uploader .el-upload{border:1px dashed #dcdfe6;border-radius:6px;cursor:pointer;position:relative;overflow:hidden;width:100px;height:100px}[data-v-78d0d29f] .avatar-uploader .el-upload:hover{border-color:#409eff}[data-v-78d0d29f] .avatar-uploader-icon{font-size:28px;color:#8c939d;width:100px;height:100px;line-height:100px;text-align:center}[data-v-78d0d29f] .avatar{width:100px;height:100px;display:block}[data-v-78d0d29f] .el-dialog__body{padding:10px 20px 0 20px}[data-v-78d0d29f] .el-upload__tip{height:25px;line-height:25px}.show-pwd[data-v-78d0d29f]{position:absolute;right:10px;font-size:16px;color:#889aa4;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}[data-v-78d0d29f] .no-status-icon .el-input__icon:after,[data-v-78d0d29f] .no-status-icon .el-input__icon:before{display:none!important}[data-v-78d0d29f] .el-table__body-wrapper{max-height:calc(100% - 45px)!important;overflow-y:auto!important}[data-v-78d0d29f] .userImg{width:32px;height:32px;border-radius:16px}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
.el-row[data-v-2a693de8]{margin-bottom:20px}.el-row[data-v-2a693de8]:last-child{margin-bottom:0}.el-col[data-v-2a693de8]{border-radius:4px}.grid-content[data-v-2a693de8]{background:#fff;border:1px solid #f3f4f6;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05),0 0 0 transparent,0 0 0 transparent;box-shadow:0 1px 2px rgba(0,0,0,.05),0 0 0 transparent,0 0 0 transparent;border-radius:8px}.userNum[data-v-2a693de8]{height:10vh;line-height:10vh;min-height:60px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:10px}.userNum .img[data-v-2a693de8]{width:48px;height:48px;margin-left:15px;line-height:100%}.userNum .img .svg-icon[data-v-2a693de8]{width:100%;height:100%;vertical-align:baseline!important}.userNum .numCon[data-v-2a693de8]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;line-height:1}.userNum .numCon div[data-v-2a693de8]:first-child{width:100px;height:20px;line-height:20px;font-size:14px;font-weight:400;color:#6b7280;text-align:left;margin-top:2vh}.userNum .numCon div[data-v-2a693de8]:last-child{width:100px;height:32px;font-size:24px;font-weight:400;color:#1d2129;margin-top:5px}.search[data-v-2a693de8]{height:8vh;min-height:45px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:10px}.search .el-input[data-v-2a693de8]{width:15vw;margin-left:20px;min-width:170px}.search .el-select[data-v-2a693de8]{width:16vw;min-width:160px}.search .addUser[data-v-2a693de8]{position:absolute;right:160px}.search .delUser[data-v-2a693de8]{position:absolute;right:30px}.table[data-v-2a693de8]{height:65vh}.table .title[data-v-2a693de8]{width:100%;height:50px;padding:0 20px;line-height:50px;color:#1d2129;font-size:16px;font-weight:400;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;border-bottom:1px solid #f3f4f6}.table .title .totalNum[data-v-2a693de8]{color:#6b7280;font-size:14px;font-weight:400}.table .tabCon[data-v-2a693de8]{width:100%;padding:20px 20px 0 20px;height:100%}.table .tabCon .state[data-v-2a693de8]{width:40px;height:24px;display:inline-block;opacity:1;border-radius:12px;background:rgba(0,180,42,.1);color:#00b42a;font-size:12px;font-weight:400}.table .tabCon .puase[data-v-2a693de8]{background:rgba(245,63,63,.1);color:#f53f3f}.table .tabCon .el-table[data-v-2a693de8]{height:calc(100% - 100px)!important}.el-table thead tr[data-v-2a693de8],[data-v-2a693de8] .el-table thead th{background-color:#f9fafb!important}[data-v-2a693de8] .el-table--border td,[data-v-2a693de8] .el-table--border th,[data-v-2a693de8] .el-table__body-wrapper .el-table--border.is-scrolling-left~.el-table__fixed{border-right:unset!important}.el-table--border[data-v-2a693de8],.el-table--group[data-v-2a693de8]{border:unset!important}.el-table[data-v-2a693de8]:before,[data-v-2a693de8] .el-table--border:after,[data-v-2a693de8] .el-table--group:after{background-color:unset!important}[data-v-2a693de8] .el-table .el-table__body-wrapper td,[data-v-2a693de8] .el-table .el-table__body-wrapper th.is-leaf{border-bottom:unset!important}.el-pagination[data-v-2a693de8]{position:absolute;right:30px;margin-top:10px}[data-v-2a693de8] .el-pager li{border:1px solid #d1d5db;border-radius:4px}[data-v-2a693de8] .el-pager li.active{background:#165dff!important;color:#fff!important;border:unset!important}[data-v-2a693de8] .el-dialog__title{padding:2px 10px;border-left:3px solid #165dff;font-size:16px;font-weight:400;color:#1d2129}[data-v-2a693de8] .avatar-uploader .el-upload{border:1px dashed #dcdfe6;border-radius:6px;cursor:pointer;position:relative;overflow:hidden;width:100px;height:100px}[data-v-2a693de8] .avatar-uploader .el-upload:hover{border-color:#409eff}[data-v-2a693de8] .avatar-uploader-icon{font-size:28px;color:#8c939d;width:100px;height:100px;line-height:100px;text-align:center}[data-v-2a693de8] .avatar{width:100px;height:100px;display:block}[data-v-2a693de8] .el-dialog__body{padding:10px 20px 0 20px}[data-v-2a693de8] .el-upload__tip{height:25px;line-height:25px}.show-pwd[data-v-2a693de8]{position:absolute;right:10px;font-size:16px;color:#889aa4;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}[data-v-2a693de8] .no-status-icon .el-input__icon:after,[data-v-2a693de8] .no-status-icon .el-input__icon:before{display:none!important}[data-v-2a693de8] .el-table__body-wrapper{max-height:calc(100% - 45px)!important;overflow-y:auto!important}[data-v-2a693de8] .userImg{width:32px;height:32px;border-radius:16px}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
.el-row[data-v-09824c6a]{margin-bottom:20px}.el-row[data-v-09824c6a]:last-child{margin-bottom:0}.el-col[data-v-09824c6a]{border-radius:4px}.grid-content[data-v-09824c6a]{background:#fff;border:1px solid #f3f4f6;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05),0 0 0 transparent,0 0 0 transparent;box-shadow:0 1px 2px rgba(0,0,0,.05),0 0 0 transparent,0 0 0 transparent;border-radius:8px}.userNum[data-v-09824c6a]{height:10vh;line-height:10vh;min-height:60px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:10px}.userNum .img[data-v-09824c6a]{width:48px;height:48px;margin-left:15px;line-height:100%}.userNum .img .svg-icon[data-v-09824c6a]{width:100%;height:100%;vertical-align:baseline!important}.userNum .numCon[data-v-09824c6a]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;line-height:1}.userNum .numCon div[data-v-09824c6a]:first-child{width:100px;height:20px;line-height:20px;font-size:14px;font-weight:400;color:#6b7280;text-align:left;margin-top:2vh}.userNum .numCon div[data-v-09824c6a]:last-child{width:100px;height:32px;font-size:24px;font-weight:400;color:#1d2129;margin-top:5px}.search[data-v-09824c6a]{height:8vh;min-height:45px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:10px}.search .el-input[data-v-09824c6a]{width:15vw;margin-left:20px;min-width:170px}.search .el-select[data-v-09824c6a]{width:16vw;min-width:160px}.search .addUser[data-v-09824c6a]{position:absolute;right:160px}.search .delUser[data-v-09824c6a]{position:absolute;right:30px}.table[data-v-09824c6a]{height:65vh}.table .title[data-v-09824c6a]{width:100%;height:50px;padding:0 20px;line-height:50px;color:#1d2129;font-size:16px;font-weight:400;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;border-bottom:1px solid #f3f4f6}.table .title .totalNum[data-v-09824c6a]{color:#6b7280;font-size:14px;font-weight:400}.table .tabCon[data-v-09824c6a]{width:100%;padding:20px 20px 0 20px;height:100%}.table .tabCon .state[data-v-09824c6a]{width:40px;height:24px;display:inline-block;opacity:1;border-radius:12px;background:rgba(0,180,42,.1);color:#00b42a;font-size:12px;font-weight:400}.table .tabCon .puase[data-v-09824c6a]{background:rgba(245,63,63,.1);color:#f53f3f}.table .tabCon .el-table[data-v-09824c6a]{height:calc(100% - 100px)!important}.el-table thead tr[data-v-09824c6a],[data-v-09824c6a] .el-table thead th{background-color:#f9fafb!important}[data-v-09824c6a] .el-table--border td,[data-v-09824c6a] .el-table--border th,[data-v-09824c6a] .el-table__body-wrapper .el-table--border.is-scrolling-left~.el-table__fixed{border-right:unset!important}.el-table--border[data-v-09824c6a],.el-table--group[data-v-09824c6a]{border:unset!important}.el-table[data-v-09824c6a]:before,[data-v-09824c6a] .el-table--border:after,[data-v-09824c6a] .el-table--group:after{background-color:unset!important}[data-v-09824c6a] .el-table .el-table__body-wrapper td,[data-v-09824c6a] .el-table .el-table__body-wrapper th.is-leaf{border-bottom:unset!important}.el-pagination[data-v-09824c6a]{position:absolute;right:30px;margin-top:10px}[data-v-09824c6a] .el-pager li{border:1px solid #d1d5db;border-radius:4px}[data-v-09824c6a] .el-pager li.active{background:#165dff!important;color:#fff!important;border:unset!important}[data-v-09824c6a] .el-dialog__title{padding:2px 10px;border-left:3px solid #165dff;font-size:16px;font-weight:400;color:#1d2129}[data-v-09824c6a] .avatar-uploader .el-upload{border:1px dashed #dcdfe6;border-radius:6px;cursor:pointer;position:relative;overflow:hidden;width:100px;height:100px}[data-v-09824c6a] .avatar-uploader .el-upload:hover{border-color:#409eff}[data-v-09824c6a] .avatar-uploader-icon{font-size:28px;color:#8c939d;width:100px;height:100px;line-height:100px;text-align:center}[data-v-09824c6a] .avatar{width:100px;height:100px;display:block}[data-v-09824c6a] .el-dialog__body{padding:10px 20px 0 20px}[data-v-09824c6a] .el-upload__tip{height:25px;line-height:25px}.show-pwd[data-v-09824c6a]{position:absolute;right:10px;font-size:16px;color:#889aa4;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}[data-v-09824c6a] .no-status-icon .el-input__icon:after,[data-v-09824c6a] .no-status-icon .el-input__icon:before{display:none!important}[data-v-09824c6a] .el-table__body-wrapper{max-height:calc(100% - 45px)!important;overflow-y:auto!important}[data-v-09824c6a] .userImg{width:32px;height:32px;border-radius:16px}

View File

@ -0,0 +1 @@
.el-row[data-v-ac11e3fa]{margin-bottom:20px}.el-row[data-v-ac11e3fa]:last-child{margin-bottom:0}.el-col[data-v-ac11e3fa]{border-radius:4px}.grid-content[data-v-ac11e3fa]{background:#fff;border:1px solid #f3f4f6;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05),0 0 0 transparent,0 0 0 transparent;box-shadow:0 1px 2px rgba(0,0,0,.05),0 0 0 transparent,0 0 0 transparent;border-radius:8px}.userNum[data-v-ac11e3fa]{height:10vh;line-height:10vh;min-height:60px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:10px}.userNum .img[data-v-ac11e3fa]{width:48px;height:48px;margin-left:15px;line-height:100%}.userNum .img .svg-icon[data-v-ac11e3fa]{width:100%;height:100%;vertical-align:baseline!important}.userNum .numCon[data-v-ac11e3fa]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;line-height:1}.userNum .numCon div[data-v-ac11e3fa]:first-child{width:100px;height:20px;line-height:20px;font-size:14px;font-weight:400;color:#6b7280;text-align:left;margin-top:2vh}.userNum .numCon div[data-v-ac11e3fa]:last-child{width:100px;height:32px;font-size:24px;font-weight:400;color:#1d2129;margin-top:5px}.search[data-v-ac11e3fa]{height:8vh;min-height:45px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:10px}.search .el-input[data-v-ac11e3fa]{width:15vw;margin-left:20px;min-width:170px}.search .el-select[data-v-ac11e3fa]{width:16vw;min-width:160px}.search .addUser[data-v-ac11e3fa]{position:absolute;right:160px}.search .delUser[data-v-ac11e3fa]{position:absolute;right:30px}.table[data-v-ac11e3fa]{height:65vh}.table .title[data-v-ac11e3fa]{width:100%;height:50px;padding:0 20px;line-height:50px;color:#1d2129;font-size:16px;font-weight:400;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;border-bottom:1px solid #f3f4f6}.table .title .totalNum[data-v-ac11e3fa]{color:#6b7280;font-size:14px;font-weight:400}.table .tabCon[data-v-ac11e3fa]{width:100%;padding:20px 20px 0 20px;height:100%}.table .tabCon .state[data-v-ac11e3fa]{width:40px;height:24px;display:inline-block;opacity:1;border-radius:12px;background:rgba(0,180,42,.1);color:#00b42a;font-size:12px;font-weight:400}.table .tabCon .puase[data-v-ac11e3fa]{background:rgba(245,63,63,.1);color:#f53f3f}.table .tabCon .el-table[data-v-ac11e3fa]{height:calc(100% - 100px)!important}.el-table thead tr[data-v-ac11e3fa],[data-v-ac11e3fa] .el-table thead th{background-color:#f9fafb!important}[data-v-ac11e3fa] .el-table--border td,[data-v-ac11e3fa] .el-table--border th,[data-v-ac11e3fa] .el-table__body-wrapper .el-table--border.is-scrolling-left~.el-table__fixed{border-right:unset!important}.el-table--border[data-v-ac11e3fa],.el-table--group[data-v-ac11e3fa]{border:unset!important}.el-table[data-v-ac11e3fa]:before,[data-v-ac11e3fa] .el-table--border:after,[data-v-ac11e3fa] .el-table--group:after{background-color:unset!important}[data-v-ac11e3fa] .el-table .el-table__body-wrapper td,[data-v-ac11e3fa] .el-table .el-table__body-wrapper th.is-leaf{border-bottom:unset!important}.el-pagination[data-v-ac11e3fa]{position:absolute;right:30px;margin-top:10px}[data-v-ac11e3fa] .el-pager li{border:1px solid #d1d5db;border-radius:4px}[data-v-ac11e3fa] .el-pager li.active{background:#165dff!important;color:#fff!important;border:unset!important}[data-v-ac11e3fa] .el-dialog__title{padding:2px 10px;border-left:3px solid #165dff;font-size:16px;font-weight:400;color:#1d2129}[data-v-ac11e3fa] .avatar-uploader .el-upload{border:1px dashed #dcdfe6;border-radius:6px;cursor:pointer;position:relative;overflow:hidden;width:100px;height:100px}[data-v-ac11e3fa] .avatar-uploader .el-upload:hover{border-color:#409eff}[data-v-ac11e3fa] .avatar-uploader-icon{font-size:28px;color:#8c939d;width:100px;height:100px;line-height:100px;text-align:center}[data-v-ac11e3fa] .avatar{width:100px;height:100px;display:block}[data-v-ac11e3fa] .el-dialog__body{padding:10px 20px 0 20px}[data-v-ac11e3fa] .el-upload__tip{height:25px;line-height:25px}.show-pwd[data-v-ac11e3fa]{position:absolute;right:10px;font-size:16px;color:#889aa4;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}[data-v-ac11e3fa] .no-status-icon .el-input__icon:after,[data-v-ac11e3fa] .no-status-icon .el-input__icon:before{display:none!important}[data-v-ac11e3fa] .el-table__body-wrapper{max-height:calc(100% - 45px)!important;overflow-y:auto!important}[data-v-ac11e3fa] .userImg{width:32px;height:32px;border-radius:16px}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -162,6 +162,18 @@ export default {
graphLabelManage: '军标管理',
version: '版本信息'
},
project: {
engineeringSettings: '工程设置',
importRoadNetwork: '路网导入',
locationData: '地点数据',
importPOLI: 'POLI导入',
engineeringData: '工程数据',
engineeringOverrideImport: '工程覆盖导入',
engineeringMergeImports: '工程合并导入',
engineeringExport: '工程导出',
activated: '已启用',
activate: '启用',
},
auths: {
authType: '授权状态',
authTime: '授权时间',

View File

@ -162,6 +162,18 @@ export default {
photoManage: 'Icon Management',
version: 'Version information'
},
project: {
engineeringSettings: 'Engineering Settings',
importRoadNetwork: 'Import Road Network',
locationData: 'Location Data',
importPOLI: 'Import POLI',
engineeringData: 'Engineering Data',
engineeringOverrideImport: 'Engineering Override Import',
engineeringMergeImports: 'Engineering Merge Imports',
engineeringExport: 'Engineering Export',
activated: 'activated',
activate: 'activate',
},
auths: {
authType: 'Authorization status',
authTime: 'Authorization time',

View File

@ -161,6 +161,18 @@ export default {
photoManage: '圖標管理',
version: '版本信息'
},
project: {
engineeringSettings: '工程設置',
importRoadNetwork: '路網導入',
locationData: '地點數據',
importPOLI: 'POLI導入',
engineeringData: '工程數據',
engineeringOverrideImport: '工程覆蓋導入',
engineeringMergeImports: '工程合並導入',
engineeringExport: '工程導出',
activated: '已啟用',
activate: '啟用',
},
auths: {
authType: '授權狀態',
authTime: '授權時間',

View File

@ -828,6 +828,10 @@ img {
background: transparent !important;
}*/
.el-message.is-center {
top: calc(5vw + 10px) !important;
}
.el-message--success {
background:
linear-gradient(180deg, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5)),

View File

@ -2,11 +2,15 @@ import { TreeApi } from '@/api/tree'
import { useTreeNode } from '../views/components/tree/hooks/treeNode'
import { initMapData } from './initMapData'
export const addMapSource = async ({ type, id, sourceName = '未命名对象', opt = {} }, cd:any = null) => {
export const addMapSource = async ({ type, id, sourceName = '未命名对象', opt = {} }, cd: any = null) => {
const { cusAddNodes } = useTreeNode()
if (!id) {
id = new YJ.Tools().randomString()
}
//判断是否已有元素
if (window.earth.entityMap.get(id)) {
window.earth.entityMap.get(id).remove()
}
let options: any = await initMapData(type, opt, cd)
let selectedNodes = window.treeObj.getSelectedNodes()
let node = selectedNodes && selectedNodes[selectedNodes.length - 1]

View File

@ -228,7 +228,7 @@ export const initMapData = async (type, data, cd) => {
if(type === 'textBox') {
entityObject.callback = (options) => {
let params = structuredClone(options)
let sourceName = '文本框'
let sourceName = params.text ? params.text : '文本框'
delete params.name
delete params.host
let params2 = {

View File

@ -30,6 +30,7 @@ import theme from "@/utils/theme";
import { handleInputLimit } from '@/utils/index'
import Pagination from './components/Pagination/index.vue'
import dispatchEventStorage from '@/utils/watchLocalStorage'
import elTableInfiniteScroll from 'el-table-infinite-scroll';
// process.env["ELECTRON_DISABLE_SECURITY_WARNINGS"] = "true";
@ -76,7 +77,7 @@ const i18n = createI18n({
});
let systemSetting = JSON.parse(localStorage.getItem("systemSetting") || '{}')
let skin = systemSetting.skinInfo ? systemSetting.skinInfo : "color1";
if(!theme[skin]) {
if (!theme[skin]) {
skin = 'color1'
}
let colorVariable = Array.from(theme[skin].keys());
@ -101,6 +102,7 @@ setupStore(setApp)
setupSvgIcon(setApp)
setApp.use(EventBusPlugin)
setApp.use(router)
setApp.use(elTableInfiniteScroll)
setApp.use(ElementPlus, {
locale: zhCn
})

View File

@ -740,6 +740,7 @@ const confirm = () => {
TsApi.updateTsSource(params2).then(res => {
if (res.code == 200) {
ElMessage({type: "success", message: "操作成功"})
// @ts-ignore
cusUpdateNode({id: params.id, sourceName: params.name, detail: JSON.stringify(params)})
}
})

View File

@ -490,6 +490,7 @@ const confirm = () => {
TsApi.updateTsSource(params2).then(res => {
if (res.code == 200) {
ElMessage({type: "success", message: "操作成功"})
// @ts-ignore
cusUpdateNode({id: params.id, sourceName: params.name, detail: JSON.stringify(params)})
}
})

View File

@ -190,6 +190,7 @@ import zhTw from 'element-plus/es/locale/lang/zh-tw'
import en from 'element-plus/es/locale/lang/en'
const language = ref('zh-CN')
// @ts-ignore
language.value = JSON.parse(localStorage.getItem("systemSetting"))?.language || 'zh-CN'
const locale = computed(() => (language.value === "zh-CN" ? zhCn : (language.value === "zh-TW" ? zhTw : en)))

View File

@ -2,7 +2,7 @@
<div class="engineering">
<div class="engineering_title">
<span class="fankuai"></span>
<span class="setting_title">工程设置</span>
<span class="setting_title">{{ t('project.engineeringSettings') }}</span>
<!-- <el-upload
:action="uploadUrl()"
@ -22,7 +22,7 @@
<template #icon>
<svg-icon name="road_network" />
</template>
<span>路网导入</span>
<span>{{ t('project.importRoadNetwork') }}</span>
</el-button>
<!-- </el-upload> -->
</div>
@ -44,7 +44,7 @@
<div class="item_right">
<span style="color: rgba(var(--color-text2), 1)">{{ item.createdAt }}</span>
<div class="but">
<span v-if="item.isEnable">已启用</span>
<span v-if="item.isEnable">{{ t('project.activated') }}</span>
<el-button
v-if="!item.isEnable"
@ -52,7 +52,7 @@
style="border: 1px solid rgba(var(--color-base1), 0.5)"
@click="enableRouteData(item)"
>
<span>启用</span>
<span>{{ t('project.activate') }}</span>
</el-button>
<el-button
v-if="!item.isEnable"
@ -60,7 +60,7 @@
style="border: 1px solid rgba(var(--color-base1), 0.5)"
@click="delRouteData(item)"
>
<span>删除</span>
<span>{{ t('general.删除') }}</span>
</el-button>
</div>
</div>
@ -70,7 +70,7 @@
<div class="line"></div>
<div class="engineering_title2">
<span class="fankuai"></span>
<span class="setting_title">地点数据</span>
<span class="setting_title">{{ t('project.locationData') }}</span>
<el-button
color="#004b4b"
@click="poiImport"
@ -79,7 +79,7 @@
<template #icon>
<svg-icon name="POI" />
</template>
<span>POIL导入</span>
<span>{{ t('project.importPOLI') }}</span>
</el-button>
</div>
<div class="fileList" v-if="poiList.length">
@ -101,7 +101,7 @@
<div class="item_right">
<span style="color: rgba(var(--color-text2), 1)">{{ item.createdAt }}</span>
<div class="but">
<span v-if="item.isEnable">已启用</span>
<span v-if="item.isEnable">{{ t('project.activated') }}</span>
<el-button
v-if="!item.isEnable"
@ -109,7 +109,7 @@
style="border: 1px solid rgba(var(--color-base1), 0.5)"
@click="enablePoieData(item)"
>
<span>启用</span>
<span>{{ t('project.activate') }}</span>
</el-button>
<el-button
v-if="!item.isEnable"
@ -117,7 +117,7 @@
style="border: 1px solid rgba(var(--color-base1), 0.5)"
@click="delPoiData(item)"
>
<span>删除</span>
<span>{{ t('general.删除') }}</span>
</el-button>
</div>
</div>
@ -127,7 +127,7 @@
<div class="line"></div>
<div class="engineering_title2">
<span class="fankuai"></span>
<span class="setting_title">工程数据</span>
<span class="setting_title">{{ t('project.engineeringData') }}</span>
<el-button
@click="importProject"
color="#004b4b"
@ -136,7 +136,7 @@
<template #icon>
<svg-icon name="leading_in" />
</template>
<span>工程覆盖导入</span>
<span>{{ t('project.engineeringOverrideImport') }}</span>
</el-button>
<el-button
@click="mergeProject"
@ -146,7 +146,7 @@
<template #icon>
<svg-icon name="leading_in" />
</template>
<span>工程合并导入</span>
<span>{{ t('project.engineeringMergeImports') }}</span>
</el-button>
<el-button
@click="derive"
@ -156,7 +156,7 @@
<template #icon>
<svg-icon name="leading_out" />
</template>
<span>工程导出</span>
<span>{{ t('project.engineeringExport') }}</span>
</el-button>
</div>
<div class="line"></div>
@ -176,7 +176,8 @@ import {
$changeComponentShow
} from '@/utils/communication'
import { ElMessage, ElMessageBox } from 'element-plus'
import { dialog } from 'electron'
import { useI18n } from 'vue-i18n'
const { t } = useI18n()
// 上传状态
const isUploading = ref(false)

View File

@ -92,12 +92,15 @@
<el-col :span="18">
<el-card shadow="hover">
<el-table
:data="modelList"
:data="currModelList"
:header-cell-style="{ 'text-align': 'center' }"
border
style="width: 100%"
ref="tableRef"
@header-dragend="handleHeaderDragend"
v-el-table-infinite-scroll="loadMoreData"
:infinite-scroll-distance="10"
:infinite-scroll-disabled="disabledScroll"
>
<el-table-column type="index" label="序号" width="60" align="center" />
<el-table-column prop="militaryName" label="名称" width="139" />
@ -209,6 +212,24 @@ const contextMenu = reactive({
})
const treeRef = ref()
//滚动加载
const disabledScroll = ref(false)
var currModelList: any = ref([])
let page = 1
const loadMoreData = () => {
// 模拟加载更多数据
setTimeout(() => {
const start = (page - 1) * 8
const end = start + 8
currModelList.value = modelList.value.slice(0, end)
page++
// 检查是否还有更多数据
if (page > modelList.value.length) {
disabledScroll.value = true
}
}, 1000)
}
// @ts-ignore
var sortableInstance: any = reactive(null)
@ -595,6 +616,9 @@ const getModelListByType = (id) => {
formData.append('name', photoName.value)
GraphApi.showModelByType(formData).then((res) => {
modelList.value = res.data
currModelList.value = []
page = 1
loadMoreData()
})
}
const divContextMenu = (event: MouseEvent) => {

View File

@ -94,11 +94,14 @@
<el-card shadow="hover">
<el-table
ref="tableRef"
:data="modelList"
:data="currModelList"
:header-cell-style="{ 'text-align': 'center' }"
border
style="width: 100%"
@header-dragend="handleHeaderDragend"
v-el-table-infinite-scroll="loadMoreData"
:infinite-scroll-distance="10"
:infinite-scroll-disabled="disabledScroll"
>
<el-table-column type="index" label="序号" width="60" align="center" />
<el-table-column prop="modelName" label="模型名称" width="139" />
@ -240,6 +243,24 @@ const handleHeaderDragend = (newWidth, oldWidth, column, event) => {
})
}
//滚动加载
const disabledScroll = ref(false)
var currModelList: any = ref([])
let page = 1
const loadMoreData = () => {
// 模拟加载更多数据
setTimeout(() => {
const start = (page - 1) * 8
const end = start + 8
currModelList.value = modelList.value.slice(0, end)
page++
// 检查是否还有更多数据
if (page > modelList.value.length) {
disabledScroll.value = true
}
}, 1000)
}
// @ts-ignore
var sortableInstance: any = reactive(null)
@ -662,6 +683,9 @@ const getModelListByType = (id) => {
formData.append('name', photoName.value)
ModelApi.showModelByType(formData).then((res) => {
modelList.value = res.data
currModelList.value = []
page = 1
loadMoreData()
})
}
const divContextMenu = (event: MouseEvent) => {

View File

@ -100,12 +100,15 @@
<el-col :span="18">
<el-card shadow="hover">
<el-table
:data="modelList"
:data="currModelList"
:header-cell-style="{ 'text-align': 'center' }"
border
style="width: 100%"
ref="tableRef"
@header-dragend="handleHeaderDragend"
v-el-table-infinite-scroll="loadMoreData"
:infinite-scroll-distance="10"
:infinite-scroll-disabled="disabledScroll"
>
<el-table-column type="index" label="序号" width="60" align="center" />
<el-table-column prop="iconName" label="名称" width="139" />
@ -311,6 +314,24 @@ const reviewPhoto = (index) => {
const seeBigPhoto = (index) => {
currentIndex.value = index
}
//滚动加载
const disabledScroll = ref(false)
var currModelList: any = ref([])
let page = 1
const loadMoreData = () => {
// 模拟加载更多数据
setTimeout(() => {
const start = (page - 1) * 8
const end = start + 8
currModelList.value = modelList.value.slice(0, end)
page++
// 检查是否还有更多数据
if (page > modelList.value.length) {
disabledScroll.value = true
}
}, 1000)
}
// @ts-ignore
var sortableInstance: any = reactive(null)
@ -683,6 +704,9 @@ const getModelListByType = async (id) => {
formData.append('name', photoName.value)
PhotoApi.showModelByType(formData).then((res) => {
modelList.value = res.data
currModelList.value = []
page = 1
loadMoreData()
})
}
}

View File

@ -603,21 +603,23 @@ const sysChange = async () => {
}
const searchWayChange = (val) => {
localStorage.setItem('searchWay', val)
ElMessage.closeAll()
ElMessage({
message: '操作成功',
message: '切换成功',
type: 'success'
})
}
const concurrentWorkloadChange = (val) => {
YJ.Global.setMaximumRequestsPerServer(val)
localStorage.setItem('concurrentcode', val)
ElMessage.closeAll()
ElMessage({
message: '操作成功',
message: '切换成功',
type: 'success'
})
}
const setView = () => {
let msg = '操作成功'
let msg = '设置成功'
let view = YJ.Global.getCurrentView(window.earth)
const options = {
destination: view.position,
@ -625,6 +627,7 @@ const setView = () => {
}
YJ.Global.setDefaultView(window.earth, options)
localStorage.setItem('defaultView', JSON.stringify(options))
ElMessage.closeAll()
ElMessage({
message: msg,
type: 'success'
@ -633,6 +636,7 @@ const setView = () => {
const setData = () => {
TreeApi.getTreeDefault().then((res) => {
if (res.code == 0 || res.code == 200) {
ElMessage.closeAll()
ElMessage({
message: '添加完成,2秒后将重启系统',
type: 'success'
@ -654,7 +658,9 @@ const intoBack = async () => {
const { ipcRenderer } = require('electron')
let availablePort = await ipcRenderer.invoke('get-available-port')
let baseURL = localStorage.getItem('ip')
console.log('availablePort', baseURL, availablePort)
let _winMap = await ipcRenderer.invoke('get-_winMap')
if (!_winMap.has(id)) {
try {
@ -684,6 +690,7 @@ const intoBack = async () => {
}
},
`http://localhost:${availablePort}/backManage/index.html#/login?timestamp=${Date.now()}`,
// `${baseURL}/backManage/index.html#/login?timestamp=${Date.now()}`,
{},
id
)

View File

@ -270,7 +270,8 @@ const methodMap = {
opt: {
id: id,
name: name,
positions: positions
positions: positions,
material: 1,
}
})
}
@ -970,11 +971,11 @@ const methodMap = {
params: {
id: id,
path: path[0],
field: 'id',
// field: 'id',
name: name,
headTables: [],
opacity: 1,
color: 'rgba(0,255,184,0.5)',
// color: 'rgba(0,255,184,0.5)',
show: true
},
id,

View File

@ -112,7 +112,9 @@
</div>
</el-tab-pane>
<el-tab-pane label="标签风格" name="4">
<labelStyle :type="title" :entityOptions="entityOptions"></labelStyle>
<div class="div-item">
<labelStyle :type="title" :entityOptions="entityOptions"></labelStyle>
</div>
</el-tab-pane>
</el-tabs>
</div>

View File

@ -60,7 +60,7 @@
<div class="col">
<el-slider
v-model="precision"
:min="0"
:min="1"
:max="maxNum"
placement="bottom"
style="max-width: 100%"
@ -77,7 +77,7 @@
id="precision"
type="number"
title=""
min="1"
min="2"
max="360"
v-model="maxNum"
@input="precisionMaxInput"

View File

@ -183,8 +183,17 @@ const close = (e) => {
baseDialog.value?.close()
}
const sure = (e) => {
YJ.Global.ContourStartDraw(window.earth, show.value)
baseDialog.value?.close()
let value = YJ.Global.ContourStartDraw(window.earth, show.value)
if (value) {
ElMessage.closeAll()
ElMessage({
message: value,
type: 'error'
})
}
else {
baseDialog.value?.close()
}
}
defineExpose({
open

View File

@ -121,7 +121,7 @@
max="999999.99"
step="0.01"
name="defaultTime"
value="0"
value="5"
/>
<span class="unit" style="top: 6px">s</span>
<span class="arrow"></span>
@ -264,7 +264,7 @@ let allData: any = reactive({
name: '',
points: [],
repeat: '',
defaultTime: 0,
defaultTime: 5,
totalTime: 0
})
const save = () => {
@ -375,8 +375,7 @@ defineExpose({
<style scoped lang="scss">
.afreshPlay {
background:
linear-gradient(0deg, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5)),
background: linear-gradient(0deg, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5)),
linear-gradient(180deg, rgba(27, 248, 195, 0.2) 0%, rgba(27, 248, 195, 0) 100%) !important;
border: 1px solid rgba(27, 248, 195, 1) !important;
color: rgba(27, 248, 195, 1) !important;
@ -387,8 +386,7 @@ defineExpose({
}
.cease {
background:
linear-gradient(180deg, rgba(241, 108, 85, 0.2) 0%, rgba(241, 108, 85, 0) 100%),
background: linear-gradient(180deg, rgba(241, 108, 85, 0.2) 0%, rgba(241, 108, 85, 0) 100%),
rgba(0, 0, 0, 0.5) !important;
border: 1px solid rgba(241, 108, 85, 1) !important;
color: rgba(241, 108, 85, 1) !important;
@ -399,8 +397,7 @@ defineExpose({
}
.video {
background:
linear-gradient(
background: linear-gradient(
180deg,
rgba(71, 27, 5, 0.3) 0%,
rgba(71, 27, 5, 0.3) 0%,

View File

@ -38,7 +38,108 @@
<div>
<div style="display: flex; margin-bottom: 12px; align-items: center">
<span class="label" style="flex: 0 0 60px">椭圆基准</span>
<div class="datalist_left"></div>
<!-- <div class="datalist_left"></div> -->
<el-select
class="datalist_left"
style="width: 175px"
v-model="coordinate"
@change="sysChange"
>
<div
class="group-header"
:class="
name_map1.filter((item) => {
return item.epsg == coordinate
}).length > 0
? 'arrowActive'
: ''
"
@click="toggleGroup('hot')"
>
地理坐标系
<svg-icon
v-if="isHotGroupOpen"
name="arrow2"
:size="10"
:color="
name_map1.filter((item) => {
return item.epsg == coordinate
}).length > 0
? 'rgba(0, 255, 255, 1)'
: 'rgba(255, 255, 255, 1)'
"
style="margin-left: 10px"
></svg-icon>
<svg-icon
v-else
name="arrow1"
:size="10"
:color="
name_map1.filter((item) => {
return item.epsg == coordinate
}).length > 0
? 'rgba(0, 255, 255, 1)'
: 'rgba(255, 255, 255, 1)'
"
style="margin-left: 10px"
></svg-icon>
</div>
<div v-show="isHotGroupOpen">
<el-option
v-for="item in name_map1"
:key="item.epsg"
:label="item.name"
:value="item.epsg"
></el-option>
</div>
<div
class="group-header"
:class="
name_map2.filter((item) => {
return item.epsg == coordinate
}).length > 0
? 'arrowActive'
: ''
"
@click="toggleGroup('ty')"
>
投影坐标系
<svg-icon
v-if="isHotGroupOpen2"
name="arrow2"
:size="10"
:color="
name_map2.filter((item) => {
return item.epsg == coordinate
}).length > 0
? 'rgba(0, 255, 255, 1)'
: 'rgba(255, 255, 255, 1)'
"
style="margin-left: 10px"
></svg-icon>
<svg-icon
v-else
name="arrow1"
:size="10"
:color="
name_map2.filter((item) => {
return item.epsg == coordinate
}).length > 0
? 'rgba(0, 255, 255, 1)'
: 'rgba(255, 255, 255, 1)'
"
style="margin-left: 10px"
></svg-icon>
</div>
<div v-show="isHotGroupOpen2">
<el-option
v-for="item in name_map2"
:key="item.epsg"
:label="item.name"
:value="item.epsg"
></el-option>
</div>
</el-select>
</div>
<div style="display: flex; margin-bottom: 12px; align-items: center">
<span class="label" style="flex: 0 0 60px">经度(x)</span>
@ -87,7 +188,108 @@
<div>
<div style="display: flex; margin-bottom: 12px; align-items: center">
<span class="label" style="flex: 0 0 60px">椭圆基准</span>
<div class="datalist_right"></div>
<!-- <div class="datalist_right"></div> -->
<el-select
class="datalist_right"
style="width: 175px"
v-model="coordinate2"
@change="sysChange"
>
<div
class="group-header"
:class="
name_map1.filter((item) => {
return item.epsg == coordinate2
}).length > 0
? 'arrowActive'
: ''
"
@click="toggleGroup('hot')"
>
地理坐标系
<svg-icon
v-if="isHotGroupOpen"
name="arrow2"
:size="10"
:color="
name_map1.filter((item) => {
return item.epsg == coordinate2
}).length > 0
? 'rgba(0, 255, 255, 1)'
: 'rgba(255, 255, 255, 1)'
"
style="margin-left: 10px"
></svg-icon>
<svg-icon
v-else
name="arrow1"
:size="10"
:color="
name_map1.filter((item) => {
return item.epsg == coordinate2
}).length > 0
? 'rgba(0, 255, 255, 1)'
: 'rgba(255, 255, 255, 1)'
"
style="margin-left: 10px"
></svg-icon>
</div>
<div v-show="isHotGroupOpen">
<el-option
v-for="item in name_map1"
:key="item.epsg"
:label="item.name"
:value="item.epsg"
></el-option>
</div>
<div
class="group-header"
:class="
name_map2.filter((item) => {
return item.epsg == coordinate2
}).length > 0
? 'arrowActive'
: ''
"
@click="toggleGroup('ty')"
>
投影坐标系
<svg-icon
v-if="isHotGroupOpen2"
name="arrow2"
:size="10"
:color="
name_map2.filter((item) => {
return item.epsg == coordinate2
}).length > 0
? 'rgba(0, 255, 255, 1)'
: 'rgba(255, 255, 255, 1)'
"
style="margin-left: 10px"
></svg-icon>
<svg-icon
v-else
name="arrow1"
:size="10"
:color="
name_map2.filter((item) => {
return item.epsg == coordinate2
}).length > 0
? 'rgba(0, 255, 255, 1)'
: 'rgba(255, 255, 255, 1)'
"
style="margin-left: 10px"
></svg-icon>
</div>
<div v-show="isHotGroupOpen2">
<el-option
v-for="item in name_map2"
:key="item.epsg"
:label="item.name"
:value="item.epsg"
></el-option>
</div>
</el-select>
</div>
<div style="display: flex; margin-bottom: 12px; align-items: center">
<span class="label" style="flex: 0 0 60px">经度(x)</span>
@ -118,6 +320,48 @@ const eventBus: any = inject('bus')
var status1: any = ref(false)
var tools: any = reactive([])
//新坐标下拉选项
var coordinate: any = ref('EPSG:4326')
var coordinate2: any = ref('EPSG:4326')
const isHotGroupOpen: any = ref(true)
const isHotGroupOpen2: any = ref(true)
const name_map: any = ref([])
const name_map1: any = ref([])
const name_map2: any = ref([
{
epsg: 'EPSG:32601',
name: 'WGS84 通用横轴墨卡托投影'
},
{
epsg: 'EPSG:4534',
name: '2000 坐标 3 度不带代号'
},
{
epsg: 'EPSG:4513',
name: '2000 坐标 3 度带代号'
},
{
epsg: 'EPSG:4502',
name: '2000 坐标 6 度不带代号'
},
{
epsg: 'EPSG:4491',
name: '2000 坐标 6 度带代号'
}
])
let tool = new YJ.Tools(window.earth)
name_map.value = Array.from(tool.name_map.values())
name_map1.value = name_map.value.splice(0, 2)
const toggleGroup = (type: string) => {
if (type === 'hot') isHotGroupOpen.value = !isHotGroupOpen.value
if (type === 'ty') isHotGroupOpen2.value = !isHotGroupOpen2.value
}
const sysChange = () => {
tools && tools.updateCoordinates(coordinate.value, coordinate2.value)
}
eventBus.on('ProjectionConvertDialog', () => {
baseDialog.value?.open()
if (status1.value) {
@ -151,6 +395,8 @@ const open = () => {
}
const closeCallBack = (e) => {
coordinate.value = 'EPSG:4326'
coordinate2.value = 'EPSG:4326'
status1.value = false
tools && tools.projectionConvert(status1.value, () => {})
}

View File

@ -50,6 +50,7 @@
max="9999999"
v-model="waterVolume"
@input="waterVolumeInput"
@change="changeWater"
/>
<span class="unit"></span>
<span class="arrow"></span>
@ -69,6 +70,7 @@
max="9999999"
v-model="minWaterLevel"
@input="minWaterLevelInput"
@change="changeWater"
/>
<span class="unit">m</span>
<span class="arrow"></span>
@ -86,6 +88,7 @@
max="9999999"
v-model="maxWaterLevel"
@input="maxWaterLevelInput"
@change="changeWater"
/>
<span class="unit">m</span>
<span class="arrow"></span>
@ -226,6 +229,10 @@ var submerge: any = reactive([])
var isPausng = ref(false)
var readOnly = ref(true)
const changeWater = () => {
submerge.restart()
}
eventBus.on('submergeDialog', () => {
baseDialog.value?.open()
@ -283,11 +290,14 @@ onBeforeUnmount(() => {
function close() {
baseDialog.value?.close()
}
function drawEnd(data) {
oriData = data
}
//方法
function draw() {
submerge.draw()
submerge.draw(drawEnd)
}
function flyTo() {
submerge.flyTo()
}
@ -378,6 +388,7 @@ function areaInput() {
submerge.maxWaterLevel = maxWaterLevel.value
}
}
let oriData = waterVolume.value
function waterVolumeInput() {
let dom: any = document.getElementById('waterVolume')
if (waterVolume.value < dom.min * 1) {
@ -388,7 +399,13 @@ function waterVolumeInput() {
waterVolume.value = Math.floor(waterVolume.value * 10000) / 10000
if (area.value) {
waterLevel.value = Number((waterVolume.value / area.value).toFixed(4))
maxWaterLevel.value = maxWaterLevel.value + waterLevel.value
if (waterVolume.value > oriData) {
maxWaterLevel.value = maxWaterLevel.value + waterLevel.value
} else if (waterVolume.value < oriData) {
let data = maxWaterLevel.value - waterLevel.value
maxWaterLevel.value = data > minWaterLevel.value ? data : minWaterLevel.value
}
oriData = waterVolume.value
submerge.waterLevels = waterLevel.value
submerge.maxWaterLevel = maxWaterLevel.value
@ -403,6 +420,7 @@ function risingSpeedInput() {
risingSpeed.value = dom.max * 1
}
submerge.risingSpeed = risingSpeed.value
submerge.restart()
}
}
defineExpose({

View File

@ -129,7 +129,9 @@
</div>
</el-tab-pane>
<el-tab-pane label="标签风格" name="4">
<labelStyle :type="title" :entityOptions="entityOptions"></labelStyle>
<div class="div-item">
<labelStyle :type="title" :entityOptions="entityOptions"></labelStyle>
</div>
</el-tab-pane>
</el-tabs>
</div>

View File

@ -90,7 +90,9 @@
<attribute :entityOptions="entityOptions"></attribute>
</el-tab-pane>
<el-tab-pane label="标签风格" name="2">
<labelStyle :entityOptions="entityOptions"></labelStyle>
<div class="div-item">
<labelStyle :entityOptions="entityOptions"></labelStyle>
</div>
</el-tab-pane>
</el-tabs>
</div>

View File

@ -173,7 +173,9 @@
</div>
</el-tab-pane>
<el-tab-pane label="标签风格" name="3">
<labelStyle type="线" :entityOptions="entityOptions"></labelStyle>
<div class="div-item">
<labelStyle type="线" :entityOptions="entityOptions"></labelStyle>
</div>
</el-tab-pane>
</el-tabs>
</div>

View File

@ -137,12 +137,12 @@
</el-tree>
</div>
<div class="model-gallery" ref="galleryRef">
<div class="model-gallery" ref="galleryRef" @scroll="handleScroll">
<div class="model-section" v-if="categories.length != 0">
<!-- <h2 class="section-title">{{ categories[Number(currentTypeId)].name }}</h2> -->
<div class="model-grid">
<div
v-for="(model, mIndex) in categories"
v-for="(model, mIndex) in currModelList"
:key="mIndex"
class="model-item"
@click="modelClick(mIndex, model)"
@ -271,23 +271,31 @@ const initObserver = () => {
})
}
//滚动加载
var currModelList: any = ref([])
let page = 1
// 模拟加载更多数据
const loadMoreData = () => {
if (loading.value) return
loading.value = true
// if (loading.value) return
// loading.value = true
setTimeout(() => {
categories.value.push({
id: `${categories.value.length + 1}`,
name: `新增分类_${categories.value.length}`,
models: Array(10)
.fill(0)
.map((_, i) => ({
id: `n${i}`,
name: `新增军标_${i}`,
thumbnail: `https://picsum.photos/300/200?random=${i + 100}`
}))
})
loading.value = false
const start = (page - 1) * 24
const end = start + 24
currModelList.value = categories.value.slice(0, end)
page++
// categories.value.push({
// id: `${categories.value.length + 1}`,
// name: `新增分类_${categories.value.length}`,
// models: Array(10)
// .fill(0)
// .map((_, i) => ({
// id: `n${i}`,
// name: `新增军标_${i}`,
// thumbnail: `https://picsum.photos/300/200?random=${i + 100}`
// }))
// })
// loading.value = false
}, 1000)
}
@ -383,7 +391,7 @@ const renderModel = async (model) => {
let GroundSvg = new YJ.Obj.GroundSvg(window.earth, option)
GroundSvg.load(() => {
GroundSvg.drag(true, (data) => {
GroundSvg.drag(true, null, (data) => {
let params = data
delete params.attributeType
delete params.attribute.ISC
@ -416,6 +424,10 @@ const renderModel = async (model) => {
DbOption.isShow = true
DbOption.params = JSON.stringify(DbOption.params)
cusAddNodes(window.treeObj, DbOption.parentId, [DbOption])
if (GroundSvg.options.id) {
;(window as any)._entityMap.set(GroundSvg.options.id, GroundSvg)
}
})
})
}
@ -425,6 +437,10 @@ const getModelListByType = (id) => {
formData.append('militaryTypeId', id)
GraphApi.showModelByType(formData).then((res) => {
categories.value = res.data
currModelList.value = []
page = 1
loadMoreData()
})
}
@ -507,8 +523,11 @@ defineExpose({
// width: 40vw;
// height: 50vh;
:deep(.el-dialog) {
background:
linear-gradient(180deg, rgba(var(--color-base1), 0.2) 0%, rgba(var(--color-base1), 0) 100%),
background: linear-gradient(
180deg,
rgba(var(--color-base1), 0.2) 0%,
rgba(var(--color-base1), 0) 100%
),
rgba(0, 0, 0, 0.6);
border: 1px solid var(--color-border1);
padding-left: 0 !important;
@ -567,22 +586,22 @@ defineExpose({
box-sizing: border-box;
// height: 50vh;
:deep(
.el-tabs--left .el-tabs__active-bar.is-left,
.el-tabs--left .el-tabs__active-bar.is-right,
.el-tabs--right .el-tabs__active-bar.is-left,
.el-tabs--right .el-tabs__active-bar.is-right
) {
.el-tabs--left .el-tabs__active-bar.is-left,
.el-tabs--left .el-tabs__active-bar.is-right,
.el-tabs--right .el-tabs__active-bar.is-left,
.el-tabs--right .el-tabs__active-bar.is-right
) {
width: 3px;
background: rgba(var(--color-base1), 1);
height: 40px !important;
}
:deep(
.el-tabs--left .el-tabs__nav-wrap.is-left::after,
.el-tabs--left .el-tabs__nav-wrap.is-right::after,
.el-tabs--right .el-tabs__nav-wrap.is-left::after,
.el-tabs--right .el-tabs__nav-wrap.is-right::after
) {
.el-tabs--left .el-tabs__nav-wrap.is-left::after,
.el-tabs--left .el-tabs__nav-wrap.is-right::after,
.el-tabs--right .el-tabs__nav-wrap.is-left::after,
.el-tabs--right .el-tabs__nav-wrap.is-right::after
) {
width: 3px;
}

View File

@ -51,7 +51,7 @@
min="0.001"
max="200"
step="0.001"
@input="$handleInputLimit"
@input="scaleChange"
v-model="entityOptions.scale.x"
/>
<div class="input-number input-number-unit-1" style="width: auto; margin-left: 10px">
@ -62,7 +62,7 @@
min="0.001"
max="200"
step="0.001"
@input="$handleInputLimit"
@input="scaleChange"
v-model="entityOptions.scale.x"
/>
<span class="arrow"></span>
@ -77,7 +77,7 @@
min="0.001"
max="200"
step="0.001"
@input="$handleInputLimit"
@input="scaleChange"
v-model="entityOptions.scale.y"
/>
<div class="input-number input-number-unit-1" style="width: auto; margin-left: 10px">
@ -88,7 +88,7 @@
min="0.001"
max="200"
step="0.001"
@input="$handleInputLimit"
@input="scaleChange"
v-model="entityOptions.scale.y"
/>
<span class="arrow"></span>
@ -200,7 +200,7 @@
</template>
<script setup lang="ts">
import { ref } from 'vue'
import { ref, getCurrentInstance } from 'vue'
import { inject } from 'vue'
import { TreeApi } from '@/api/tree'
import Dialog from '@/components/dialog/baseDialog.vue'
@ -210,6 +210,7 @@ import { useTreeNode } from '@/views/components/tree/hooks/treeNode'
import { getFontList } from './fontSelect'
const { cusUpdateNode, cusRemoveNode } = useTreeNode()
const { proxy } = getCurrentInstance()!
const fontList = ref(getFontList())
@ -241,9 +242,10 @@ const entityOptions: any = ref({})
let originalOptions: any
let that: any
const scaleChange = () => {
entityOptions.value.scaleY = entityOptions.value.scaleX
entityOptions.value.scaleZ = entityOptions.value.scaleX
const scaleChange = (e) => {
proxy?.$handleInputLimit(e)
console.log(entityOptions.value.scale)
entityOptions.value.scale = entityOptions.value.scale
}
const open = async (id: any, type: any) => {
@ -349,8 +351,10 @@ const closeCallback = () => {
const nodeEdit = () => {
that.drag(!entityOptions.value._isdrag, (data) => {
that.options = data
})
entityOptions.value.angle = data.angle
entityOptions.value.scale.x = data.scale.x
entityOptions.value.scale.y = data.scale.y
}, null)
}
const confirm = () => {
@ -363,6 +367,7 @@ const confirm = () => {
delete params.attribute.camera
delete params.attribute.goods
delete params.attribute.vr
delete params.host
let params2 = {
id: params.id,

View File

@ -137,12 +137,12 @@
</el-tree>
</div>
<div class="model-gallery" ref="galleryRef">
<div class="model-gallery" ref="galleryRef" @scroll="handleScroll">
<div class="model-section" v-if="categories.length != 0">
<!-- <h2 class="section-title">{{ categories[Number(currentTypeId)].name }}</h2> -->
<div class="model-grid">
<div
v-for="(model, mIndex) in categories"
v-for="(model, mIndex) in currModelList"
:key="mIndex"
class="model-item"
@click="modelClick(mIndex, model)"
@ -365,24 +365,32 @@ const initObserver = () => {
observer?.observe(section)
})
}
//滚动加载
var currModelList: any = ref([])
let page = 1
// 模拟加载更多数据
const loadMoreData = () => {
if (loading.value) return
loading.value = true
// if (loading.value) return
// loading.value = true
setTimeout(() => {
categories.value.push({
id: `${categories.value.length + 1}`,
name: `新增分类_${categories.value.length}`,
models: Array(10)
.fill(0)
.map((_, i) => ({
id: `n${i}`,
name: `新增模型_${i}`,
thumbnail: `https://picsum.photos/300/200?random=${i + 100}`
}))
})
loading.value = false
const start = (page - 1) * 24
const end = start + 24
currModelList.value = categories.value.slice(0, end)
page++
// categories.value.push({
// id: `${categories.value.length + 1}`,
// name: `新增分类_${categories.value.length}`,
// models: Array(10)
// .fill(0)
// .map((_, i) => ({
// id: `n${i}`,
// name: `新增模型_${i}`,
// thumbnail: `https://picsum.photos/300/200?random=${i + 100}`
// }))
// })
// loading.value = false
}, 1000)
}
@ -391,14 +399,18 @@ const handleScroll = () => {
if (!galleryRef.value) return
const scrollPosition = galleryRef.value.scrollTop + 100
const sections = Array.from(document.querySelectorAll('.model-section'))
// const sections = Array.from(document.querySelectorAll('.model-section'))
sections.forEach((section, index) => {
const rect = section.getBoundingClientRect()
if (rect.top <= 450 && rect.bottom >= 450) {
activeTab.value = index.toString()
}
})
// sections.forEach((section, index) => {
// const rect = section.getBoundingClientRect()
// if (rect.top <= 450 && rect.bottom >= 450) {
// console.log('indexxxxxx', index)
// activeTab.value = index.toString()
// }
// })
if (galleryRef.value.scrollTop + galleryRef.value.clientHeight >= galleryRef.value.scrollHeight) {
loadMoreData()
}
}
//-----------tree-----------
@ -566,6 +578,10 @@ const getModelListByType = (id) => {
formData.append('name', modelName.value)
ModelApi.showModelByType(formData).then((res) => {
categories.value = res.data
currModelList.value = []
page = 1
loadMoreData()
})
}
@ -668,8 +684,11 @@ defineExpose({
// height: 50vh;
:deep(.el-dialog) {
background:
linear-gradient(180deg, rgba(var(--color-base1), 0.2) 0%, rgba(var(--color-base1), 0) 100%),
background: linear-gradient(
180deg,
rgba(var(--color-base1), 0.2) 0%,
rgba(var(--color-base1), 0) 100%
),
rgba(0, 0, 0, 0.6);
border: 1px solid var(--color-border1);
padding-left: 0 !important;
@ -737,22 +756,22 @@ defineExpose({
// height: 50vh;
:deep(
.el-tabs--left .el-tabs__active-bar.is-left,
.el-tabs--left .el-tabs__active-bar.is-right,
.el-tabs--right .el-tabs__active-bar.is-left,
.el-tabs--right .el-tabs__active-bar.is-right
) {
.el-tabs--left .el-tabs__active-bar.is-left,
.el-tabs--left .el-tabs__active-bar.is-right,
.el-tabs--right .el-tabs__active-bar.is-left,
.el-tabs--right .el-tabs__active-bar.is-right
) {
width: 3px;
background: rgba(var(--color-base1), 1);
height: 40px !important;
}
:deep(
.el-tabs--left .el-tabs__nav-wrap.is-left::after,
.el-tabs--left .el-tabs__nav-wrap.is-right::after,
.el-tabs--right .el-tabs__nav-wrap.is-left::after,
.el-tabs--right .el-tabs__nav-wrap.is-right::after
) {
.el-tabs--left .el-tabs__nav-wrap.is-left::after,
.el-tabs--left .el-tabs__nav-wrap.is-right::after,
.el-tabs--right .el-tabs__nav-wrap.is-left::after,
.el-tabs--right .el-tabs__nav-wrap.is-right::after
) {
width: 3px;
}

View File

@ -112,7 +112,9 @@
</div>
</el-tab-pane>
<el-tab-pane label="标签风格" name="4">
<labelStyle :type="title" :entityOptions="entityOptions"></labelStyle>
<div class="div-item">
<labelStyle :type="title" :entityOptions="entityOptions"></labelStyle>
</div>
</el-tab-pane>
</el-tabs>
</div>

View File

@ -46,7 +46,9 @@
<attribute :entityOptions="entityOptions"></attribute>
</el-tab-pane>
<el-tab-pane label="标签风格" name="4">
<labelStyle :type="title" :entityOptions="entityOptions"></labelStyle>
<div class="div-item">
<labelStyle :type="title" :entityOptions="entityOptions"></labelStyle>
</div>
</el-tab-pane>
</el-tabs>
</div>

View File

@ -53,7 +53,9 @@
<attribute :entityOptions="entityOptions"></attribute>
</el-tab-pane>
<el-tab-pane label="标签风格" name="2">
<labelStyle :entityOptions="entityOptions"></labelStyle>
<div class="div-item">
<labelStyle :entityOptions="entityOptions"></labelStyle>
</div>
</el-tab-pane>
</el-tabs>
</div>

View File

@ -69,7 +69,9 @@
<attribute :entityOptions="entityOptions"></attribute>
</el-tab-pane>
<el-tab-pane label="标签风格" name="2">
<labelStyle :entityOptions="entityOptions"></labelStyle>
<div class="div-item">
<labelStyle :entityOptions="entityOptions"></labelStyle>
</div>
</el-tab-pane>
</el-tabs>
</div>

View File

@ -103,7 +103,7 @@ const updateNode = (children, field) => {
}
else {
if(children[i].params) {
cusUpdateNode({ "id": children[i].id, "sourceName": children[i].params.properties[field], "params": children[i].params })
cusUpdateNode({ "id": children[i].id, "sourceName": (children[i].params.properties[field] || children[i].params.properties[field] == 0)? children[i].params.properties[field] : '未知', "params": children[i].params })
}
}
}

View File

@ -1,12 +1,6 @@
<template>
<Dialog
ref="baseDialog"
:title="title"
width="900px"
left="calc(50% - 450px)"
top="calc(50% - 360px)"
:closeCallback="closeCallback"
>
<Dialog ref="baseDialog" :title="title" width="900px" left="calc(50% - 450px)" top="calc(50% - 360px)"
:closeCallback="closeCallback">
<template #content>
<span class="custom-divider"></span>
<div class="div-item" style="display: flex">
@ -64,13 +58,8 @@
</div>
</div>
<div class="row">
<Pagination
:total="total"
v-model:page="pageNum"
v-model:limit="pageSize"
:pageSizes="pageSizes"
@pagination="getTableList"
/>
<Pagination :total="total" v-model:page="pageNum" v-model:limit="pageSize" :pageSizes="pageSizes"
@pagination="getTableList" />
</div>
</div>
</template>
@ -248,9 +237,9 @@ const updateNode = (children, field) => {
cusUpdateNode({
id: children[i].id,
sourceName:
children[i].params.properties[field] === undefined
? ''
: children[i].params.properties[field],
(children[i].params.properties[field] || children[i].params.properties[field] == 0)
? children[i].params.properties[field]
: '未知',
params: children[i].params
})
}
@ -399,6 +388,7 @@ defineExpose({
}
}
}
.YJ-custom-base-dialog {
::v-deep .foot {
padding: 4px;

View File

@ -30,8 +30,8 @@
<div class="col">
<span class="label">拉伸高度</span>
<div class="input-number input-number-unit-1">
<input class="input" type="number" title="" min="0" max="999999999"
v-model="entityOptions.extrudedHeight" @input="$handleInputLimit">
<input class="input" type="number" title="" min="0" max="999999999" v-model="entityOptions.extrudedHeight"
@input="$handleInputLimit">
<span class="unit">m</span>
<span class="arrow"></span>
</div>
@ -40,25 +40,36 @@
<div class="row">
<div class="col material-box">
<span class="label">拐角类型</span>
<el-select class="input input-select input-select-line-type"
v-model="entityOptions.material">
<el-option v-for="item in material" :key="item.key" :label="item.name" :value="item.key">
<i class="yj-custom-icon" :class="item.icon"></i>
{{ item.name }}
<el-select class="input input-select input-select-line-type" v-model="entityOptions.cornerType">
<template #label="{ label, value }">
<svg class="icon-yj">
<use :xlink:href="`#yj-${cornerType[value].icon}`"></use>
</svg>
{{ label }}
</template>
<el-option v-for="item in cornerType" :key="item.key" :label="item.name" :value="item.key">
<div style="display: flex; align-items: center;">
<svg class="icon-yj" style="width: 12px; height: 12px;">
<use :xlink:href="`#yj-${item.icon}`"></use>
</svg>
{{ item.name }}
</div>
</el-option>
</el-select>
</div>
<div class="col material-box">
<span class="label">墙体样式</span>
<el-select class="input input-select input-select-line-type"
v-model="entityOptions.material">
<el-select class="input input-select input-select-line-type" v-model="entityOptions.material">
<template #label="{ label, value }">
<i class="yj-custom-icon" :class="material[value].icon"></i>
<i class="yj-custom-icon" :class="material[value].icon"
:style="`background: url(${material[value].icon}) 100% 100% no-repeat;background-size: 100% 100%;`">
</i>
{{ label }}
</template>
<el-option v-for="item in material" :key="item.key" :label="item.name" :value="item.key">
<div style="display: flex; align-items: center;">
<i class="yj-custom-icon" :class="item.icon"></i>
<i class="yj-custom-icon" :class="item.icon"
:style="`background: url(${item.icon}) 100% 100% no-repeat;background-size: 100% 100%;`"></i>
{{ item.name }}
</div>
</el-option>
@ -74,18 +85,18 @@
</div>
</div>
</div>
<div class="div-item">
<div class="row">
<el-tabs v-model="activeName">
<el-tab-pane label="属性信息" name="1">
<attribute :entityOptions="entityOptions"></attribute>
</el-tab-pane>
<el-tab-pane label="标签风格" name="2">
<labelStyle :entityOptions="entityOptions"></labelStyle>
<div class="div-item">
<labelStyle :entityOptions="entityOptions"></labelStyle>
</div>
</el-tab-pane>
</el-tabs>
</div>
</div>
<span class="custom-divider"></span>
</template>
<template #footer>
@ -116,30 +127,50 @@ const { cusUpdateNode, getSelectedNodes, cusRemoveNode } = useTreeNode()
const baseDialog: any = ref(null);
const eventBus: any = inject("bus");
const cornerType = ref([
{
name: '直角',
value: '直角',
key: 0,
icon: 'icon-zj',
},
{
name: '斜角',
value: '斜角',
key: 1,
icon: 'icon-xj',
},
{
name: '圆角',
value: '圆角',
key: 2,
icon: 'icon-yj',
},
])
const material = ref([
{
name: '纯色墙',
value: '纯色墙',
key: 0,
icon: 'icon-wall'
icon: '../sdk/custom/img/icon-wall.png'
},
{
name: '红砖墙',
value: '红砖墙',
key: 1,
icon: 'icon-wall-brick1'
icon: '../sdk/img/material/brick1.png'
},
{
name: '黄砖墙',
value: '黄砖墙',
key: 2,
icon: 'icon-wall-brick2'
icon: '../sdk/img/material/brick2.png'
},
{
name: '灰瓷墙',
value: '灰瓷墙',
key: 3,
icon: 'icon-wall-brick3'
icon: '../sdk/img/material/brick3.png'
}
])
eventBus.on("openStandTextAdd", () => {
@ -151,7 +182,7 @@ let originalOptions: any
let that: any
const colorRef = ref(null)
const open = async (id: any) => {
that = window.earth.entityMap.get('aaa')
that = window.earth.entityMap.get(id)
originalOptions = structuredClone(that.options)
entityOptions.value = that
baseDialog.value?.open()
@ -193,31 +224,31 @@ const close = () => {
const remove = () => {
close()
ElMessageBox.confirm('此操作将永久删除节点及所有子节点, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
.then(async () => {
let node = window.treeObj.getNodeByParam('id', that.options.id, null)
let source_ids = cusRemoveNode(window.treeObj, [node])
const res = await TreeApi.removeDirectory({ ids: source_ids })
if (res.code == 0 || res.code == 200) {
ElMessage({
message: '删除成功',
type: 'success'
})
that.remove()
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
.then(async () => {
let node = window.treeObj.getNodeByParam('id', that.options.id, null)
let source_ids = cusRemoveNode(window.treeObj, [node])
const res = await TreeApi.removeDirectory({ ids: source_ids })
if (res.code == 0 || res.code == 200) {
ElMessage({
message: '删除成功',
type: 'success'
})
that.remove()
(window as any)._entityMap.delete(source_ids[0])
} else {
ElMessage({
message: res.msg || '删除失败',
type: 'error'
})
}
})
.catch(() => {
// 用户点击取消,不执行任何操作
})
} else {
ElMessage({
message: res.msg || '删除失败',
type: 'error'
})
}
})
.catch(() => {
// 用户点击取消,不执行任何操作
})
}
const nodeEdit = () => {
that.nodeEdit()
@ -225,7 +256,6 @@ const nodeEdit = () => {
const closeCallback = () => {
entityOptions.value.originalOptions = structuredClone(originalOptions)
that.positionEditing = false
that.reset()
eventBus?.emit("destroyComponent")
}

View File

@ -63,7 +63,9 @@
<attribute :entityOptions="entityOptions"></attribute>
</el-tab-pane>
<el-tab-pane label="标签风格" name="2">
<labelStyle :entityOptions="entityOptions"></labelStyle>
<div class="div-item">
<labelStyle :entityOptions="entityOptions"></labelStyle>
</div>
</el-tab-pane>
</el-tabs>
</div>

View File

@ -37,7 +37,7 @@ export function renderVector(node, ifFly = true) {
sourceType: item.type,
sourcePath: params.path,
sourceName:
item.properties[Vector.field] || Object.keys(item.properties)[0] || '未知',
(item.properties[Vector.field] || item.properties[Vector.field] == 0) ? item.properties[Vector.field] : '未知',
params: {
...item,
},

View File

@ -1,5 +1,5 @@
import { TreeApi } from '@/api/tree'
import { $changeComponentPop } from '@/utils/communication'
import { $changeComponentPop, $sendElectronChanel, $recvElectronChanel } from '@/utils/communication'
import { ElMessage, ElMessageBox } from 'element-plus'
import { useTreeNode } from '@/views/components/tree/hooks/treeNode'
import { initMapData } from '@/common/initMapData'
@ -85,12 +85,10 @@ export const useRightOperate = () => {
params: {
id: id,
path: filePaths[i],
field: 'id',
// field: 'id',
name: name,
headTables: [],
opacity: 1,
color: 'rgba(0,255,184,0.5)',
show: true
headTables: [{}],
show: true,
},
}
TreeApi.addOtherSource(params)
@ -191,35 +189,21 @@ export const useRightOperate = () => {
parentId = node.parentId
}
}
const pickerOpts = {
types: [
let option = {
properties: ['openFile', 'multiSelections'],
filters: [
{
description: '全景图',
accept:
{
'image/jpg': ['.jpg']
}
name: '全景图',
extensions: ['jpg']
}
],
excludeAcceptAllOption: true,
multiple: true
};
if ((window as any).showOpenFilePicker) {
const fileHandles = await (window as any).showOpenFilePicker(pickerOpts);
const files = await Promise.all(fileHandles.map(fileHandle => fileHandle.getFile()));
const dataTransfer = new DataTransfer();
handleFileImgInput(files, parentId, 'vrImage')
} else {
let input = document.createElement('input')
input.type = 'file'
input.accept = '.jpg'
input.multiple = true
input.click()
input.addEventListener('input', async (e: any) => {
let files = e.target.files
handleFileImgInput(files, parentId, 'vrImage')
})
]
}
$sendElectronChanel('open-directory-dialog', option)
$recvElectronChanel('selectedItem', (e, paths) => {
if (paths.length) {
handleFileImgInput(paths, parentId, 'vrImage')
}
})
}
//图片定位
const pictureLocation = async () => {
@ -233,35 +217,21 @@ export const useRightOperate = () => {
parentId = node.parentId
}
}
const pickerOpts = {
types: [
let option = {
properties: ['openFile', 'multiSelections'],
filters: [
{
description: '无人机航拍',
accept:
{
'image/jpg': ['.jpg']
}
name: '无人机航拍',
extensions: ['jpg']
}
],
excludeAcceptAllOption: true,
multiple: true
};
if ((window as any).showOpenFilePicker) {
const fileHandles = await (window as any).showOpenFilePicker(pickerOpts);
const files = await Promise.all(fileHandles.map(fileHandle => fileHandle.getFile()));
const dataTransfer = new DataTransfer();
handleFileImgInput(files, parentId, 'linkImage')
} else {
let input = document.createElement('input')
input.type = 'file'
input.accept = '.jpg'
input.multiple = true
input.click()
input.addEventListener('input', async (e: any) => {
let files = e.target.files
handleFileImgInput(files, parentId, 'linkImage')
})
]
}
$sendElectronChanel('open-directory-dialog', option)
$recvElectronChanel('selectedItem', (e, paths) => {
if (paths.length) {
handleFileImgInput(paths, parentId, 'linkImage')
}
})
}
//属性
const showAttr = (eventBus) => {
@ -442,6 +412,9 @@ export const useRightOperate = () => {
if (node.sourceType == 'standText' || node.sourceType == 'groundText') {
sourceName = params.text
}
else if (node.sourceType == 'textBox') {
sourceName = params.text ? params.text : '文本框'
}
let params2 = {
"id": node.id,
"sourceName": sourceName,
@ -634,12 +607,13 @@ export const useRightOperate = () => {
const formData = new FormData();
let ids: any = []
let filesList: any = []
console.log('files', files)
for (let i = 0; i < files.length; i++) {
const element = files[i]
ids.push(new YJ.Tools().randomString())
filesList.push(element)
formData.append('files', element)
}
formData.append('filePaths', filesList)
let params: any = {
"id": ids[0],
"show": true,

View File

@ -583,7 +583,7 @@ export const useTree = () => {
let res = await TreeApi.getTreeList()
if ([0, 200].includes(res.code)) {
res.data.list.sort((a: any, b: any) => {
if (a.treeIndex && b.treeIndex) {
if ((a.treeIndex || a.treeIndex == 0) && (b.treeIndex || b.treeIndex == 0)) {
return a.treeIndex - b.treeIndex
}
if (a.treeIndex) {

View File

@ -456,7 +456,7 @@ export const useTreeNode = () => {
const cusNodeIcon = async (node) => {
let availablePort = await ipcRenderer.invoke('get-available-port');
let type
if (node.sourcePath || node.sourceType === 'vector') {
if ((node.sourcePath || node.sourceType === 'vector') && (node.sourceType !== 'vrImage' && node.sourceType !== 'linkImage')) {
let path = node.sourcePath ? node.sourcePath : JSON.parse(node.params).path
// 获取最后一个点的位置
const lastDotIndex = path.lastIndexOf('.');

View File

@ -222,7 +222,7 @@
v-for="(item, index) in poiOptions"
:key="item.search_key + index"
:label="item.search_key"
:value="item.address"
:value="item.id"
>
</el-option>
</el-select>
@ -417,6 +417,7 @@ const searchPlace = debounce(function () {
item.location.lat
)
arr.push({
id: item.id,
address: item.name,
search_key: item.name,
search_type: item.id,
@ -505,7 +506,7 @@ const searchPlace = debounce(function () {
const availablePort = ref(55110)
const locationChange = () => {
let item = poiOptions.value.find((item) => item.address == value.value)
let item = poiOptions.value.find((item) => item.id == value.value)
let id = new YJ.Tools().randomString()
nextTick(() => {
select1.value.blur()
@ -811,14 +812,26 @@ defineExpose({
width: 380px !important;
}
.el-select-dropdown__item {
svg {
fill: #ffffff !important;
margin: 2px 5px 0 0 !important;
}
}
.el-select-dropdown__item.is-hovering {
background-color: unset !important;
color: rgba(var(--color-base1), 1) !important;
svg {
fill: rgba(var(--color-base1), 1) !important;
}
}
.el-select-dropdown__item.is-selected {
background-color: unset !important;
color: rgba(var(--color-base1), 1) !important;
svg {
fill: rgba(var(--color-base1), 1) !important;
}
}
// .custom-dropdown2 {

View File

@ -734,7 +734,7 @@ const validatePortRange = (rule, value, callback) => {
align-items: center;
::placeholder {
color: #fff;
color: rgba(113, 126, 143, 1);
}
.el-form-item {

View File

@ -17,56 +17,59 @@ export const useSetUp = () => {
const selectedService = ref('接口服务')
const serviceOptions: any = ref([{ name: '接口服务' }, { name: '北斗串口' }])
let serveUrl: any = getIP()
let isOk = validateURL(serveUrl)
let serverMode = localStorage.getItem('serverMode')
if (isOk) {
const parsedUrl = new URL(serveUrl);
const host = parsedUrl.host;
const ipPort = host.split(':');
if (serverMode === 'false') {
servVal.value = '网络'
ip.value = ipPort[0]
port.value = Number(ipPort[1])
prototype.value = parsedUrl.protocol.slice(0, -1)
}
else {
localip.value = ipPort[0]
localport.value = Number(ipPort[1])
const reset = () => {
let serveUrl: any = getIP()
let isOk = validateURL(serveUrl)
serverMode = localStorage.getItem('serverMode')
if (isOk) {
const parsedUrl = new URL(serveUrl);
const host = parsedUrl.host;
const ipPort = host.split(':');
if (serverMode === 'false') {
servVal.value = '网络'
ip.value = ipPort[0]
port.value = Number(ipPort[1])
prototype.value = parsedUrl.protocol.slice(0, -1)
}
else {
localip.value = ipPort[0]
localport.value = Number(ipPort[1])
}
}
}
reset()
const submit = () => {
switch (selectedService.value) {
case '接口服务':
// this.submitIP();
if (serverMode === 'false') {
if(Number(port.value) < 1024 || Number(port.value) > 65535) {
if (Number(port.value) < 1024 || Number(port.value) > 65535) {
// ElMessage.error('端口号范围为1024-65535')
return
}
}
else {
if(Number(localport.value) < 1024 || Number(localport.value) > 65535) {
if (Number(localport.value) < 1024 || Number(localport.value) > 65535) {
// ElMessage.error('端口号范围为1024-65535')
return
}
}
submitIP()
break
case '北斗串口':
// this.submitGPS();
submitGPS();
break
}
selectedService.value = '接口服务'
}
const cancel = () => {
serviceDialog.value = false
selectedService.value = '接口服务'
reset()
}
const submitIP = () => {
@ -99,6 +102,9 @@ export const useSetUp = () => {
}
}
const submitGPS = () => {
serviceDialog.value = false
}
const initialize = () => {
if (serverMode === 'false') {