From 0daac085e308ab5dd5557048bbcb28473ae1b7df Mon Sep 17 00:00:00 2001
From: ZZJ <10913410+zzj2100@user.noreply.gitee.com>
Date: 星期三, 27 七月 2022 17:13:32 +0800
Subject: [PATCH] gb18186

---
 src/views/GB28181/components/TableArea.vue                               |  670 ++---------------------
 src/views/hashrate/CameraManage/CameraRules/components/SdkBox.vue        |    2 
 vue.config.js                                                            |    4 
 src/views/GB28181/components/DevList.vue                                 |  122 ++--
 src/views/hashrate/CameraManage/CameraRules/components/SdkSettingBox.vue |    2 
 src/views/search/index.vue                                               |    6 
 src/components/Footer.vue                                                |    2 
 src/views/GB28181/components/TreeArea.vue                                |  105 +++
 src/Pool/TreeData.ts                                                     |   17 
 src/views/hashrate/CameraManage/CameraRules/components/TimeSlider.vue    |    4 
 src/api/search.ts                                                        |   19 
 src/views/search/Searching.vue                                           |   20 
 src/views/equipmentManagement/equipmentList/components/Content.vue       |    2 
 src/api/Gb28181.ts                                                       |   30 
 src/views/search/components/SetBox.vue                                   |  325 +++++++++++
 src/views/equipmentManagement/algorithmDetail/components/Card.vue        |    3 
 src/components/giantTree/index.vue                                       |  129 ++++
 src/api/area.ts                                                          |   38 
 src/views/search/components/CardWindow.vue                               |   10 
 src/views/manageCenter/index.vue                                         |    6 
 src/scripts/httpRequest.ts                                               |    5 
 src/views/GB28181/components/SettingBox.vue                              |   19 
 src/views/hashrate/CameraManage/CameraInfo/index.vue                     |    4 
 src/api/system.ts                                                        |    7 
 src/components/Header.vue                                                |    2 
 src/views/hashrate/CameraManage/CameraRules/index.vue                    |   54 +
 src/views/connectUs/index.vue                                            |    2 
 src/views/equipmentManagement/equipmentDetail/components/FormArea.vue    |   16 
 src/views/GB28181/components/FormArea.vue                                |   13 
 29 files changed, 880 insertions(+), 758 deletions(-)

diff --git a/src/Pool/TreeData.ts b/src/Pool/TreeData.ts
index 7156994..1ff4151 100644
--- a/src/Pool/TreeData.ts
+++ b/src/Pool/TreeData.ts
@@ -67,6 +67,8 @@
   public baseImageLoading: boolean
 
   public activeNode: string
+  public clusterId: string
+  public devId: string
 
 
   constructor() {
@@ -108,6 +110,8 @@
     this.gb28181CameraBaseImage = ""
     this.baseImageLoading = false
     this.activeNode = ''
+    this.clusterId = ''
+    this.devId = ''
 
 
   }
@@ -447,7 +451,7 @@
   }
 
   async refreshGB28181() {
-    await refreshGB28181Tree()
+    await refreshGB28181Tree({})
     // this.fetchGbTree()
   }
 
@@ -485,7 +489,10 @@
     if (update) {
       fn = refreshGB28181Tree
     }
-    const rsp: any = await fn()
+    const rsp: any = await fn({
+      clusterId:this.clusterId,
+      devId:this.devId,
+    })
 
     if (rsp && rsp.success) {
       this.selectedNode = {}
@@ -541,7 +548,11 @@
     this.cameraNameForBaseImage = node.name
 
     try {
-      const rsp: any = await getCameraBaseImage({ id: node.id })
+      const rsp: any = await getCameraBaseImage({ 
+        id: node.id,
+        clusterId: this.clusterId,
+        devId: this.devId,
+      })
 
       if (rsp && rsp.data) {
         this.gb28181CameraBaseImage = rsp.data
diff --git a/src/api/Gb28181.ts b/src/api/Gb28181.ts
index 235a523..171ae36 100644
--- a/src/api/Gb28181.ts
+++ b/src/api/Gb28181.ts
@@ -1,16 +1,17 @@
 import request from '@/scripts/httpRequest'
 
-export const getGB28181Config = () => {
+export const getGB28181Config = (query: any) => {
   return request({
-    url: "/data/api-v/sysset/gb28181ConfigShow",
-    method: "get"
+    url: "/saas/api-s/gb28181/configShow",
+    method: "get",
+    params:query
   });
 };
 
 
 export const saveGB28181Config = (query: any) => {
   return request({
-    url: "/data/api-v/sysset/gb28181ConfEdit",
+    url: "/saas/api-s/gb28181/configEdit",
     method: "post",
     data: query
   });
@@ -18,7 +19,7 @@
 
 export const getGb28181AreaList = (query: any) => {
   return request({
-    url: "/data/api-v/gb28181/findAreaByParentId",
+    url: "/saas/api-s/gb28181/findAreaByParentId",
     method: "get",
     params: query
   });
@@ -26,15 +27,15 @@
 
 export const getAllSubServer = (query: any) => {
   return request({
-    url: "/data/api-v/gb28181/getAllSubServer",
-    method: "get",
-    params: query
+    url: "/saas/api-s/gb28181/getAllSubServer",
+    method: "post",
+    data: query
   });
 };
 
 export const newGb28181ID = (query: any) => {
   return request({
-    url: "/data/api-v/gb28181/newGbId",
+    url: "/saas/api-s/gb28181/newGbId",
     method: "get",
     params: query
   });
@@ -65,8 +66,17 @@
 
 export const saveGb28181CamTree = (query: any) => {
   return request({
-    url: "/data/api-v/gb28181/saveGb28181CamTree",
+    url: "/saas/api-s/gb28181/autoSaveGb28181CamTree",
     method: "post",
     data: query
   });
 };
+
+export const saveTree = (data) => {
+  return request({
+    url: "/saas/api-s/gb28181/saveGb28181CamTree",
+    method: "post",
+    data
+  });
+};
+
diff --git a/src/api/area.ts b/src/api/area.ts
index 087b428..a8ce2ad 100644
--- a/src/api/area.ts
+++ b/src/api/area.ts
@@ -49,25 +49,27 @@
   });
 };
 
-export const getCameraBaseImage = (query: any) => {
+export const getCameraBaseImage = (data: any) => {
   return request({
-    url: "/data/api-v/gb28181/camera/capture",
-    method: "get",
-    params: query
-  });
-};
-
-export const getGb28181Pool = () => {
-  return request({
-    url: "/data/api-v/gb28181/treeSelected",
-    method: "get"
-  });
-};
-
-export const refreshGB28181Tree = () => {
-  return request({
-    url: "/data/api-v/gb28181/treeRefresh",
+    url: "/saas/api-s/gb28181/camera/capture",
     method: "post",
+    data
+  });
+};
+
+export const getGb28181Pool = (data) => {
+  return request({
+    url: "/saas/api-s/gb28181/treeSelected",
+    method: "post",
+    data
+  });
+};
+
+export const refreshGB28181Tree = (data) => {
+  return request({
+    url: "/saas/api-s/gb28181/treeRefresh",
+    method: "post",
+    data
   });
 };
 
@@ -78,3 +80,5 @@
     data: qs.stringify(query)
   });
 };
+
+
diff --git a/src/api/search.ts b/src/api/search.ts
index 74c4dee..618cf75 100644
--- a/src/api/search.ts
+++ b/src/api/search.ts
@@ -62,4 +62,21 @@
     method: "post",
     data: query
   });
-};
\ No newline at end of file
+};
+
+// 鑾峰彇閰嶇疆
+export const config = () => {
+  return request({
+    url: "/saas/api-s/es/config",
+    method: "get",
+  });
+};
+
+// 淇濆瓨閰嶇疆
+export const saveEsConfig = (query: any) => {
+  return request({
+    url: " /saas/api-s/es/saveEsConfig",
+    method: "post",
+    data: query
+  });
+};
diff --git a/src/api/system.ts b/src/api/system.ts
index e1cc118..5780091 100644
--- a/src/api/system.ts
+++ b/src/api/system.ts
@@ -68,10 +68,11 @@
   });
 };
 
-export const getGB28181Config = () => {
+export const getGB28181Config = (query: any) => {
   return request({
-    url: "/data/api-v/gb28181/configShow",
-    method: "get"
+    url: "/saas/api-s/gb28181/configShow",
+    method: "get",
+    params:query
   });
 };
 
diff --git a/src/components/Footer.vue b/src/components/Footer.vue
index 006050c..0ccb1c8 100644
--- a/src/components/Footer.vue
+++ b/src/components/Footer.vue
@@ -24,7 +24,7 @@
   },
   methods: {
     jump() {
-      window.open("http://www.smartai.com/contact");
+      window.open("http://www.smartai.com/about");
     },
     jump2() {
       window.open("http://www.smartai.com/consult");
diff --git a/src/components/Header.vue b/src/components/Header.vue
index 75b8a2c..6d1040a 100644
--- a/src/components/Header.vue
+++ b/src/components/Header.vue
@@ -17,7 +17,7 @@
 export default {
   methods: {
     jump() {
-      window.open("http://www.smartai.com/contact");
+      window.open("http://www.smartai.com/about");
     },
     jump2() {
       window.open("http://www.smartai.com/consult");
diff --git a/src/components/giantTree/index.vue b/src/components/giantTree/index.vue
index c04cbae..9351497 100644
--- a/src/components/giantTree/index.vue
+++ b/src/components/giantTree/index.vue
@@ -1,5 +1,28 @@
 <template>
   <div class="tree-menu" :style="`max-height:${height - 200}px;`">
+    <div class="devArea">
+      <swiper :options="swiperOption" v-if="showDevArea">
+        <swiper-slide
+          v-for="item in nodeList"
+          :key="item.devId"
+          :class="{ active: activeTabObj.devId === item.devId }"
+        >
+          <div class="tab" @click="chooseTab(item)">
+            {{ item.devName }}
+          </div>
+        </swiper-slide>
+      </swiper>
+      <div class="swiper-pre-border" v-if="showDevArea">
+        <div class="icon-btn" slot="button-prev">
+          <i class="iconfont">&#xe618;</i>
+        </div>
+      </div>
+      <div class="swiper-next-border" v-if="showDevArea">
+        <div class="icon-btn" slot="button-next">
+          <i class="iconfont">&#xe623;</i>
+        </div>
+      </div>
+    </div>
     <z-tree
       :nodes="node"
       :show-checkbox="TreeDataPool.multiple"
@@ -92,6 +115,11 @@
       type: Boolean,
       default: false,
     },
+    showDevArea: {
+      type: Boolean,
+      default: false,
+    },
+    nodeList: {},
   },
   data() {
     return {
@@ -108,9 +136,27 @@
         ],
       },
       curNodeTid: "",
+
+      activeTabObj: {},
+      swiperOption: {
+        slidesPerView: 3,
+        spaceBetween: 0,
+        pagination: {
+          el: ".swiper-pagination",
+          clickable: true,
+        },
+        navigation: {
+          nextEl: ".swiper-next-border",
+          prevEl: ".swiper-pre-border",
+        },
+        observer: true, //淇敼swiper鑷繁鎴栧瓙鍏冪礌鏃讹紝鑷姩鍒濆鍖杝wiper
+        observeParents: true, //淇敼swiper鐨勭埗鍏冪礌鏃讹紝鑷姩鍒濆鍖杝wiper
+      },
     };
   },
   created() {
+    this.activeTabObj =
+      this.nodeList && this.nodeList.length > 0 ? this.nodeList[0] : "";
     this.TreeDataPool.zTree = true;
     this.TreeDataPool.activeVideoIndex = sessionStorage.activeIndexVideo
       ? Number(sessionStorage.activeIndexVideo)
@@ -121,6 +167,9 @@
       if (newValue !== this.treeName) {
         this.TreeDataPool.cleanTree(this.treeName);
       }
+    },
+    showDevArea: function () {
+      this.$forceUpdate();
     },
   },
   methods: {
@@ -153,6 +202,12 @@
 
         this.ztreeObj.selectNode(node, false, true);
       }
+    },
+    chooseTab(item) {
+      this.$emit("saveTree", this.activeTabObj);
+      setTimeout(() => {
+        this.activeTabObj = item;
+      }, 100);
     },
 
     findTidByIdFromArr(arr) {
@@ -357,6 +412,9 @@
 };
 </script>
 <style lang="scss" scoped>
+.devArea {
+}
+
 .dialog-box {
   position: absolute;
   width: 220px;
@@ -445,4 +503,75 @@
 .tree-menu:hover {
   overflow-y: auto;
 }
+
+.devArea {
+  position: relative;
+  margin: 20px;
+  background: #f0f5fa;
+  padding: 0 40px;
+
+  .swiper-slide {
+    display: flex;
+    align-items: center;
+    height: 46px;
+
+    &.active {
+      .tab {
+        color: #0064ff;
+      }
+      border-bottom: 2px solid #0064ff;
+    }
+
+    .tab {
+      margin: 0 12px 0 24px;
+      font-size: 14px;
+      color: #666;
+      cursor: pointer;
+    }
+
+    .iconfont {
+      font-size: 12px;
+      color: #dbdbdb;
+    }
+  }
+
+  .swiper-pre-border {
+    position: absolute;
+    padding-bottom: 13px;
+    padding-right: 18px;
+    top: 12px;
+    left: 10px;
+    cursor: pointer;
+
+    i {
+      font-size: 16px;
+      color: #999;
+    }
+  }
+
+  .swiper-next-border {
+    position: absolute;
+    top: 12px;
+    right: 10px;
+    padding-bottom: 13px;
+    padding-left: 18px;
+    cursor: pointer;
+
+    i {
+      font-size: 16px;
+      color: #999;
+    }
+  }
+
+  .swiper-button-disabled {
+    cursor: not-allowed;
+    i {
+      color: #dbdbdb;
+    }
+  }
+
+  .del {
+    cursor: pointer;
+  }
+}
 </style>
diff --git a/src/scripts/httpRequest.ts b/src/scripts/httpRequest.ts
index 36ccb94..4a82703 100644
--- a/src/scripts/httpRequest.ts
+++ b/src/scripts/httpRequest.ts
@@ -38,6 +38,11 @@
       if(config.url === '/saas/api-d/device/userClusterInfo') {
          config.data.clusterId = ''
       }
+
+       if(config.url === '/saas/api-s/es/saveEsConfig') {
+        delete config.data.clusterId
+        delete config.data.devId
+      }
      
     }
 
diff --git a/src/views/GB28181/components/DevList.vue b/src/views/GB28181/components/DevList.vue
index 396f565..83ae5ea 100644
--- a/src/views/GB28181/components/DevList.vue
+++ b/src/views/GB28181/components/DevList.vue
@@ -4,25 +4,45 @@
     <div class="empty" v-if="devList.length === 0">
       <img src="/images/search/1.png" alt="" />
       <div class="des">鎮ㄨ繕鏈坊鍔犻泦缇ゆ垨璁惧锛岃鍦ㄨ澶囩鐞嗕腑娣诲姞</div>
-      <div class="button add">绔嬪嵆娣诲姞</div>
+      <div class="button add" @click="$router.push('/equipmentList')">
+        绔嬪嵆娣诲姞
+      </div>
     </div>
     <div class="list scroll">
-      <div class="devItem" v-for="(item, index) in devList" :key="index">
+      <div class="devItem" v-for="(item, index) in clusterList" :key="index">
         <div class="mainInfo">
-          <img
-            v-if="item.type == 1"
-            src="/images/hashrate/cluster.png"
-            alt=""
-          />
-          <img v-else src="/images/hashrate/equipment.png" alt="" />
+          <img src="/images/hashrate/cluster.png" alt="" />
 
           <div class="right">
-            <div class="name">闆嗙兢123</div>
-            <div class="ip">192.168.1.1</div>
-            <div class="number">璁惧鎬婚噺:7</div>
+            <div class="name">{{ item.cluster_name }}</div>
+            <div class="ip">{{ item.virtual_ip }}</div>
+            <div class="number">璁惧鎬婚噺:{{ item.nodeNum }}</div>
           </div>
 
-          <div class="button set" @click="showSettingBox = true">閰嶇疆</div>
+          <div
+            class="button set"
+            @click="setting({ clusterId: item.cluster_id }, item.nodeList)"
+          >
+            閰嶇疆
+          </div>
+        </div>
+      </div>
+      <div
+        class="devItem"
+        v-for="(item, index) in devList"
+        :key="index + 'dev'"
+      >
+        <div class="mainInfo">
+          <img src="/images/hashrate/equipment.png" alt="" />
+
+          <div class="right">
+            <div class="name">{{ item.devName }}</div>
+            <div class="ip">{{ item.devIp }}</div>
+          </div>
+
+          <div class="button set" @click="setting({ devId: item.devId })">
+            閰嶇疆
+          </div>
         </div>
       </div>
     </div>
@@ -30,73 +50,45 @@
     <SettingBox
       v-if="showSettingBox"
       @close="showSettingBox = false"
+      :id="idObj"
+      :nodeList="nodeList"
     ></SettingBox>
   </div>
 </template>
 
 <script>
 import SettingBox from "@/views/GB28181/components/SettingBox";
+import { getClusterDevList } from "@/api/clusterManage";
 
 export default {
   components: {
     SettingBox,
   },
+  created() {
+    this.getClusterDevList();
+  },
   data() {
     return {
-      devList: [
-        {
-          type: 1,
-        },
-        {
-          type: 1,
-        },
-
-        {
-          type: 1,
-        },
-        {
-          type: 1,
-        },
-        {
-          type: 1,
-        },
-        {
-          type: 1,
-        },
-
-        {
-          type: 1,
-        },
-        {
-          type: 1,
-        },
-        {
-          type: 1,
-        },
-        {
-          type: 1,
-        },
-        {
-          type: 1,
-        },
-        {
-          type: 1,
-        },
-        {
-          type: 1,
-        },
-        {
-          type: 1,
-        },
-        {
-          type: 0,
-        },
-        {
-          type: 0,
-        },
-      ],
+      clusterList: [],
+      devList: [],
       showSettingBox: false,
+      idObj: {},
+      nodeList: [],
     };
+  },
+  methods: {
+    async getClusterDevList() {
+      const res = await getClusterDevList();
+      if (res && res.success) {
+        this.clusterList = res.data.clusterList;
+        this.devList = res.data.devList;
+      }
+    },
+    setting(id, nodeList) {
+      this.idObj = id;
+      this.nodeList = nodeList ? nodeList : [];
+      this.showSettingBox = true;
+    },
   },
 };
 </script>
@@ -213,4 +205,4 @@
     }
   }
 }
-</style>
\ No newline at end of file
+</style>
diff --git a/src/views/GB28181/components/FormArea.vue b/src/views/GB28181/components/FormArea.vue
index 9184634..42bfb6f 100644
--- a/src/views/GB28181/components/FormArea.vue
+++ b/src/views/GB28181/components/FormArea.vue
@@ -116,6 +116,9 @@
 import { isPort, isIPv4 } from "@/scripts/validate";
 
 export default {
+  props: {
+    id: {},
+  },
   created() {
     this.initGB28181Conf();
   },
@@ -168,7 +171,7 @@
   },
   methods: {
     initGB28181Conf() {
-      getGB28181Config().then((rsp) => {
+      getGB28181Config(this.id).then((rsp) => {
         if (rsp && rsp.success) {
           this.gb28181 = rsp.data;
           //this.gb28181.idType = 0;
@@ -179,7 +182,7 @@
       });
       getGb28181AreaList().then((rsp) => {
         if (rsp && rsp.success) {
-          this.locationCity.provinceOptions = rsp.data;
+          this.locationCity.provinceOptions = rsp.data.list;
         }
       });
     },
@@ -205,7 +208,7 @@
       let pid = this.locationCity.province;
       getGb28181AreaList({ parentId: pid }).then((rsp) => {
         if (rsp && rsp.success) {
-          this.locationCity.cityOptions = rsp.data;
+          this.locationCity.cityOptions = rsp.data.list;
           this.locationCity.city = this.locationCity.cityOptions[0].id;
           this.changeCity();
         }
@@ -215,7 +218,7 @@
       let pid = this.locationCity.city;
       getGb28181AreaList({ parentId: pid }).then((rsp) => {
         if (rsp && rsp.success) {
-          this.locationCity.countyOptions = rsp.data;
+          this.locationCity.countyOptions = rsp.data.list;
           this.locationCity.county = this.locationCity.countyOptions[0].id;
         }
       });
@@ -224,7 +227,7 @@
       let cCode = this.locationCity.county + "";
       newGb28181ID({ code: cCode }).then((rsp) => {
         if (rsp && rsp.success) {
-          this.gb28181.PublicId = rsp.data;
+          this.gb28181.PublicId = rsp.data.code;
         }
       });
     },
diff --git a/src/views/GB28181/components/SettingBox.vue b/src/views/GB28181/components/SettingBox.vue
index 0815666..fcf1cca 100644
--- a/src/views/GB28181/components/SettingBox.vue
+++ b/src/views/GB28181/components/SettingBox.vue
@@ -27,9 +27,18 @@
         </div>
       </div>
 
-      <FormArea @close="$emit('close')" v-if="activeTab === 0"></FormArea>
-      <TableArea v-if="activeTab === 1"></TableArea>
-      <TreeArea @close="$emit('close')" v-if="activeTab === 2"></TreeArea>
+      <FormArea
+        :id="id"
+        @close="$emit('close')"
+        v-if="activeTab === 0"
+      ></FormArea>
+      <TableArea :id="id" v-if="activeTab === 1"></TableArea>
+      <TreeArea
+        :id="id"
+        :nodeList="nodeList"
+        @close="$emit('close')"
+        v-if="activeTab === 2"
+      ></TreeArea>
     </div>
   </div>
 </template>
@@ -45,6 +54,10 @@
     TableArea,
     TreeArea,
   },
+  props: {
+    id: {},
+    nodeList: {},
+  },
   data() {
     return {
       activeTab: 0,
diff --git a/src/views/GB28181/components/TableArea.vue b/src/views/GB28181/components/TableArea.vue
index 3539206..87561d5 100644
--- a/src/views/GB28181/components/TableArea.vue
+++ b/src/views/GB28181/components/TableArea.vue
@@ -1,38 +1,40 @@
 <template>
   <div class="TableArea">
-    <el-table
-      :data="subDevTable"
-      fit
-      highlight-current-row
-      style="width: 100%"
-      height="500"
-    >
-      <el-table-column
-        type="index"
-        label="搴忓彿"
-        align="center"
-        width="80"
-      ></el-table-column>
-      <el-table-column
-        prop="name"
-        label="鍚嶇О"
-        show-overflow-tooltip
-      ></el-table-column>
-      <el-table-column
-        prop="publicid"
-        label="ID"
-        show-overflow-tooltip
-      ></el-table-column>
-      <el-table-column prop="ip" label="IP"></el-table-column>
-      <el-table-column prop="status" label="鐘舵��" align="center">
-        <template slot-scope="scope">
-          <span :style="scope.row.alive ? `color:#36B24A` : 'color:#FF4B33;'">{{
-            scope.row.alive ? "鍦ㄧ嚎" : "绂荤嚎"
-          }}</span>
-        </template>
-      </el-table-column>
-      <el-table-column prop="corp" label="澶囨敞"></el-table-column>
-    </el-table>
+    <div class="content">
+      <el-table
+        :data="subDevTable"
+        fit
+        highlight-current-row
+        style="width: 100%"
+      >
+        <el-table-column
+          type="index"
+          label="搴忓彿"
+          align="center"
+          width="80"
+        ></el-table-column>
+        <el-table-column
+          prop="name"
+          label="鍚嶇О"
+          show-overflow-tooltip
+        ></el-table-column>
+        <el-table-column
+          prop="publicid"
+          label="ID"
+          show-overflow-tooltip
+        ></el-table-column>
+        <el-table-column prop="ip" label="IP"></el-table-column>
+        <el-table-column prop="status" label="鐘舵��" align="center">
+          <template slot-scope="scope">
+            <span
+              :style="scope.row.alive ? `color:#36B24A` : 'color:#FF4B33;'"
+              >{{ scope.row.alive ? "鍦ㄧ嚎" : "绂荤嚎" }}</span
+            >
+          </template>
+        </el-table-column>
+        <el-table-column prop="corp" label="澶囨敞"></el-table-column>
+      </el-table>
+    </div>
   </div>
 </template>
 
@@ -40,6 +42,9 @@
 import { getAllSubServer } from "@/api/Gb28181";
 
 export default {
+  props: {
+    id: {},
+  },
   created() {
     this.getList();
   },
@@ -50,586 +55,22 @@
   },
   methods: {
     async getList() {
-      console.log(12121);
-      // const res = await getAllSubServer();
-      this.subDevTable = [
-        {
-          alive: 0,
-          corp: "",
-          devmode: "gb28181",
-          ip: "218.11.13.177",
-          name: "",
-          parentid: "11011400011121000001",
-          passwd: "",
-          port: 15060,
-          publicid: "34020000002000000001",
-          username: "",
-        },
-        {
-          alive: 1,
-          corp: "",
-          devmode: "gb28181",
-          ip: "192.168.5.53",
-          name: "",
-          parentid: "11011400011121000001",
-          passwd: "",
-          port: 5060,
-          publicid: "34020000001320000001",
-          username: "",
-        },
-        {
-          alive: 0,
-          corp: "",
-          devmode: "gb28181",
-          ip: "194.5.215.118",
-          name: "",
-          parentid: "11011400011121000001",
-          passwd: "",
-          port: 60783,
-          publicid: "1278",
-          username: "",
-        },
-        {
-          alive: 0,
-          corp: "",
-          devmode: "gb28181",
-          ip: "138.199.42.181",
-          name: "",
-          parentid: "11011400011121000001",
-          passwd: "",
-          port: 53998,
-          publicid: "2376",
-          username: "",
-        },
-        {
-          alive: 0,
-          corp: "",
-          devmode: "gb28181",
-          ip: "156.146.50.98",
-          name: "",
-          parentid: "11011400011121000001",
-          passwd: "",
-          port: 49420,
-          publicid: "2924",
-          username: "",
-        },
-        {
-          alive: 0,
-          corp: "",
-          devmode: "gb28181",
-          ip: "149.34.242.65",
-          name: "",
-          parentid: "11011400011121000001",
-          passwd: "",
-          port: 54724,
-          publicid: "3775",
-          username: "",
-        },
-        {
-          alive: 0,
-          corp: "",
-          devmode: "gb28181",
-          ip: "188.240.57.118",
-          name: "",
-          parentid: "11011400011121000001",
-          passwd: "",
-          port: 61962,
-          publicid: "4423",
-          username: "",
-        },
-        {
-          alive: 0,
-          corp: "",
-          devmode: "gb28181",
-          ip: "89.37.173.34",
-          name: "",
-          parentid: "11011400011121000001",
-          passwd: "",
-          port: 58343,
-          publicid: "4877",
-          username: "",
-        },
-        {
-          alive: 0,
-          corp: "",
-          devmode: "gb28181",
-          ip: "89.187.162.185",
-          name: "",
-          parentid: "11011400011121000001",
-          passwd: "",
-          port: 56095,
-          publicid: "391",
-          username: "",
-        },
-        {
-          alive: 0,
-          corp: "",
-          devmode: "gb28181",
-          ip: "62.197.145.4",
-          name: "",
-          parentid: "11011400011121000001",
-          passwd: "",
-          port: 60973,
-          publicid: "1872",
-          username: "",
-        },
-        {
-          alive: 0,
-          corp: "",
-          devmode: "gb28181",
-          ip: "45.134.212.244",
-          name: "",
-          parentid: "11011400011121000001",
-          passwd: "",
-          port: 55040,
-          publicid: "4379",
-          username: "",
-        },
-        {
-          alive: 0,
-          corp: "",
-          devmode: "gb28181",
-          ip: "194.33.40.115",
-          name: "",
-          parentid: "11011400011121000001",
-          passwd: "",
-          port: 51789,
-          publicid: "4923",
-          username: "",
-        },
-        {
-          alive: 0,
-          corp: "",
-          devmode: "gb28181",
-          ip: "91.219.215.52",
-          name: "",
-          parentid: "11011400011121000001",
-          passwd: "",
-          port: 52951,
-          publicid: "1885",
-          username: "",
-        },
-        {
-          alive: 0,
-          corp: "",
-          devmode: "gb28181",
-          ip: "185.99.3.103",
-          name: "",
-          parentid: "11011400011121000001",
-          passwd: "",
-          port: 60547,
-          publicid: "3377",
-          username: "",
-        },
-        {
-          alive: 0,
-          corp: "",
-          devmode: "gb28181",
-          ip: "213.152.165.107",
-          name: "",
-          parentid: "11011400011121000001",
-          passwd: "",
-          port: 62282,
-          publicid: "769",
-          username: "",
-        },
-        {
-          alive: 0,
-          corp: "",
-          devmode: "gb28181",
-          ip: "129.227.219.8",
-          name: "",
-          parentid: "11011400011121000001",
-          passwd: "",
-          port: 53877,
-          publicid: "1271",
-          username: "",
-        },
-        {
-          alive: 0,
-          corp: "",
-          devmode: "gb28181",
-          ip: "45.9.249.244",
-          name: "",
-          parentid: "11011400011121000001",
-          passwd: "",
-          port: 57637,
-          publicid: "3424",
-          username: "",
-        },
-        {
-          alive: 0,
-          corp: "",
-          devmode: "gb28181",
-          ip: "45.136.155.91",
-          name: "",
-          parentid: "11011400011121000001",
-          passwd: "",
-          port: 55749,
-          publicid: "2877",
-          username: "",
-        },
-        {
-          alive: 0,
-          corp: "",
-          devmode: "gb28181",
-          ip: "156.146.50.98",
-          name: "",
-          parentid: "11011400011121000001",
-          passwd: "",
-          port: 49162,
-          publicid: "2925",
-          username: "",
-        },
-        {
-          alive: 0,
-          corp: "",
-          devmode: "gb28181",
-          ip: "194.5.215.118",
-          name: "",
-          parentid: "11011400011121000001",
-          passwd: "",
-          port: 50858,
-          publicid: "1279",
-          username: "",
-        },
-        {
-          alive: 0,
-          corp: "",
-          devmode: "gb28181",
-          ip: "188.240.57.118",
-          name: "",
-          parentid: "11011400011121000001",
-          passwd: "",
-          port: 61692,
-          publicid: "4424",
-          username: "",
-        },
-        {
-          alive: 0,
-          corp: "",
-          devmode: "gb28181",
-          ip: "138.199.42.181",
-          name: "",
-          parentid: "11011400011121000001",
-          passwd: "",
-          port: 58970,
-          publicid: "2377",
-          username: "",
-        },
-        {
-          alive: 0,
-          corp: "",
-          devmode: "gb28181",
-          ip: "149.34.242.65",
-          name: "",
-          parentid: "11011400011121000001",
-          passwd: "",
-          port: 54856,
-          publicid: "3776",
-          username: "",
-        },
-        {
-          alive: 0,
-          corp: "",
-          devmode: "gb28181",
-          ip: "89.187.162.185",
-          name: "",
-          parentid: "11011400011121000001",
-          passwd: "",
-          port: 52956,
-          publicid: "392",
-          username: "",
-        },
-        {
-          alive: 0,
-          corp: "",
-          devmode: "gb28181",
-          ip: "194.33.40.115",
-          name: "",
-          parentid: "11011400011121000001",
-          passwd: "",
-          port: 64302,
-          publicid: "4924",
-          username: "",
-        },
-        {
-          alive: 0,
-          corp: "",
-          devmode: "gb28181",
-          ip: "45.134.212.244",
-          name: "",
-          parentid: "11011400011121000001",
-          passwd: "",
-          port: 63807,
-          publicid: "4380",
-          username: "",
-        },
-        {
-          alive: 0,
-          corp: "",
-          devmode: "gb28181",
-          ip: "91.219.215.52",
-          name: "",
-          parentid: "11011400011121000001",
-          passwd: "",
-          port: 64985,
-          publicid: "1886",
-          username: "",
-        },
-        {
-          alive: 0,
-          corp: "",
-          devmode: "gb28181",
-          ip: "45.9.249.244",
-          name: "",
-          parentid: "11011400011121000001",
-          passwd: "",
-          port: 57372,
-          publicid: "3425",
-          username: "",
-        },
-        {
-          alive: 0,
-          corp: "",
-          devmode: "gb28181",
-          ip: "213.152.165.107",
-          name: "",
-          parentid: "11011400011121000001",
-          passwd: "",
-          port: 49539,
-          publicid: "770",
-          username: "",
-        },
-        {
-          alive: 0,
-          corp: "",
-          devmode: "gb28181",
-          ip: "45.136.155.91",
-          name: "",
-          parentid: "11011400011121000001",
-          passwd: "",
-          port: 60032,
-          publicid: "2878",
-          username: "",
-        },
-        {
-          alive: 0,
-          corp: "",
-          devmode: "gb28181",
-          ip: "156.146.50.98",
-          name: "",
-          parentid: "11011400011121000001",
-          passwd: "",
-          port: 65234,
-          publicid: "2926",
-          username: "",
-        },
-        {
-          alive: 0,
-          corp: "",
-          devmode: "gb28181",
-          ip: "188.240.57.118",
-          name: "",
-          parentid: "11011400011121000001",
-          passwd: "",
-          port: 61386,
-          publicid: "4425",
-          username: "",
-        },
-        {
-          alive: 0,
-          corp: "",
-          devmode: "gb28181",
-          ip: "194.5.215.118",
-          name: "",
-          parentid: "11011400011121000001",
-          passwd: "",
-          port: 62886,
-          publicid: "1280",
-          username: "",
-        },
-        {
-          alive: 0,
-          corp: "",
-          devmode: "gb28181",
-          ip: "149.34.242.65",
-          name: "",
-          parentid: "11011400011121000001",
-          passwd: "",
-          port: 57416,
-          publicid: "3777",
-          username: "",
-        },
-        {
-          alive: 0,
-          corp: "",
-          devmode: "gb28181",
-          ip: "194.33.40.115",
-          name: "",
-          parentid: "11011400011121000001",
-          passwd: "",
-          port: 65530,
-          publicid: "4925",
-          username: "",
-        },
-        {
-          alive: 0,
-          corp: "",
-          devmode: "gb28181",
-          ip: "89.187.162.185",
-          name: "",
-          parentid: "11011400011121000001",
-          passwd: "",
-          port: 59341,
-          publicid: "393",
-          username: "",
-        },
-        {
-          alive: 0,
-          corp: "",
-          devmode: "gb28181",
-          ip: "45.134.212.244",
-          name: "",
-          parentid: "11011400011121000001",
-          passwd: "",
-          port: 49608,
-          publicid: "4381",
-          username: "",
-        },
-        {
-          alive: 0,
-          corp: "",
-          devmode: "gb28181",
-          ip: "91.219.215.52",
-          name: "",
-          parentid: "11011400011121000001",
-          passwd: "",
-          port: 62294,
-          publicid: "1887",
-          username: "",
-        },
-        {
-          alive: 0,
-          corp: "",
-          devmode: "gb28181",
-          ip: "45.9.249.244",
-          name: "",
-          parentid: "11011400011121000001",
-          passwd: "",
-          port: 57068,
-          publicid: "3426",
-          username: "",
-        },
-        {
-          alive: 0,
-          corp: "",
-          devmode: "gb28181",
-          ip: "213.152.165.107",
-          name: "",
-          parentid: "11011400011121000001",
-          passwd: "",
-          port: 61066,
-          publicid: "771",
-          username: "",
-        },
-        {
-          alive: 0,
-          corp: "",
-          devmode: "gb28181",
-          ip: "156.146.50.98",
-          name: "",
-          parentid: "11011400011121000001",
-          passwd: "",
-          port: 64946,
-          publicid: "2927",
-          username: "",
-        },
-        {
-          alive: 0,
-          corp: "",
-          devmode: "gb28181",
-          ip: "188.240.57.118",
-          name: "",
-          parentid: "11011400011121000001",
-          passwd: "",
-          port: 61133,
-          publicid: "4426",
-          username: "",
-        },
-        {
-          alive: 0,
-          corp: "",
-          devmode: "gb28181",
-          ip: "194.5.215.118",
-          name: "",
-          parentid: "11011400011121000001",
-          passwd: "",
-          port: 63212,
-          publicid: "1281",
-          username: "",
-        },
-        {
-          alive: 0,
-          corp: "",
-          devmode: "gb28181",
-          ip: "194.33.40.115",
-          name: "",
-          parentid: "11011400011121000001",
-          passwd: "",
-          port: 56324,
-          publicid: "4926",
-          username: "",
-        },
-        {
-          alive: 0,
-          corp: "",
-          devmode: "gb28181",
-          ip: "149.34.242.65",
-          name: "",
-          parentid: "11011400011121000001",
-          passwd: "",
-          port: 50517,
-          publicid: "3778",
-          username: "",
-        },
-        {
-          alive: 0,
-          corp: "",
-          devmode: "gb28181",
-          ip: "45.134.212.244",
-          name: "",
-          parentid: "11011400011121000001",
-          passwd: "",
-          port: 52108,
-          publicid: "4382",
-          username: "",
-        },
-        {
-          alive: 0,
-          corp: "",
-          devmode: "gb28181",
-          ip: "45.9.249.244",
-          name: "",
-          parentid: "11011400011121000001",
-          passwd: "",
-          port: 56708,
-          publicid: "3427",
-          username: "",
-        },
-        {
-          alive: 0,
-          corp: "GBT28181",
-          devmode: "gb28181",
-          ip: "192.168.5.56",
-          name: "Camera 01",
-          parentid: "11011400011121000001",
-          passwd: "",
-          port: 5060,
-          publicid: "44122500041325000002",
-          username: "",
-        },
-      ];
+      let params = {};
+      if (this.id.clusterId) {
+        params = {
+          clusterId: this.id.clusterId,
+          devId: "",
+        };
+      } else {
+        params = {
+          clusterId: "",
+          devId: this.id.devId,
+        };
+      }
+      const res = await getAllSubServer(params);
+      if (res && res.success) {
+        this.subDevTable = res.data;
+      }
     },
   },
 };
@@ -638,6 +79,9 @@
 <style lang="scss" scoped >
 .TableArea {
   padding: 30px 0;
+  .content {
+    height: 500px;
+  }
   .el-table ::v-deep {
     background-color: rgb(233, 235, 238);
     padding: 1px;
diff --git a/src/views/GB28181/components/TreeArea.vue b/src/views/GB28181/components/TreeArea.vue
index 281491a..3ea8c29 100644
--- a/src/views/GB28181/components/TreeArea.vue
+++ b/src/views/GB28181/components/TreeArea.vue
@@ -1,6 +1,27 @@
 <template>
   <div class="TreeArea">
     <div class="refresh">
+      <span v-if="nodeList && nodeList.length > 0">閰嶇疆瑙勫垯</span>
+      <el-switch
+        v-model="ruleType"
+        active-color="#0065FF"
+        inactive-color="#ED7E2F"
+        :width="52"
+        v-if="nodeList && nodeList.length > 0"
+      >
+      </el-switch>
+      <span
+        class="des1"
+        @click="ruleType = false"
+        v-if="ruleType && nodeList && nodeList.length > 0"
+        >鑷姩</span
+      >
+      <span
+        class="des2"
+        @click="ruleType = true"
+        v-if="!ruleType && nodeList && nodeList.length > 0"
+        >鎵嬪姩</span
+      >
       <div class="button" @click="updateCamerasFromVideosvr">鍒锋柊</div>
       鍗曞彴璁惧鏈�澶ф敮鎸侀厤缃�500璺憚鍍忔満锛岄泦缇ゆ渶澶ф敮鎸侀厤缃矾鏁�=闆嗙兢鍐呰澶囨�婚噺*500
     </div>
@@ -18,7 +39,10 @@
           :node="TreeDataPool.treeData"
           :height="600"
           :setting="treeSettings"
+          :showDevArea="!ruleType"
+          :nodeList="nodeList"
           @itemChecked="onItemCheck"
+          @saveTree="tempSaveTree"
           search
           style="width: 450px; min-height: 600px"
         />
@@ -68,7 +92,7 @@
 </template>
 
 <script>
-import { saveGb28181CamTree } from "@/api/Gb28181";
+import { saveGb28181CamTree, saveTree } from "@/api/Gb28181";
 import TreeMenu from "@/components/giantTree/index";
 import ZTree from "@/components/giantTree/zTree/ztree";
 
@@ -76,6 +100,10 @@
   components: {
     TreeMenu,
     ZTree,
+  },
+  props: {
+    id: {},
+    nodeList: {},
   },
   data() {
     return {
@@ -91,7 +119,13 @@
       },
       dstTreeData: [],
       loading: null,
+      ruleType: true,
+      allTreeData: {},
     };
+  },
+  created() {
+    this.TreeDataPool.clusterId = this.id.clusterId ? this.id.clusterId : "";
+    this.TreeDataPool.devId = this.id.devId ? this.id.devId : "";
   },
   mounted() {
     this.TreeDataPool.multiple = true;
@@ -127,6 +161,13 @@
         this.TreeDataPool.activeTreeData
       );
     },
+    tempSaveTree(tab) {
+      console.log(1212);
+      console.log(tab);
+      this.allTreeData[tab.devId] = this.TreeDataPool.newTreeByChecked(
+        this.TreeDataPool.activeTreeData
+      );
+    },
     saveChecked() {
       localStorage.setItem(
         "ztree_fold_list",
@@ -148,8 +189,12 @@
         this.TreeDataPool.activeTreeData
       );
 
-      saveGb28181CamTree({ checkedMenus: treeData })
-        .then((rsp) => {
+      if (this.ruleType) {
+        saveGb28181CamTree({
+          clusterId: this.id.clusterId ? this.id.clusterId : "",
+          devId: this.id.devId ? this.id.devId : "",
+          checkedMenus: treeData,
+        }).then((rsp) => {
           if (rsp && rsp.success) {
             this.$message({
               type: "success",
@@ -157,14 +202,30 @@
             });
           }
           this.loading = false;
-        })
-        .catch((err) => {
-          this.$message({
-            type: "error",
-            message: "淇濆瓨澶辫触",
+        });
+      } else {
+        let tab = this.$refs["ztree"].activeTabObj;
+        this.allTreeData[tab.devId] = treeData;
+        let params = [];
+        for (const key in this.allTreeData) {
+          params.push({
+            devId: key,
+            checkedMenus: this.allTreeData[key],
           });
+        }
+
+        saveTree({
+          list: params,
+        }).then((rsp) => {
+          if (rsp && rsp.success) {
+            this.$message({
+              type: "success",
+              message: "淇濆瓨鎴愬姛",
+            });
+          }
           this.loading = false;
         });
+      }
     },
   },
 };
@@ -181,6 +242,34 @@
     align-items: center;
     font-size: 12px;
     color: #666666;
+    position: relative;
+
+    span {
+      font-size: 14px;
+    }
+
+    .el-switch {
+      margin-left: 16px;
+      margin-right: 32px;
+    }
+
+    .des1 {
+      top: 7px;
+      left: 78px;
+      position: absolute;
+      font-size: 12px;
+      color: #fff;
+      cursor: pointer;
+    }
+
+    .des2 {
+      top: 7px;
+      left: 92px;
+      position: absolute;
+      font-size: 12px;
+      color: #fff;
+      cursor: pointer;
+    }
 
     .button {
       margin-right: 10px;
diff --git a/src/views/connectUs/index.vue b/src/views/connectUs/index.vue
index 574d3ea..d788d04 100644
--- a/src/views/connectUs/index.vue
+++ b/src/views/connectUs/index.vue
@@ -38,7 +38,7 @@
         this.$router.push("/");
       }
       if (index == 2) {
-        window.open("http://smartai.com/contact");
+        window.open("http://smartai.com/about");
       }
       if (index == 4) {
         window.open("http://smartai.com/consult");
diff --git a/src/views/equipmentManagement/algorithmDetail/components/Card.vue b/src/views/equipmentManagement/algorithmDetail/components/Card.vue
index 0271d4a..b1c6b0d 100644
--- a/src/views/equipmentManagement/algorithmDetail/components/Card.vue
+++ b/src/views/equipmentManagement/algorithmDetail/components/Card.vue
@@ -35,7 +35,8 @@
 
       <li>
         <div class="label">婵�娲荤爜:</div>
-        <div class="data">-</div>
+        <div class="data" v-if="data.activateCode">{{ data.activateCode }}</div>
+        <div class="data" v-else>-</div>
       </li>
     </ul>
 
diff --git a/src/views/equipmentManagement/equipmentDetail/components/FormArea.vue b/src/views/equipmentManagement/equipmentDetail/components/FormArea.vue
index 391eb76..42d70b5 100644
--- a/src/views/equipmentManagement/equipmentDetail/components/FormArea.vue
+++ b/src/views/equipmentManagement/equipmentDetail/components/FormArea.vue
@@ -8,30 +8,30 @@
         >
       </div>
       <el-table :data="data.algos" stripe style="width: 100%">
-        <el-table-column prop="name" label="鍚嶇О" width="206" class-name="name">
+        <el-table-column prop="name" label="鍚嶇О" class-name="name">
         </el-table-column>
-        <el-table-column label="CPU" width="206">
+        <el-table-column label="CPU">
           <template slot-scope="scope">
             <span>{{ scope.row.cpu.toFixed(2) }} %</span>
           </template>
         </el-table-column>
-        <el-table-column prop="mem" label="鍐呭瓨" width="206">
+        <el-table-column prop="mem" label="鍐呭瓨">
           <template slot-scope="scope">
             <span>{{ scope.row.mem.toFixed(2) }} %</span>
           </template>
         </el-table-column>
-        <el-table-column prop="dist" label="纭洏" width="206">
-        </el-table-column>
-        <el-table-column prop="gpu" label="绠楀姏" width="206">
+        <!--  <el-table-column prop="dist" label="纭洏" width="206">
+        </el-table-column> -->
+        <el-table-column prop="gpu" label="绠楀姏">
           <template slot-scope="scope">
             <span>{{ scope.row.gpu.toFixed(2) }} Mbps</span>
           </template>
         </el-table-column>
-        <el-table-column prop="net" label="缃戠粶">
+        <!--   <el-table-column prop="net" label="缃戠粶">
           <template slot-scope="scope">
             <span>{{ scope.row.net.toFixed(2) }} %</span>
           </template>
-        </el-table-column>
+        </el-table-column> -->
       </el-table>
     </div>
 
diff --git a/src/views/equipmentManagement/equipmentList/components/Content.vue b/src/views/equipmentManagement/equipmentList/components/Content.vue
index e3bde8d..bb69fb1 100644
--- a/src/views/equipmentManagement/equipmentList/components/Content.vue
+++ b/src/views/equipmentManagement/equipmentList/components/Content.vue
@@ -194,7 +194,7 @@
         box-sizing: border-box;
         display: none;
         position: absolute;
-        padding: 20px;
+        padding: 20px 10px;
         top: 40px;
         left: -100px;
         width: 247px;
diff --git a/src/views/hashrate/CameraManage/CameraInfo/index.vue b/src/views/hashrate/CameraManage/CameraInfo/index.vue
index 2b886e1..793881c 100644
--- a/src/views/hashrate/CameraManage/CameraInfo/index.vue
+++ b/src/views/hashrate/CameraManage/CameraInfo/index.vue
@@ -204,6 +204,7 @@
             :rtspUrl="videoItem.rtsp"
             :isRunning="false"
             :showArea="false"
+            :videoUrl="ip"
             v-if="
               videoItem !== '' &&
               videoItem !== undefined &&
@@ -261,6 +262,7 @@
       togglePlay: true,
       eventAudio: new Audio(),
       soundPath: "",
+      ip: "",
       form: {},
       // 璁板綍娣诲姞鐘舵��
       isAdd: false,
@@ -375,6 +377,8 @@
       if (node.type === "4") {
         getCameraInfo(node.id).then((res) => {
           if (res.success) {
+            this.ip = "ws://" + res.data.ip + ":7009/ws";
+
             if (res.data.resolutions) {
               let list = res.data.resolutions.map((i) => {
                 let obj = {};
diff --git a/src/views/hashrate/CameraManage/CameraRules/components/SdkBox.vue b/src/views/hashrate/CameraManage/CameraRules/components/SdkBox.vue
index da349b8..578b2d6 100644
--- a/src/views/hashrate/CameraManage/CameraRules/components/SdkBox.vue
+++ b/src/views/hashrate/CameraManage/CameraRules/components/SdkBox.vue
@@ -54,7 +54,7 @@
   height: 534px;
   background-color: #fff;
   box-shadow: 0px 2px 16px 0px rgba(0, 43, 106, 0.25);
-  z-index: 2100;
+  z-index: 2002;
 
   .title {
     box-sizing: border-box;
diff --git a/src/views/hashrate/CameraManage/CameraRules/components/SdkSettingBox.vue b/src/views/hashrate/CameraManage/CameraRules/components/SdkSettingBox.vue
index 8604d05..e984e29 100644
--- a/src/views/hashrate/CameraManage/CameraRules/components/SdkSettingBox.vue
+++ b/src/views/hashrate/CameraManage/CameraRules/components/SdkSettingBox.vue
@@ -733,6 +733,8 @@
 
     setOptArgValueOptions(optArg) {
       let alias = optArg.alias;
+      console.log(121212);
+      console.log(alias);
       optArg.valueOptions = this.VideoManageData.Dictionary[alias].map((r) => {
         return {
           name: r.name,
diff --git a/src/views/hashrate/CameraManage/CameraRules/components/TimeSlider.vue b/src/views/hashrate/CameraManage/CameraRules/components/TimeSlider.vue
index c000dc0..5d4415e 100644
--- a/src/views/hashrate/CameraManage/CameraRules/components/TimeSlider.vue
+++ b/src/views/hashrate/CameraManage/CameraRules/components/TimeSlider.vue
@@ -451,7 +451,7 @@
       position: absolute;
       padding-bottom: 13px;
       padding-right: 18px;
-      top: 16px;
+      top: 12px;
       left: -34px;
       cursor: pointer;
       border-bottom: 1px solid #e9ebee;
@@ -464,7 +464,7 @@
 
     .swiper-next-border {
       position: absolute;
-      top: 16px;
+      top: 12px;
       right: -34px;
       padding-bottom: 13px;
       padding-left: 18px;
diff --git a/src/views/hashrate/CameraManage/CameraRules/index.vue b/src/views/hashrate/CameraManage/CameraRules/index.vue
index 789c9f6..b069cc3 100644
--- a/src/views/hashrate/CameraManage/CameraRules/index.vue
+++ b/src/views/hashrate/CameraManage/CameraRules/index.vue
@@ -129,9 +129,30 @@
     <div class="SeparateRules" @click="selectMultiple(false)">
       <div class="title">鐙珛鍦烘櫙</div>
       <div class="control">
-        <i class="iconfont" @click="openSdkBox($event)">&#xe650;</i>
-        <i class="iconfont">&#xe64e;</i>
-        <i class="iconfont">&#xe64f;</i>
+        <el-tooltip
+          class="item"
+          effect="dark"
+          content="绠楁硶浜嬩欢"
+          placement="top"
+        >
+          <i class="iconfont" @click="openSdkBox($event)">&#xe650;</i>
+        </el-tooltip>
+        <el-tooltip
+          class="item"
+          effect="dark"
+          content="鏁版嵁娴佷紶"
+          placement="top"
+        >
+          <i class="iconfont">&#xe64e;</i>
+        </el-tooltip>
+        <el-tooltip
+          class="item"
+          effect="dark"
+          content="妯℃澘鍔╂墜"
+          placement="top"
+        >
+          <i class="iconfont">&#xe64f;</i>
+        </el-tooltip>
       </div>
 
       <div class="content">
@@ -171,9 +192,30 @@
     <div class="linkageRule" @click="selectMultiple(true)">
       <div class="title">鑱斿姩鍦烘櫙</div>
       <div class="control">
-        <i class="iconfont" @click="showSdkBox = true">&#xe650;</i>
-        <i class="iconfont">&#xe64e;</i>
-        <i class="iconfont">&#xe64f;</i>
+        <el-tooltip
+          class="item"
+          effect="dark"
+          content="绠楁硶浜嬩欢"
+          placement="top"
+        >
+          <i class="iconfont" @click="showSdkBox = true">&#xe650;</i>
+        </el-tooltip>
+        <el-tooltip
+          class="item"
+          effect="dark"
+          content="鏁版嵁娴佷紶"
+          placement="top"
+        >
+          <i class="iconfont">&#xe64e;</i>
+        </el-tooltip>
+        <el-tooltip
+          class="item"
+          effect="dark"
+          content="妯℃澘鍔╂墜"
+          placement="top"
+        >
+          <i class="iconfont">&#xe64f;</i>
+        </el-tooltip>
       </div>
       <template v-if="linkageRule.length > 0">
         <div class="content" v-for="(item, index) in linkageRule" :key="index">
diff --git a/src/views/manageCenter/index.vue b/src/views/manageCenter/index.vue
index fe31d59..f170113 100644
--- a/src/views/manageCenter/index.vue
+++ b/src/views/manageCenter/index.vue
@@ -291,13 +291,13 @@
           permission: "statisticMng",
         },
 
-        /*    {
+        {
           name: "GB28181",
-          icon: "/images/manageCenter/缁熻鏌ヨ.png",
+          icon: "/images/manageCenter/search.png",
           openPath: "/GB28181Open",
           path: "/GB28181Open",
           permission: "statisticMng",
-        }, */
+        },
       ],
       timeList: [
         { name: "20.103鏈嶅姟鍣�", time: "9澶�12灏忔椂44鍒�39绉�" },
diff --git a/src/views/search/Searching.vue b/src/views/search/Searching.vue
index eb7d71d..639d258 100644
--- a/src/views/search/Searching.vue
+++ b/src/views/search/Searching.vue
@@ -141,6 +141,16 @@
           <p class="p-clear">
             <b class="clear-searching" @click="clearSearch">閲嶇疆</b>
           </p>
+          <el-tooltip
+            class="item"
+            effect="dark"
+            content="閰嶇疆瀛樺偍璺緞"
+            placement="bottom"
+          >
+            <span @click="showSetBox = true" class="iconfont setIcon"
+              >&#xe652;</span
+            >
+          </el-tooltip>
         </div>
         <div ref="mid" style="height: calc(100% - 50px)">
           <div class="left-selection" v-if="VideoPhotoData.uploadDiaplay">
@@ -272,6 +282,7 @@
         </div>
       </hsc-window>
     </hsc-window-style-metal>
+    <SetBox v-if="showSetBox" @close="showSetBox = false"></SetBox>
   </div>
 </template>
 
@@ -280,11 +291,13 @@
 import UploadImg from "./components/UploadImg";
 import bus from "@/main";
 import { getUrlKey } from "@/api/utils.ts";
+import SetBox from "@/views/search/components/SetBox";
 export default {
   name: "RightSide",
   components: {
     Card,
     UploadImg,
+    SetBox,
   },
   data() {
     return {
@@ -305,6 +318,7 @@
       ],
       searchText: "",
       currentPage: 1,
+      showSetBox: false,
     };
   },
   computed: {
@@ -887,6 +901,12 @@
             color: #2249b4;
           }
         }
+        .setIcon {
+          margin-left: 10px;
+          font-size: 18px;
+          color: #1677ff;
+          cursor: pointer;
+        }
         .clear-searching {
           cursor: pointer;
           text-decoration: underline;
diff --git a/src/views/search/components/CardWindow.vue b/src/views/search/components/CardWindow.vue
index e163d51..13cc517 100644
--- a/src/views/search/components/CardWindow.vue
+++ b/src/views/search/components/CardWindow.vue
@@ -37,7 +37,7 @@
             ></model-card>
           </el-carousel-item>
         </el-carousel>
-        <div class="model-bottom">
+        <!-- <div class="model-bottom">
           <p class="model-bottom-left" @click="upPage(item.list, index)">
             <i class="el-icon-arrow-left"></i>
             涓婁竴涓�
@@ -46,7 +46,7 @@
             涓嬩竴涓�
             <i class="el-icon-arrow-right"></i>
           </p>
-        </div>
+        </div> -->
       </hsc-window>
     </hsc-window-style-metal>
   </div>
@@ -251,6 +251,12 @@
   },
 };
 </script>
+
+
+
+
+
+
 <style lang="scss">
 .layout {
   min-width: 1350px;
diff --git a/src/views/search/components/SetBox.vue b/src/views/search/components/SetBox.vue
new file mode 100644
index 0000000..bb22d9c
--- /dev/null
+++ b/src/views/search/components/SetBox.vue
@@ -0,0 +1,325 @@
+<template>
+  <div class="SetBox">
+    <div class="title">閰嶇疆瀛樺偍璺緞</div>
+
+    <!-- 鍒涘缓闆嗙兢琛ㄦ牸 -->
+    <el-form
+      :model="formData"
+      :rules="rules"
+      ref="Form"
+      label-position="left"
+      label-width="150px"
+    >
+      <el-form-item class="h32" prop="enable" label="鏄惁瀹夎鏁版嵁搴�">
+        <el-radio-group v-model="formData.enable">
+          <el-radio :label="true">鏄�</el-radio>
+          <el-radio :label="false">鍚�</el-radio>
+        </el-radio-group>
+      </el-form-item>
+
+      <el-form-item
+        v-if="formData.enable"
+        class="h32 ip"
+        prop="alarmIp"
+        label="鏁版嵁搴撳瓨鍌ㄤ綅缃�"
+      >
+        <el-input
+          v-model="formData.alarmIp"
+          placeholder="渚嬶細192.168.20.118锛�9200"
+          class="h32"
+        ></el-input>
+
+        <el-input
+          v-model="formData.alarmPort"
+          placeholder="璇疯緭鍏ョ鍙�"
+          class="h32"
+        ></el-input>
+      </el-form-item>
+
+      <el-form-item
+        v-if="formData.enable"
+        class="h32 ip"
+        prop="webPicIp"
+        label="鏂囦欢瀛樺偍浣嶇疆"
+      >
+        <el-input
+          v-model="formData.webPicIp"
+          placeholder="璇疯緭鍏ユ湇鍔″櫒淇℃伅"
+          class="h32"
+        ></el-input>
+
+        <el-input
+          v-model="formData.webPicPort"
+          placeholder="璇疯緭鍏ョ鍙�"
+          class="h32"
+        ></el-input>
+      </el-form-item>
+
+      <el-form-item
+        v-if="formData.enable"
+        class="h32"
+        prop="esIsAuth"
+        label="鏁版嵁搴撻獙璇佹柟寮�"
+      >
+        <el-radio-group v-model="formData.esIsAuth">
+          <el-radio :label="false">鏃�</el-radio>
+          <el-radio :label="true">璐︽埛瀵嗙爜楠岃瘉</el-radio>
+        </el-radio-group>
+      </el-form-item>
+
+      <el-form-item
+        v-if="formData.enable && formData.esIsAuth"
+        class="h32"
+        prop="esUsername"
+        label="鏁版嵁搴撹处鍙�"
+      >
+        <el-input
+          v-model="formData.esUsername"
+          placeholder="璇疯緭鍏ユ暟鎹簱璐﹀彿"
+          class="h32"
+        ></el-input>
+      </el-form-item>
+
+      <el-form-item
+        v-if="formData.enable && formData.esIsAuth"
+        class="h32"
+        prop="esPassword"
+        label="鏁版嵁搴撳瘑鐮�"
+      >
+        <el-input
+          v-model="formData.esPassword"
+          placeholder="璇疯緭鍏ユ暟鎹簱瀵嗙爜"
+          class="h32"
+          type="password"
+        ></el-input>
+      </el-form-item>
+    </el-form>
+
+    <!-- 鍙栨秷涓庢彁浜� -->
+    <div class="btns">
+      <div class="cancel button" @click="close()">鍙栨秷</div>
+      <div class="quit button" @click="submit">纭畾</div>
+    </div>
+
+    <div class="close iconfont" @click="close()">&#xe60f;</div>
+  </div>
+</template>
+
+<script>
+import { config, saveEsConfig } from "@/api/search";
+
+export default {
+  created() {
+    this.getData();
+  },
+  data() {
+    return {
+      formData: {
+        id: "", //鍙杇et缁撴灉涓殑id   绗竴娆′繚瀛樹紶绌�
+        alarmIp: "", //es鐨刬p
+        alarmPort: 9200, //es鐨刾ort
+        webPicIp: "", //weedfs鐨刬p
+        webPicPort: 6333, //weedfs鐨刾ort
+        enable: false, //鍚敤瀛樺偍浼爐rue,涓嶅惎鐢ㄤ紶false
+        esIsAuth: false, //es鏄惁寮�鍚敤鎴峰悕瀵嗙爜閴存潈
+        esUsername: "", //寮�鍚壌鏉冿紝es鐢ㄦ埛鍚�
+        esPassword: "", //es瀵嗙爜
+      },
+      rules: {
+        enable: [
+          {
+            required: true,
+            message: "璇烽�夋嫨鏄惁瀹夎鏁版嵁搴�",
+            trigger: "blur",
+          },
+        ],
+        alarmIp: [
+          {
+            required: true,
+            message: "璇疯緭鍏ユ暟鎹簱瀛樺偍浣嶇疆",
+            trigger: "blur",
+          },
+        ],
+        webPicIp: [
+          { required: true, message: "璇疯緭鍏ユ枃浠跺瓨鍌ㄤ綅缃�", trigger: "blur" },
+        ],
+        esIsAuth: [
+          {
+            required: true,
+            message: "璇烽�夋嫨鏁版嵁搴撻獙璇佹柟寮�",
+            trigger: "blur",
+          },
+        ],
+        esUsername: [
+          { required: true, message: "璇疯緭鍏ユ暟鎹簱璐﹀彿", trigger: "blur" },
+        ],
+        esPassword: [
+          { required: true, message: "璇疯緭鍏ユ暟鎹簱瀵嗙爜", trigger: "blur" },
+        ],
+      },
+    };
+  },
+  methods: {
+    close() {
+      this.$emit("close");
+    },
+    async getData() {
+      const res = await config();
+      if (res && res.success) {
+        this.formData = res.data;
+      }
+    },
+    submit() {
+      this.$refs["Form"].validate(async (valid) => {
+        if (valid) {
+          const res = await saveEsConfig(this.formData);
+          if (res && res.success) {
+            this.$notify({
+              type: "success",
+              message: "淇濆瓨鎴愬姛",
+            });
+            this.close();
+          }
+        }
+      });
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.SetBox {
+  position: relative;
+  box-sizing: border-box;
+  padding: 20px;
+  position: fixed;
+  width: 520px;
+  height: 490px;
+  top: 50%;
+  left: 50%;
+  margin-top: -260px;
+  margin-left: -245px;
+  filter: drop-shadow(0px 2px 16px rgba(0, 43, 106, 0.25));
+  z-index: 3000;
+  background-color: #fff;
+
+  .title {
+    margin-bottom: 10px;
+    padding-bottom: 20px;
+    font-size: 18px;
+    font-weight: 700;
+    border-bottom: 1px solid #e9ebee;
+  }
+
+  .el-form-item ::v-deep {
+    margin-bottom: 22px;
+
+    label {
+      color: #666;
+    }
+
+    .el-form-item__error {
+      padding-top: 0;
+    }
+
+    .el-input {
+      .el-input__inner {
+        padding: 0 10px;
+        color: #3d3d3d;
+        border-radius: 0;
+        border-color: #c0c5cc;
+        &::-webkit-input-placeholder {
+          color: #999999;
+        }
+
+        &:focus {
+          border-color: #0065ff;
+        }
+      }
+    }
+  }
+
+  .el-form-item.ip ::v-deep {
+    .el-form-item__content {
+      display: flex;
+
+      .el-input {
+        flex: 1;
+      }
+
+      .el-input:first-child {
+        margin-right: 10px;
+        flex: 2;
+      }
+    }
+  }
+  .el-form-item.password ::v-deep {
+    .el-form-item__content {
+      display: flex;
+      justify-content: space-between;
+
+      .el-input {
+        margin-left: -4px;
+        width: 250px;
+      }
+
+      .createPassword {
+        font-size: 14px;
+        color: #0065ff;
+        cursor: pointer;
+      }
+
+      .search {
+        margin-top: 8px;
+        width: 64px;
+        height: 24px;
+        font-size: 12px;
+        line-height: 24px;
+        text-align: center;
+        background-color: #0065ff;
+        color: #fff;
+        cursor: pointer;
+      }
+    }
+  }
+
+  .btns {
+    padding: 20px 0;
+    border-top: 1px solid #e9ebee;
+    position: absolute;
+    left: 20px;
+    right: 20px;
+    bottom: 0;
+    display: flex;
+    justify-content: flex-end;
+    text-align: center;
+    line-height: 32px;
+    font-size: 14px;
+
+    .cancel {
+      margin-right: 10px;
+      width: 60px;
+      height: 32px;
+      border: 1px solid #0065ff;
+      color: #0065ff;
+    }
+
+    .quit {
+      width: 60px;
+      height: 32px;
+      color: #fff;
+      background-color: #0065ff;
+      border: 1px solid #0065ff;
+    }
+  }
+
+  .close {
+    position: absolute;
+    top: 20px;
+    right: 20px;
+    font-size: 12px;
+    color: #666;
+    cursor: pointer;
+  }
+}
+</style>
\ No newline at end of file
diff --git a/src/views/search/index.vue b/src/views/search/index.vue
index e252b64..8d37ce7 100644
--- a/src/views/search/index.vue
+++ b/src/views/search/index.vue
@@ -61,6 +61,10 @@
       })();
     };
   },
+  beforeDestroy() {
+    sessionStorage.removeItem("clusterId");
+    sessionStorage.removeItem("devId");
+  },
   methods: {
     parseUrl() {},
     selectCluster(val) {
@@ -198,7 +202,7 @@
 }
 
 .search_cluster {
-  top: 12px;
+  top: 18px;
   left: 172px;
   position: fixed;
   width: 135px;
diff --git a/vue.config.js b/vue.config.js
index 3dc4473..871f606 100644
--- a/vue.config.js
+++ b/vue.config.js
@@ -13,7 +13,7 @@
     // hotOnly: false, // 鐑洿鏂�
     proxy: {
       "/api": {
-        // target: "http://192.168.20.10:7004",
+        //  target: "http://192.168.20.10:7009",
         target: "http://192.168.20.115:7070",
         // target: "http://192.168.20.235:7070",
         //  target: "http://192.168.20.117:7080",
@@ -33,7 +33,7 @@
       },
 
       "/ws": {
-        target: "http://192.168.20.235:7070",
+        target: "http://192.168.20.115:7070",
         // ws: true,
         changeOrigin: true,
       },

--
Gitblit v1.8.0