| | |
| | | :readonly="TreeDataPool.readonly" |
| | | :gb28181="gb28181" |
| | | :setting="setting" |
| | | :search="search" |
| | | @onCreated="handleCreated" |
| | | @onClick="itemClick" |
| | | @onCheck="itemCheck" |
| | | @onAfterSearch="itemCheck" |
| | | @onDblClick="onDblClick" |
| | | @onAddNode="addNode" |
| | | @onRemoveNode="delNode" |
| | |
| | | default: "" |
| | | }, |
| | | gb28181: { |
| | | type: Boolean, |
| | | default: false |
| | | }, |
| | | search: { |
| | | type: Boolean, |
| | | default: false |
| | | }, |
| | |
| | | } |
| | | }, |
| | | onDblClick(evt, treeId, item) { |
| | | if (item.type !== "4" || this.app !== "Camera") { |
| | | if (!item || item.type !== "4" || this.app !== "Camera") { |
| | | return |
| | | } |
| | | // console.log('activeForceChoose', this.TreeDataPool.activeForceChoose) |
| | |
| | | // this.TreeDataPool.updateZTreeCheckNodes([treeNode]); |
| | | // }, |
| | | itemCheck(evt, treeId, treeNode) { |
| | | if (treeNode) { |
| | | this.TreeDataPool.selectedNode = treeNode |
| | | } |
| | | this.TreeDataPool.treeType = this.treeName |
| | | |
| | | // 多选 |
| | |
| | | |
| | | // 保存一份数据 |
| | | this.TreeDataPool.activeTreeData = this.ztreeObj.getNodes() |
| | | this.$emit("itemChecked", treeNode) |
| | | }, |
| | | //展开 |
| | | itemExpand(e, id, node) { |
| | |
| | | <template> |
| | | <div> |
| | | <div class="search"> |
| | | <el-input placeholder="搜索" v-model="keyWord"> |
| | | <i slot="suffix" class="el-input__icon el-icon-search" id="key"></i> |
| | | <el-input placeholder="搜索" v-model="keyWord" size="mini" v-show="search"> |
| | | <i slot="suffix" class="el-input__icon el-icon-search" :id="searchBtnId"></i> |
| | | </el-input> |
| | | </div> |
| | | <div class="ztree" :id="ztreeId"></div> |
| | |
| | | showCheckbox: { type: Boolean, default: false }, |
| | | readonly: { type: Boolean, default: true }, |
| | | gb28181: { type: Boolean, default: false }, |
| | | search: { type: Boolean, default: false }, |
| | | setting: { |
| | | type: Object, |
| | | require: false, |
| | |
| | | data() { |
| | | return { |
| | | ztreeId: "ztree_" + parseInt(Math.random() * 1e10), |
| | | searchBtnId: "search_" + parseInt(Math.random() * 1e10), |
| | | ztreeObj: null, |
| | | list: [], |
| | | loading: false, |
| | | ztreeSetting: { |
| | | view: { |
| | | showLine: true, |
| | |
| | | Object.assign({}, this.ztreeSetting, this.setting), |
| | | this.list |
| | | ) |
| | | this.fuzzySearch(this.ztreeObj, "#key", null, true) //初始化模糊搜索方法 |
| | | this.fuzzySearch(this.ztreeObj, this.searchBtnId, false, true) //初始化模糊搜索方法 |
| | | this.$emit("onCreated", this.ztreeObj) |
| | | }) |
| | | }, |
| | |
| | | |
| | | var nodesShow = zTreeObj.getNodesByFilter(filterFunc) //get all nodes that would be shown |
| | | processShowNodes(nodesShow, _keywords) //nodes should be reprocessed to show correctly |
| | | _this.$emit("onAfterSearch", null) |
| | | } |
| | | |
| | | /** |
| | |
| | | } |
| | | |
| | | //listen to change in input element |
| | | $(searchField).bind("click", function() { |
| | | _this.options.target = document.querySelector("#" + _this.ztreeId).parentNode.parentNode |
| | | $("#" + searchField).bind("click", function() { |
| | | // _this.options.target = document.querySelector("#" + _this.ztreeId).parentNode.parentNode |
| | | // console.log(_this.options.target); |
| | | let loadingInstance = Loading.service(_this.options) |
| | | // let loadingInstance = Loading.service(_this.options) |
| | | // console.log(_this.keyWord); |
| | | // var _keywords = $(this).val(); |
| | | $("#" + searchField).removeClass("el-icon-search") |
| | | $("#" + searchField).addClass("el-icon-loading") |
| | | searchNodeLazy(_this.keyWord) //call lazy load |
| | | loadingInstance.close() |
| | | // loadingInstance.close() |
| | | setTimeout(() => { |
| | | $("#" + searchField).removeClass("el-icon-loading") |
| | | $("#" + searchField).addClass("el-icon-search") |
| | | }, 300) |
| | | }) |
| | | |
| | | var timeoutId = null |
| | | var lastKeyword = "" |
| | | // excute lazy load once after input change, the last pending task will be cancled |
| | | function searchNodeLazy(_keywords) { |
| | | if (timeoutId) { |
| | | //clear pending task |
| | | clearTimeout(timeoutId) |
| | | } |
| | | timeoutId = setTimeout(function() { |
| | | if (lastKeyword === _keywords) { |
| | | return |
| | | } |
| | | ztreeFilter(zTreeObj, _keywords) //lazy load ztreeFilter function |
| | | // $(searchField).focus();//focus input field again after filtering |
| | | lastKeyword = _keywords |
| | | }, 500) |
| | | } |
| | | }, |
| | | handleSearch() { |
| | | this.loading = true |
| | | searchNodeLazy(this.keyWord) //call lazy load |
| | | this.loading = false |
| | | } |
| | | } |
| | | } |
| | |
| | | |
| | | <style scoped lang="scss"> |
| | | .search { |
| | | width: 300px; |
| | | width: 280px; |
| | | margin: 5px 5px; |
| | | |
| | | ::v-deep .el-input__suffix { |
| | | right: 0; |
| | |
| | | type="border-card"
|
| | | @tab-click="hanleTabClick"
|
| | | >
|
| | | <el-tab-pane label="国标ID" name="gb28181">
|
| | | <el-tab-pane label="国标服务" name="gb28181">
|
| | | <div style="width: 775px">
|
| | | <!-- GB28181设置 -->
|
| | | <el-form :model="gb28181" :rules="rules" label-width="130px" class="alarmSetting" ref="gb28181">
|
| | |
| | | <ip-input :ip="gb28181.ServerIp" @on-blur="gb28181.ServerIp = arguments[0]"></ip-input>
|
| | | </el-form-item>-->
|
| | |
|
| | | <div style="text-align: left; margin-bottom: 16px">
|
| | | <div style="text-align: left;margin-bottom: 16px;">
|
| | | <el-radio-group v-model="gb28181.idType">
|
| | | <el-radio :label="0">输入已有ID</el-radio>
|
| | | <el-radio :label="1">生成新的ID</el-radio>
|
| | |
| | | fit
|
| | | highlight-current-row
|
| | | style="width: 100%; color: #000"
|
| | | :header-cell-style="{
|
| | | background: '#f8f8f8',
|
| | | color: '#222222',
|
| | | height: '30px'
|
| | | }"
|
| | | :header-cell-style="{ background: '#f8f8f8', color: '#222222', height: '30px' }"
|
| | | >
|
| | | <el-table-column type="index" label="序号" align="center" width="50"></el-table-column>
|
| | | <el-table-column prop="name" label="名称" align="center"></el-table-column>
|
| | |
| | | <div style="text-align: left">
|
| | | <el-button type="primary" size="small" @click="updateCamerasFromVideosvr">刷新</el-button>
|
| | | </div>
|
| | |
|
| | | <div class="tree-container">
|
| | | <div class="tree-box">
|
| | | <div class="camera-title">
|
| | | <b>国标摄像机配置</b>
|
| | | <span>(最多勾选500路摄像机)</span>
|
| | | <b>国标摄像机</b>
|
| | | </div>
|
| | | <tree-menu
|
| | | ref="tree"
|
| | | ref="ztree"
|
| | | app="gb28181"
|
| | | treeName="localTree"
|
| | | clickType="multiple"
|
| | | :node="TreeDataPool.treeData"
|
| | | :height="treeHeight"
|
| | | :setting="treeSettings"
|
| | | clickType="multiple"
|
| | | style="width: 600px; min-height: 500px"
|
| | | @itemChecked="onItemCheck"
|
| | | search
|
| | | style="width:500px;min-height:500px"
|
| | | />
|
| | | </div>
|
| | |
|
| | | <div class="tree-box">
|
| | | <div class="camera-title">
|
| | | <b>已选摄像机</b>
|
| | | <span>(最多勾选500路摄像机)</span>
|
| | | </div>
|
| | | <!-- <tree-menu
|
| | | ref="dstTree"
|
| | | treeName="localTree"
|
| | | :node="dstTreeData"
|
| | | :height="treeHeight"
|
| | | :setting="treeSettingsSelect"
|
| | | style="width:500px;min-height:500px"
|
| | | /> -->
|
| | | <div class="select-tree-menu" :style="`max-height:${750 - 200}px;`">
|
| | | <z-tree :nodes="dstTreeData" :show-checkbox="false" :gb28181="true" search />
|
| | | </div>
|
| | | </div>
|
| | |
|
| | | <div class="base-image" v-loading="TreeDataPool.baseImageLoading">
|
| | | <span>{{ TreeDataPool.cameraNameForBaseImage }}</span>
|
| | | <div class="camera-image" v-show="TreeDataPool.cameraNameForBaseImage.length">
|
| | | <img :src="'data:image/png;base64,' + TreeDataPool.gb28181CameraBaseImage" width="450px" alt />
|
| | | </div>
|
| | | </div>
|
| | | </div>
|
| | |
|
| | | <el-divider></el-divider>
|
| | |
|
| | | <span class="camera-seleted-text">
|
| | |
| | |
|
| | | import TreeMenu from "@/components/giantTree/index"
|
| | | import { isPort, isIPv4 } from "@/scripts/validate"
|
| | | import bus from "@/plugin/bus"
|
| | | import ZTree from "@/components/giantTree/zTree/ztree"
|
| | |
|
| | | export default {
|
| | | name: "Gb28181Setting",
|
| | | components: {
|
| | | TreeMenu
|
| | | TreeMenu,
|
| | | ZTree
|
| | | },
|
| | | directives: {
|
| | | focus: {
|
| | |
| | | treeSettings: {
|
| | | check: {
|
| | | enable: true
|
| | | }
|
| | | },
|
| | | treeSettingsSelect: {
|
| | | check: {
|
| | | enable: false
|
| | | }
|
| | | },
|
| | | rules: {
|
| | |
| | | provinceOptions: [],
|
| | | cityOptions: [],
|
| | | countyOptions: []
|
| | | }
|
| | | },
|
| | | dstTreeData: []
|
| | | }
|
| | | },
|
| | | mounted() {
|
| | |
| | | } else if (this.activeName == "cameras") {
|
| | | this.getCamerasFromVideosvr()
|
| | | }
|
| | |
|
| | | // this.TreeDataPool.fetchGbTree()
|
| | | // this.dstTreeData = this.TreeDataPool.gb28181Data
|
| | | },
|
| | | async getCamerasFromVideosvr() {
|
| | | this.loading = true
|
| | | await this.TreeDataPool.fetchVideosvrCameras(false)
|
| | | this.dstTreeData = this.TreeDataPool.newTreeByChecked(this.TreeDataPool.treeData)
|
| | | this.loading = false
|
| | | },
|
| | | async updateCamerasFromVideosvr() {
|
| | | this.loading = true
|
| | | await this.TreeDataPool.fetchVideosvrCameras(true)
|
| | | this.loading = false
|
| | | },
|
| | | onItemCheck() {
|
| | | this.dstTreeData = this.TreeDataPool.newTreeByChecked(this.TreeDataPool.activeTreeData)
|
| | | },
|
| | | saveChecked() {
|
| | | localStorage.setItem("ztree_fold_list", JSON.stringify(this.TreeDataPool.foldNodeList))
|
| | |
| | | text-decoration: underline;
|
| | | }
|
| | |
|
| | | .camera-title {
|
| | | text-align: left;
|
| | | padding: 0px 10px;
|
| | | margin: 5px 0px;
|
| | | height: 33px;
|
| | | background-color: #e4e2e2;
|
| | | line-height: 33px;
|
| | | font-size: 14px;
|
| | | }
|
| | |
|
| | | .camera-seleted-text {
|
| | | margin-right: 20px;
|
| | |
|
| | |
| | | }
|
| | | }
|
| | |
|
| | | .tree-container {
|
| | | display: flex;
|
| | | .tree-box {
|
| | | width: 500px;
|
| | | margin: 5px 10px 0px 0px;
|
| | | border: 1px solid #e4e2e2;
|
| | |
|
| | | .camera-title {
|
| | | text-align: left;
|
| | | padding: 0px 10px;
|
| | | margin: 0px 0px;
|
| | | height: 33px;
|
| | | background-color: #e4e2e2;
|
| | | line-height: 33px;
|
| | | font-size: 14px;
|
| | | }
|
| | | }
|
| | |
|
| | | .base-image {
|
| | | position: absolute;
|
| | | top: 18%;
|
| | | left: 57%;
|
| | | margin: 140px 10px;
|
| | | width: 450px;
|
| | | height: 300px;
|
| | |
|
| | | .camera-image {
|
| | | background-color: black;
|
| | | height: 254px;
|
| | | }
|
| | | }
|
| | | .select-tree-menu {
|
| | | // max-width: 350px;
|
| | | overflow-x: hidden;
|
| | | overflow-y: hidden;
|
| | | margin-bottom: 4px;
|
| | | }
|
| | | .select-tree-menu::-webkit-scrollbar {
|
| | | /*滚动条整体样式*/
|
| | | width: 4px; /*高宽分别对应横竖滚动条的尺寸*/
|
| | | height: 4px;
|
| | | }
|
| | | .select-tree-menu::-webkit-scrollbar-thumb {
|
| | | /*滚动条里面小方块*/
|
| | | border-radius: 5px;
|
| | | -webkit-box-shadow: inset 0 0 5px rgba(157, 165, 183, 0);
|
| | | background: rgb(202, 201, 201);
|
| | | }
|
| | | .select-tree-menu::-webkit-scrollbar-track {
|
| | | /*滚动条里面轨道*/
|
| | | -webkit-box-shadow: inset 0 0 5px rgba(157, 165, 183, 0);
|
| | | border-radius: 0;
|
| | | background: rgb(235, 234, 234);
|
| | | }
|
| | | .select-tree-menu::-webkit-scrollbar-thumb:hover {
|
| | | background: rgba(0, 0, 0, 0.4);
|
| | | }
|
| | | .select-tree-menu:hover {
|
| | | overflow-x: visible;
|
| | | overflow-y: auto;
|
| | | margin-bottom: 0px;
|
| | | }
|
| | | }
|
| | | }
|
| | | </style>
|