From 1e1e5f612f252d66b0d0386cf52873bb1f3f7d7b Mon Sep 17 00:00:00 2001 From: haoxuan <haoxuan> Date: 星期五, 01 九月 2023 16:10:37 +0800 Subject: [PATCH] 系统维护+系统监控器+调试工具的app 增加 --- src/components/LeftNav.vue | 310 +++++++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 262 insertions(+), 48 deletions(-) diff --git a/src/components/LeftNav.vue b/src/components/LeftNav.vue index 6fe6546..e63e984 100644 --- a/src/components/LeftNav.vue +++ b/src/components/LeftNav.vue @@ -4,6 +4,7 @@ class="left-tree-box" :style="`height:${height}px;animation-duration: 0.7s`" v-show="TreeDataPool.showTreeBox" + v-loading="menuLoading" > <el-tabs v-model="TreeDataPool.treeActiveName" type="border-card" @tab-click="handleClick"> <el-tab-pane label="鎽勫儚鏈�" name="camera" :style="`height:${height - 56}px;`" v-if="showCam"> @@ -45,7 +46,7 @@ @click="searchAreaData" ></i> </el-input> - <div class="tree-close"> + <!-- <div class="tree-close"> <el-tooltip content="鏀惰捣鐩綍鏍�" placement="bottom" popper-class="atooltip"> <i class="el-icon-s-fold" @@ -53,7 +54,7 @@ @click="closeTree" ></i> </el-tooltip> - </div> + </div>--> </li> <!-- 娣诲姞鍖哄煙鍥炬爣 --> @@ -71,6 +72,16 @@ <button @click="addCamera('0')"> <!-- <i class="el-icon-video-camera"></i> --> <span class="iconfont iconshishishipin" style="font-size:14px;"></span> + </button> + </el-tooltip> + </div> + + <!-- 瀵煎叆璁惧 --> + <div class="tree-edit import-btn" v-show="!TreeDataPool.readonly"> + <el-tooltip content="瀵煎叆璁惧" placement="bottom" popper-class="atooltip"> + <button @click="importCameras('0')"> + <!-- <i class="el-icon-video-camera"></i> --> + <span class="iconfont icondaoru" style="font-size:16px;"></span> </button> </el-tooltip> </div> @@ -101,23 +112,25 @@ :node="TreeDataPool.treeData" :height="height" @addDevice="addCamera" + @import="importCameras" /> </el-menu-item-group> </el-submenu> <el-submenu index="1"> <template slot="title"> - <i class="iconfont iconGBx"></i> + <i class="iconfont iconGBx" style="margin-left:-4px;"></i> <b class="tree-font">GB28181</b> </template> <!-- 鍥芥爣鍒锋柊鍥炬爣 --> - <div class="tree-edit gb-refresh" v-show="!TreeDataPool.gbReadonly"> + <!-- <div class="tree-edit gb-refresh" v-show="!TreeDataPool.gbReadonly"> <el-tooltip content="鍒锋柊" placement="top" popper-class="atooltip"> <button @click="refreshGB"> - <i class="el-icon-refresh" style="font-size:16px"></i> + <i v-if="loadingGBTree" class="el-icon-loading" style="font-size:16px"></i> + <i v-else class="el-icon-refresh" style="font-size:16px"></i> </button> </el-tooltip> - </div> + </div>--> <div class="tree-edit gb-lock" v-show="showLock"> <button @click="gbLockSwitch"> <i v-if="TreeDataPool.gbReadonly" class="el-icon-lock" style="font-size:16px"></i> @@ -140,15 +153,65 @@ </el-menu> </el-tab-pane> <el-tab-pane - label="鏁版嵁鏍�" - name="dataStack" + label="闆嗙兢" + name="cluster" :style="`height:${height - 56}px;`" - v-if="showDataStack" + v-if="showCluster" > <div class="local-vedio-area"> <!-- 鎼滅储 --> + <div class="navTopSelect"> + <div class="search-input flex-box"> + <el-select + v-model="TreeDataPool.searchCamType" + placeholder="璇烽�夋嫨" + @change="searchClusterData" + > + <el-option + v-for="item in searchTypeOptions" + :key="item.value" + :label="item.label" + :value="item.value" + ></el-option> + </el-select> + <span style="display: inline-block;padding: 0px 3px;"></span> + <el-input + v-model="TreeDataPool.searchInput" + placeholder="鎼滅储" + clearable + @input="querySearchAsync('cluster')" + > + <i + class="el-icon-search el-input__icon" + style="color:#DCDFE6" + slot="prefix" + @click="searchClusterData" + ></i> + </el-input> + </div> + </div> + <div class="top-menu" style="margin:0 0 10px;text-align:left;"> + <span class="iconfont iconjiqun" style="font-size:20px;"></span> + <span style="font-size:14px; margin-left: 5px;font-weight: 600;">{{clusterName}}</span> + </div> + <div class="cluster-list"> + <tree-menu + ref="tree" + :app="appName" + :treeName="'localTree'" + :node="TreeDataPool.clusterData" + :height="height" + @addDevice="addCamera" + @import="importCameras" + /> + </div> + </div> + </el-tab-pane> + <el-tab-pane label="鏁版嵁鏍�" name="dataStack" v-if="showDataStack"> + <div class="local-vedio-area"> + <!-- 鎼滅储 --> <div class="search-input"> - <span style="display: inline-block;padding: 0px 3px;"></span> + <!-- <span style="display: inline-block;padding: 0px 3px;"></span> --> <el-select v-model="DataStackPool.searchType" placeholder="璇烽�夋嫨" @@ -170,7 +233,7 @@ size="small" clearable @input="querySearchAsync('dir')" - :style="'width:103px;'" + :style="'width:148px;'" > <i class="el-icon-search el-input__icon" @@ -180,13 +243,13 @@ ></i> </el-input> <!-- 闅愯棌鏍戞寜閽� --> - <div class="dev-tree-close"> + <!-- <div class="dev-tree-close"> <i class="el-icon-s-fold" style="color: #3D68E1;line-height: 22px;font-size: 27px;" @click="closeTree" ></i> - </div> + </div>--> </div> <!-- 鏈湴瑙嗛婧愬垪琛� --> @@ -213,6 +276,20 @@ <file-upload v-show="fileUploadBox" @close="fileUploadBox= false" /> </el-tab-pane> </el-tabs> + + <!-- 瀵煎叆璁惧缁勪欢 浜嬩欢瑙﹀彂 --> + <el-upload + class="upload-btn" + action="https://jsonplaceholder.typicode.com/posts/" + accept=".xlsx" + :on-exceed="exceed" + :limit="10" + :on-remove="remove" + :http-request="uploadFile" + :show-file-list="false" + > + <button ref="import-btn" v-show="false"></button> + </el-upload> </div> </transition> </template> @@ -225,9 +302,17 @@ updateStatus } from "@/api/localVedio"; -import TreeMenu from "@/components/treeMenu/index"; +import { + createCamera, +} from "@/api/camera"; + +import bus from "@/plugin/bus" +// import TreeMenu from "@/components/treeMenu/index"; +import TreeMenu from "@/components/giantTree/index"; import LocalVedioList from '@/components/subComponents/LocalVedioList'; import FileUpload from '@/components/subComponents/FileUpload/index'; +import XLSX from 'xlsx' +import { findCluster } from "@/api/clusterManage"; export default { components: { @@ -255,10 +340,31 @@ return true; }, showCam() { - return this.appName === "Camera" || this.appName === "Search"; + return this.appName === "Camera" || this.appName === 'Cluster' || (this.appName === "Search" && (this.buttonAuthority.indexOf("search:camera") >= 0 || this.isAdmin)); }, + showCluster() { + return this.appName === "Cluster"; + }, + // 鏁版嵁鏍堥厤缃繀椤绘樉绀恒�� 妫�绱㈤�氳繃鏉冮檺鎺у埗鏄剧ず, 鏈畨瑁呮暟鎹爤涔熶笉鏄剧ず showDataStack() { - return this.appName === "DataStack" || this.appName === "Search"; + if (this.appName === "DataStack") { + return true; + } + + if (this.appName === "Search") { + // 鏈畨瑁呮暟鎹爤閰嶇疆 + if (this.installedApps.indexOf("dataStack") >= 0) { + if (this.isAdmin) { + return true; + } + + if (this.buttonAuthority.indexOf("search:stack") >= 0) { + return true; + } + } + } + + return false; }, showLock() { return this.edit; @@ -291,6 +397,7 @@ dataStack: "videoMonitor:dataStack", activeIndexVideo: "", buttonAuthority: sessionStorage.getItem("buttonAuthoritys") || [], + installedApps: sessionStorage.getItem("apps") || [], loginName: JSON.parse(sessionStorage.getItem("userInfo")).username || "鐢ㄦ埛鍚�", searchTypeOptions: [ { @@ -334,28 +441,15 @@ ], timeout: null, fileUploadBox: false, - loadingGBTree: false + loadingGBTree: false, + importAreaId: "", + menuLoading: false, + clusterName: '' }; }, - // watch: { - // $route(to, from) { - // switch (to.name) { - // case "Searching": - // this.cameraAuth = "videoSearch:camera" - // this.dataStack = "videoSearch:dataStack" - // break - // case "VideoManage": - // this.cameraAuth = "VIDEOCAMERA:camera" - // this.dataStack = "VIDEOCAMERA:dataStack" - // break - // default: - // this.cameraAuth = "videoMonitor:camera" - // this.dataStack = "videoMonitor:dataStack" - // } - // // console.log("璺敱鍙樺寲锛�", to, from) - // } - // }, created() { + console.log(this.appName) + console.log(this.showCam) if (this.showCam) { this.TreeDataPool.treeActiveName = "camera" this.TreeDataPool.fetchTreeData(); @@ -365,6 +459,16 @@ this.DataStackPool.fetchFiles(); } + if (this.showCluster) { + this.TreeDataPool.treeActiveName = "cluster" + this.TreeDataPool.fetchClusterTree(); + findCluster().then(res => { + if (res.success) { + this.clusterName = res.data.clusterName; + } + + }) + } }, methods: { searchAreaData() { @@ -373,9 +477,11 @@ searchDataStack() { this.DataStackPool.fetchFiles(); }, + searchClusterData() { + this.TreeDataPool.fetchClusterTree(); + }, lockSwitch() { this.TreeDataPool.readonly = !this.TreeDataPool.readonly; - console.log(this.TreeDataPool.readonly) }, gbLockSwitch() { this.TreeDataPool.gbReadonly = !this.TreeDataPool.gbReadonly; @@ -385,16 +491,16 @@ }, closeTree() { this.TreeDataPool.showTreeBox = false; - // bus.$emit('refreshCompareImg') + bus.$emit('refreshCompareImg') }, addNode(event) { this.$refs.tree.addNode(event, { id: 0 }); }, addCamera(node) { - // bus.$emit("addCameraOnTree", node); + bus.$emit("addCameraOnTree", node); }, addDir(node) { - // bus.$emit("addDirOnTree", node); + bus.$emit("addDirOnTree", node); }, menuOpen(index) { this.TreeDataPool.openeds[index] = true; @@ -421,6 +527,9 @@ this.timeout = setTimeout(() => { if (type === "camera") { this.TreeDataPool.fetchTreeData(); + } + if (type === "cluster") { + this.TreeDataPool.fetchClusterTree(); } if (type === "dir") { this.DataStackPool.fetchFiles(); @@ -506,6 +615,92 @@ refrash(current, pageSize) { this.TreeDataPool.localCurrentPage = current; }, + + importCameras(area) { + this.importAreaId = area + this.$refs["import-btn"].click() + }, + + async uploadFile(params) { + const _file = params.file; + const fileReader = new FileReader(); + fileReader.onload = (ev) => { + this.menuLoading = true; + try { + const data = ev.target.result; + const workbook = XLSX.read(data, { + type: 'binary' + }); + + for (let sheet in workbook.Sheets) { + //寰幆璇诲彇姣忎釜鏂囦欢 + const sheetArray = XLSX.utils.sheet_to_json(workbook.Sheets[sheet]); + //鑻ュ綋鍓峴heet娌℃湁鏁版嵁锛屽垯continue + if (sheetArray.length == 0) { + continue; + } + + let succeed = 0; + let failed = 0; + let promiseArr = []; + for (let item in sheetArray) { + let camera = this.newCamera(); + camera.areaid = this.importAreaId; + camera.name = String(sheetArray[item].name); + camera.rtsp = String(sheetArray[item].rtsp); + camera.addr = String(sheetArray[item].addr); + + promiseArr.push(createCamera(camera)); + } + let _this = this; + Promise.allSettled(promiseArr).then(res => { + res.forEach(item => { + if (item.status === 'fulfilled') { + succeed++; + } else { + failed++; + } + }); + _this.menuLoading = false; + _this.$message({ + type: "success", + message: "鎿嶄綔瀹屾垚, 瀵煎叆鎴愬姛:" + succeed + "涓� 澶辫触:" + failed + "涓�" + }) + _this.TreeDataPool.fetchTreeData(); + }).catch(e => { + console.log(e) + }); + + } + } catch (e) { + this.menuLoading = false + this.$message.warning('鏂囦欢绫诲瀷涓嶆纭紒'); + } + }; + fileReader.readAsBinaryString(_file); + }, + exceed() { + this.$message.error("鏈�澶氬彧鑳戒笂浼�1涓獂ls鏂囦欢"); + }, + //鍒犻櫎鏂囦欢 + remove() { + + }, + newCamera() { + return { + latitude: 0, + rtsp: "", + longitude: 0, + name: "", + addr: "", + areaid: "", + reserved: "", + run_type: -1, + username: "", + password: "", + sensors: [] + } + } } }; </script> @@ -514,12 +709,17 @@ .left-tree-box { float: left; width: 100%; + .el-tabs__nav-prev, + .el-tabs__nav-next { + display: none; + } .el-tabs--border-card { border: none; box-shadow: none; .el-tabs__header { + display: none; border-bottom: none; - margin: 0 0 15px; + //margin: 0 0 15px; } .el-tabs__content { padding: 0; @@ -576,6 +776,10 @@ font-size: 20px; padding: 0px 5px; } + // .el-input__inner:focus { + // outline: none; + // border-color: #3D68E1; + // } .el-menu { border-right: none; } @@ -642,6 +846,7 @@ .search-input { padding-top: 8px; padding-bottom: 12px; + text-align: left; .dev-tree-close { width: 10%; margin-left: 10px; @@ -662,15 +867,17 @@ } .dev-vedio-list { padding: 0 15px; - max-height: 740px; + box-sizing: border-box; + height: calc(100vh - 80px); + //max-height: 740px; overflow-x: hidden; overflow-y: auto; - @media screen and (max-height: 720px) { - max-height: 580px; - } - @media screen and (min-height: 900px) { - max-height: 740px; - } + // @media screen and (max-height: 720px) { + // max-height: 580px; + // } + // @media screen and (min-height: 900px) { + // max-height: 740px; + // } } .dev-vedio-list::-webkit-scrollbar { /*婊氬姩鏉℃暣浣撴牱寮�*/ @@ -690,7 +897,7 @@ } .tree-edit { - z-index: 1; + z-index: 2; font-size: 16px; position: absolute; top: 56px; @@ -727,6 +934,10 @@ .camera-add { left: 128px; } + +.import-btn { + left: 156px; +} .tree-font { font-family: PingFangSC-Medium; font-size: 14px; @@ -753,4 +964,7 @@ color: #606266; } } +.flex-box { + display: flex; +} </style> \ No newline at end of file -- Gitblit v1.8.0