站点配置功能完成,关联配置功能完成

master
zhangliang 7 months ago
parent cd5951858c
commit dde0252d27

36
package-lock.json generated

@ -47,6 +47,7 @@
"pinia": "^2.0.28",
"rollup-plugin-copy": "^3.4.0",
"rxjs": "^7.8.1",
"splitpanes": "^3.1.5",
"three": "^0.146.0",
"unplugin-auto-import": "^0.12.1",
"unplugin-vue-components": "^0.22.12",
@ -58,8 +59,7 @@
"vue-json-viewer": "^3.0.4",
"vue-router": "^4.1.6",
"vue3-json-viewer": "^2.2.2",
"vue3-ts-jsoneditor": "^2.7.1",
"yarn": "^1.22.22"
"vue3-ts-jsoneditor": "^2.7.1"
},
"devDependencies": {
"@commitlint/cli": "^17.4.1",
@ -5055,6 +5055,7 @@
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz",
"integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==",
"license": "MIT",
"dependencies": {
"min-document": "^2.19.0",
"process": "^0.11.10"
@ -9818,6 +9819,14 @@
"readable-stream": "^3.0.0"
}
},
"node_modules/splitpanes": {
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/splitpanes/-/splitpanes-3.1.5.tgz",
"integrity": "sha512-r3Mq2ITFQ5a2VXLOy4/Sb2Ptp7OfEO8YIbhVJqJXoFc9hc5nTXXkCvtVDjIGbvC0vdE7tse+xTM9BMjsszP6bw==",
"funding": {
"url": "https://github.com/sponsors/antoniandre"
}
},
"node_modules/string_decoder": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
@ -11582,19 +11591,6 @@
"node": ">=10"
}
},
"node_modules/yarn": {
"version": "1.22.22",
"resolved": "https://registry.npmjs.org/yarn/-/yarn-1.22.22.tgz",
"integrity": "sha512-prL3kGtyG7o9Z9Sv8IPfBNrWTDmXB4Qbes8A9rEzt6wkJV8mUvoirjU0Mp3GGAU06Y0XQyA3/2/RQFVuK7MTfg==",
"hasInstallScript": true,
"bin": {
"yarn": "bin/yarn.js",
"yarnpkg": "bin/yarn.js"
},
"engines": {
"node": ">=4.0.0"
}
},
"node_modules/yn": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
@ -18524,6 +18520,11 @@
"readable-stream": "^3.0.0"
}
},
"splitpanes": {
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/splitpanes/-/splitpanes-3.1.5.tgz",
"integrity": "sha512-r3Mq2ITFQ5a2VXLOy4/Sb2Ptp7OfEO8YIbhVJqJXoFc9hc5nTXXkCvtVDjIGbvC0vdE7tse+xTM9BMjsszP6bw=="
},
"string_decoder": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
@ -19745,11 +19746,6 @@
"integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
"dev": true
},
"yarn": {
"version": "1.22.22",
"resolved": "https://registry.npmjs.org/yarn/-/yarn-1.22.22.tgz",
"integrity": "sha512-prL3kGtyG7o9Z9Sv8IPfBNrWTDmXB4Qbes8A9rEzt6wkJV8mUvoirjU0Mp3GGAU06Y0XQyA3/2/RQFVuK7MTfg=="
},
"yn": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",

@ -52,6 +52,7 @@
"pinia": "^2.0.28",
"rollup-plugin-copy": "^3.4.0",
"rxjs": "^7.8.1",
"splitpanes": "^3.1.5",
"three": "^0.146.0",
"unplugin-auto-import": "^0.12.1",
"unplugin-vue-components": "^0.22.12",
@ -63,8 +64,7 @@
"vue-json-viewer": "^3.0.4",
"vue-router": "^4.1.6",
"vue3-json-viewer": "^2.2.2",
"vue3-ts-jsoneditor": "^2.7.1",
"yarn": "^1.22.22"
"vue3-ts-jsoneditor": "^2.7.1"
},
"devDependencies": {
"@commitlint/cli": "^17.4.1",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 KiB

@ -1,977 +0,0 @@
*{
margin:0;
padding:0;
}
ul{
list-style: none;
}
input {
/* border: 0; */
outline: none;
/* background-color: rgba(0, 0, 0, 0); */
}
a{
text-decoration: none;
/* color: #333333; */
color: #fff;
outline: medium none;
overflow: hidden;
}
/* 隐藏 input type="number" 的箭头按钮 */
input[type="number"]::-webkit-outer-spin-button,
input[type="number"]::-webkit-inner-spin-button {
-webkit-appearance: none; /* WebKit 浏览器 */
margin: 0; /* Firefox 不显示箭头 */
}
input[type="number"] {
-moz-appearance: textfield; /* Firefox */
}
@media screen and (min-width: 1280px) {
body{
overflow-x:hidden;
}
}
header .nav-list{
color:#fff;
}
.hide{
display:none;
}
.col{
box-sizing: border-box;
padding: 0;
outline: 0;
border: 0;
vertical-align: baseline;
font-weight: inherit;
font-style: inherit;
font-size: 100%;
font-family: inherit;
overflow:hidden;
}
/* select option 样式 */
select{
box-sizing: border-box;
font-size:12px;
}
/* 实时数据表 */
.col.echarts-chart:after{
display:block;
content:'';
clear:both;
}
.echarts-btn{
position: relative;
height:20px;
}
.echarts-btn>span{
/* float:right; */
display: inline-block;
}
.echarts-text span{
font-size:14px;
color:#92A3A8; /*#333*/
margin-right:8px;
}
.realdata{
padding-left: 10px;
padding-right: 10px;
position: absolute;
top: 10px;
z-index: 10;
width: 95vw;
}
.btn{
width: 22px;
height: 22px;
cursor: pointer;
border-radius: 5px;
box-sizing: border-box;
}
.record-btn{
display: inline-block;
width:100%;
height:100%;
background: url(../img/LiveData/record.png) 0 0 no-repeat transparent;
background-size: cover;
/* border-radius: 50%; */
transition: all .5s;
}
.record-btn.ready{
background: url(../img/LiveData/record_ready.png) 0 0 no-repeat transparent;
background-size: cover;
transition: all .5s;
}
.record-btn.live{
background: url(../img/LiveData/recording.png) 0 0 no-repeat transparent;
background-size: cover;
transition: all .5s;
}
.record-btn.live{
transform: scale(0.9);
animation: geetest_wait 2s linear infinite both;
}
@keyframes geetest_wait{
0%{transform: scale(0.9);}
50%{transform: scale(0.5);}
100%{transform: scale(0.9);}
}
.refresh-btn{
display: inline-block;
width:100%;
height:100%;
transform: scale(0.8);
background: url(../img/LiveData/total.png) 0 0 no-repeat transparent;
background-size: cover;
}
.refresh-btn.ready{
background: url(../img/LiveData/total_ready.png) 0 0 no-repeat transparent;
background-size: cover;
transition: all .5s;
}
.btn:active{
background:#eee;
border-color:1px solid #333;
}
.associated-noise{
display: inline-block;
width:100%;
height:100%;
transform: scale(0.9);
box-sizing: border-box;
background: url(../img/LiveData/noise.png) 0 0 no-repeat transparent;
background-size: cover;
cursor: pointer;
transition: all .5s;
}
.prps{
display: inline-block;
width:100%;
height:100%;
transform: scale(0.9);
box-sizing: border-box;
background: url(../img/LiveData/prps_cluster.png) 0 0 no-repeat transparent;
background-size: cover;
transition: all .5s;
pointer-events: auto;
cursor: pointer;
}
.prps.ready{
background: url(../img/LiveData/prps.png) 0 0 no-repeat transparent;
background-size: cover;
transition: all .5s;
pointer-events: none;
}
.prpd{
display: inline-block;
width:100%;
height:100%;
transform: scale(0.9);
box-sizing: border-box;
background: url(../img/LiveData/prpd_cluster.png) 0 0 no-repeat transparent;
background-size: cover;
cursor: pointer;
transition: all .5s;
}
.prpd.ready{
background: url(../img/LiveData/prpd.png) 0 0 no-repeat transparent;
background-size: cover;
transition: all .5s;
pointer-events: none;
}
.start{
display: inline-block;
width:100%;
height:100%;
transform: scale(0.9);
box-sizing: border-box;
background: url(../img/LiveData/play.png) 0 0 no-repeat transparent;
background-size: cover;
cursor: pointer;
transition: all .5s;
}
.start.ready{
background: url(../img/LiveData/stop.png) 0 0 no-repeat transparent;
background-size: cover;
transition: all .5s;
}
.show{
display: inline-block;
width:100%;
height:100%;
transform: scale(0.9);
box-sizing: border-box;
background: url(../img/LiveData/show.png) 0 0 no-repeat transparent;
background-size: cover;
cursor: pointer;
transition: all .5s;
}
#menu-right{
margin-left: auto;
}
.show.ready{
background: url(../img/LiveData/hide.png) 0 0 no-repeat transparent;
background-size: cover;
transition: all .5s;
}
.big{
display: inline-block;
width:100%;
height:100%;
transform: scale(0.9);
box-sizing: border-box;
background: url(../img/LiveData/big.png) 0 0 no-repeat transparent;
background-size: cover;
cursor: pointer;
transition: all .5s;
}
.big.ready{
background: url(../img/LiveData/big_ready.png) 0 0 no-repeat transparent;
background-size: cover;
transition: all .5s;
cursor: not-allowed;
pointer-events: none;
}
.small{
display: inline-block;
width:100%;
height:100%;
transform: scale(0.9);
box-sizing: border-box;
background: url(../img/LiveData/small.png) 0 0 no-repeat transparent;
background-size: cover;
cursor: pointer;
transition: all .5s;
}
.small.ready{
background: url(../img/LiveData/small_ready.png) 0 0 no-repeat transparent;
background-size: cover;
transition: all .5s;
cursor: not-allowed;
pointer-events: none;
}
.zoom{
position: absolute;
z-index: 101;
bottom: 50px;
left: 10px;
display: flex;
flex-direction: column;
}
#total-time{
width:70px
}
.adaptive-noise{
display: inline-block;
width:100%;
height:100%;
transform: scale(0.9);
box-sizing: border-box;
background: url(../img/LiveData/adaptive-noise_off.png) 0 0 no-repeat transparent;
background-size: cover;
cursor: pointer;
transition: all .5s;
}
.associated-noise.ready{
background: url(../img/LiveData/noise_ready.png) 0 0 no-repeat transparent;
background-size: cover;
transition: all .5s;
}
.adaptive-noise.ready{
background: url(../img/LiveData/adaptive-noise_on.png) 0 0 no-repeat transparent;
background-size: cover;
transition: all .5s;
}
.slide{
text-align: left;
border-radius: 5px;
cursor: pointer;
}
.slide-name{
position: absolute;
display: block;
cursor: default;
white-space: nowrap;
content: attr(data-content);
color: #fff;
font-size: 10px;
line-height: 1.333;
text-shadow: none;
padding: 1px 5px;
background: #1890ff;
border-radius: 5px;
}
.pm-slide-box .slide-name{
left:-65px;
top:6px;
}
.noisy-slide-box .slide-name{
left:3px;
top:0px;
}
.cdf-slide-box .slide-name{
left:-70px;
top:10px;
}
.pm-slide-box{
position:absolute;
width:600px;
height:30px;
left:40%;
margin-left:-300px;
}
.pm-slide{
position:absolute;
width:100%;
top:12px;
margin:0 auto;
font-size:12px;
z-index:100;
height:8px;
background: url(../img/sprite-skin-nice.png) repeat-x;
background-position: 0 0;
}
#addPointNumDiv{
position: absolute;
bottom: 25px;
left: 20%;
}
.noisy-slide-box{
width:26px;
}
.noisy-slide{
position: absolute;
margin:auto;
left:-6px;
height:350px;
margin:25px 0 0 20px;
width:8px!important;
background: url(../img/sprite-skin-nice-1.png) repeat-y!important;
background-position: 0 0;
}
.cdf-slide-box{
width:40vw;
height:20px;
}
.cdf-slide{
position:absolute;
width:100%;
top:15px;
margin:0 auto;
font-size:12px;
z-index:100;
height:8px;
background: url(../img/sprite-skin-nice.png) repeat-x;
background-position: 0 0;
}
.menu-top{
display: flex;
gap: 8px;
}
.menu-right{
display: flex;
flex-direction: column;
gap: 8px;
}
.text-bottom{
height: 50px;
position: absolute;
z-index: 10;
bottom: 0;
right: 10px;
display: flex;
flex-direction: column;
justify-content: space-between;
}
.content{
position: relative;
width:100%;
margin-top:80px;
user-select: none;
}
.left-box{
position: fixed;
width:180px;
height:600px;
background-color:#fbfbfb;
border:1px solid #999;
border-top-color:transparent;
-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);
-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);
box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);
z-index: 101;
}
.right-box{
position: relative;
width:100%;
min-width:1000px;
top:0;
left:180px;
}
.crumbs{
padding-top:40px;
padding-bottom:30px;
}
.selectStyle{
border-radius: 2px;
height: 22px;
width: 80px;
background-color: #fff;
border: 1px solid #d9d9d9;
text-align:center;
text-align-last:center
}
.selectStyle:hover{
border-color: #1890ff
}
.selectStyle option{
text-align:center;
text-align-last:center;
}
.site-box{
width:98%;
min-width:1045px;
/* max-width:1600px;
margin:auto; */
/* height:500px; */
margin-top:30px;
margin-left:1%;
overflow: hidden;
}
.echarts-box{
/* max-width:1600px; */
height:auto;
padding:5px;
border: 1px solid #ddd;
background-color: #fff;
border-radius: 15px;
box-shadow: 0 1px 2px rgba(0,0,0,0.2);
min-width:1040px;
margin:auto;
margin-top:10px;
/* margin-bottom:20px; */
}
.mainer{
display:flex;
flex-flow:row wrap;
}
/* @media screen and (min-width: 1920px) { */
/* body {
background-color:#b9e8f898;
} */
.auto-box{
/* width:788px; */
width:50%;
/* max-width:788px; */
border:1px solid #d9edf7;
/* padding:10px; */
box-sizing: border-box;
border-radius:10px;
/* margin-right:1%;
margin-bottom:10px; */
}
.loading-box{
/* width:360px; */
width:90%;
/* width:45%; */
/* height:300px; */
min-height:180px;
float:left;
/*background: @body-background;*/
}
.loading-box-mini{
min-height:106.5px;
display: inline-block;
width: 100%;
}
.auto-box canvas{
width:100%;
height:100%;
}
.pm-slide-box{
left:auto;
position:relative;
}
.pm-slide-box .slide-name {
left: auto;
right: 104%;
}
.cdf-slide{
position:absolute;
width:100%;
top:15px;
margin:0 auto;
font-size:12px;
z-index:100;
height:8px;
background: url(../img/sprite-skin-nice.png) repeat-x;
background-position: 0 0;
}
@media screen and (min-width: 1800px) {
.noisy-slide-box{
margin-right:20px!important;
}
}
@media screen and (min-width: 1600px) {
.pm-slide-box{
width:40%;
right:-60%;
margin-left:-32%;
}
.echarts-text span {
font-size: 0.8rem;
}
}
@media screen and (max-width: 1599px){
.pm-slide-box{
width:40%;
right:-35%;
margin-left:-32%;
}
.pm-slide-box .slide-name {
opacity:0;
left: -20px;
top: 21px;
}
.echarts-text span {
font-size: 0.7rem;
}
}
@media screen and (max-width: 1439px) {
.site-box {
margin-left: 15px;
}
.pm-slide-box{
/* width:30%; */
width:38%;
/*right:-60%;*/
margin-left:-33%;
}
.sel-opt.sm{
width:80px;
}
.pm-slide-box .slide-name {
opacity:0;
left: -20px;
top: 21px;
}
.echarts-text span {
font-size: 0.6rem;
}
}
@media screen and (max-width: 750px) {
}
@media screen and (max-width: 590px) {
}
.pm-slide{
position:absolute;
width:100%;
top:12px;
margin:0 auto;
font-size:12px;
z-index:100;
height:8px;
background: url(../img/sprite-skin-nice.png) repeat-x;
background-position: 0 0;
}
.noisy-slide-box{
position: relative;
}
.noisy-slide{
position: absolute;
margin:auto;
left:-6px;
height:80%;
/* height:250px; */
margin:25px 0 0 20px;
width:8px!important;
background: url(../img/sprite-skin-nice-1.png) repeat-y!important;
background-position: 0 0;
}
.noisy-slide .ui-slider-handle:after {
top: -18px;
left: -28px;
}
.ui-slider-handle{
width:20px;
height:20px;
outline:none;
}
.pm-slide .ui-slider-handle {
top: -8px;
}
.cdf-slide .ui-slider-handle {
top: -8px;
}
.noisy-slide-box{
float:right!important;
margin-right:10px;
margin-top: 45px;
}
.btn.mr50{
margin-right:1%!important;
}
/* } */
/* @media screen and (max-width:1919px){
body {
background-color:#b9e8f898;
}
.auto-box{
width:1022px;
margin:0 auto;
border:1px solid #d9edf7;
padding:10px;
box-sizing: border-box;
border-radius:10px;
margin-bottom:20px;
}
#box3D1,#box2D1,#box3D2,#box2D2,#box3D3,#box2D3,#box3D4,#box2D4{
width:480px;
height:380px;
float:left;
}
.noisy-slide .ui-slider-handle:after{
top: -18px;
left: -20px;
opacity: 0;
}
.noisy-slide-box{
float:right!important;
}
} */
/* .col{
min-width:1000px;
} */
/************* 数据图表 ************/
#box3D canvas,#box2D canvas{
width:100%;
height:100%;
}
.col{
overflow: visible;
}
/*量程*/
.radiogroup{
margin-top:5px;
user-select: none;
}
.el-radio {
color: #fff;
font-weight: 300;
line-height: 1;
cursor: pointer;
white-space: nowrap;
outline: 0;
}
.el-radio, .el-radio--medium.is-bordered .el-radio__label {
font-size: 14px;
}
.el-radio, .el-radio__inner, .el-radio__input {
position: relative;
display: inline-block;
}
.el-radio__input {
white-space: nowrap;
cursor: pointer;
outline: 0;
line-height: 1;
vertical-align: middle;
}
.el-radio__input.is-checked .el-radio__inner {
border-color: #2DAFB8;
background: #2DAFB8;
}
.el-radio__inner {
border: 1px solid #99a4ac;
border-radius: 100%;
width: 14px;
height: 14px;
background-color: #fff;
cursor: pointer;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
.el-radio__input.is-checked .el-radio__inner::after {
-webkit-transform: translate(-50%,-50%) scale(1);
transform: translate(-50%,-50%) scale(1);
}
.el-radio__inner::after {
width: 4px;
height: 4px;
border-radius: 100%;
background-color: #fff;
content: "";
position: absolute;
left: 50%;
top: 50%;
-webkit-transform: translate(-50%,-50%) scale(0);
transform: translate(-50%,-50%) scale(0);
-webkit-transition: -webkit-transform .15s cubic-bezier(.71,-.46,.88,.6);
transition: -webkit-transform .15s cubic-bezier(.71,-.46,.88,.6);
transition: transform .15s cubic-bezier(.71,-.46,.88,.6);
transition: transform .15s cubic-bezier(.71,-.46,.88,.6),-webkit-transform .15s cubic-bezier(.71,-.46,.88,.6);
}
.el-radio__original {
opacity: 0;
outline: 0;
position: absolute;
z-index: -1;
top: 0;
left: 0;
right: 0;
bottom: 0;
margin: 0;
}
.el-radio__input.is-checked+.el-radio__label {
color: #2DAFB8;
}
.el-radio__label {
font-size: 12px;
font-weight: bold;
/*padding-left: 5px;*/
}
.el-radio+.el-radio {
/*margin-left: 30px;*/
}
/*量程end*/
/* 弹出修改框 */
.alert {
z-index: 2;
border: 1px solid rgba(0,0,0,.2);
width: 598px;
height: auto;
border-radius: 6px;
box-shadow: 0 5px 15px rgba(0,0,0,.5);
background: #fff;
z-index: 1000;
position: fixed;
left: 50%;
top: 20%;
margin-left: -299px;
display: none;
line-height: 1.428571429;
}
.model-head {
padding: 15px;
color: #73879C;
border-bottom: 1px solid #e5e5e5;
}
.close {
padding: 0;
cursor: pointer;
background: 0 0;
border: 0;
float: right;
font-size: 14px !important;
font-weight: 700;
text-shadow: 0 1px 0 #fff;
opacity: 0.4;
margin-top: 5px;
line-height: 1;
color: #000000;
}
#close:hover {
cursor: pointer;
color: #000;
}
#mask {
position: fixed;
top: 0;
left: 0;
height: 100%;
width: 100%;
background: #000;
opacity: 0.3;
display: none;
z-index: 99;
}
.model-content {
position: relative;
padding: 15px;
padding-bottom: 0;
}
.model-foot {
padding: 15px;
text-align: right;
}
.modal-title {
margin: 0;
line-height: 1.428571429;
font-size: 18px;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-weight: 500;
}
.foot-btn {
/* width: 100%; */
/* height: 58px; */
border-top: 1px solid #ddd;
padding: 10px 10px;
margin-top: 10px;
text-align: center;
}
.main.page{
margin-top:0;
border:0;
min-width:800px;
}
.alert .block{
margin-top:0;
margin-bottom:0;
}
.text-right input.lg {
width: 300px;
}
#type-imgf{
display:none;
}
#select-type-img{
margin-top:4px;
margin-left:10px;
}
#type-describe{
margin-top:5px;
padding:10px;
color:#666;
font-size:14px;
}
#type-describe.err{
border:1px solid #f00;
}
#save-btn{
margin-left:-10px;
}
#cancel-btn{
margin-left:100px;
}
button:hover {
color: #fff;
}
/* 左侧专家库树 */
.libraryList li span{
/* max-width:120px; */
/* white-space:normal; */
/* word-break:break-all; */
/* overflow:hidden; */
white-space: nowrap;
/* text-overflow: ellipsis; */
}
.libraryList li span:hover{
background:#ddd;
}
.libraryList li span.select{
background:#468847;
}
.tree{
padding-right:0;
}
.tree ul{
margin:0;
}
/* 按钮组样式 */
.btn-group button {
line-height: 20px;
border-radius: 2px;
background-color: #FFF; /* Green background */
border: 1px solid #d9d9d9; /* Green border */
box-sizing: border-box;
color: #000000d9; /* White text */
padding: 0 7px; /* Some padding */
cursor: pointer; /* Pointer/hand icon */
float: left; /* Float the buttons side by side */
}
/* Clear floats (clearfix hack) */
.btn-group:after {
content: "";
clear: both;
display: table;
}
.btn-group button:not(:last-child) {
border-right: none; /* Prevent double borders */
}
/* Add a background color on hover */
.btn-group button:hover {
background-color: #1890ff;
color: #fff;
}
.btn-group .active {
background-color: #1890ff;
color: #fff;
}
.channelNum{
display:inline-block;
width:100%;
}
.monitorType{
position: absolute;
right: 20px;
font-size: 20px!important;
color:#A1BEC6!important;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

@ -1,603 +0,0 @@
const createAxisInfo = (size, minSize = 0) => {
const textY = minSize ? (360 / (size + (-minSize))) * minSize - 30 : -30;
let data = {};
let prps = [
{
type: 'plan',
size: 50,
color: 0x1890ff,
},
{
type: 'curveLine',
line: [
[0, minSize ? 0 : size / 2, 0],
[0, minSize ? minSize : 0, 90],
[0, size, 270],
[0, minSize ? 0 : size / 2, 360],
],
color: 0x1890ff,
},
{
type: 'line',
line: [
0, minSize, 0,
0, size, 0,
0, size, 360,
0, minSize, 360,
0, minSize, 0,
0, 0, 0,
50, 0, 0,
50, 0, 360,
0, 0, 360,
0, 0, 0,
// 0, minSize, 0,
// 0, size, 0,
// 50, size, 0,
// 50, minSize, 0,
// 0, minSize, 0,
],
color: 0x1890ff,
},
{
type: 'line',
line: [
0, 0, 90,
50, 0, 90,
],
color: 0xcccccc,
position: 'Z',
num: 3,
margin: 90,
},
{
type: 'line',
line: [
10, 0, 0,
10, 0, 360,
],
color: 0xcccccc,
position: 'X',
num: 4,
margin: 10,
},
{
type: 'line',
line: [
0, (minSize ? minSize + (size / 2) : size / 4), 0,
0, (minSize ? minSize + (size / 2) : size / 4), 360,
],
color: 0xcccccc,
position: 'Y',
num: 3,
margin: minSize ? size / 2 : size / 4,
},
{
type: 'line',
line: [
0, minSize, 90,
0, size, 90,
],
color: 0xcccccc,
position: 'Z',
num: 3,
margin: 90,
},
// {
// type: 'line',
// line: [
// 10, minSize, 0,
// 10, size, 0,
// ],
// color: 0xcccccc,
// position: 'X',
// num: 4,
// margin: 10,
// },
// {
// type: 'line',
// line: [
// 0, (minSize ? minSize + (size / 4) : size / 4), 0,
// 50, (minSize ? minSize + (size / 4) : size / 4), 0,
// ],
// color: 0xcccccc,
// position: 'Y',
// num: 3 + (minSize ? -minSize / (size / 4) : 0),
// margin: size / 4,
// },
{
type: 'text',
content: ['0'],
w: 55,
h: 25,
color: '#FF0000',
font: 'normal 500px Arial,sans-serif',
xyz: [360, -40, 360],
},
{
type: 'text',
content: ['10'],
w: 55,
h: 25,
color: '#FF0000',
font: 'normal 500px Arial,sans-serif',
xyz: [288, -40, 360],
},
{
type: 'text',
content: ['20'],
w: 55,
h: 25,
color: '#FF0000',
font: 'normal 500px Arial,sans-serif',
xyz: [216, -40, 360],
},
{
type: 'text',
content: ['30'],
w: 55,
h: 25,
color: '#FF0000',
font: 'normal 500px Arial,sans-serif',
xyz: [144, -40, 360],
},
{
type: 'text',
content: ['40'],
w: 55,
h: 25,
color: '#FF0000',
font: 'normal 500px Arial,sans-serif',
xyz: [72, -40, 360],
},
{
type: 'text',
content: ['50'],
w: 55,
h: 25,
color: '#FF0000',
font: 'normal 500px Arial,sans-serif',
xyz: [0, -40, 360],
},
{
type: 'text',
content: ['0'],
w: 55,
h: 25,
color: '#0000cc',
font: 'normal 500px Arial,sans-serif',
xyz: [390, -40, 330],
textAlign: 'right',
},
{
type: 'text',
content: ['90'],
w: 55,
h: 25,
color: '#0000cc',
font: 'normal 500px Arial,sans-serif',
xyz: [380, -40, 250],
},
{
type: 'text',
content: ['180'],
w: 75,
h: 25,
ch: 9,
cw: 5.7,
color: '#0000cc',
size: 20.3,
font: 'normal 500px Arial,sans-serif',
xyz: [380, -40, 160],
},
{
type: 'text',
content: ['270'],
w: 75,
h: 25,
ch: 9,
cw: 5.7,
color: '#0000cc',
size: 20.3,
font: 'normal 500px Arial,sans-serif',
xyz: [380, -40, 70],
},
{
type: 'text',
content: ['360'],
w: 75,
h: 25,
ch: 9,
cw: 5.7,
color: '#0000cc',
size: 20.3,
font: 'normal 500px Arial,sans-serif',
xyz: [380, -40, -20],
},
]
let prpd = [
{
type: 'curveLine',
line: [
[0, minSize ? 0 : size / 2, 0],
[0, minSize ? minSize : 0, 90],
[0, size, 270],
[0, minSize ? 0 : size / 2, 360],
],
color: 0x1890ff,
},
{
type: 'line',
line: [
0, minSize, 0,
0, size, 0,
0, size, 360,
0, minSize, 360,
0, minSize, 0,
],
color: 0x1890ff,
},
{
type: 'line',
line: [
0, 0, 90,
50, 0, 90,
],
color: 0xcccccc,
position: 'Z',
num: 3,
margin: 90,
},
{
type: 'line',
line: [
0, (minSize ? minSize + (size / 2) : size / 4), 0,
0, (minSize ? minSize + (size / 2) : size / 4), 360,
],
color: 0xcccccc,
position: 'Y',
num: 3,
margin: minSize ? size / 2 : size / 4,
},
{
type: 'line',
line: [
0, minSize, 90,
0, size, 90,
],
color: 0xcccccc,
position: 'Z',
num: 3,
margin: 90,
},
{
type: 'text',
content: ['0'],
w: 40,
h: 25,
color: '#0000cc',
font: 'normal 500px Arial,sans-serif',
xyz: [360, textY, 340],
},
{
type: 'text',
content: ['90'],
w: 47,
h: 25,
color: '#0000cc',
font: 'normal 500px Arial,sans-serif',
xyz: [360, textY, 270],
},
{
type: 'text',
content: ['180'],
w: 75,
h: 25,
ch: 9,
cw: 5.7,
color: '#0000cc',
size: 22.3,
font: 'normal 500px Arial,sans-serif',
xyz: [360, textY - 2, 180],
},
{
type: 'text',
content: ['270'],
w: 75,
h: 25,
ch: 9,
cw: 5.7,
color: '#0000cc',
size: 22.3,
font: 'normal 500px Arial,sans-serif',
xyz: [360, textY - 2, 90],
},
{
type: 'text',
content: ['360'],
w: 75,
h: 25,
ch: 9,
cw: 5.7,
color: '#0000cc',
size: 22.3,
font: 'normal 500px Arial,sans-serif',
xyz: [360, textY - 2, 0],
},
];
let prpd3d = [
{
type: 'plan',
line: [minSize ? size * 2 : size, 360, minSize],
color: 0x32494B,
},
{
type: 'curveLine',
line: [
[minSize ? 0 : size / 2, 0, 0],
[size, 0, 90],
[minSize, 0, 270],
[minSize ? 0 : size / 2, 0, 360],
],
color: 0xcccccc,
},
{
type: 'line',
line: [
minSize, 0, 0,
size, 0, 0,
size, 0, 360,
minSize, 0, 360,
minSize, 0, 0,
0, 0, 0,
0, 50, 0,
0, 50, 360,
0, 0, 360,
0, 0, 0,
],
color: 0xcccccc,
},
{
type: 'line',
line: [
minSize, 0, 90,
size, 0, 90,
],
color: 0xcccccc,
position: 'Z',
num: 3,
margin: 90,
},
{
type: 'line',
line: [
(minSize ? minSize + (size / 2) : size / 4), 0, 0,
(minSize ? minSize + (size / 2) : size / 4), 0, 360,
],
color: 0xcccccc,
position: 'X',
num: 3,
margin: (minSize ? size / 2 : size / 4),
},
{
type: 'line',
line: [
0, 0, 90,
0, 50, 90,
],
color: 0xcccccc,
position: 'Z',
num: 3,
margin: 90,
},
{
type: 'line',
line: [
0, 10, 0,
0, 10, 360,
],
color: 0xcccccc,
position: 'Y',
num: 4,
margin: 10,
},
{
type: 'text',
content: ['0'],
w: 40,
h: 25,
color: 0xcccccc,
font: 'normal 500px Arial,sans-serif',
xyz: [0, 20, 380],
},
{
type: 'text',
content: ['10'],
w: 47,
h: 25,
color: 0xcccccc,
font: 'normal 500px Arial,sans-serif',
xyz: [0, 72, 380],
},
{
type: 'text',
content: ['20'],
w: 47,
h: 25,
color: 0xcccccc,
font: 'normal 500px Arial,sans-serif',
xyz: [0, 144, 380],
},
{
type: 'text',
content: ['30'],
w: 47,
h: 25,
color: 0xcccccc,
font: 'normal 500px Arial,sans-serif',
xyz: [0, 216, 380],
},
{
type: 'text',
content: ['40'],
w: 47,
h: 25,
color: 0xcccccc,
font: 'normal 500px Arial,sans-serif',
xyz: [0, 288, 380],
},
{
type: 'text',
content: ['50'],
w: 47,
h: 25,
color: 0xcccccc,
font: 'normal 500px Arial,sans-serif',
xyz: [0, 360, 380],
},
{
type: 'text',
content: ['0'],
w: 40,
h: 25,
color: 0xcccccc,
font: 'normal 500px Arial,sans-serif',
xyz: [minSize ? 200 : 400, -40, 330],
},
{
type: 'text',
content: ['90'],
w: 47,
h: 25,
color: 0xcccccc,
font: 'normal 500px Arial,sans-serif',
xyz: [minSize ? 200 : 400, -40, 230],
},
{
type: 'text',
content: ['180'],
w: 75,
h: 25,
ch: 9,
cw: 5.7,
color: 0xcccccc,
size: 22.3,
font: 'normal 500px Arial,sans-serif',
xyz: [minSize ? 200 : 400, -40, 140],
},
{
type: 'text',
content: ['270'],
w: 75,
h: 25,
ch: 9,
cw: 5.7,
color: 0xcccccc,
size: 22.3,
font: 'normal 500px Arial,sans-serif',
xyz: [minSize ? 200 : 400, -40, 50],
},
{
type: 'text',
content: ['360'],
w: 75,
h: 25,
ch: 9,
cw: 5.7,
color: 0xcccccc,
size: 22.3,
font: 'normal 500px Arial,sans-serif',
xyz: [minSize ? 200 : 400, -40, -40],
},
]
let set = [7.2, 360 / (size + (-minSize)), 1];
let isGIS = size <= 80;
let YAxisText = minSize ? [
[size, 180],
[size / 2, 90],
[0, 0],
[minSize / 2, -90],
[minSize, -180],
] : [
[isGIS ? size == 80 ? 0 : `-${80 - size}` : size],
[isGIS ? `-${80 - (size * 0.75)}` : size * 0.75,],
[isGIS ? `-${80 - (size * 0.5)}` : size * 0.5,],
[isGIS ? `-${80 - (0.25 * size)}` : size * 0.25,],
[isGIS ? `-80` : 0,],
];
let infoNum = [
{
w: 40,
h: 20,
size: 16,
}, {
w: 55,
h: 25,
size: 22.3,
}, {
w: 70,
h: 25,
size: 22.3,
}, {
w: 100,
h: 30,
size: 26.3,
}, {
w: 115,
h: 32,
size: 28.3,
}
]
YAxisText.forEach((item, index) => {
item[0] = item[0].toString();
let length = item[0].length;
let info = {
type: 'text',
content: item,
w: infoNum[length - 1].w,
h: infoNum[length - 1].h,
cw: length >= 3 ? 5.7 : '',
ch: length >= 3 ? 9 : '',
size: infoNum[length - 1].size,
color: '#00ff00',
font: 'normal 500px Arial,sans-serif',
xyz: [index, minSize ? item[1] : 360 - (index * 90), length === 1 ? 410 : 430],
textAlign: 'right',
};
let infoPrpd = {
type: 'text',
content: item,
w: infoNum[length - 1].w,
h: infoNum[length - 1].h,
cw: length >= 3 ? 5.7 : '',
ch: length >= 3 ? 9 : '',
size: infoNum[length - 1].size,
color: '#00ff00',
font: 'normal 500px Arial,sans-serif',
xyz: [0, minSize ? item[1] : 360 - (index * 90), length === 1 ? 385 : 395],
textAlign: 'right',
};
let info3d = {
type: 'text',
content: item,
w: infoNum[length - 1].w,
h: infoNum[length - 1].h,
cw: length >= 3 ? 5.7 : '',
ch: length >= 3 ? 9 : '',
size: infoNum[length - 1].size,
color: '#00ff00',
font: 'normal 500px Arial,sans-serif',
xyz: [minSize ? item[1] - 20 : 360 - (index * 90), -40, 380],
textAlign: 'right',
};
prps.push(info);
prpd.push(infoPrpd);
prpd3d.push(info3d);
})
data[size] = { set, prps, prpd, prpd3d }
return data;
}
export { createAxisInfo }

@ -1,27 +0,0 @@
//全屏
const fullScreen = () => {
var element = document.documentElement;
if (element.requestFullscreen) {
element.requestFullscreen();
} else if (element.msRequestFullscreen) {
element.msRequestFullscreen();
} else if (element.mozRequestFullScreen) {
element.mozRequestFullScreen();
} else if (element.webkitRequestFullscreen) {
element.webkitRequestFullscreen();
}
}
//退出全屏
const exitFullscreen = () => {
if (document.exitFullscreen) {
document.exitFullscreen();
} else if (document.msExitFullscreen) {
document.msExitFullscreen();
} else if (document.mozCancelFullScreen) {
document.mozCancelFullScreen();
} else if (document.webkitExitFullscreen) {
document.webkitExitFullscreen();
}
}
export { fullScreen, exitFullscreen }

@ -1,280 +0,0 @@
import { scene, axis, meshList, pointsList, axis2D, scene2D } from './index.js';
import { createAxisInfo } from './axisInfo/constant.js';
const lut = new THREE.Lut();
lut.addColorMap('axis', [[0.0, 0x00ee00], [0.25, 0xeeee00], [0.75, 0xee0000], [1.0, 0x4e0211]],);
lut.setColorMap('axis',1024)
let pointColors = [
{
material: new THREE.PointsMaterial({ color: 0xD94E5D, size: 2, sizeAttenuation: false }),
colors: 0xD94E5D,
num: 15,
},
{
material: new THREE.PointsMaterial({ color: 0xE28B4A, size: 2, sizeAttenuation: false }),
colors: 0xE28B4A,
num: 14,
},
{
material: new THREE.PointsMaterial({ color: 0xEAC736, size: 2, sizeAttenuation: false }),
colors: 0xEAC736,
num: 10,
},
{
material: new THREE.PointsMaterial({ color: 0x9DB578, size: 2, sizeAttenuation: false }),
colors: 0x9DB578,
num: 7,
},
{
material: new THREE.PointsMaterial({ color: 0x50A3BA, size: 2, sizeAttenuation: false }),
colors: 0x50A3BA,
num: 5,
},
];
const initPoints = new THREE.Points(
new THREE.BufferGeometry().setAttribute('position', new THREE.Float32BufferAttribute([0.5, 0, 0], 3)),
new THREE.PointsMaterial({ color: 0x0082df, size: 2, sizeAttenuation: false })
);
//柱子材质数据
let meterials = [
{
material: new THREE.MeshBasicMaterial({
color: '#4e0211',
}),
max: 0.75
},
{
material: new THREE.MeshBasicMaterial({
color: '#ee0000',
}),
max: 0.5
},
{
material: new THREE.MeshBasicMaterial({
color: '#eeee00',
}),
max: 0.25
},
{
material: new THREE.MeshBasicMaterial({
color: '#00ee00',
}),
max: 0,
},
];
const initGeometry = new THREE.BoxGeometry(0.6, 1, 2.5);
//绘制图表柱子
const drawChartsContent = (px, pz, py = 50, max, pxNum) => {
let y = py < 0 ? -py : py;
const material = new THREE.MeshBasicMaterial({color:lut.getColor(Number(y)/max)});//
//const material = meterials.find(item => (y / max) >= item.max).material;
//柱子宽高长
const geometry = initGeometry.clone();
geometry.scale(1, y, 1);
geometry.translate(49.4 - pxNum, Math.fround(py / 2), 360 - pz);
return { geometry, material }
}
//正弦曲线绘制
const drawSinLine = (obj) => {
let { line, color } = obj, list = [];
line.forEach(item => {
list.push(new THREE.Vector3(...item));
})
let geometry = new THREE.BufferGeometry(); //声明一个几何体对象Geometry
// 三维样条曲线 Catmull-Rom算法
let curve = new THREE.CatmullRomCurve3(list);
//getPoints是基类Curve的方法返回一个vector3对象作为元素组成的数组
let points = curve.getPoints(200); //分段数100返回101个顶点
// setFromPoints方法从points中提取数据改变几何体的顶点属性vertices
geometry.setFromPoints(points);
//材质对象
let material = new THREE.LineBasicMaterial({
color,
linewidth: 1,
});
//线条模型对象
let modelLine = new THREE.Line(geometry, material);
return modelLine
//scene.add(line); //线条对象添加到场景中
}
//绘制网格线条
const drawLine = (obj) => {
let { line, color, position, margin, num } = obj
let geometry = new THREE.BufferGeometry(); //创建一个Buffer类型几何体对象
//3个为一组表示一个顶点的xyz坐标
geometry.setAttribute('position', new THREE.Float32BufferAttribute(line, 3))
// 线条渲染模式
let material = new THREE.LineBasicMaterial({
color, //线条颜色
});//材质对象
let LineList = [];
let modelLine = new THREE.Line(geometry, material);//线条模型对象
LineList.push(modelLine)
for (let i = 1; i < num; i++) {
let lineChildren = modelLine.clone()['translate' + position](i * margin)
LineList.push(lineChildren);
}
return LineList
}
// 添加文字geometry
const add3DText = (text, callback) => {
let { content, url, size, set, rotation, xyz } = text;
let loader = new THREE.FontLoader();
//加载相应的字体下面字体名和样式组成gentilis_bold.typeface.json 完整文件名
let fontJsonUrl = url ? url : 'common/fonts/Century Gothic_Regular.json'; //你的字体json路径文件名规格随意
loader.load(fontJsonUrl, function (font) {
const color = 0xffffff;
const matLite = new THREE.MeshBasicMaterial({
color: color, // 字体大小
});
const geometry = new THREE.TextGeometry(content, {
font: font,
size: size ? size : 5,
height: 1,
});
geometry.translate(...xyz);
if (rotation) {
for (let i of rotation) {
geometry['rotate' + i[0]](Math.PI / i[1])
}
}
let mesh = new THREE.Mesh(geometry, matLite);
// mesh.scale.set(2, 2, 2)
if (set) {
mesh.scale.set(...set);
}
mesh.castShadow = true;
mesh.receiveShadow = true;
mesh.name = 'text';
callback(mesh)
});
}
// 添加精灵图文字
const draw2DText = (obj) => {
let scale = 1;//window.devicePixelRatio;
let { content, w, h, color, font, xyz, size, cw, ch, rotate } = obj;
cw = cw ? cw : 6;
ch = ch ? ch : 8;
let canvas = document.createElement('canvas')
canvas.style.width = w * scale;
canvas.style.height = h * scale;
if (rotate) {
canvas.width = w * cw * scale * 3;
canvas.height = h * ch * scale * 2;
} else {
canvas.width = w * cw * scale * 2;
canvas.height = h * ch * scale * 3;
}
let ctx = canvas.getContext('2d');
ctx.fillStyle = color;
ctx.strokeStyle = color;
ctx.font = font;
ctx.direction = "ltr"; // 文本方向从左向右
ctx.textAlign = "left"; // 左对齐
ctx.textBaseline = 'middle'//基线对齐选项,决定文字垂直方向的对齐方式
if (rotate) {
ctx.translate(canvas.width / 2, canvas.height);
ctx.rotate(-Math.PI / 2);
ctx.fillText(content, h, 0);
//ctx.strokeText(content, h, 0);
} else {
for (let i = 0; i < 1; i++) {
ctx.fillText(content[i], 0, canvas.height / 2);
ctx.strokeText(content[i], 0, canvas.height / 2);
}
}
let texture = new THREE.CanvasTexture(canvas)
// texture.needsUpdate = true//如果编码类型在纹理已被一个材质使用之后发生了改变, 你需要来设置Material.needsUpdate为true来使得材质重新编译
let geometry = new THREE.BufferGeometry(); //创建一个Buffer类型几何体对象
//3个为一组表示一个顶点的xyz坐标
geometry.setAttribute('position', new THREE.Float32BufferAttribute(xyz, 3));
const material = new THREE.PointsMaterial({
map: texture,
transparent: true,//材质透明
size: size ? size : 16.0, //点对象像素尺寸
});
const pointsText = new THREE.Points(geometry, material);
pointsText.name = 'pointsText';
return pointsText;
}
const drawAxis = (size, minNum, is2DInit) => {
scene.remove(...scene.children.filter(item => item.name === 'axisNumberText'))
if (axis.children.length) {
axis.remove(...axis.children)
}
let axisText = new THREE.Group();
axisText.name = 'axisNumberText';
scene.add(axisText)
const data = createAxisInfo(size, minNum);
axis.scale.set(...data[size]['set'])
meshList.scale.set(...data[size]['set'])
pointsList.scale.set(...data[size]['set'])
data[size]['prps'].forEach(async item => {
switch (item.type) {
case 'plan':
axis.add(drawPlan(item));
break;
case 'line':
axis.add(...drawLine(item));
break;
case 'curveLine':
axis.add(drawSinLine(item));
break;
case 'text':
axisText.add(draw2DText(item));
}
});
if (is2DInit) {
return;
}
drawAxis2D(size, minNum);
}
const drawAxis2D = (size, minNum) => {
if (axis2D.children.length) {
axis2D.remove(...axis2D.children)
}
let axisList = scene2D?.children.filter(item => item.name === 'axisNumberText');
axisList && scene2D.remove(...axisList)
let axisText = new THREE.Group();
const data = createAxisInfo(size, minNum);
axisText.name = 'axisNumberText';
scene2D.add(axisText)
axis2D.scale.set(...data[size]['set'])
let list = scene2D.getObjectByName('chartsPoint')
if (list) {
list.scale.set(...data[size]['set'])
}
data[size]['prpd'].forEach(async item => {
switch (item.type) {
case 'line':
axis2D.add(...drawLine(item));
break;
case 'curveLine':
axis2D.add(drawSinLine(item));
break;
case 'text':
axisText.add(draw2DText(item));
}
});
}
//绘制平面
const drawPlan = (obj) => {
const { size, color } = obj;
let geometry = new THREE.PlaneGeometry(size, 360); //创建一个Buffer类型几何体对象
geometry.rotateX(Math.PI / 2).translate(size/2, 0, 180);
// 三角面(网格)渲染模式
let material = new THREE.MeshBasicMaterial({
color, //三角面颜色
transparent: true,//透明
opacity: 0.2,
side: THREE.DoubleSide, //两面可见
}); //材质对象
let mesh = new THREE.Mesh(geometry, material); //网格模型对象Mesh
mesh.name = 'plan';
//scene.add(mesh);
return mesh
}
export { drawChartsContent, drawSinLine, drawLine, add3DText, draw2DText, drawAxis, drawAxis2D, initPoints, pointColors, drawPlan }

@ -1,280 +0,0 @@
import { scene, axis, meshList, pointsList, axis2D, scene2D } from './history.js';
import { createAxisInfo } from './axisInfo/constant.js';
const lut = new THREE.Lut();
lut.addColorMap('axis', [[0.0, 0x00ee00], [0.25, 0xeeee00], [0.75, 0xee0000], [1.0, 0x4e0211]],);
lut.setColorMap('axis',1024)
let pointColors = [
{
material: new THREE.PointsMaterial({ color: 0xD94E5D, size: 2, sizeAttenuation: false }),
colors: 0xD94E5D,
num: 15,
},
{
material: new THREE.PointsMaterial({ color: 0xE28B4A, size: 2, sizeAttenuation: false }),
colors: 0xE28B4A,
num: 14,
},
{
material: new THREE.PointsMaterial({ color: 0xEAC736, size: 2, sizeAttenuation: false }),
colors: 0xEAC736,
num: 10,
},
{
material: new THREE.PointsMaterial({ color: 0x9DB578, size: 2, sizeAttenuation: false }),
colors: 0x9DB578,
num: 7,
},
{
material: new THREE.PointsMaterial({ color: 0x50A3BA, size: 2, sizeAttenuation: false }),
colors: 0x50A3BA,
num: 5,
},
];
const initPoints = new THREE.Points(
new THREE.BufferGeometry().setAttribute('position', new THREE.Float32BufferAttribute([0.5, 0, 0], 3)),
new THREE.PointsMaterial({ color: 0x0082df, size: 2, sizeAttenuation: false })
);
//柱子材质数据
let meterials = [
{
material: new THREE.MeshBasicMaterial({
color: '#4e0211',
}),
max: 0.75
},
{
material: new THREE.MeshBasicMaterial({
color: '#ee0000',
}),
max: 0.5
},
{
material: new THREE.MeshBasicMaterial({
color: '#eeee00',
}),
max: 0.25
},
{
material: new THREE.MeshBasicMaterial({
color: '#00ee00',
}),
max: 0,
},
];
const initGeometry = new THREE.BoxGeometry(0.6, 1, 2.5);
//绘制图表柱子
const drawChartsContent = (px, pz, py = 50, max, pxNum) => {
let y = py < 0 ? -py : py;
const material = new THREE.MeshBasicMaterial({color:lut.getColor(Number(y)/max)});//
//const material = meterials.find(item => (y / max) >= item.max).material;
//柱子宽高长
const geometry = initGeometry.clone();
geometry.scale(1, y, 1);
geometry.translate(49.4 - pxNum, Math.fround(py / 2), 360 - pz);
return { geometry, material }
}
//正弦曲线绘制
const drawSinLine = (obj) => {
let { line, color } = obj, list = [];
line.forEach(item => {
list.push(new THREE.Vector3(...item));
})
let geometry = new THREE.BufferGeometry(); //声明一个几何体对象Geometry
// 三维样条曲线 Catmull-Rom算法
let curve = new THREE.CatmullRomCurve3(list);
//getPoints是基类Curve的方法返回一个vector3对象作为元素组成的数组
let points = curve.getPoints(200); //分段数100返回101个顶点
// setFromPoints方法从points中提取数据改变几何体的顶点属性vertices
geometry.setFromPoints(points);
//材质对象
let material = new THREE.LineBasicMaterial({
color,
linewidth: 1,
});
//线条模型对象
let modelLine = new THREE.Line(geometry, material);
return modelLine
//scene.add(line); //线条对象添加到场景中
}
//绘制网格线条
const drawLine = (obj) => {
let { line, color, position, margin, num } = obj
let geometry = new THREE.BufferGeometry(); //创建一个Buffer类型几何体对象
//3个为一组表示一个顶点的xyz坐标
geometry.setAttribute('position', new THREE.Float32BufferAttribute(line, 3))
// 线条渲染模式
let material = new THREE.LineBasicMaterial({
color, //线条颜色
});//材质对象
let LineList = [];
let modelLine = new THREE.Line(geometry, material);//线条模型对象
LineList.push(modelLine)
for (let i = 1; i < num; i++) {
let lineChildren = modelLine.clone()['translate' + position](i * margin)
LineList.push(lineChildren);
}
return LineList
}
// 添加文字geometry
const add3DText = (text, callback) => {
let { content, url, size, set, rotation, xyz } = text;
let loader = new THREE.FontLoader();
//加载相应的字体下面字体名和样式组成gentilis_bold.typeface.json 完整文件名
let fontJsonUrl = url ? url : 'common/fonts/Century Gothic_Regular.json'; //你的字体json路径文件名规格随意
loader.load(fontJsonUrl, function (font) {
const color = 0xffffff;
const matLite = new THREE.MeshBasicMaterial({
color: color, // 字体大小
});
const geometry = new THREE.TextGeometry(content, {
font: font,
size: size ? size : 5,
height: 1,
});
geometry.translate(...xyz);
if (rotation) {
for (let i of rotation) {
geometry['rotate' + i[0]](Math.PI / i[1])
}
}
let mesh = new THREE.Mesh(geometry, matLite);
// mesh.scale.set(2, 2, 2)
if (set) {
mesh.scale.set(...set);
}
mesh.castShadow = true;
mesh.receiveShadow = true;
mesh.name = 'text';
callback(mesh)
});
}
// 添加精灵图文字
const draw2DText = (obj) => {
let scale = 1;//window.devicePixelRatio;
let { content, w, h, color, font, xyz, size, cw, ch, rotate } = obj;
cw = cw ? cw : 6;
ch = ch ? ch : 8;
let canvas = document.createElement('canvas')
canvas.style.width = w * scale;
canvas.style.height = h * scale;
if (rotate) {
canvas.width = w * cw * scale * 3;
canvas.height = h * ch * scale * 2;
} else {
canvas.width = w * cw * scale * 2;
canvas.height = h * ch * scale * 3;
}
let ctx = canvas.getContext('2d');
ctx.fillStyle = color;
ctx.strokeStyle = color;
ctx.font = font;
ctx.direction = "ltr"; // 文本方向从左向右
ctx.textAlign = "left"; // 左对齐
ctx.textBaseline = 'middle'//基线对齐选项,决定文字垂直方向的对齐方式
if (rotate) {
ctx.translate(canvas.width / 2, canvas.height);
ctx.rotate(-Math.PI / 2);
ctx.fillText(content, h, 0);
//ctx.strokeText(content, h, 0);
} else {
for (let i = 0; i < 1; i++) {
ctx.fillText(content[i], 0, canvas.height / 2);
ctx.strokeText(content[i], 0, canvas.height / 2);
}
}
let texture = new THREE.CanvasTexture(canvas)
// texture.needsUpdate = true//如果编码类型在纹理已被一个材质使用之后发生了改变, 你需要来设置Material.needsUpdate为true来使得材质重新编译
let geometry = new THREE.BufferGeometry(); //创建一个Buffer类型几何体对象
//3个为一组表示一个顶点的xyz坐标
geometry.setAttribute('position', new THREE.Float32BufferAttribute(xyz, 3));
const material = new THREE.PointsMaterial({
map: texture,
transparent: true,//材质透明
size: size ? size : 16.0, //点对象像素尺寸
});
const pointsText = new THREE.Points(geometry, material);
pointsText.name = 'pointsText';
return pointsText;
}
const drawAxis = (size, minNum, is2DInit) => {
scene.remove(...scene.children.filter(item => item.name === 'axisNumberText'))
if (axis.children.length) {
axis.remove(...axis.children)
}
let axisText = new THREE.Group();
axisText.name = 'axisNumberText';
scene.add(axisText)
const data = createAxisInfo(size, minNum);
axis.scale.set(...data[size]['set'])
meshList.scale.set(...data[size]['set'])
pointsList.scale.set(...data[size]['set'])
data[size]['prps'].forEach(async item => {
switch (item.type) {
case 'plan':
axis.add(drawPlan(item));
break;
case 'line':
axis.add(...drawLine(item));
break;
case 'curveLine':
axis.add(drawSinLine(item));
break;
case 'text':
axisText.add(draw2DText(item));
}
});
if (is2DInit) {
return;
}
drawAxis2D(size, minNum);
}
const drawAxis2D = (size, minNum) => {
if (axis2D.children.length) {
axis2D.remove(...axis2D.children)
}
let axisList = scene2D?.children.filter(item => item.name === 'axisNumberText');
axisList && scene2D.remove(...axisList)
let axisText = new THREE.Group();
const data = createAxisInfo(size, minNum);
axisText.name = 'axisNumberText';
scene2D.add(axisText)
axis2D.scale.set(...data[size]['set'])
let list = scene2D.getObjectByName('chartsPoint')
if (list) {
list.scale.set(...data[size]['set'])
}
data[size]['prpd'].forEach(async item => {
switch (item.type) {
case 'line':
axis2D.add(...drawLine(item));
break;
case 'curveLine':
axis2D.add(drawSinLine(item));
break;
case 'text':
axisText.add(draw2DText(item));
}
});
}
//绘制平面
const drawPlan = (obj) => {
const { size, color } = obj;
let geometry = new THREE.PlaneGeometry(size, 360); //创建一个Buffer类型几何体对象
geometry.rotateX(Math.PI / 2).translate(size/2, 0, 180);
// 三角面(网格)渲染模式
let material = new THREE.MeshBasicMaterial({
color, //三角面颜色
transparent: true,//透明
opacity: 0.2,
side: THREE.DoubleSide, //两面可见
}); //材质对象
let mesh = new THREE.Mesh(geometry, material); //网格模型对象Mesh
mesh.name = 'plan';
//scene.add(mesh);
return mesh
}
export { drawChartsContent, drawSinLine, drawLine, add3DText, draw2DText, drawAxis, drawAxis2D, initPoints, pointColors, drawPlan }

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -1,211 +0,0 @@
import { drawAxis, drawAxis2D } from './drawHistory.js';
let renderer, scene, camera, controls, renderer2D, scene2D, camera2D, controls2D;
let axis = new THREE.Group();
let axis2D = new THREE.Group();
let initAxis = 80;//正值最大值
let minNum = 0;//负值最大值
let planes = [];//截断面
let maxRange = 100;
const lut = new THREE.Lut();
lut.addColorMap('axis', [[0.0, 0x00ee00], [0.25, 0xeeee00], [0.75, 0xee0000], [1.0, 0x4e0211]],);
lut.setColorMap('axis', 500)
let meshList = new THREE.Group();//图例柱子
meshList.name = 'chartsMesh';
const dummy = new THREE.Object3D();
let pointsList = new THREE.Group();//图例散点
pointsList.name = 'chartsPoint';
// 周期,相位 柱子数
let period = 50, phase = 128, count = period * phase;
const geometry = new THREE.BoxGeometry(0.6, 1, 2.5);
geometry.computeVertexNormals();
//非光泽表面的材质,没有镜面高光
//const initInstancedMesh = new THREE.InstancedMesh(geometry, new THREE.MeshLambertMaterial(), count);
//最佳性能材质
const initInstancedMesh = new THREE.InstancedMesh(geometry, new THREE.MeshBasicMaterial(), count);
initInstancedMesh.name = 'initInstancedMesh';
/* prpd初始Instanced点 */
let initInstancedPoints,//prpd实例
pointPositions, pointColors,//PRPS位置及颜色的集合
pointsGeometry = new THREE.BufferGeometry(),
pointCount;
init();
init2D();
render();
render2D();
onWindowResize()
//prps or prpd 切换
$('#prps').click(function () {
$('#box3D1').toggle();
$('#box2D1').toggle();
$(this).toggleClass('ready')
$('#prpd').toggleClass('ready')
})
$('#prpd').click(function () {
$('#box2D1').toggle();
$('#box3D1').toggle();
$(this).toggleClass('ready')
$('#prps').toggleClass('ready')
})
$(window).resize(function () {
window.requestAnimationFrame(function () {
onWindowResize()
})
})
//prps初始化
function init() {
let box = $('#box3D1');
let width = box.width();
let height = box.height();
renderer = new THREE.WebGLRenderer({ logarithmicDepthBuffer: true, antialias: true, preserveDrawingBuffer: true, });//preserveDrawingBuffer保存three.js canvas画布上的信息
renderer.localClippingEnabled = true
let constant = (360 / (initAxis)) * initAxis + 1
planes = [
new THREE.Plane(new THREE.Vector3(0, -1, 0), constant), //y轴正值截取
]
renderer.clippingPlanes = planes
renderer.setSize(width, height);//设置渲染区域尺寸
renderer.setClearColor(0xffffff, 1); //设置背景颜色
//renderer.setClearColor(0xb9d3ff, 1); //设置背景颜色
renderer.setPixelRatio(window.devicePixelRatio)//设备像素比,优化渲染效果
box?.append(renderer.domElement); //body元素中插入canvas对象
scene = new THREE.Scene();
scene.add(meshList, axis, pointsList);
/* var point = new THREE.PointLight(0xffffff);
point.position.set(600, 600, 600); //点光源位置
scene.add(point); //点光源添加到场景中
var ambient = new THREE.AmbientLight(0x444444);
scene.add(ambient); */
drawAxis(initAxis, minNum, true)
var k = width / height; //窗口宽高比
var s = 420; //三维场景显示范围控制系数,系数越大,显示的范围越大
//创建相机对象
camera = new THREE.OrthographicCamera(-s * k, s * k, s, -s, 1, 1600);
camera.position.set(500, 200, 500); //设置相机位置
camera.lookAt(scene.position); //设置相机方向(指向的场景对象)
controls = new THREE.OrbitControls(camera, renderer.domElement);
// 设置左右方向的最大、最小角度限制为 90 度和 0 度
controls.minAzimuthAngle = 0;
controls.maxAzimuthAngle = Math.PI / 2;
// 设置上下方向的最大、最小角度限制为 90 度和 0 度
controls.minPolarAngle = 0;
controls.maxPolarAngle = Math.PI / 2;
//设置放大缩小上下限
controls.minZoom = 0.5;
controls.maxZoom = 2;
//controls.enablePan = false;
//设置控制器中心点
controls.target.set(25, 0, 180);
renderer.render(scene, camera);
//controls.addEventListener('change', render);
}
//prpd初始化
function init2D() {
let box = $('#box2D1');
let width = box.width();
let height = box.height();
renderer2D = new THREE.WebGLRenderer({ logarithmicDepthBuffer: true, antialias: true, preserveDrawingBuffer: true, });//preserveDrawingBuffer保存three.js canvas画布上的信息\
renderer2D.localClippingEnabled = true
let constant = (360 / (initAxis)) * initAxis + 1
planes = [
new THREE.Plane(new THREE.Vector3(0, -1, 0), constant), //y轴正值截取
]
renderer2D.clippingPlanes = planes
renderer2D.setSize(width, height);//设置渲染区域尺寸
renderer2D.setClearColor(0xffffff, 1); //设置背景颜色
renderer2D.setPixelRatio(window.devicePixelRatio)//设备像素比,优化渲染效果
box?.append(renderer2D.domElement); //body元素中插入canvas对象
scene2D = new THREE.Scene();
const List = pointsList.clone()
scene2D.add(axis2D, List, pointsList)
drawAxis2D(initAxis, minNum)
// 辅助坐标系 参数250表示坐标系大小可以根据场景大小去设置
// let axisHelper = new THREE.AxesHelper(250);
// scene2D.add(axisHelper);
var k = width / height; //窗口宽高比
var s = 380; //三维场景显示范围控制系数,系数越大,显示的范围越大
//创建相机对象
camera2D = new THREE.OrthographicCamera(-s * k - 200, s * k - 200, s + 160, -s + 160, 1, 1200);
camera2D.position.set(600, 0, 0); //设置相机位置
camera2D.lookAt(scene2D.position); //设置相机方向(指向的场景对象)
controls2D = new THREE.OrbitControls(camera2D, renderer2D.domElement);
controls2D.enablePan = false//右键位移禁用
controls2D.enableZoom = false//放大缩小禁用
//设置放大缩小上下限
controls2D.minZoom = 0.5;
controls2D.maxZoom = 2;
controls2D.enableRotate = false
renderer2D.render(scene2D, camera2D);
controls2D.addEventListener('change', render2D);
}
function onWindowResize() {
let h = $(window).height();
let w = $(window).width();
$(".loading-box").css('height', h * 0.95)
let box = $('#box3D1');
let width = box.width();
let height = box.height();
let k = width / height; //窗口宽高比
let s = 350; //三维场景显示范围控制系数,系数越大,显示的范围越大
camera.left = -s * k - 20;
camera.right = s * k - 20;
camera.top = s + (minNum ? -80 : 60);
camera.bottom = -s + (minNum ? -80 : 60);
camera.aspect = k;
camera.updateProjectionMatrix();
renderer.setSize(width, height);
renderer.setPixelRatio(window.devicePixelRatio)//设备像素比,优化渲染效果
let s2D = 270;
camera2D.left = -s2D * k - 200;
camera2D.right = s2D * k - 200;
camera2D.top = s2D + (minNum ? -30 : 155);
camera2D.bottom = -s2D + (minNum ? -30 : 155);
camera2D.aspect = k;
camera2D.updateProjectionMatrix();
renderer2D.setSize(width, height);
renderer2D.setPixelRatio(window.devicePixelRatio)//设备像素比,优化渲染效果
}
function render() {
// 获取摄像机的视锥体
const frustum = new THREE.Frustum();
const cameraViewProjectionMatrix = new THREE.Matrix4();
camera.updateMatrixWorld(); // 确保摄像机的世界矩阵已更新
cameraViewProjectionMatrix.multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse);
frustum.setFromProjectionMatrix(cameraViewProjectionMatrix);
// 遍历场景中的每个对象,并根据视锥体进行剔除
scene.traverse((object) => {
if (object.isMesh) {
object.visible = frustum.intersectsObject(object);
}
});
// 更新帧率显示器
//stats.update();
renderer.render(scene, camera);
requestAnimationFrame(render)
}
function render2D() {
//scene.rotateY(0.001);//每次绕y轴旋转0.01弧度
requestAnimationFrame(render2D)
renderer2D.render(scene2D, camera2D);
}
export { scene, axis, meshList, pointsList, axis2D, scene2D }

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -1,72 +0,0 @@
/**
* Created by Dasate on 2017/9/14.
* QQ361899429
*/
var simpleAlert = function (opts) {
//设置默认参数
var opt = {
"closeAll": false,
"content": "",
"buttons": {}
}
//合并参数
var option = $.extend(opt, opts);
//事件
var dialog = {}
var $simpleAlert = $('<div class="simpleAlert">');
var $shelter = $('<div class="simpleAlertShelter">');
var $simpleAlertBody = $('<div class="simpleAlertBody">');
var $simpleAlertBodyClose = $('<img class="simpleAlertBodyClose" src="img/close.png" height="14" width="14"/>');
var $simpleAlertBodyContent = $('<p class="simpleAlertBodyContent">' + option.content + '</p>');
dialog.init = function () {
$simpleAlertBody.append($simpleAlertBodyClose).append($simpleAlertBodyContent);
var num = 0;
var only = false;
var onlyArr = [];
for (var i = 0; i < 2; i++) {
for (var key in option.buttons) {
switch (i) {
case 0:
onlyArr.push(key);
break;
case 1:
if (onlyArr.length <= 1) {
only = true;
} else {
only = false;
}
num++;
var $btn = $('<button class="simpleAlertBtn simpleAlertBtn' + num + '">' + key + '</button>')
// console.log(key)
$btn.bind("click", option.buttons[key=='OK'?'确定':key=='Yes'?'是':key=='No'?'否':key=='Cancel'?'取消':key]);
if (only) {
$btn.addClass("onlyOne")
}
$simpleAlertBody.append($btn);
break;
}
}
}
$simpleAlert.append($shelter).append($simpleAlertBody);
$("body").append($simpleAlert);
$simpleAlertBody.show().animate({"marginTop":"-128px","opacity":"1"},300);
}
//右上角关闭按键事件
$simpleAlertBodyClose.bind("click", function () {
option.closeAll=false;
dialog.close();
})
dialog.close = function () {
if(option.closeAll){
$(".simpleAlert").remove()
}else {
$simpleAlertBody.animate({"marginTop": "-188px", "opacity": "0"}, 200, function () {
$(".simpleAlert").last().remove()
});
}
}
dialog.init();
return dialog;
}

@ -1,200 +0,0 @@
(function(){
class Lut {
constructor( colormap, count = 32 ) {
this.isLut = true;
this.lut = [];
this.map = [];
this.n = 0;
this.minV = 0;
this.maxV = 1;
this.setColorMap( colormap, count );
}
set( value ) {
if ( value.isLut === true ) {
this.copy( value );
}
return this;
}
setMin( min ) {
this.minV = min;
return this;
}
setMax( max ) {
this.maxV = max;
return this;
}
setColorMap( colormap, count = 32 ) {
this.map = ColorMapKeywords[ colormap ] || ColorMapKeywords.rainbow;
this.n = count;
const step = 1.0 / this.n;
const minColor = new THREE.Color();
const maxColor = new THREE.Color();
this.lut.length = 0;
// sample at 0
this.lut.push( new THREE.Color( this.map[ 0 ][ 1 ] ) );
// sample at 1/n, ..., (n-1)/n
for ( let i = 1; i < count; i ++ ) {
const alpha = i * step;
for ( let j = 0; j < this.map.length - 1; j ++ ) {
if ( alpha > this.map[ j ][ 0 ] && alpha <= this.map[ j + 1 ][ 0 ] ) {
const min = this.map[ j ][ 0 ];
const max = this.map[ j + 1 ][ 0 ];
minColor.setHex( this.map[ j ][ 1 ], THREE.LinearSRGBColorSpace );
maxColor.setHex( this.map[ j + 1 ][ 1 ], THREE.LinearSRGBColorSpace );
const color = new THREE.Color().lerpColors( minColor, maxColor, ( alpha - min ) / ( max - min ) );
this.lut.push( color );
}
}
}
// sample at 1
this.lut.push( new THREE.Color( this.map[ this.map.length - 1 ][ 1 ] ) );
return this;
}
copy( lut ) {
this.lut = lut.lut;
this.map = lut.map;
this.n = lut.n;
this.minV = lut.minV;
this.maxV = lut.maxV;
return this;
}
getColor( alpha ) {
alpha = THREE.MathUtils.clamp( alpha, this.minV, this.maxV );
alpha = ( alpha - this.minV ) / ( this.maxV - this.minV );
const colorPosition = Math.round( alpha * this.n );
return this.lut[ colorPosition ];
}
addColorMap( name, arrayOfColors ) {
ColorMapKeywords[ name ] = arrayOfColors;
return this;
}
createCanvas() {
const canvas = document.createElement( 'canvas' );
canvas.width = 1;
canvas.height = this.n;
this.updateCanvas( canvas );
return canvas;
}
updateCanvas( canvas ) {
const ctx = canvas.getContext( '2d', { alpha: false } );
const imageData = ctx.getImageData( 0, 0, 1, this.n );
const data = imageData.data;
let k = 0;
const step = 1.0 / this.n;
const minColor = new THREE.Color();
const maxColor = new THREE.Color();
const finalColor = new THREE.Color();
for ( let i = 1; i >= 0; i -= step ) {
for ( let j = this.map.length - 1; j >= 0; j -- ) {
if ( i < this.map[ j ][ 0 ] && i >= this.map[ j - 1 ][ 0 ] ) {
const min = this.map[ j - 1 ][ 0 ];
const max = this.map[ j ][ 0 ];
minColor.setHex( this.map[ j - 1 ][ 1 ], THREE.LinearSRGBColorSpace );
maxColor.setHex( this.map[ j ][ 1 ], THREE.LinearSRGBColorSpace );
finalColor.lerpColors( minColor, maxColor, ( i - min ) / ( max - min ) );
data[ k * 4 ] = Math.round( finalColor.r * 255 );
data[ k * 4 + 1 ] = Math.round( finalColor.g * 255 );
data[ k * 4 + 2 ] = Math.round( finalColor.b * 255 );
data[ k * 4 + 3 ] = 255;
k += 1;
}
}
}
ctx.putImageData( imageData, 0, 0 );
return canvas;
}
}
const ColorMapKeywords = {
'rainbow': [[ 0.0, 0x0000FF ], [ 0.2, 0x00FFFF ], [ 0.5, 0x00FF00 ], [ 0.8, 0xFFFF00 ], [ 1.0, 0xFF0000 ]],
'cooltowarm': [[ 0.0, 0x3C4EC2 ], [ 0.2, 0x9BBCFF ], [ 0.5, 0xDCDCDC ], [ 0.8, 0xF6A385 ], [ 1.0, 0xB40426 ]],
'blackbody': [[ 0.0, 0x000000 ], [ 0.2, 0x780000 ], [ 0.5, 0xE63200 ], [ 0.8, 0xFFFF00 ], [ 1.0, 0xFFFFFF ]],
'grayscale': [[ 0.0, 0x000000 ], [ 0.2, 0x404040 ], [ 0.5, 0x7F7F80 ], [ 0.8, 0xBFBFBF ], [ 1.0, 0xFFFFFF ]]
};
THREE.Lut = Lut;
})()

File diff suppressed because it is too large Load Diff

@ -1,167 +0,0 @@
var Stats = function () {
var mode = 0;
var container = document.createElement( 'div' );
container.style.cssText = 'position:fixed;top:0;left:0;cursor:pointer;opacity:0.9;z-index:10000';
container.addEventListener( 'click', function ( event ) {
event.preventDefault();
showPanel( ++ mode % container.children.length );
}, false );
//
function addPanel( panel ) {
container.appendChild( panel.dom );
return panel;
}
function showPanel( id ) {
for ( var i = 0; i < container.children.length; i ++ ) {
container.children[ i ].style.display = i === id ? 'block' : 'none';
}
mode = id;
}
//
var beginTime = ( performance || Date ).now(), prevTime = beginTime, frames = 0;
var fpsPanel = addPanel( new Stats.Panel( 'FPS', '#0ff', '#002' ) );
var msPanel = addPanel( new Stats.Panel( 'MS', '#0f0', '#020' ) );
if ( self.performance && self.performance.memory ) {
var memPanel = addPanel( new Stats.Panel( 'MB', '#f08', '#201' ) );
}
showPanel( 0 );
return {
REVISION: 16,
dom: container,
addPanel: addPanel,
showPanel: showPanel,
begin: function () {
beginTime = ( performance || Date ).now();
},
end: function () {
frames ++;
var time = ( performance || Date ).now();
msPanel.update( time - beginTime, 200 );
if ( time >= prevTime + 1000 ) {
fpsPanel.update( ( frames * 1000 ) / ( time - prevTime ), 100 );
prevTime = time;
frames = 0;
if ( memPanel ) {
var memory = performance.memory;
memPanel.update( memory.usedJSHeapSize / 1048576, memory.jsHeapSizeLimit / 1048576 );
}
}
return time;
},
update: function () {
beginTime = this.end();
},
// Backwards Compatibility
domElement: container,
setMode: showPanel
};
};
Stats.Panel = function ( name, fg, bg ) {
var min = Infinity, max = 0, round = Math.round;
var PR = round( window.devicePixelRatio || 1 );
var WIDTH = 80 * PR, HEIGHT = 48 * PR,
TEXT_X = 3 * PR, TEXT_Y = 2 * PR,
GRAPH_X = 3 * PR, GRAPH_Y = 15 * PR,
GRAPH_WIDTH = 74 * PR, GRAPH_HEIGHT = 30 * PR;
var canvas = document.createElement( 'canvas' );
canvas.width = WIDTH;
canvas.height = HEIGHT;
canvas.style.cssText = 'width:80px;height:48px';
var context = canvas.getContext( '2d' );
context.font = 'bold ' + ( 9 * PR ) + 'px Helvetica,Arial,sans-serif';
context.textBaseline = 'top';
context.fillStyle = bg;
context.fillRect( 0, 0, WIDTH, HEIGHT );
context.fillStyle = fg;
context.fillText( name, TEXT_X, TEXT_Y );
context.fillRect( GRAPH_X, GRAPH_Y, GRAPH_WIDTH, GRAPH_HEIGHT );
context.fillStyle = bg;
context.globalAlpha = 0.9;
context.fillRect( GRAPH_X, GRAPH_Y, GRAPH_WIDTH, GRAPH_HEIGHT );
return {
dom: canvas,
update: function ( value, maxValue ) {
min = Math.min( min, value );
max = Math.max( max, value );
context.fillStyle = bg;
context.globalAlpha = 1;
context.fillRect( 0, 0, WIDTH, GRAPH_Y );
context.fillStyle = fg;
context.fillText( round( value ) + ' ' + name + ' (' + round( min ) + '-' + round( max ) + ')', TEXT_X, TEXT_Y );
context.drawImage( canvas, GRAPH_X + PR, GRAPH_Y, GRAPH_WIDTH - PR, GRAPH_HEIGHT, GRAPH_X, GRAPH_Y, GRAPH_WIDTH - PR, GRAPH_HEIGHT );
context.fillRect( GRAPH_X + GRAPH_WIDTH - PR, GRAPH_Y, PR, GRAPH_HEIGHT );
context.fillStyle = bg;
context.globalAlpha = 0.9;
context.fillRect( GRAPH_X + GRAPH_WIDTH - PR, GRAPH_Y, PR, round( ( 1 - ( value / maxValue ) ) * GRAPH_HEIGHT ) );
}
};
};
export default Stats;

File diff suppressed because one or more lines are too long

@ -1,91 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link type="text/css" rel="stylesheet" href="./common/css/common.css">
<style>
* {
padding: 0;
margin: 0;
}
#chartDiv {
position: relative;
}
body {
background-color: #fff;
}
</style>
</head>
<body>
<!-- 第一个 -->
<div id="realdata" class="realdata">
<div id="echarts-btn" class="col echarts-btn menu-top">
<span class="btn" title="PRPS">
<span id="prps" class="prps ready"></span>
</span>
<span class="btn" title="PRPD">
<span id="prpd" class="prpd"></span>
</span>
<span class="btn" title="开启">
<span id="start" class="start"></span>
</span>
<span class="btn refreshtitle " title="累计">
<span class="refresh-btn ready"></span>
</span>
</div>
</div>
<div id="chartDiv" class="col echarts-chart charts">
<div id="box3D1" class="loading-box"></div>
<div id="box2D1" class="loading-box" style="display: none;"></div>
<div class="noisy-slide-box">
<span class="slide-name noise" name="noise">底噪</span>
<div class="noisy-slide slide GIS" data-price="0"></div>
<div class="noisy-slide slide GIL" data-price="0" style="display:none"></div>
</div>
<div id="addPointNumDiv">
<div class="cdf-slide-box">
<span class="slide-name phaseOffset" name="phaseOffset">相位偏移</span>
<span class="cdf-slide slide" data-price="0"></span>
</div>
</div>
<div class="zoom">
<span class="btn" title="放大">
<span id="scale" class="scale big ready"></span>
</span>
<span class="btn" title="缩小">
<span id="scale" class="scale small"></span>
</span>
</div>
</div>
<div id="box2D6" class="loading-box-mini"></div>
<script type="text/javascript" src="./common/js/jquery.min.js"></script>
<!-- <script type="text/javascript" src="./common/js/jquery-ui.min.js"></script>
<script type="text/javascript" src="./common/js/simpleAlert.js"></script> -->
<script type="text/javascript" src="./common/js/three/three.min.js"></script>
<script type="text/javascript" src="./common/js/three/OrbitControls.js"></script>
<script type="text/javascript" src="./common/js/three/Lut.js"></script>
<!--<script type="text/javascript" src="./common/js/echarts/echarts.js"></script> -->
<!-- 使不支持es模块的浏览器支持es -->
<!-- <script type="text/javascript" async src="https://unpkg.com/es-module-shims@1.3.6/dist/es-module-shims.js"></script> -->
<script type="module" src="./common/js/history.js"></script>
</body>
</html>

@ -1,137 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link type="text/css" rel="stylesheet" href="./common/css/common.css">
<style>
* {
padding: 0;
margin: 0;
}
#chartDiv {
position: relative;
}
body {
background-color: #fff;
}
</style>
</head>
<body>
<!-- 第一个 -->
<div id="realdata" class="realdata">
<div id="echarts-btn" class="col echarts-btn menu-top">
<select id="channelFiltering" class="selectStyle">
<option value="0" class="selectFrequency">选择频段</option>
<option value="1" class="lowband">低频</option>
<option value="2" class="fullband">全频</option>
<option value="3" class="narrowband">窄频</option>
<option value="4" class="highband">高频</option>
</select>
<span class="btn" title="PRPS">
<span id="prps" class="prps ready"></span>
</span>
<span class="btn" title="PRPD">
<span id="prpd" class="prpd"></span>
</span>
<span class="btn" title="开启">
<span id="start" class="start"></span>
</span>
<span class="btn LinkANC" title="自适应降噪">
<span id="adaptive-noise" class="adaptive-noise"></span>
</span>
<span id="associated-noise-box" class="btn LinkNC" title="关联噪声传感器降噪">
<span id="associated-noise" class="associated-noise"></span>
</span>
<span class="btn eventList" title="事件列表">
<span class="event-btn"></span>
</span>
<span id="record-btn-box" class="btn record-btn-box" title="录波">
<span class="record-btn"></span>
</span>
<span id="total" class="btn" style="width: 70px;display:none" >
<input id="total-time" type="number" placeholder="累计时间(s)" />
</span>
<span class="btn refreshtitle " title="累计">
<span class="refresh-btn ready"></span>
</span>
<span id="menu-right" class="btn" title="展开">
<span id="show" class="show"></span>
</span>
</div>
</div>
<div id="chartDiv" class="col echarts-chart charts">
<div id="box3D1" class="loading-box"></div>
<div id="box3D2" class="loading-box" style="display: none;"></div>
<div id="box2D2" class="loading-box" style="display: none;"></div>
<div id="box2D5" class="loading-box" style="display: none;width:100%;height: 100%;"></div>
<div id="box2D1" class="loading-box" style="display: none;"></div>
<div class="noisy-slide-box">
<span class="slide-name noise" name="noise">底噪</span>
<div class="noisy-slide slide GIS" data-price="0"></div>
<div class="noisy-slide slide GIL" data-price="0" style="display:none"></div>
</div>
<div id="echarts-text" class="echarts-text text-bottom">
<span class="maxValue" name="maxValue">
<span class="name">脉冲最大值:</span>
<span id="maxValue">0</span>
<span class="unit">dBm</span>
</span>
<span class="avgValue" name="averageValue">
<span class="name">脉冲平均值:</span>
<span id="averageValue">0</span>
<span class="unit">dBm</span>
</span>
<span class="pulseNumber" name="impulseQuantity">
<span class="name">脉冲数量:</span>
<span id="impulseQuantity">0</span>
</span>
</div>
<div id="addPointNumDiv">
<div class="cdf-slide-box">
<span class="slide-name phaseOffset" name="phaseOffset">相位偏移</span>
<span class="cdf-slide slide" data-price="0"></span>
</div>
</div>
<div class="zoom">
<span class="btn" title="放大">
<span id="scale" class="scale big ready"></span>
</span>
<span class="btn" title="缩小">
<span id="scale" class="scale small"></span>
</span>
</div>
</div>
<div id="box2D6" class="loading-box-mini"></div>
<script type="text/javascript" src="./common/js/jquery.min.js"></script>
<script type="text/javascript" src="./common/js/jquery-ui.min.js"></script>
<!--<script type="text/javascript" src="./common/js/simpleAlert.js"></script> -->
<script type="text/javascript" src="./common/js/three/three.min.js"></script>
<script type="text/javascript" src="./common/js/three/OrbitControls.js"></script>
<script type="text/javascript" src="./common/js/three/Lut.js"></script>
<script type="text/javascript" src="./common/js/echarts/echarts.js"></script>
<!-- 使不支持es模块的浏览器支持es -->
<!-- <script type="text/javascript" async src="https://unpkg.com/es-module-shims@1.3.6/dist/es-module-shims.js"></script> -->
<script type="module" src="./common/js/index.js"></script>
</body>
</html>

Binary file not shown.

@ -280,7 +280,7 @@ const createAxisInfo = (size, minSize = 0) => {
h: 25,
color: '#0000cc',
font: 'normal 500px Arial,sans-serif',
xyz: [360, textY + 40, 340],
xyz: [360, textY, 355],
},
{
type: 'text',
@ -289,7 +289,7 @@ const createAxisInfo = (size, minSize = 0) => {
h: 25,
color: '#0000cc',
font: 'normal 500px Arial,sans-serif',
xyz: [360, textY + 40, 270],
xyz: [360, textY, 270],
},
{
type: 'text',
@ -301,7 +301,7 @@ const createAxisInfo = (size, minSize = 0) => {
color: '#0000cc',
size: 22.3,
font: 'normal 500px Arial,sans-serif',
xyz: [360, textY + 40, 180],
xyz: [360, textY, 180],
},
{
type: 'text',
@ -313,7 +313,7 @@ const createAxisInfo = (size, minSize = 0) => {
color: '#0000cc',
size: 22.3,
font: 'normal 500px Arial,sans-serif',
xyz: [360, textY + 40, 90],
xyz: [360, textY, 90],
},
{
type: 'text',
@ -325,7 +325,7 @@ const createAxisInfo = (size, minSize = 0) => {
color: '#0000cc',
size: 22.3,
font: 'normal 500px Arial,sans-serif',
xyz: [360, textY + 40, 0],
xyz: [360, textY, 0],
},
];
let prpd3d = [

@ -22,13 +22,7 @@ let token = 'c9343e83005e1f2b458d66628ddff98b'
let url = `ws://192.168.1.88:8844/messaging/${token}`
//const stats = new Stats();
//document.body.appendChild(stats.dom);
let box3D = document.getElementById("box3D2");
let box2D = document.getElementById("box2D2");
let box2D5 = document.getElementById('box2D5');
let box2D6 = document.getElementById('box2D6');
let box3Dchart = '';
let box2Dchart = '';
let box2D5chart = '';
let box2D6chart = '';
let maxRange = 100;
@ -83,6 +77,16 @@ let initInstancedPoints,//prpd实例
//pointsGeometry.computeVertexNormals()
let counter = 1;
const switchFun = {
showHistory: {
open() {
initTrendChart()
},
close() {
}
}
};
$('.switch').on('click', function () {
$(this).toggleClass('active');
if ($(this).hasClass('active')) {
@ -92,6 +96,8 @@ $('.switch').on('click', function () {
}
});
$('#setting-btn').click(function () {
$(this).toggleClass('ready')
$('#setting').toggle()
@ -216,7 +222,9 @@ init();
init2D();
render();
render2D();
initTrendChart()
initTrendChart();
onWindowResize()
function initTrendChart() {
box2D6chart = echarts.init(box2D6)
setTimeout(() => {
@ -1084,9 +1092,9 @@ function handleVisibilityChange() {
//prps初始化
function init() {
let box = $('#box3D1');
let width = window.innerWidth;//box.width();
let height = window.innerHeight//box.height();
console.log("🚀 height:",width, height)
let width = box.width();
let height = box.height();
renderer = new THREE.WebGLRenderer({ logarithmicDepthBuffer: true, antialias: true, preserveDrawingBuffer: true, });//preserveDrawingBuffer保存three.js canvas画布上的信息
renderer.localClippingEnabled = true
let constant = (360 / (initAxis)) * initAxis + 1
@ -1184,15 +1192,17 @@ function onWindowResize() {
$('#addPointNumDiv').show();
$('#box3D1').show();
$('#box2D1').hide();
$('#box2D6').show();
} else if (viewType == 3) {//实时数据仅展示prpd
let h = $(window).height();
$(".loading-box").css('height', h * 0.9)
$(".loading-box").css('height', h)
$('#realdata').hide();
$('.noisy-slide-box').hide();
$('#echarts-text').hide();
$('#addPointNumDiv').hide();
$('#box3D1').hide();
$('#box2D1').show();
$('#box2D6').hide();
} else if (viewType == 4) {//历史趋势仅展示prps
let h = $(window).height();
$(".loading-box").css('height', h * 0.9)
@ -1223,7 +1233,7 @@ function onWindowResize() {
let width = box.width();
let height = box.height();
console.log("🚀 height:",width, height)
//console.log("🚀 height:",width, height)
let k = width / height; //窗口宽高比
let s = 350; //三维场景显示范围控制系数,系数越大,显示的范围越大

@ -33,6 +33,7 @@
width: calc(100% - 40px);
padding: 20px 10px;
display: none;
backdrop-filter: blur(3px);
}
#setting::before {
@ -46,6 +47,7 @@
background-color: #1890ff;
opacity: 0.2;
z-index: -1;
/* 确保伪元素在子元素后面 */
}
@ -78,7 +80,7 @@
.slide {
display: inline-block;
width: 160px;
width: 100px;
height: 8px;
margin-top: 5px;
background-image: url('./common/img/sprite-skin-nice.png');
@ -267,7 +269,7 @@
</div>
</div>
<div id="box2D6" class="loading-box-mini" style="display: none;"></div>
<div id="box2D6" class="loading-box-mini"></div>
<div id="chartDiv" class="col echarts-chart charts">
<div id="box3D1" class="loading-box"></div>
<div id="box2D1" class="loading-box" style="display: none;"></div>

@ -0,0 +1,19 @@
import server from '@/utils/request';
//关联关系配置
//使用post分页动态查询
export const getAssociateConfigListPage_api = (data: object) => server.post(`/fault-config/_query`, data);
// 新增数据 fault-config
export const addAssociateConfig_api = (data: object) => server.patch(`/fault-config`, data);
//修改数据
export const updateAssociateConfig_api = (id: object) => server.put(`/fault-config/${id}`);
//根据ID查询
export const getAssociateConfigList_api = (id: object) => server.get(`/fault/config/${id}`);
//根据ID删除
export const delteAssociateConfig_api = (id: string) => server.remove(`/fault/config/${id}`);

@ -0,0 +1,29 @@
import server from '@/utils/request'
/**
* (POST)
* @param logicId
* @returns
*/
export const findDefaultTree = (logicId: string) => server.get(`/common-point/findDefaultTree/${logicId}`)
/**
*
* @param data
* @returns
*/
export const addMonitor = (data: any) => server.post(`/common-point`, data)
/**
*
* @param id
* @returns
*/
export const editMonitor = (data: any) => server.put(`/common/point/${data.id}`, data)
/**
*
* @param id
* @returns
*/
export const deleteMonitor = (id: any) => server.remove(`/common/point/${id}`)

@ -1,17 +0,0 @@
import server from '@/utils/request';
//编辑标签
export const saveTag = (data:any) => server.patch('/calendar/tags',data)
//查询标签列表
export const queryTags = () => server.get('/calendar/tags')
//删除标签
export const deleteTags = (ids:any) => server.remove('/calendar/tags',{},{data:ids})
//保存标签颜色
export const saveTagsColor = (data:any) => server.post('/system/config/calendar-tag-color',data)
//查询标签颜色
export const getTagsColor = () => server.get('/system/config/calendar-tag-color');
//查询指定日期内的日历
export const queryEvents = (dateFrom:any,dateTo:any) => server.get(`/calendar/${dateFrom}/${dateTo}`)
//批量保存指定日期的日历
export const saveEvents = (data:any) => server.patch('/calendar',data)
//清空日历
export const clearAll = () => server.remove('/calendar/mine/_all')

@ -1,92 +0,0 @@
<template>
<div
:style="props.style || { width: '100%', height: '100%' }"
:class="props.class"
>
<el-amap v-if="amapKey" :zooms="[3, 20]" @init="initMap" ref="mapRef">
<template v-if="isOpenUi">
<template v-if="uiLoading">
<slot></slot>
</template>
</template>
<template v-else><slot></slot></template>
</el-amap>
<JEmpty v-else description="请配置高德地图key" style="padding: 20%" />
</div>
</template>
<script lang="ts" setup>
import { CSSProperties, PropType } from 'vue';
import AMap, { initAMapApiLoader } from '@vuemap/vue-amap';
import '@vuemap/vue-amap/dist/style.css';
import { getAMapUiPromise } from './utils';
import { useSystem } from '@/store/system';
const emit = defineEmits(['init']);
const system = useSystem();
interface AMapProps {
style?: CSSProperties;
class?: string;
AMapUI?: string | boolean;
}
const amapKey = system.$state.configInfo.amap?.apiKey;
const secretKey = system.$state.configInfo.amap?.secretKey;
initAMapApiLoader({
key: amapKey,
securityJsCode: secretKey,
plugins: ['AMap.DistrictSearch', 'AMap.GeoJSON'],
});
const props = defineProps({
style: Object as PropType<AMapProps['style']>,
class: String as PropType<AMapProps['class']>,
AMapUI: [String, Boolean],
center: Array,
});
const mapRef = ref();
const uiLoading = ref<boolean>(false);
let mapInstance:any = null;
const isOpenUi = computed(() => {
return 'AMapUI' in props || props.AMapUI;
});
const getAMapUI = () => {
const version = typeof props.AMapUI === 'string' ? props.AMapUI : '1.1';
getAMapUiPromise(version).then(() => {
uiLoading.value = true;
});
};
const marker = ref<any[]>([]);
const initMap = (e: any) => {
mapInstance = e;
if (isOpenUi.value) {
getAMapUI();
}
emit('init', e);
};
const setBounds = (bounds: any) => {
console.log(bounds)
if (mapInstance) {
mapInstance.setBounds(bounds)
}
}
onMounted(()=>{
console.log(secretKey,'secretKey')
})
defineExpose({
setBounds
})
</script>
<style lang="less" scoped></style>

@ -1,116 +0,0 @@
<template>
</template>
<script setup>
import { useMap } from './useMap'
import {pick} from "lodash-es";
defineOptions({
name: 'DistrictSearch'
})
const instance = useMap()
const props = defineProps({
subdistrict: {
type: Number,
default: 0
},
extensions: {
type: String,
default: 'all'
},
level: {
type: String,
default: 'district'
},
view: {
type: Boolean,
default: true
},
styles: {
type: Object,
default: () => ({})
},
adcode: {
type: String,
default: undefined
}
})
let district
let polygon
const remove = () => {
if (polygon && instance.$amapComponent) {
if (instance.$amapComponent.getLayers().length) {
instance.$amapComponent.remove(polygon)
}
polygon = null
}
}
const drawBounds = (paths) => {
if (polygon && instance.$amapComponent?.remove) {
instance.$amapComponent.remove(polygon)
polygon = null
}
for (var i = 0; i < paths.length; i += 1) {//MultiPolygonpath
paths[i] = [paths[i]]
}
const _styles = Object.assign({
strokeWeight: 1,
path: paths,
fillOpacity: 0.25,
fillColor: '#80d8ff',
strokeColor: '#0091ea'
},props.styles)
polygon = new AMap.Polygon(_styles);
instance.$amapComponent.add(polygon)
if (props.view) {
instance.$amapComponent.setFitView(polygon)
}
}
const queryDistrict = (code) => {
const opts = {
subdistrict: 0, //
extensions: 'all', //
level: 'district' //
}
const options = Object.assign(opts, pick(props, ['subdistrict', 'extensions', 'level']))
if (!district) {
district = new AMap.DistrictSearch(options)
}
if (!code) return
district.search(code, (status, result) => {
if (!result || !result.districtList || !result.districtList[0]) {
console.warn('请正确填写名称或更新其他名称');
return
}
const bounds = result.districtList[0].boundaries;
drawBounds(bounds)
})
}
onBeforeUnmount(() => {
remove()
})
watch(() => props.adcode, () =>{
queryDistrict(props.adcode)
}, { immediate: true })
</script>
<style scoped>
</style>

@ -1,91 +0,0 @@
<template>
</template>
<script setup>
import { useMap } from './useMap'
import { max, min } from 'lodash-es'
defineOptions({
name: 'GeoJson'
})
const props = defineProps({
geo: {
type: Object,
default: undefined
},
view: {
type: Boolean,
default: true
},
})
const instance = useMap()
let geoJsonLayer
const remove = () => {
if (geoJsonLayer && instance.$amapComponent) {
if (instance.$amapComponent.getLayers().length) {
instance.$amapComponent.remove(geoJsonLayer)
}
geoJsonLayer = null
}
}
const drawBounds = () => {
remove()
if (!props.geo) return
geoJsonLayer = new AMap.GeoJSON({
geoJSON: props.geo,
getPolygon: (geojson, lnglats) => {
return new AMap.Polygon({
path: lnglats,
fillOpacity: 0.25,//
strokeColor: '#0091ea',
fillColor: '#80d8ff'
});
}
})
instance.$amapComponent.add(geoJsonLayer)
if (props.view) {
const points = props.geo.features.reduce((prev, next) => {
const coordinates = next.geometry.coordinates
prev.push(...coordinates[0])
return prev
}, [])
if (points.length) {
const lngArr = points.map(lnglat => lnglat[0])
const latArr = points.map(lnglat => lnglat[1])
const maxLng = max(lngArr)
const maxLat = max(latArr)
const minLng = min(lngArr)
const minLat = min(latArr)
const southWest = new AMap.LngLat(maxLng, maxLat)
const northEast = new AMap.LngLat(minLng, minLat)
const bounds = new AMap.Bounds(southWest, northEast)
instance.$amapComponent.setBounds(bounds)
}
}
}
onBeforeUnmount(() => {
remove()
})
watch(() => JSON.stringify(props.geo), () =>{
drawBounds()
}, { immediate: true })
</script>
<style scoped>
</style>

@ -1,7 +0,0 @@
import AMap from './AMap.vue'
export * from './useMap'
export { default as DistrictSearch } from './DistrictSearch.vue'
export { default as GeoJson } from './GeoJson.vue'
export default AMap

@ -1,4 +0,0 @@
export const useMap = () => {
return inject('parentInstance')
}

@ -1,27 +0,0 @@
<template>
<img :src="src" />
</template>
<script setup>
defineOptions({
name: 'LevelIcon'
})
const props = defineProps({
level: {
type: Number,
default: undefined
}
})
const src = computed(() => {
return `/images/alarm/alarm${props.level}.png`
})
</script>
<style scoped>
</style>

@ -1,282 +0,0 @@
<template>
<div :class="{ 'j-card-panel': true, 'no-column': noColumn }">
<j-row v-if="!noColumn" :gutter="[16, 16]">
<j-col
v-for="item in itemOptions"
:key="item.value"
:span="24 / column"
>
<div
:class="{
'j-card-item': true,
active: activeKeys.includes(item.value),
disabled: disabled || item.disabled,
horizontal: type === 'horizontal',
vertical: type === 'vertical',
right: float === 'right',
left: float === 'left',
}"
@click="() => handleSelect(item.value, item)"
>
<div class="j-card-title-warp">
<div class="title">
<slot
name="title"
:title="item.label"
:option="item"
>
<j-ellipsis>
{{ item.label }}
</j-ellipsis>
</slot>
</div>
<div
v-if="item.subLabel && showSubLabel"
class="sub-title"
>
<slot
name="subLabel"
:sub-label="item.subLabel"
:option="item"
>
{{ item.subLabel }}
</slot>
</div>
</div>
<div v-if="showImage" class="j-card-image">
<slot name="image" :image="item.iconUrl" :option="item">
<j-avatar
class="icon box-shadow"
:src="item.iconUrl"
/>
</slot>
</div>
</div>
</j-col>
</j-row>
<template v-else>
<div
v-for="item in itemOptions"
:key="item.value"
:class="{
'j-card-item': true,
active: activeKeys.includes(item.value),
disabled: disabled || item.disabled,
horizontal: type === 'horizontal',
vertical: type === 'vertical',
right: float === 'right',
left: float === 'left',
}"
@click="() => handleSelect(item.value, item)"
>
<div class="j-card-title-warp">
<div class="title">
<slot name="title" :title="item.label" :option="item">
<j-ellipsis>
{{ item.label }}
</j-ellipsis>
</slot>
</div>
<div v-if="item.subLabel && showSubLabel" class="sub-title">
<slot
name="subLabel"
:sub-label="item.subLabel"
:option="item"
>
{{ item.subLabel }}
</slot>
</div>
</div>
<div v-if="showImage" class="j-card-image">
<slot name="image" :image="item.iconUrl" :option="item">
<j-avatar class="icon box-shadow" :src="item.iconUrl" />
</slot>
</div>
</div>
</template>
</div>
</template>
<script lang="ts" setup>
import { computed, PropType, ref, toRefs, watch } from 'vue';
interface CardOption {
value: string | number;
label: string;
subLabel?: string;
iconUrl: string;
disabled?: boolean;
}
const props = defineProps({
type: {
type: String as PropType<'vertical' | 'horizontal'>,
default: 'horizontal',
},
float: {
type: String as PropType<'left' | 'right'>,
default: 'left',
},
options: {
type: Array as PropType<Array<CardOption>>,
default: () => [],
},
disabled: {
type: Boolean,
default: false,
},
multiple: {
type: Boolean,
default: false,
},
column: {
type: Number,
default: 3,
},
noColumn: {
type: Boolean,
default: false,
},
showImage: {
type: Boolean,
default: true,
},
showSubLabel: {
type: Boolean,
default: true,
},
value: {
type: [String, Array],
default: undefined,
},
allowClear: {
type: Boolean,
default: false,
},
});
const { multiple, type, disabled, float } = toRefs(props);
const emits = defineEmits(['update:value', 'change', 'select']);
const activeKeys = ref<Array<string | number>>([]);
const itemOptions = computed(() => props.options);
const isAllowClear = computed(() => {
return props.allowClear !== false;
});
const getOptions = (keys: Array<string | number>): CardOption[] => {
return itemOptions.value.filter((item) => {
return keys.includes(item.value);
});
};
const handleSelect = (key: string | number, item: CardOption) => {
if (disabled.value || item.disabled) return;
let cloneActiveKeys = new Set(activeKeys.value);
const isActive = cloneActiveKeys.has(key);
// allowClearfalsereturn
if (isActive && !multiple.value && isAllowClear.value === false) return;
if (isActive) {
//
cloneActiveKeys.delete(key);
} else {
//
multiple.value
? cloneActiveKeys.add(key)
: (cloneActiveKeys = new Set([key]));
}
activeKeys.value = [...cloneActiveKeys.keys()];
const options = multiple.value ? getOptions(activeKeys.value) : item;
const values = props.multiple ? activeKeys.value : activeKeys.value[0]
emits('update:value', values);
emits('change', values, options);
emits('select', values, key, !isActive)
};
watch(
() => props.value,
() => {
activeKeys.value = Array.isArray(props.value)
? props.value
: [props.value];
},
{ immediate: true },
);
</script>
<style lang="less" scoped>
@card-border: #e6e6e6;
.j-card-panel {
.j-card-item {
border: 1px solid @card-border;
border-radius: 4px;
cursor: pointer;
color: @black;
display: flex;
width: 100%;
gap: 12px;
.j-card-title-warp {
flex: 1 1 auto;
max-width: 100%;
.title {
word-break: keep-all;
width: 100%;
}
}
&.vertical {
flex-direction: column-reverse;
padding: 22px 4px;
align-items: center;
.j-card-image {
margin-bottom: 4px;
}
}
&.horizontal {
padding: 20px;
}
.sub-title {
color: rgba(0, 0, 0, 0.24);
}
&.right {
flex-direction: row-reverse;
}
}
&.no-column {
display: flex;
flex-wrap: wrap;
gap: 16px;
.j-card-item {
min-width: 36px;
width: unset;
&.vertical {
padding: 14px 16px;
}
}
}
.active {
border: 1px solid var(--ant-primary-color) !important;
}
.disabled {
cursor: not-allowed;
opacity: 0.75;
}
}
</style>

@ -1,72 +0,0 @@
<template>
<div class="radio-button" :style="styles">
<div v-for="item in options" @click="onClick(item)" class="radio-button-item" :class="{'active': myValue === item.value }">
{{ item.label }}
</div>
</div>
</template>
<script setup>
defineOptions({
name: 'RadioButton',
})
const props = defineProps({
value: {
type: [String, Number],
default: undefined
},
options: {
type: Array,
default: () => []
},
columns: {
type: Number,
default: 3
}
})
const emit = defineEmits(['update:value'])
const myValue = ref(props.value)
const styles = computed(() => {
return {
'grid-template-columns': `repeat(${props.columns}, 1fr)`
}
})
const onClick = (record) => {
if (myValue.value !== record.value) {
myValue.value = record.value
emit('update:value', record.value)
emit('select', record.value)
}
}
watch(() => props.value, () => {
myValue.value = props.value
})
</script>
<style scoped lang="less">
.radio-button {
display: grid;
gap: 16px;
.radio-button-item {
padding: 6px 12px;
text-align: center;
height: 100%;
border-radius: 2px;
background-color: #f5f5f5;
cursor: pointer;
&.active {
color: #fff;
background-color: @primary-color;
}
}
}
</style>

@ -1,11 +0,0 @@
import CardSelect from './CardSelect.vue';
import type { App } from 'vue';
CardSelect.name = 'JCardSelect';
CardSelect.install = function (app: App) {
app.component('JCardSelect', CardSelect);
return app;
};
export default CardSelect;

@ -1,163 +0,0 @@
<template>
<div :class="['j-check-button', props.class]" :style="styles">
<div
v-for="item in _options"
:key="item.value"
:class="{
'j-check-button-item': true,
'selected': myValue.includes(item.value),
'disabled': item.disabled
}"
@click="
() => {
selected(item.value, item.disabled);
}
"
>
{{ item.label }}
</div>
</div>
</template>
<script setup lang="ts">
import { computed, CSSProperties, PropType, ref, watch } from 'vue';
import { isArray } from 'lodash-es';
import { Form } from 'ant-design-vue'
defineOptions({
name: 'CheckButton'
})
const props = defineProps({
value: {
type: [String, Array],
default: undefined,
},
options: {
type: Array,
default: () => [],
},
multiple: {
type: Boolean,
default: false,
},
disabled: {
type: Boolean,
default: false,
},
class: {
type: String,
default: undefined,
},
style: {
type: Object as PropType<CSSProperties>,
default: () => ({}),
},
columns: {
type: Number,
default: 3
}
});
const emit = defineEmits(['update:value', 'change', 'select']);
const formItemContext = Form.useInjectFormItemContext();
const myValue = ref();
const optionsMap = ref(new Map());
const styles = computed(() => {
return {
'grid-template-columns': `repeat(${props.columns}, 1fr)`,
...props.style
}
})
const _options = computed(() => {
props.options.forEach((item: any) => {
if (props.disabled) {
item.disabled = props.disabled
}
optionsMap.value.set(item.value, item);
});
return props.options;
});
const selected = (key: string | number, disabeld: boolean) => {
if (disabeld || props.disabled) return;
const values = new Set(myValue.value);
if (values.has(key)) {
values.delete(key);
} else {
if (!props.multiple) {
values.clear();
}
values.add(key);
}
myValue.value = [...values.values()];
const optionsItems = myValue.value.map((_key) => {
return optionsMap.value.get(_key);
});
const _value = props.multiple ? myValue.value : myValue.value[0];
emit('update:value', _value);
emit('change', _value, props.multiple ? optionsItems : optionsItems[0]);
emit('select', _value, props.multiple ? optionsItems : optionsItems[0]);
formItemContext.onFieldChange()
};
watch(
() => props.value,
() => {
if (props.value) {
myValue.value = isArray(props.value) ? props.value : [props.value];
} else {
myValue.value = [];
}
},
{ immediate: true, deep: true },
);
</script>
<style scoped lang="less">
.j-check-button {
display: grid;
gap: 16px;
width: 100%;
.j-check-button-item {
flex: 1;
min-width: 0;
padding: 8px;
border-radius: @border-radius-base;
background-color: #f2f3f5;
transition: all 0.3s;
color: #333;
text-align: center;
cursor: pointer;
&:hover {
background-color: @primary-color;
opacity: 0.85;
color: #fff;
}
&.selected {
background-color: @primary-color;
color: #fff;
}
&.disabled {
cursor: not-allowed;
color: #00000040;
background-color: #e6e6e6;
opacity: 1
}
}
}
</style>

@ -1,3 +0,0 @@
import CheckButton from "./CheckButton.vue";
export default CheckButton

@ -1,76 +0,0 @@
<template>
<!-- <a-tooltip v-if="toolTip" v-bind="toolTip">
<span @click="showConfirm" :class="props.className" v-show="show">
{{ props.class }}
<slot></slot>
</span>
</a-tooltip> -->
<span @click="showConfirm" :class="props.className" v-show="show">
{{ props.class }}
<slot></slot>
</span>
</template>
<script setup>
import { Modal } from 'ant-design-vue';
const props = defineProps({
title: {
type: String,
default: '',
},
onConfirm: {
type: Object,
default: {},
},
className: {
type: String,
},
show: {
type: Boolean,
default: true,
},
disabled: {
type: Boolean,
default: false,
},
toolTip: {
type: Object
},
});
// const confirmLoading = ref(false);
// const modalVisible = ref(false);
// const modalConfirm = async() => {
// if (typeof props.onConfirm === 'function') {
// confirmLoading.value = true;
// const res = await props.onConfirm()?.finally(()=>{
// confirmLoading.value = false;
// modalVisible.value = false;
// return
// });
// if(!res?.finally){
// confirmLoading.value = false;
// modalVisible.value = false;
// }
// } else {
// modalVisible.value = false;
// }
// };
const showConfirm = () => {
if (props.disabled) {
return;
}
Modal.confirm({
title: props.title,
content: props?.content,
onOk() {
return props?.onConfirm();
},
onCancel() {},
});
};
</script>
<style lang="less" scoped>
.modalContent {
text-align: center;
}
</style>

@ -1,326 +0,0 @@
<template>
<div ref='dialog' :style='styleName' class='dialog'>
<Transition name='dialog'>
<div class='dialog-sprite' ref='header'>
<div class='header' v-if="title !== false">
<span>{{ title }}</span>
<a-button size='small' type='text' @click.stop='onClose'>
<AIcon type='CloseOutlined' />
</a-button>
</div>
<div class='dialog-body' :style="bodyStyle">
<slot></slot>
</div>
<!-- <div class='dialog-footer' v-if='slots?.footer'>-->
<!-- <slot name='footer'></slot>-->
<!-- </div>-->
</div>
</Transition>
<!-- <template v-for='item in rangeList'>-->
<!-- <div :class="{'range': true, [item.classname]: true}" @mousedown.stop='rangeMove($event,item.classname)'></div>-->
<!-- </template>-->
<div :class="{'range': true, 'bottom-right': true}" @mousedown.stop='rangeMove($event,"bottom-right")'></div>
</div>
</template>
<script setup lang='ts'>
defineOptions({
name: 'DragModal'
})
const props = defineProps({
title: {
type: [String, Boolean],
default: ''
},
width: {
type: Number,
default: 400
},
height: {
type: Number,
default: 100
},
dragRang: {
type: [Array , Number],
default: [400, 200]
},
bodyStyle: {
type: Object,
default: () => ({})
}
})
const emits = defineEmits(['close', 'heightChange'])
const slots = useSlots()
const ele = document.body
const dialog = ref()
const header = ref()
const baseWidth = ref(props.width || 400)
const baseHeight = ref(props.height || 100)
const baseLeft = ref(100)
const baseTop = ref(100)
const rangeList = [
// {
// classname: 'top-left'
// },
// {
// classname: 'top-right'
// },
// {
// classname: 'bottom-left'
// },
{
classname: 'bottom-right'
}
]
const styleName = computed(() => {
return {
top: getFixed(baseTop.value) + 'px',
left: getFixed(baseLeft.value) + 'px',
width: getFixed(baseWidth.value) + 'px',
height: getFixed(baseHeight.value) + 'px'
}
})
const getFixed = (val: number) => {
return Number(val.toFixed(2))
}
const onDrag = () => {
let active = false
let initialX: number
let initialY: number
let initialWindowX: number
let initialWindowY: number
header.value.addEventListener('mousedown', (e: MouseEvent) => {
active = true
initialX = e.clientX
initialY = e.clientY
initialWindowX = dialog.value.offsetLeft
initialWindowY = dialog.value.offsetTop
})
document.addEventListener('mouseup', () => {
active = false
})
document.addEventListener('mousemove', (e) => {
if (active) {
const dx = e.clientX - initialX
const dy = e.clientY - initialY
baseLeft.value = initialWindowX + dx
baseTop.value = initialWindowY + dy
}
})
}
const handleClear = () => {
document.onmouseup = () => {
document.onmousemove = null
document.onmouseup = null
}
}
const rangeMove = (e: MouseEvent, position: string) => {
//
let x: boolean = false
let y: boolean = false
//
let xp: boolean = false
let yp: boolean = false
//
let xc: boolean = false
let yc: boolean = false
let disX = e.clientX
let disY = e.clientY
document.onmousemove = e => {
if (position === 'bottom-right') {
x = true
y = true
} else if (position === 'bottom-left') {
x = true
y = true
xp = true
xc = true
} else if (position === 'top-right') {
x = true
y = true
yp = true
yc = true
} else if (position === 'top-left') {
x = true
y = true
xp = true
xc = true
yp = true
yc = true
}
let left = e.clientX - disX
let top = e.clientY - disY
disX = e.clientX
disY = e.clientY
if (x) {
let calc = left
if (xc) {
calc = -calc
}
if (xp) {
baseLeft.value = baseLeft.value - calc
}
const width = baseWidth.value + calc
baseWidth.value = width <= props.dragRang[0] ? props.dragRang[0] : width
}
if (y) {
let calc = top
if (yc) {
calc = -calc
}
if (yp) {
baseTop.value = baseTop.value - calc
}
const height = baseHeight.value + calc
baseHeight.value = height <= props.dragRang[1] ? props.dragRang[1] : height
emits('heightChange', baseHeight.value)
}
}
handleClear()
}
const onClose = () => {
console.log('close---1')
emits("close")
}
onMounted(() => {
if (dialog.value && header.value) {
onDrag()
}
if (ele) {
const data = ele?.getBoundingClientRect()
baseLeft.value = (data?.right - baseWidth.value) / 2 || 0
baseTop.value = data?.top + 200 || 0
}
})
watch(() => props.height, () => {
if (props.height > baseHeight.value) {
baseHeight.value = props.height
}
})
</script>
<style lang='less' scoped>
@boxColor: rgb(@primary-color);
//
.dialog-enter-active,
.dialog-leave-active {
transition: opacity .5s;
}
.dialog-enter,
.dialog-leave-to {
opacity: 0;
}
.dialog {
position: fixed;
z-index: 1000;
.dialog-sprite {
position: absolute;
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
overflow: hidden;
z-index: 23456765435;
background-color: #ffffff;
border-radius: 4px;
border: 1px solid #91CAFF;
box-shadow: 0 3px 8px 0 rgba(#1677FF, 0.24);
.header {
padding: 5px 15px;
font-size: 18px;
font-weight: 700;
color: #333;
display: flex;
justify-content: space-between;
align-items: center;
border-bottom: 1px solid #f0f0f0;
cursor: move;
}
.dialog-body {
flex: 1;
min-height: 0;
overflow-y: auto;
padding: 24px 20px;
}
.dialog-footer {
border-top: 1px solid #f0f0f0;
padding: 5px 15px;
}
}
.range {
position: absolute;
width: 16px;
height: 16px;
border-radius: 100%;
z-index: 23456765436;
}
.bottom-right, .top-left {
&:hover {
cursor: nwse-resize
}
}
.bottom-left, .top-right {
&:hover {
cursor: nesw-resize
}
}
.top-right {
top: -6px;
right: -6px;
}
.top-left {
top: -6px;
left: -6px;
}
.bottom-right {
bottom: -6px;
right: -6px;
}
.bottom-left {
bottom: -6px;
left: -6px;
}
}
</style>

@ -1 +0,0 @@
export { default as DragModal } from './DragModal.vue'

@ -1,13 +0,0 @@
import FlvPlugin from 'xgplayer-flv'
import HlsPlugin from "xgplayer-hls"
export const settingEnum = {
mp4: {
isLive: false,
},
flv: {
plugins: [FlvPlugin],
},
m3u8: {
plugins: [HlsPlugin],
}
}

@ -1,30 +0,0 @@
import { useRequest } from './useRequest'
import { queryLevel } from '@/api/rule-engine/config';
type LevelListType = Array<{ label: number, value: string}>
export const useAlarmLevel = () => {
const levelMap = ref({})
const levelList = ref<LevelListType>([])
useRequest(queryLevel, {
onSuccess(res) {
if (res.result?.levels?.length) {
const arr: LevelListType = []
levelMap.value = res.result.levels.reduce((prev: Record<string, string>, next: Record<string, any>) => {
prev[next.level] = next.title
arr.push({
label: next.title,
value: next.level
})
return prev
}, {})
levelList.value = arr
}
}
})
return {
levelMap,
levelList
}
}

@ -1,17 +0,0 @@
import { createI18n } from 'vue-i18n'
import zh from './locale/zh.json'
import en from './locale/en.json'
const messages = {
en,
zh,
}
const language = (navigator.language || 'en').toLocaleLowerCase() // 这是获取浏览器的语言
const i18n = createI18n({
locale: localStorage.getItem('lang') || language.split('-')[0] || 'en', // 首先从缓存里拿,没有的话就用浏览器语言,
fallbackLocale: 'en', // 设置备用语言
messages,
legacy: false
})
export default i18n

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -1,8 +0,0 @@
{
"zh": {
"components.StepCard.926510-0": "暂无权限,请联系管理员"
},
"en": {
"components.StepCard.926510-0": "No permission at the moment, please contact the administrator"
}
}

@ -1,36 +0,0 @@
{
"zh": {
"DeviceHome.index.926510-0": "物联网引导",
"DeviceHome.index.926510-1": "设备接入推荐步骤",
"DeviceHome.index.926510-2": "不同的设备因为通信协议的不同,存在接入步骤的差异",
"DeviceHome.index.926510-3": "创建产品",
"DeviceHome.index.926510-4": "创建设备",
"DeviceHome.index.926510-5": "规则引擎",
"DeviceHome.index.926510-6": "产品是设备的集合,通常指一组具有相同功能的设备。物联设备必须通过产品进行接入方式配置。",
"DeviceHome.index.926510-7": "配置产品接入方式",
"DeviceHome.index.926510-8": "通过产品对同一类型的设备进行统一的接入方式配置。请参照设备铭牌说明选择匹配的接入方式。",
"DeviceHome.index.926510-9": "添加测试设备",
"DeviceHome.index.926510-10": "添加单个设备,用于验证产品模型是否配置正确。",
"DeviceHome.index.926510-11": "功能调试",
"DeviceHome.index.926510-12": "对添加的测试设备进行功能调试,验证能否连接到平台,设备功能是否配置正确。",
"DeviceHome.index.926510-13": "批量添加设备",
"DeviceHome.index.926510-14": "批量添加同一产品下的设备"
},
"en": {
"DeviceHome.index.926510-0": "IoT guidance",
"DeviceHome.index.926510-1": "Recommended steps for device access",
"DeviceHome.index.926510-2": "Different devices may have different access steps due to differences in communication protocols",
"DeviceHome.index.926510-3": "Create product",
"DeviceHome.index.926510-4": "Create device",
"DeviceHome.index.926510-5": "Rule engine",
"DeviceHome.index.926510-6": "A product is a collection of devices, usually referring to a group of devices with the same functionality. IoT devices must be configured through product access methods.",
"DeviceHome.index.926510-7": "Configure product access methods",
"DeviceHome.index.926510-8": "Configure unified access methods for devices of the same type through products. Please refer to the instructions on the device nameplate to select the matching access method.",
"DeviceHome.index.926510-9": "Add testing equipment",
"DeviceHome.index.926510-10": "Add a single device to verify if the product model is configured correctly.",
"DeviceHome.index.926510-11": "Functional debugging",
"DeviceHome.index.926510-12": "Perform functional debugging on the added testing equipment to verify if it can connect to the platform and if the device's functions are configured correctly.",
"DeviceHome.index.926510-13": "Batch Add Devices",
"DeviceHome.index.926510-14": "Batch adding devices under the same product"
}
}

@ -1,10 +0,0 @@
{
"zh": {
"InitHome.index.926510-0": "请选择首页视图",
"InitHome.index.926510-1": "保存修改"
},
"en": {
"InitHome.index.926510-0": "Please select the homepage view",
"InitHome.index.926510-1": "Save modifications"
}
}

@ -1,8 +0,0 @@
{
"zh": {
"components.PlatformPicCard.926510-0": "平台架构图"
},
"en": {
"components.PlatformPicCard.926510-0": "Platform architecture diagram"
}
}

@ -1,8 +0,0 @@
{
"zh": {
"home.index.926510-0": "基本信息"
},
"en": {
"home.index.926510-0": "essential information"
}
}

@ -1,14 +0,0 @@
{
"zh": {
"components.DeviceCountCard.926510-0": "设备统计",
"components.DeviceCountCard.926510-1": "详情",
"components.DeviceCountCard.926510-2": "产品数量",
"components.DeviceCountCard.926510-3": "设备数量"
},
"en": {
"components.DeviceCountCard.926510-0": "Equipment statistics",
"components.DeviceCountCard.926510-1": "details",
"components.DeviceCountCard.926510-2": "Product quantity",
"components.DeviceCountCard.926510-3": "Number of devices"
}
}

@ -1,12 +0,0 @@
{
"zh": {
"dialogs.ProductChooseDialog.926510-0": "选择产品",
"dialogs.ProductChooseDialog.926510-1": "产品",
"dialogs.ProductChooseDialog.926510-2": "请选择产品"
},
"en": {
"dialogs.ProductChooseDialog.926510-0": "Select product",
"dialogs.ProductChooseDialog.926510-1": "product",
"dialogs.ProductChooseDialog.926510-2": "Please select a product"
}
}

@ -1,38 +0,0 @@
{
"zh": {
"DevOpsHome.index.926510-0": "运维引导",
"DevOpsHome.index.926510-1": "运维管理推荐步骤",
"DevOpsHome.index.926510-2": "请根据业务需要对下述步骤进行选择性操作。",
"DevOpsHome.index.926510-3": "设备接入配置",
"DevOpsHome.index.926510-4": "日志排查",
"DevOpsHome.index.926510-5": "实时监控",
"DevOpsHome.index.926510-6": "协议管理",
"DevOpsHome.index.926510-7": "根据业务需求自定义开发对应的产品(设备模型)接入协议,并上传到平台。",
"DevOpsHome.index.926510-8": "证书管理",
"DevOpsHome.index.926510-9": "统一维护平台内的证书,用于数据通信加密。",
"DevOpsHome.index.926510-10": "网络组件",
"DevOpsHome.index.926510-11": "根据不同的传输类型配置平台底层网络组件相关参数。",
"DevOpsHome.index.926510-12": "设备接入网关",
"DevOpsHome.index.926510-13": "根据不同的传输类型,关联消息协议,配置设备接入网关相关参数。",
"DevOpsHome.index.926510-14": "日志管理",
"DevOpsHome.index.926510-15": "监控系统日志,及时处理系统异常。"
},
"en": {
"DevOpsHome.index.926510-0": "Operations guidance",
"DevOpsHome.index.926510-1": "Recommended steps for operation and maintenance management",
"DevOpsHome.index.926510-2": "Please perform selective operations on the following steps according to business needs.",
"DevOpsHome.index.926510-3": "Device access configuration",
"DevOpsHome.index.926510-4": "Log troubleshooting",
"DevOpsHome.index.926510-5": "Real time monitoring",
"DevOpsHome.index.926510-6": "Protocol management",
"DevOpsHome.index.926510-7": "Customize and develop corresponding product (device model) access protocols according to business needs, and upload them to the platform.",
"DevOpsHome.index.926510-8": "Certificate Management",
"DevOpsHome.index.926510-9": "Unified maintenance of certificates within the platform for data communication encryption.",
"DevOpsHome.index.926510-10": "Network components",
"DevOpsHome.index.926510-11": "Configure platform underlying network component related parameters based on different transmission types.",
"DevOpsHome.index.926510-12": "Device access gateway",
"DevOpsHome.index.926510-13": "According to different transmission types, associate message protocols, and configure device access gateway related parameters.",
"DevOpsHome.index.926510-14": "Log management",
"DevOpsHome.index.926510-15": "Monitor system logs and promptly handle system exceptions."
}
}

@ -1,24 +0,0 @@
{
"zh": {
"dialogs.DeviceChooseDialog.926510-0": "选择设备",
"dialogs.DeviceChooseDialog.926510-1": "请选择设备",
"dialogs.DeviceChooseDialog.926510-2": "设备ID",
"dialogs.DeviceChooseDialog.926510-3": "设备名称",
"dialogs.DeviceChooseDialog.926510-4": "产品名称",
"dialogs.DeviceChooseDialog.926510-5": "注册时间",
"dialogs.DeviceChooseDialog.926510-6": "状态",
"dialogs.DeviceChooseDialog.926510-7": "在线",
"dialogs.DeviceChooseDialog.926510-8": "离线"
},
"en": {
"dialogs.DeviceChooseDialog.926510-0": "Select device",
"dialogs.DeviceChooseDialog.926510-1": "Please select a device",
"dialogs.DeviceChooseDialog.926510-2": "Device ID",
"dialogs.DeviceChooseDialog.926510-3": "Device Name",
"dialogs.DeviceChooseDialog.926510-4": "Product Name",
"dialogs.DeviceChooseDialog.926510-5": "Registration time",
"dialogs.DeviceChooseDialog.926510-6": "state",
"dialogs.DeviceChooseDialog.926510-7": "on-line",
"dialogs.DeviceChooseDialog.926510-8": "off-line"
}
}

@ -1,8 +0,0 @@
{
"zh": {
"components.BootCard.926510-0": "暂无权限,请联系管理员"
},
"en": {
"components.BootCard.926510-0": "No permission at the moment, please contact the administrator"
}
}

@ -1,14 +0,0 @@
{
"zh": {
"components.BasicCountCard.926510-0": "基础统计",
"components.BasicCountCard.926510-1": "详情",
"components.BasicCountCard.926510-2": "CPU使用率",
"components.BasicCountCard.926510-3": "JVM内存"
},
"en": {
"components.BasicCountCard.926510-0": "Basic statistics",
"components.BasicCountCard.926510-1": "details",
"components.BasicCountCard.926510-2": "CPU usage rate",
"components.BasicCountCard.926510-3": "JVM memory"
}
}

@ -1,8 +0,0 @@
{
"zh": {
"components.BootCardSmall.926510-0": "暂无权限,请联系管理员"
},
"en": {
"components.BootCardSmall.926510-0": "No permission at the moment, please contact the administrator"
}
}

@ -1,68 +0,0 @@
{
"zh": {
"ComprehensiveHome.index.926510-0": "物联网引导",
"ComprehensiveHome.index.926510-1": "运维引导",
"ComprehensiveHome.index.926510-2": "设备接入推荐步骤",
"ComprehensiveHome.index.926510-3": "不同的设备因为通信协议的不同,存在接入步骤的差异",
"ComprehensiveHome.index.926510-4": "运维管理推荐步骤",
"ComprehensiveHome.index.926510-5": "请根据业务需要对下述步骤进行选择性操作。",
"ComprehensiveHome.index.926510-6": "创建产品",
"ComprehensiveHome.index.926510-7": "创建设备",
"ComprehensiveHome.index.926510-8": "规则引擎",
"ComprehensiveHome.index.926510-9": "产品是设备的集合,通常指一组具有相同功能的设备。物联设备必须通过产品进行接入方式配置。",
"ComprehensiveHome.index.926510-10": "配置产品接入方式",
"ComprehensiveHome.index.926510-11": "通过产品对同一类型的设备进行统一的接入方式配置。请参照设备铭牌说明选择匹配的接入方式。",
"ComprehensiveHome.index.926510-12": "添加测试设备",
"ComprehensiveHome.index.926510-13": "添加单个设备,用于验证产品模型是否配置正确。",
"ComprehensiveHome.index.926510-14": "功能调试",
"ComprehensiveHome.index.926510-15": "对添加的测试设备进行功能调试,验证能否连接到平台,设备功能是否配置正确。",
"ComprehensiveHome.index.926510-16": "批量添加设备",
"ComprehensiveHome.index.926510-17": "批量添加同一产品下的设备",
"ComprehensiveHome.index.926510-18": "设备接入配置",
"ComprehensiveHome.index.926510-19": "日志排查",
"ComprehensiveHome.index.926510-20": "实时监控",
"ComprehensiveHome.index.926510-21": "协议管理",
"ComprehensiveHome.index.926510-22": "根据业务需求自定义开发对应的产品(设备模型)接入协议,并上传到平台。",
"ComprehensiveHome.index.926510-23": "证书管理",
"ComprehensiveHome.index.926510-24": "统一维护平台内的证书,用于数据通信加密。",
"ComprehensiveHome.index.926510-25": "网络组件",
"ComprehensiveHome.index.926510-26": "根据不同的传输类型配置平台底层网络组件相关参数。",
"ComprehensiveHome.index.926510-27": "设备接入网关",
"ComprehensiveHome.index.926510-28": "根据不同的传输类型,关联消息协议,配置设备接入网关相关参数。",
"ComprehensiveHome.index.926510-29": "日志管理",
"ComprehensiveHome.index.926510-30": "监控系统日志,及时处理系统异常。"
},
"en": {
"ComprehensiveHome.index.926510-0": "IoT guidance",
"ComprehensiveHome.index.926510-1": "Operations guidance",
"ComprehensiveHome.index.926510-2": "Recommended steps for device access",
"ComprehensiveHome.index.926510-3": "Different devices may have different access steps due to differences in communication protocols",
"ComprehensiveHome.index.926510-4": "Recommended steps for operation and maintenance management",
"ComprehensiveHome.index.926510-5": "Please perform selective operations on the following steps according to business needs.",
"ComprehensiveHome.index.926510-6": "Create product",
"ComprehensiveHome.index.926510-7": "Create device",
"ComprehensiveHome.index.926510-8": "Rule engine",
"ComprehensiveHome.index.926510-9": "A product is a collection of devices, usually referring to a group of devices with the same functionality. IoT devices must be configured through product access methods.",
"ComprehensiveHome.index.926510-10": "Configure product access methods",
"ComprehensiveHome.index.926510-11": "Configure unified access methods for devices of the same type through products. Please refer to the instructions on the device nameplate to select the matching access method.",
"ComprehensiveHome.index.926510-12": "Add testing equipment",
"ComprehensiveHome.index.926510-13": "Add a single device to verify if the product model is configured correctly.",
"ComprehensiveHome.index.926510-14": "Functional debugging",
"ComprehensiveHome.index.926510-15": "Perform functional debugging on the added testing equipment to verify if it can connect to the platform and if the device's functions are configured correctly.",
"ComprehensiveHome.index.926510-16": "Batch Add Devices",
"ComprehensiveHome.index.926510-17": "Batch adding devices under the same product",
"ComprehensiveHome.index.926510-18": "Device access configuration",
"ComprehensiveHome.index.926510-19": "Log troubleshooting",
"ComprehensiveHome.index.926510-20": "Real time monitoring",
"ComprehensiveHome.index.926510-21": "Protocol management",
"ComprehensiveHome.index.926510-22": "Customize and develop corresponding product (device model) access protocols according to business needs, and upload them to the platform.",
"ComprehensiveHome.index.926510-23": "Certificate Management",
"ComprehensiveHome.index.926510-24": "Unified maintenance of certificates within the platform for data communication encryption.",
"ComprehensiveHome.index.926510-25": "Network components",
"ComprehensiveHome.index.926510-26": "Configure platform underlying network component related parameters based on different transmission types.",
"ComprehensiveHome.index.926510-27": "Device access gateway",
"ComprehensiveHome.index.926510-28": "According to different transmission types, associate message protocols, and configure device access gateway related parameters.",
"ComprehensiveHome.index.926510-29": "Log management",
"ComprehensiveHome.index.926510-30": "Monitor system logs and promptly handle system exceptions."
}
}

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save