From fed1301812fab576517b582fa01dfe51bb429f8c Mon Sep 17 00:00:00 2001
From: heyujie <516346543@qq.com>
Date: 星期三, 21 四月 2021 17:58:20 +0800
Subject: [PATCH] 设备管理和新设置中心

---
 vue.config.js                                                          |    4 
 src/pages/desktop/index/components/ToolsEntry.vue                      |   11 
 src/pages/desktop/index/App.vue                                        |    2 
 src/pages/deviceCenter/index/main.ts                                   |   30 
 src/pages/shuohuangMonitorAnalyze/components/searchForVideoAnalyze.vue |   10 
 src/pages/systemSettings/index/App.vue                                 | 1286 ++++++++++++
 src/pages/systemSettings/views/generalSettings.vue                     |  311 ++
 public/apps.json                                                       |   46 
 src/pages/systemSettings/components/switchBar.vue                      |   42 
 src/pages/shuohuangMonitorAnalyze/components/videoAnalyze.vue          |  318 +-
 src/pages/ai/index/App.vue                                             |  876 ++++----
 src/pages/settings/components/ClusterManagement.vue                    |   78 
 src/pages/shuohuangMonitorAnalyze/components/taskManage.vue            |    4 
 src/pages/shuohuangMonitorAnalyze/components/guideIndex.vue            |   71 
 src/pages/settings/components/BasicSetting.vue                         |   39 
 src/pages/systemSettings/views/keyboardLanguage.vue                    |  240 ++
 src/pages/shuohuangMonitorAnalyze/components/timeShortcut.vue          |    1 
 src/components/subComponents/LocalVedioList.vue                        |    6 
 src/pages/systemSettings/index/main.ts                                 |   12 
 src/pages/deviceCenter/index/mixins.ts                                 |   25 
 src/pages/systemSettings/components/CloudNode.vue                      |  149 +
 src/pages/deviceCenter/index/App.vue                                   | 1368 +++++++++++++
 src/pages/systemSettings/views/NetSettings.vue                         |  570 +++++
 src/pages/systemSettings/views/clusterManagement.vue                   |  714 ++++++
 24 files changed, 5,571 insertions(+), 642 deletions(-)

diff --git a/public/apps.json b/public/apps.json
index a77785f..a8d2ce6 100644
--- a/public/apps.json
+++ b/public/apps.json
@@ -186,6 +186,29 @@
       "progressMsg": ""
     },
     {
+      "id": "5a5e0610-0a62-4de3-8021-2c6652c29ebe",
+      "name": "绯荤粺璁剧疆(鏂扮増)",
+      "package": "systemSettings",
+      "type": "2",
+      "url": "/view/systemSettings/",
+      "title": "绯荤粺璁剧疆(鏂扮増)",
+      "width": 1200,
+      "height": 650,
+      "iconBlob": "",
+      "icon": "../../images/app-mid/settings.png",
+      "version": "1.0.0",
+      "create_time": "2020-10-09 14:00:10",
+      "create_by": "",
+      "update_time": "",
+      "update_by": "",
+      "isDelete": 0,
+      "isDefault": true,
+      "remoteVersion": "",
+      "installed": true,
+      "isUpgrade": false,
+      "progressMsg": ""
+    },
+    {
       "id": "ee64fe23-7631-4ef9-9aca-ea09673693be",
       "name": "绯荤粺缁存姢",
       "package": "vindicate",
@@ -414,6 +437,29 @@
       "installed": true,
       "isUpgrade": false,
       "progressMsg": ""
+    },
+    {
+      "id": "af412cbe-472e-4dbc-b962-b290483c9ea1",
+      "name": "璁惧涓績",
+      "package": "deviceCenter",
+      "type": "2",
+      "url": "/view/deviceCenter/",
+      "title": "璁惧涓績",
+      "width": 1200,
+      "height": 670,
+      "iconBlob": "",
+      "icon": "../../images/app-mid/datastack-config.png",
+      "version": "1.0.1",
+      "create_time": "2021-04-01 21:47:38",
+      "create_by": "basic",
+      "update_time": "",
+      "update_by": "",
+      "isDelete": 0,
+      "isDefault": false,
+      "remoteVersion": "",
+      "installed": true,
+      "isUpgrade": false,
+      "progressMsg": ""
     }
   ],
   "msg": "璇锋眰澶勭悊鎴愬姛",
diff --git a/src/components/subComponents/LocalVedioList.vue b/src/components/subComponents/LocalVedioList.vue
index 5c80dc1..1762b8e 100644
--- a/src/components/subComponents/LocalVedioList.vue
+++ b/src/components/subComponents/LocalVedioList.vue
@@ -17,7 +17,9 @@
         <span class="iconfont iconshipinwenjianjia1 folder" v-else-if="item.type === 3"></span>
         <span class="iconfont iconwenjian folder" v-else></span>
 
+           <!-- <el-tooltip class="item" effect="dark" :content="item.name" placement="top" :enterable="false" transition="all 0 ease 0" > -->
         <span class="folder-name">{{item.name}}</span>
+    <!-- </el-tooltip> -->
 
         <!-- 绠楁硶閰嶇疆涓嶅叏 -->
         <i class="iconfont iconicon-test6 folder-status" v-if="item.status === 0"></i>
@@ -94,6 +96,10 @@
     margin-left: 5px;
     float: left;
     line-height: 27px;
+    max-width: 134px;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
   }
   .folder-status {
     color: #3d68e1;
diff --git a/src/pages/ai/index/App.vue b/src/pages/ai/index/App.vue
index 679fc32..87b1598 100644
--- a/src/pages/ai/index/App.vue
+++ b/src/pages/ai/index/App.vue
@@ -49,7 +49,7 @@
                               v-if="!item.isDefault || item.isUpgrade"
                             >
                               <div class="left-top">
-                                <div>褰撳墠鐗堟湰:{{ item.version }}</div>
+                                <div>褰撳墠鐗堟湰1:{{ item.version }}</div>
                                 <div v-if="item.remoteVersion">
                                   鏈�鏂扮増鏈�:{{ item.remoteVersion }}
                                 </div>
@@ -70,11 +70,11 @@
                                 >
                                 <el-button
                                   v-if="item.isUpgrade"
-                                  @click="donwload(item,0)"
+                                  @click="donwload(item, 0)"
                                   type="warning"
                                   size="small"
                                   class="bot-btn"
-                                  >鍗囩骇</el-button
+                                  >鍗囩骇1</el-button
                                 >
                               </div>
                             </div>
@@ -119,28 +119,28 @@
                         v-loading="downloading && downloadItem == item.id"
                       >
                         <div class="mask">
-                           <div class="left-top">
-                                <div v-if="item.installed">褰撳墠鐗堟湰:{{ item.version }}</div>
-                                <div v-if="item.remoteVersion">
-                                  鏈�鏂扮増鏈�:{{ item.remoteVersion }}
-                                </div>
-                              </div>
-                              <div
-                                class="info-onmask"
-                                @click="checkDetail(item, 'activeNotInstall')"
-                              >
-                                鏌ョ湅璇︽儏
-                              </div>
-                              <div class="mask-btn">
-                                <el-button
-                                 @click="donwload(item,1)"
-                                  type="primary"
-                                  class="bot-btn"
-                                  >瀹夎</el-button
-                                >
-                                
-                              </div>
-                  
+                          <div class="left-top">
+                            <div v-if="item.installed">
+                              褰撳墠鐗堟湰:{{ item.version }}
+                            </div>
+                            <div v-if="item.remoteVersion">
+                              鏈�鏂扮増鏈�:{{ item.remoteVersion }}
+                            </div>
+                          </div>
+                          <div
+                            class="info-onmask"
+                            @click="checkDetail(item, 'activeNotInstall')"
+                          >
+                            鏌ョ湅璇︽儏
+                          </div>
+                          <div class="mask-btn">
+                            <el-button
+                              @click="donwload(item, 1)"
+                              type="primary"
+                              class="bot-btn"
+                              >瀹夎</el-button
+                            >
+                          </div>
                         </div>
                         <div class="click-download" title="涓嬭浇">
                           <span class="iconfont iconxiazai1"></span>
@@ -206,10 +206,10 @@
                                   鏈�鏂扮増鏈�:{{ item.remoteVersion }}
                                 </div>
                               </div>
-                                  <!-- v-if="!item.isDefault" -->
+                              <!-- v-if="!item.isDefault" -->
                               <div
                                 class="info-onmask"
-                                @click="checkDetail(item,'active')"
+                                @click="checkDetail(item, 'active')"
                               >
                                 鏌ョ湅璇︽儏
                               </div>
@@ -276,7 +276,6 @@
                             element-loading-background="rgba(0,0,0,.8)"
                           >
                             <div class="mask">
-                             
                               <el-button
                                 size="small"
                                 type="primary"
@@ -388,7 +387,6 @@
                                   class="bot-btn"
                                   >婵�娲�</el-button
                                 >
-                                
                               </div>
                             </div>
                             <img
@@ -424,7 +422,7 @@
                   </div>
                   <p class="src-title">搴旂敤杞欢</p>
                   <div class="app-list flex-list">
-                     <div v-if="!unActivedAppList.length" class="empty-tip">
+                    <div v-if="!unActivedAppList.length" class="empty-tip">
                       鏆傛棤鏁版嵁
                     </div>
                     <div
@@ -450,7 +448,7 @@
                                 "
                               ></span>
                             </div> -->
-                             <div
+                            <div
                               class="mask"
                               v-if="!item.isDefault || item.isUpgrade"
                             >
@@ -462,19 +460,18 @@
                               </div>
                               <div
                                 class="info-onmask"
-                                @click="actSdkOrApp(item,'app')"
+                                @click="actSdkOrApp(item, 'app')"
                               >
                                 鏌ョ湅璇︽儏
                               </div>
                               <div class="mask-btn">
                                 <el-button
-                                  @click="actSdkOrApp(item,'app')"
+                                  @click="actSdkOrApp(item, 'app')"
                                   type="primary"
                                   size="small"
                                   class="bot-btn"
                                   >婵�娲�</el-button
                                 >
-                                
                               </div>
                             </div>
                             <img
@@ -508,11 +505,13 @@
                   </div>
                 </div>
                 <!--  -->
-                
               </el-tab-pane>
               <el-tab-pane name="update">
                 <span slot="label">
-                  <el-badge class="update-badge" :value="updateNum" :hidden="updateNum==0"
+                  <el-badge
+                    class="update-badge"
+                    :value="updateNum"
+                    :hidden="updateNum == 0"
                     >鏇存柊</el-badge
                   >
                 </span>
@@ -527,8 +526,8 @@
                     >
                   </div>
                   <div class="flex-list">
-                    <div v-if="hasNewVersionSdk.length==0" class="empty-tip">
-                      {{errMsg?errMsg:"鏆傛棤鏁版嵁"}}
+                    <div v-if="hasNewVersionSdk.length == 0" class="empty-tip">
+                      {{ errMsg ? errMsg : "鏆傛棤鏁版嵁" }}
                     </div>
                     <div
                       class="wrap-box"
@@ -560,7 +559,7 @@
                               </div>
                               <div
                                 class="info-onmask"
-                                @click="checkDetail(item,'active')"
+                                @click="checkDetail(item, 'active')"
                               >
                                 鏌ョ湅璇︽儏
                               </div>
@@ -574,7 +573,7 @@
                                 >
                                 <el-button
                                   v-if="item.isUpgrade"
-                                  @click="donwload(item,0)"
+                                  @click="donwload(item, 0)"
                                   type="warning"
                                   size="small"
                                   class="bot-btn"
@@ -647,7 +646,7 @@
                               </div>
                               <div
                                 class="info-onmask"
-                                @click="checkDetail(item,'active')"
+                                @click="checkDetail(item, 'active')"
                               >
                                 鏌ョ湅璇︽儏
                               </div>
@@ -758,16 +757,21 @@
       :visible="productDetailVisible"
       @close="closeDial"
     >
-    <!-- <el-button-group> -->
-      <div class="button-group" v-show="!backDisable||!forwardDisable">
-  <el-button    size="small" @click="backwards" :disabled="backDisable"> <span>&#60;</span> </el-button>
-  <!-- <el-button type="primary" size="small" icon="el-icon-arrow-left"></el-button> -->
-  <el-button    size="small" @click="forwards" :disabled="forwardDisable">></el-button>
-  <!-- <el-button type="primary" size="small"><i class="el-icon-arrow-right el-icon--right"></i></el-button> -->
-
+      <!-- <el-button-group> -->
+      <div class="button-group" v-show="!backDisable || !forwardDisable">
+        <el-button size="small" @click="backwards" :disabled="backDisable">
+          <span>&#60;</span>
+        </el-button>
+        <!-- <el-button type="primary" size="small" icon="el-icon-arrow-left"></el-button> -->
+        <el-button size="small" @click="forwards" :disabled="forwardDisable"
+          >></el-button
+        >
+        <!-- <el-button type="primary" size="small"><i class="el-icon-arrow-right el-icon--right"></i></el-button> -->
       </div>
-<!-- </el-button-group> -->
-      <div class="dialog-title" slot="title">{{isSDKDialog?"绠楁硶璇︽儏":"搴旂敤璇︽儏"}}</div>
+      <!-- </el-button-group> -->
+      <div class="dialog-title" slot="title">
+        {{ isSDKDialog ? "绠楁硶璇︽儏" : "搴旂敤璇︽儏" }}
+      </div>
       <div class="dialog-content">
         <div class="box-top">
           <div class="top-left">
@@ -823,39 +827,85 @@
                 />
               </div>
               <div class="right-desc">
-                  
-                <div class="name"><el-tooltip class="" effect="dark" :content="productDetail.productName  " placement="right-start">
-                  <span>{{ productDetail.productName  }}</span>
-                </el-tooltip></div>
+                <div class="name">
+                  <el-tooltip
+                    class=""
+                    effect="dark"
+                    :content="productDetail.productName"
+                    placement="right-start"
+                  >
+                    <span>{{ productDetail.productName }}</span>
+                  </el-tooltip>
+                </div>
                 <div class="tags">
-                  <el-tag type="info" size="small" color="#fff" v-if="!isSDKDialog">搴旂敤</el-tag>
-                  <el-tag type="info" size="small" color="#fff" v-if="isSDKDialog">绠楁硶</el-tag>
+                  <el-tag
+                    type="info"
+                    size="small"
+                    color="#fff"
+                    v-if="!isSDKDialog"
+                    >搴旂敤</el-tag
+                  >
+                  <el-tag
+                    type="info"
+                    size="small"
+                    color="#fff"
+                    v-if="isSDKDialog"
+                    >绠楁硶</el-tag
+                  >
                 </div>
                 <div class="btns">
-                  <el-button size="small" type="warning"  v-if="needToUpgradeInWin||productDetail.isUpgrade" @click="upgradeSDKinWin" >{{
-                    isUpgrading ? "鍗囩骇涓�.." : "鍗囩骇"
-                  }}</el-button>
-                  <el-button size="small" type="primary" v-if="isActive&&!isDefaultApp" @click="unloadSDKinWin">鍗歌浇</el-button>
-                  <el-button size="small" type="primary" v-if="!isActive&&!showInstallNotActive" @click="showInputCode=!showInputCode">婵�娲�</el-button>
-                  <el-button size="small" type="primary" v-if="!isActive&&showInstallNotActive" @click="downloadSdkInSide">{{isUpgrading?"瀹夎涓�..":"瀹夎"}}</el-button>
-                  <el-button size="small" type="success" v-if="!isSDKDialog&&isActive" @click="openApp">鎵撳紑</el-button>
+                  <el-button
+                    size="small"
+                    type="warning"
+                    v-if="needToUpgradeInWin || productDetail.isUpgrade"
+                    @click="upgradeSDKinWin"
+                    >{{ isUpgrading ? "鍗囩骇涓�.." : "鍗囩骇" }}</el-button
+                  >
+                  <el-button
+                    size="small"
+                    type="primary"
+                    v-if="isActive && !isDefaultApp"
+                    @click="unloadSDKinWin"
+                    >鍗歌浇</el-button
+                  >
+                  <el-button
+                    size="small"
+                    type="primary"
+                    v-if="!isActive && !showInstallNotActive"
+                    @click="showInputCode = !showInputCode"
+                    >婵�娲�</el-button
+                  >
+                  <el-button
+                    size="small"
+                    type="primary"
+                    v-if="!isActive && showInstallNotActive"
+                    @click="downloadSdkInSide"
+                    >{{ isUpgrading ? "瀹夎涓�.." : "瀹夎" }}</el-button
+                  >
+                  <el-button
+                    size="small"
+                    type="success"
+                    v-if="!isSDKDialog && isActive"
+                    @click="openApp"
+                    >鎵撳紑</el-button
+                  >
                 </div>
-               
               </div>
             </div>
             <div class="jihuo-input" v-if="showInputCode">
-                        <el-input size="small"
-                          v-model="activeCode"
-                          placeholder="00000-00000-00000-00000-00000"
-                          @blur="getCodeDetail"
-                        ></el-input>
-                         <el-button type="primary" size="small" @click="actived"
-                          >婵�娲�</el-button
-                        >
-                           <el-button type="primary" size="small" @click="cancelActivate"
-                          >鍙栨秷</el-button
-                        >
-                      </div>
+              <el-input
+                size="small"
+                v-model="activeCode"
+                placeholder="00000-00000-00000-00000-00000"
+                @blur="getCodeDetail"
+              ></el-input>
+              <el-button type="primary" size="small" @click="actived"
+                >婵�娲�</el-button
+              >
+              <el-button type="primary" size="small" @click="cancelActivate"
+                >鍙栨秷</el-button
+              >
+            </div>
             <div class="product-intruduction">
               <div class="part-title" v-if="!showInputCode">绠�浠�</div>
               <div class="text">
@@ -895,7 +945,9 @@
         </div>
         <div class="box-bottom">
           <div class="bot-left">
-            <div class="part-title">{{isSDKDialog?"搴旂敤鍦烘櫙":"鍔熻兘鐗圭偣"}}</div>
+            <div class="part-title">
+              {{ isSDKDialog ? "搴旂敤鍦烘櫙" : "鍔熻兘鐗圭偣" }}
+            </div>
             <div class="list-zone">
               <div
                 class="list-item"
@@ -906,11 +958,7 @@
                   {{ item.title === "" ? "鏆傛棤鏁版嵁" : item.title }}
                 </el-tag>
                 <div class="desc">
-                  {{
-                    item.desc === ""
-                      ? "鏆傛棤鏁版嵁"
-                      : item.desc
-                  }}
+                  {{ item.desc === "" ? "鏆傛棤鏁版嵁" : item.desc }}
                 </div>
               </div>
             </div>
@@ -940,15 +988,26 @@
                     alt
                   />
 
-                <div class="icon-name">
-                  <el-tooltip class="" effect="dark" :content="item.name === '' ? '鏆傛棤鏁版嵁':item.name" placement="top-start">
-                  <span>{{ item.name === "" ? "鏆傛棤鏁版嵁" : item.name }}</span>
-                </el-tooltip>
+                  <div class="icon-name">
+                    <el-tooltip
+                      class=""
+                      effect="dark"
+                      :content="item.name === '' ? '鏆傛棤鏁版嵁' : item.name"
+                      placement="top-start"
+                    >
+                      <span>{{
+                        item.name === "" ? "鏆傛棤鏁版嵁" : item.name
+                      }}</span>
+                    </el-tooltip>
                   </div>
-                  
                 </div>
                 <div class="look-button">
-                  <el-button type="primary" size="mini" @click="checkInWindow(item)">鏌ョ湅</el-button>
+                  <el-button
+                    type="primary"
+                    size="mini"
+                    @click="checkInWindow(item)"
+                    >鏌ョ湅</el-button
+                  >
                 </div>
               </div>
             </div>
@@ -956,12 +1015,12 @@
         </div>
       </div>
     </el-dialog>
-    <el-dialog 
-    :visible.sync="showActivateSuccess"
-    title="婵�娲绘垚鍔燂紒"
-  width="30%"
-  class="active-Dial"
-  :before-close="handleClose"
+    <el-dialog
+      :visible.sync="showActivateSuccess"
+      title="婵�娲绘垚鍔燂紒"
+      width="30%"
+      class="active-Dial"
+      :before-close="handleClose"
     >
       <div class="dialog-active">
         <ul class="desc">
@@ -987,9 +1046,7 @@
           </li>
         </ul>
         <div class="text-right">
-          <el-button type="primary" @click="checkMyAlgorith"
-            >纭畾</el-button
-          >
+          <el-button type="primary" @click="checkMyAlgorith">纭畾</el-button>
           <p class="tip">鎻愮ず锛氳鍦ㄢ�滃凡婵�娲烩�濅腑鏌ョ湅骞跺畨瑁呯畻娉�</p>
         </div>
       </div>
@@ -1015,7 +1072,7 @@
   actApp,
 } from "@/api/app";
 
-import bus from '@/plugin/bus'
+import bus from "@/plugin/bus";
 import FileUploader from "@/components/subComponents/FileUpload/index";
 export default {
   name: "algorithmManage",
@@ -1073,19 +1130,19 @@
       downloading: false,
       direction: "rtl",
       actStep: 0,
-      showActivateSuccess:false,
+      showActivateSuccess: false,
       activeCode: "",
       isInstall: false,
       installDialogVisible: false,
       installPackage: {},
       installAppPackage: null,
       installSdkPackage: null,
-      isActive:true,
-      isDefaultApp:false,
+      isActive: true,
+      isDefaultApp: false,
       installPercentage: 0,
       unActivedSDKList: [],
       unActivedAppList: [],
-      isSDKDialog:true,
+      isSDKDialog: true,
       //actSdkId: '',
       actType: "",
       actId: "",
@@ -1113,12 +1170,12 @@
       otherProducts: [],
       backStack: [],
       forwardStack: [],
-      backDisable:true,
-      forwardDisable:true,
-      showInputCode:false,
-      needToUpgradeInWin:false,
-      errMsg:"",
-      showInstallNotActive:false
+      backDisable: true,
+      forwardDisable: true,
+      showInputCode: false,
+      needToUpgradeInWin: false,
+      errMsg: "",
+      showInstallNotActive: false,
     };
   },
   directives: {
@@ -1135,7 +1192,6 @@
 
     this.getUnActivedList();
     this.getUnActivedAppList();
-    
   },
   beforeDestroy() {
     this.autoRefresh = false;
@@ -1149,7 +1205,7 @@
     batchUpdate(type) {
       if (type == "sdk") {
         this.hasNewVersionSdk.forEach((sdk) => {
-          this.donwload(sdk,0);
+          this.donwload(sdk, 0);
         });
       } else {
         this.hasNewVersionApp.forEach((app) => {
@@ -1157,115 +1213,114 @@
         });
       }
     },
-    closeDial(){
-      this.productDetailVisible = false
-      this.productDetail = {}
-      this.otherProducts = []
+    closeDial() {
+      this.productDetailVisible = false;
+      this.productDetail = {};
+      this.otherProducts = [];
     },
-    checkDetail(item,type) {
-      if (type =='inactive') {
-        this.isActive =false
-         this.showInstallNotActive = false
-        this.showInputCode = false
-      }else if (type =='active'){
-        this.showInputCode = false
-         this.showInstallNotActive = false
-         this.isActive =true
-      }else if (type =='activeNotInstall'){
-        this.showInputCode = false
-         this.isActive =false
-         this.showInstallNotActive = true
+    checkDetail(item, type) {
+      if (type == "inactive") {
+        this.isActive = false;
+        this.showInstallNotActive = false;
+        this.showInputCode = false;
+      } else if (type == "active") {
+        this.showInputCode = false;
+        this.showInstallNotActive = false;
+        this.isActive = true;
+      } else if (type == "activeNotInstall") {
+        this.showInputCode = false;
+        this.isActive = false;
+        this.showInstallNotActive = true;
       }
-      this.checkIsDefOrNot(item.id)
-        this.needToUpgradeInWin = item.isUpgrade?true:false
-      this.resetStack()
-      if (item.sdk_type===undefined) {
-       this.isSDKDialog=false
-      }else{
-       this.isSDKDialog=true
+      this.checkIsDefOrNot(item.id);
+      this.needToUpgradeInWin = item.isUpgrade ? true : false;
+      this.resetStack();
+      if (item.sdk_type === undefined) {
+        this.isSDKDialog = false;
+      } else {
+        this.isSDKDialog = true;
       }
       this.productDetailVisible = true;
       let _this = this;
       getAppDetail({ id: item.id }).then((res) => {
         _this.productDetail = res.data.detail;
-        _this.productDetail.isUpgrade = item.isUpgrade
-        _this.productDetail.iconBlob = item.iconBlob
+        _this.productDetail.isUpgrade = item.isUpgrade;
+        _this.productDetail.iconBlob = item.iconBlob;
 
         _this.otherProducts = res.data.randoms;
-
       });
     },
-    resetStack(){
-      this.forwardStack = []
-       this.backStack = []
-       this.backDisable = true
-       this.forwardDisable = true
-
+    resetStack() {
+      this.forwardStack = [];
+      this.backStack = [];
+      this.backDisable = true;
+      this.forwardDisable = true;
     },
-    checkInWindow(item){
-      this.backStack.push([this.productDetail, this.otherProducts])
-      this.backDisable = false
-      this.checkIsDefOrNot(item.id)
+    checkInWindow(item) {
+      this.backStack.push([this.productDetail, this.otherProducts]);
+      this.backDisable = false;
+      this.checkIsDefOrNot(item.id);
 
       let _this = this;
       getAppDetail({ id: item.id }).then((res) => {
         _this.productDetail = res.data.detail;
-        _this.productDetail.iconBlob = item.iconBlob
-        this.actId = _this.productDetail.productBaseId
-        let flag=false
-       const allNeedToNew = [...this.hasNewVersionSdk,...this.hasNewVersionApp]
+        _this.productDetail.iconBlob = item.iconBlob;
+        this.actId = _this.productDetail.productBaseId;
+        let flag = false;
+        const allNeedToNew = [
+          ...this.hasNewVersionSdk,
+          ...this.hasNewVersionApp,
+        ];
         for (let i = 0; i < allNeedToNew.length; i++) {
           const item = allNeedToNew[i];
           if (item.id == _this.productDetail.productBaseId) {
-            flag=true
+            flag = true;
           }
         }
-        this.needToUpgradeInWin = flag
-          _this.productDetail.isUpgrade = flag
+        this.needToUpgradeInWin = flag;
+        _this.productDetail.isUpgrade = flag;
 
         _this.otherProducts = res.data.randoms;
       });
     },
-    checkIsDefOrNot(id){
-      if (id.length>10) {
-        this.isDefaultApp=false
-      }else {
-        this.isDefaultApp=true
+    checkIsDefOrNot(id) {
+      if (id.length > 10) {
+        this.isDefaultApp = false;
+      } else {
+        this.isDefaultApp = true;
       }
     },
-    backwards(){
-      if (this.backStack.length ==0) {
-        this.backDisable = true
-      return
+    backwards() {
+      if (this.backStack.length == 0) {
+        this.backDisable = true;
+        return;
       }
 
-   this.forwardStack.push([this.productDetail,this.otherProducts])
-   let item = this.backStack.pop()
-   this.productDetail =  item[0]
-   this.checkIsDefOrNot(this.productDetail.productBaseId) 
-   this.otherProducts = item[1]
-  this.forwardDisable=false
- if (this.backStack.length ==0) {
-        this.backDisable = true
-      
+      this.forwardStack.push([this.productDetail, this.otherProducts]);
+      let item = this.backStack.pop();
+      this.productDetail = item[0];
+      this.checkIsDefOrNot(this.productDetail.productBaseId);
+      this.otherProducts = item[1];
+      this.forwardDisable = false;
+      if (this.backStack.length == 0) {
+        this.backDisable = true;
       }
     },
-    forwards(){
-      if(this.forwardStack.length==0){
-        this.forwardDisable=true
-        return
+    forwards() {
+      if (this.forwardStack.length == 0) {
+        this.forwardDisable = true;
+        return;
       }
 
-        this.backStack.push([this.productDetail,this.otherProducts])
-        this.backDisable=false
-        let item = this.forwardStack.pop()
+      this.backStack.push([this.productDetail, this.otherProducts]);
+      this.backDisable = false;
+      let item = this.forwardStack.pop();
 
-        this.productDetail = item[0]
-        this.otherProducts = item[1]
-      if (this.forwardStack.length==0) {
-        this.forwardDisable=true
+      this.productDetail = item[0];
+      this.otherProducts = item[1];
+      if (this.forwardStack.length == 0) {
+        this.forwardDisable = true;
       }
-      
     },
     //绂荤嚎瀹夎
     offlineInstall() {
@@ -1313,10 +1368,10 @@
         .then((res) => {
           if (res && res.success) {
             _this.$notify({
-               title: "鎴愬姛",
-               message: "瀹夎搴旂敤鎴愬姛",
-               type: "success",
-             });
+              title: "鎴愬姛",
+              message: "瀹夎搴旂敤鎴愬姛",
+              type: "success",
+            });
             setTimeout(() => {
               if (action == "upgrade") {
                 app.upgradeLoading = false;
@@ -1331,16 +1386,15 @@
                 "*"
               );
             }, 3000);
-          }else {
-        
+          } else {
           }
         })
         .catch((e) => {
-            _this.$notify({
-              title: "瀹夎澶辫触",
-              message: e.data,
-              type: "warning",
-            });
+          _this.$notify({
+            title: "瀹夎澶辫触",
+            message: e.data,
+            type: "warning",
+          });
           if (action == "upgrade") {
             app.upgradeLoading = false;
           } else {
@@ -1384,7 +1438,7 @@
       let _this = this;
       this.$confirm("纭畾瑕佸嵏杞借搴旂敤鍚�?", "鎻愮ず")
         .then(() => {
-      _this.productDetailVisible = false
+          _this.productDetailVisible = false;
 
           app.unloadLoading = true;
           removeApp({ appId: app.id })
@@ -1416,7 +1470,7 @@
     },
 
     actSdkOrApp(item, type = "sdk") {
-      this.checkDetail(item, 'inactive')
+      this.checkDetail(item, "inactive");
       this.actType = type;
       this.actId = item.id;
       this.actStep = 0;
@@ -1424,9 +1478,9 @@
       this.activedSdkOrApp = this.newActInfo();
     },
 
-    cancelActivate(){
-      this.showInputCode= false
-      this.activeCode = ""
+    cancelActivate() {
+      this.showInputCode = false;
+      this.activeCode = "";
     },
     newActInfo() {
       return {
@@ -1454,21 +1508,21 @@
     },
     actived() {
       let _this = this;
-      if (this.activeCode.trim()=="") {
+      if (this.activeCode.trim() == "") {
         this.$notify({
           type: "error",
           message: "婵�娲荤爜涓嶈兘涓虹┖",
         });
-        return
+        return;
       }
       if (this.actType == "sdk") {
         //婵�娲荤畻娉�
         actPageAlg(this.actId, this.activeCode)
           .then((res) => {
             if (res.data.isSuccess) {
-              this.productDetailVisible = false
+              this.productDetailVisible = false;
               _this.activedSdkOrApp = res.data.successMsg;
-              this.showActivateSuccess=true
+              this.showActivateSuccess = true;
               _this.actStep++;
               _this.getUnActivedList();
               _this.getAllSdk();
@@ -1487,9 +1541,9 @@
         actApp(this.actId, this.activeCode)
           .then((res) => {
             if (res.data.isSuccess) {
-              this.productDetailVisible = false
+              this.productDetailVisible = false;
               _this.activedSdkOrApp = res.data.successMsg;
-              this.showActivateSuccess=true
+              this.showActivateSuccess = true;
               _this.actStep++;
               _this.getUnActivedAppList();
               _this.getAllApps();
@@ -1547,11 +1601,14 @@
           });
         });
     },
-    openApp(){
-      let message = 'toOpenApp?' + this.productDetail.productBaseId;
-      window.parent.postMessage({
-        msg: message
-      }, "*")
+    openApp() {
+      let message = "toOpenApp?" + this.productDetail.productBaseId;
+      window.parent.postMessage(
+        {
+          msg: message,
+        },
+        "*"
+      );
     },
 
     onFileAdded(f) {
@@ -1579,27 +1636,26 @@
 
           //绠楁硶杞欢 宸插畨瑁呭叾涓寘鍚緟鍗囩骇 鏈畨瑁�
           item.installed ? installedList.push(obj) : unInstalledList.push(obj);
-          item.isUpgrade ? hasNewVersionList.push(obj): null
+          item.isUpgrade ? hasNewVersionList.push(obj) : null;
         });
       }
       this.installedList = installedList;
       this.notInstalledList = unInstalledList;
       this.hasNewVersionSdk = hasNewVersionList;
     },
-    unloadSDKinWin(){
-
-      let appToUnload
-      let sdkToUnload
-      if (this.productDetail.productTypeName=="搴旂敤") {
-        appToUnload= this.installedApps.find((item)=>{
-          return item.id == this.productDetail.productBaseId
-        })
-        this.unLoad(appToUnload)
-      }else{
-          sdkToUnload= this.installedList.find((item)=>{
-          return item.id == this.productDetail.productBaseId
-        })
-        this.unLoadSdk(sdkToUnload)
+    unloadSDKinWin() {
+      let appToUnload;
+      let sdkToUnload;
+      if (this.productDetail.productTypeName == "搴旂敤") {
+        appToUnload = this.installedApps.find((item) => {
+          return item.id == this.productDetail.productBaseId;
+        });
+        this.unLoad(appToUnload);
+      } else {
+        sdkToUnload = this.installedList.find((item) => {
+          return item.id == this.productDetail.productBaseId;
+        });
+        this.unLoadSdk(sdkToUnload);
       }
     },
     //鍗歌浇绠楁硶
@@ -1607,17 +1663,17 @@
       let _this = this;
       this.$confirm("纭畾瑕佸嵏杞借绠楁硶鍚�?", "鎻愮ず")
         .then(() => {
-      _this.productDetailVisible = false
+          _this.productDetailVisible = false;
           sdk.unloadLoading = true;
           removeSdk({ sdkId: sdk.id })
             .then((res) => {
               if (res && res.success) {
                 sdk.unloadLoading = false;
                 this.$notify({
-                title: "鎴愬姛",
-                message: "鍗歌浇瀹屾垚",
-                type: "success",
-              });
+                  title: "鎴愬姛",
+                  message: "鍗歌浇瀹屾垚",
+                  type: "success",
+                });
                 _this.getAllSdk();
                 window.parent.postMessage(
                   {
@@ -1636,73 +1692,70 @@
           console.log(e);
         });
     },
-    upgradeSDKinWin(){
-
+    upgradeSDKinWin() {
       this.isUpgrading = !this.isUpgrading;
 
       let _this = this;
-      if (this.productDetail.productTypeName=="搴旂敤") {
-      installApp({ path: this.productDetail.productBaseId})
-        .then((res) => {
-          if (res && res.success) {
-         this.$notify({
-          title: "鎴愬姛",
-          message: "鍗囩骇瀹屾垚",
-          type: "success",
-        });
-        this.needToUpgradeInWin=false
-        this.productDetail.isUpgrade = false
-        this.isUpgrading = !this.isUpgrading;
-        
-          }
-        })
-        .catch((e) => {
+      if (this.productDetail.productTypeName == "搴旂敤") {
+        installApp({ path: this.productDetail.productBaseId })
+          .then((res) => {
+            if (res && res.success) {
+              this.$notify({
+                title: "鎴愬姛",
+                message: "鍗囩骇瀹屾垚",
+                type: "success",
+              });
+              this.needToUpgradeInWin = false;
+              this.productDetail.isUpgrade = false;
+              this.isUpgrading = !this.isUpgrading;
+            }
+          })
+          .catch((e) => {
             _this.$notify({
               title: "鍗囩骇澶辫触",
               message: e.data,
               type: "warning",
             });
-             this.isUpgrading = !this.isUpgrading;
-        });
+            this.isUpgrading = !this.isUpgrading;
+          });
 
-      // 寮�鍚嚜鍔ㄥ埛鏂�
-      this.appUpgreading = true;
-      }else{
-        downloadSdk({path:this.productDetail.productBaseId}).then((res)=>{
-          this.needToUpgradeInWin=false
-        this.productDetail.isUpgrade = false
-        this.isUpgrading = !this.isUpgrading;
-        this.$notify({
-          title: "鎴愬姛",
-          message: "鍗囩骇瀹屾垚",
-          type: "success",
-        });
-      }).catch((err)=>{
-        this.$notify({
-          title: "鍗囩骇澶辫触",
-          message: err.data,
-          type: "warning",
-        });
-        this.isUpgrading = !this.isUpgrading;
-      })
-      this.sdkUpgreading = true;
+        // 寮�鍚嚜鍔ㄥ埛鏂�
+        this.appUpgreading = true;
+      } else {
+        downloadSdk({ path: this.productDetail.productBaseId })
+          .then((res) => {
+            this.needToUpgradeInWin = false;
+            this.productDetail.isUpgrade = false;
+            this.isUpgrading = !this.isUpgrading;
+            this.$notify({
+              title: "鎴愬姛",
+              message: "鍗囩骇瀹屾垚",
+              type: "success",
+            });
+          })
+          .catch((err) => {
+            this.$notify({
+              title: "鍗囩骇澶辫触",
+              message: err.data,
+              type: "warning",
+            });
+            this.isUpgrading = !this.isUpgrading;
+          });
+        this.sdkUpgreading = true;
       }
-
-
-      
     },
-    downloadSdkInSide(){
+    downloadSdkInSide() {
       this.downloadItem = this.productDetail.productBaseId;
-      this.isUpgrading = true
+      this.isUpgrading = true;
       downloadSdk({ path: this.productDetail.productBaseId })
         .then((rsp) => {
-          this.productDetailVisible = false
+          this.productDetailVisible = false;
           this.downloadItem = "";
           this.$notify({
             type: "success",
-            message: "绠楁硶宸插畨瑁�"
+            message: "绠楁硶宸插畨瑁�",
           });
-      this.isUpgrading=false
+          this.isUpgrading = false;
         })
         .catch((err) => {
           this.$notify({
@@ -1710,12 +1763,13 @@
             message: err.data,
           });
           this.downloadItem = "";
-      this.isUpgrading=false
+          this.isUpgrading = false;
         });
       // 寮�鍚嚜鍔ㄥ埛鏂�
       this.sdkUpgreading = true;
     },
-    donwload(item,typ) {
+    donwload(item, typ) {
+      
       item.upgradeLoading = true;
       this.downloadItem = item.id;
 
@@ -1726,7 +1780,7 @@
           this.downloadItem = "";
           this.$notify({
             type: "success",
-            message: typ==1? "绠楁硶瀹夎鎴愬姛":"绠楁硶鍗囩骇鎴愬姛"
+            message: typ == 1 ? "绠楁硶瀹夎鎴愬姛" : "绠楁硶鍗囩骇鎴愬姛",
           });
         })
         .catch((err) => {
@@ -1801,9 +1855,8 @@
     height: 100%;
   }
   .product-detail-dialog {
-    .dialog-title{
-          font-size: 13px;
-
+    .dialog-title {
+      font-size: 13px;
     }
     .el-dialog {
       width: 50%;
@@ -1812,36 +1865,35 @@
     }
     .el-dialog__header {
       text-align: center;
-          padding: 6px;
+      padding: 6px;
 
       .el-dialog__headerbtn {
-          position: absolute;
-             top: 5px;
+        position: absolute;
+        top: 5px;
 
-          right: 20px;
-          padding: 0;
-          background: transparent;
-          outline: none;
-          cursor: pointer;
-          font-size: 20px;
+        right: 20px;
+        padding: 0;
+        background: transparent;
+        outline: none;
+        cursor: pointer;
+        font-size: 20px;
       }
     }
     .el-dialog__body {
       background-color: rgba(222, 225, 230, 1);
-          padding: 8px 3px;
-      .button-group{
+      padding: 8px 3px;
+      .button-group {
         position: absolute;
-               top: 3px;
+        top: 3px;
 
-            left:6px;
-                left: 10px;
-      .el-button--small {
-        padding: 5px 12px;
-
-    }
-        button{
+        left: 6px;
+        left: 10px;
+        .el-button--small {
+          padding: 5px 12px;
+        }
+        button {
           font-size: 18px;
-        line-height: 12px;  
+          line-height: 12px;
         }
       }
     }
@@ -1857,20 +1909,19 @@
           height: 330px;
           border-radius: 2px;
           .banner {
-        text-align: center;
-        margin-top: 3px;
-           video {
+            text-align: center;
+            margin-top: 3px;
+            video {
+              margin: 0px auto;
+              margin-top: 23px;
 
-            margin: 0px auto;
-                 margin-top: 23px;
-
-            width: 443px;
-          height: 277px;
-          }
-          img{
-                max-width: 90%;
-                     margin-top: 28px;
-          }
+              width: 443px;
+              height: 277px;
+            }
+            img {
+              max-width: 90%;
+              margin-top: 28px;
+            }
           }
         }
         .top-right {
@@ -1883,34 +1934,33 @@
           border-radius: 2px;
           overflow: hidden;
           .summary {
-                height: 120px;
+            height: 120px;
 
-
-                margin: 5px 5px 0 5px;
+            margin: 5px 5px 0 5px;
 
             .icon {
-             margin: 0 10px;
-                margin-top: 8px;
+              margin: 0 10px;
+              margin-top: 8px;
 
               float: left;
-              .baseImg{
-         max-width: 106px;
-    max-height: 106px;
+              .baseImg {
+                max-width: 106px;
+                max-height: 106px;
               }
             }
-            
+
             .right-desc {
               float: left;
               position: absolute;
-                 left: 140px;
+              left: 140px;
               .name {
-                    font-size: 28px;
+                font-size: 28px;
 
                 margin-bottom: 5px;
                 text-overflow: ellipsis;
-          white-space: nowrap;
-          overflow: hidden;
-          width: 250px;
+                white-space: nowrap;
+                overflow: hidden;
+                width: 250px;
               }
               .tags {
                 margin-bottom: 10px;
@@ -1919,55 +1969,50 @@
                 }
               }
             }
-           
           }
-           .jihuo-input{
-             margin-left: 10px;
-             margin-bottom: 10px;
-              .el-input{
-                float: left;
-                width: 63%;
-                margin-bottom: 8px;
-                margin-right: 10px;
-              }
-              el-button{
-                float: left;
-              }
+          .jihuo-input {
+            margin-left: 10px;
+            margin-bottom: 10px;
+            .el-input {
+              float: left;
+              width: 63%;
+              margin-bottom: 8px;
+              margin-right: 10px;
             }
+            el-button {
+              float: left;
+            }
+          }
           .product-intruduction {
             height: 200px;
-               margin-top: 3px;
+            margin-top: 3px;
 
             .part-title {
               display: block;
-                  line-height: 20px;
+              line-height: 20px;
 
               font-size: 16px;
               margin-left: 24px;
               border-bottom: 3px solid #3d68e1;
               width: fit-content;
-                 height: 26px;
-            margin-bottom: 8px;
-
+              height: 26px;
+              margin-bottom: 8px;
             }
             .text {
-                height: 156px;
+              height: 156px;
               overflow: auto;
               padding: 0 15px 0px 15px;
 
-
               .single-desc {
-                   margin-bottom: 10px;
-                        font-size: 13px;
-
-
+                margin-bottom: 10px;
+                font-size: 13px;
               }
             }
           }
         }
       }
       .box-bottom {
-            margin-top: 8px;
+        margin-top: 8px;
 
         height: 240px;
         .bot-left {
@@ -1984,24 +2029,22 @@
             margin-left: 24px;
             border-bottom: 3px solid #3d68e1;
             width: fit-content;
-               margin-bottom: 10px;
+            margin-bottom: 10px;
 
-              height: 33px;
-
+            height: 33px;
           }
           .list-zone {
             overflow: auto;
-                height: 190px;
-                padding: 0 20px;
+            height: 190px;
+            padding: 0 20px;
             .list-item {
               .desc {
                 background-color: rgba(242, 242, 242, 1.3);
-                      margin: 5px 12px 0 12px;
-                    font-size: 12px;
-                        line-height: 18px;
-
+                margin: 5px 12px 0 12px;
+                font-size: 12px;
+                line-height: 18px;
               }
-               margin-bottom: 12px;
+              margin-bottom: 12px;
             }
           }
         }
@@ -2021,13 +2064,12 @@
             border-bottom: 3px solid #3d68e1;
             width: fit-content;
             margin-bottom: 5px;
-                height: 33px;
-
+            height: 33px;
           }
           .item-zone {
             overflow: auto;
             height: 225px;
-              padding: 0px 12px;
+            padding: 0px 12px;
 
             .item {
               height: 165px;
@@ -2046,26 +2088,25 @@
                 img {
                   max-width: 60px;
                   max-height: 60px;
-                      position: absolute;
-                top: 20%;
-                left: 26%;
+                  position: absolute;
+                  top: 20%;
+                  left: 26%;
                 }
                 .icon-name {
-                 text-align: center;
-                position: absolute;
-                top: 61%;
-                   left: 12%;
-            width: 100px;
-            text-overflow: ellipsis;
-            white-space: nowrap;
-            overflow: hidden;
-              font-size: 13px;
-
+                  text-align: center;
+                  position: absolute;
+                  top: 61%;
+                  left: 12%;
+                  width: 100px;
+                  text-overflow: ellipsis;
+                  white-space: nowrap;
+                  overflow: hidden;
+                  font-size: 13px;
                 }
               }
               .look-button {
                 position: absolute;
-                      left: 30%;
+                left: 30%;
 
                 top: 76%;
               }
@@ -2228,8 +2269,7 @@
             max-width: 200px;
             .mask {
               width: 100%;
-              
-            
+
               .el-button + .el-button {
                 margin-left: 0 !important;
               }
@@ -2478,7 +2518,7 @@
         flex-wrap: wrap;
         justify-content: center;
         top: 0;
-       
+
         .bot-btn {
           flex: 1;
         }
@@ -2752,42 +2792,40 @@
     }
   }
 }
-.active-Dial{
-  .el-dialog{
-
+.active-Dial {
+  .el-dialog {
     min-width: 400px;
   }
 
-  .dialog-active{
-          .desc {
-          padding: 0 30px;
-          margin-bottom: 30px;
-          li {
-            border-bottom: 1px solid #eee;
-            height: 45px;
-            line-height: 45px;
-            font-size: 14px;
-            &:last-child {
-              border-bottom: none;
-            }
-            label {
-              display: inline-block;
-              width: 90px;
-              padding-left: 14px;
-              font-weight: bold;
-            }
-          }
+  .dialog-active {
+    .desc {
+      padding: 0 30px;
+      margin-bottom: 30px;
+      li {
+        border-bottom: 1px solid #eee;
+        height: 45px;
+        line-height: 45px;
+        font-size: 14px;
+        &:last-child {
+          border-bottom: none;
         }
-        .text-right {
-          padding-right: 30px;
-          text-align: right;
-          .tip {
-            color: #999;
-            line-height: 38px;
-          }
+        label {
+          display: inline-block;
+          width: 90px;
+          padding-left: 14px;
+          font-weight: bold;
         }
+      }
+    }
+    .text-right {
+      padding-right: 30px;
+      text-align: right;
+      .tip {
+        color: #999;
+        line-height: 38px;
+      }
+    }
+  }
 }
-}
-
 </style>
 
diff --git a/src/pages/desktop/index/App.vue b/src/pages/desktop/index/App.vue
index 4bbd122..7babd3b 100644
--- a/src/pages/desktop/index/App.vue
+++ b/src/pages/desktop/index/App.vue
@@ -86,7 +86,7 @@
         if (rsp && rsp.success) {
           _that.$store.state.desktop.docks = [];
           let installedApps = [];
-
+          rsp.data
           rsp.data.forEach(function (item) {
             if (item.installed) {
               let temp = {
diff --git a/src/pages/desktop/index/components/ToolsEntry.vue b/src/pages/desktop/index/components/ToolsEntry.vue
index c25e428..ac23151 100644
--- a/src/pages/desktop/index/components/ToolsEntry.vue
+++ b/src/pages/desktop/index/components/ToolsEntry.vue
@@ -107,13 +107,10 @@
       if (window.innerHeight >= 930) {
         //this.rowSize = 4;
         arr = this.chunk(tempArr, 24);
-        //arr = chunkArr(tempArr,24);
       } else {
         //this.rowSize = 3;
         arr = this.chunk(tempArr, 18);
-        //arr = chunkArr(tempArr, 18);
       }
-      console.log(arr)
       return arr
     },
     badgeNum() {
@@ -139,8 +136,6 @@
           location.assign("/");
           return;
         }
-
-        // 鎵撳紑妫�绱�, toSearch?showType=findByPic&targetId=108ba0bc-b0a1-433d-8e1e-d5d2e712b53b&picSmUrl=192.168.20.10:6700/47628,7cc869f3a9c714&compType=1
         if (msg.indexOf("toSearch") >= 0) {
           let params = msg.substring(7);
           this.addFrameByName("search", params)
@@ -181,13 +176,10 @@
         console.log(e)
       })
     },
-
     dockClick(dock) {
-
       if (dock.type === '1') {
         window.open(dock.url);
       } else if (dock.type === '2' && !dock.isOpen) {
-
         this.$store.dispatch('desktop/addFrame', {
           id: dock.id,
           icon: dock.src,
@@ -212,6 +204,7 @@
       } else if (dock.type === '2' && dock.isOpen) {
         this.$store.commit('desktop/resetMinFrame', dock.id);
       }
+      
     },
     resetDockItem() {
       const dockItems = document.getElementsByClassName('dock-item');
@@ -231,7 +224,6 @@
           dock = app;
         }
       });
-
       if (dock.isOpen) {
         this.$store.dispatch('desktop/closeFrame', dock);
       }
@@ -252,7 +244,6 @@
       });
     },
     addFrameByID(id, params) {
-
       let dock = null;
       let toClose = null
       this.$store.state.desktop.docks.forEach(app => {
diff --git a/src/pages/deviceCenter/index/App.vue b/src/pages/deviceCenter/index/App.vue
new file mode 100644
index 0000000..5f4b456
--- /dev/null
+++ b/src/pages/deviceCenter/index/App.vue
@@ -0,0 +1,1368 @@
+<template>
+  <div class="column">
+    <div class="column-left" ref="left">
+      <div class="left-title">璁惧绠$悊</div>
+      <div
+        class="left-item"
+        :ref="`item_${index}`"
+        v-for="(item, index) in groups"
+        :key="index"
+        @click="clickCard(index)"
+      >
+        <div class="cir-all">
+          <div class="pie">
+            <el-progress
+              :width="60"
+              :stroke-width="8"
+              :color="item.barColor"
+              :show-text="false"
+              type="circle"
+              :percentage="25"
+            ></el-progress>
+            <div class="circleCenter">25%</div>
+          </div>
+
+          <div class="circle-bot">
+            <div class="dot"></div>
+            鍦ㄧ嚎
+          </div>
+        </div>
+
+        <div class="desc-item">
+          <div class="desc-name">{{ item.name }}</div>
+          <div class="desc-count">
+            <span class="count-name">璁惧鎬婚噺锛�</span>
+            <span class="num" style="margin-right: 10px">{{ 31 }}</span>
+            <span class="count-name">绠楁硶锛�</span>
+            <span class="num">{{ 31 }}</span>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="column-right">
+      <div class="title">
+        <span class="m-t" @click="backToList">鍏ㄩ儴璁惧</span>
+
+        <span class="sep" v-show="isInDetail">|</span>
+
+        <span v-show="isInDetail">璁惧璇︽儏</span>
+      </div>
+
+      <div class="area-left" v-if="!isInDetail">
+        <!-- <div class="add-btn btn" ></div> -->
+        <div class="add-btn" @click="addDevice">
+          <span class="icon iconfont">&#xe646;</span>
+          <span class="add-text">娣诲姞璁惧</span>
+        </div>
+        <span
+          class="icon iconfont"
+          style="font-size: 25px"
+          :style="{ color: !showTable ? '#333333' : '#3d5ee1' }"
+          @click="showTable = true"
+          >&#xe64d;</span
+        >
+        <span
+          class="icon iconfont"
+          :style="{ color: showTable ? '#333333' : '#3d5ee1' }"
+          style="font-size: 19px"
+          @click="showTable = false"
+          >&#xe62d;</span
+        >
+      </div>
+
+      <el-dialog
+        v-drag
+        class="device-dial"
+        title="娣诲姞璁惧"
+        :visible.sync="dialogVisible"
+        :close-on-click-modal="false"
+        :destroy-on-close="true"
+        :modal-append-to-body="false"
+        width="50%"
+      >
+        <div style="">
+          <el-input
+            placeholder="璇疯緭鍏ラ泦缇P/璁惧ID/璁惧IP"
+            v-model="input3"
+            class="input-with-select"
+          >
+            <el-button slot="append" icon="el-icon-search"></el-button>
+          </el-input>
+        </div>
+
+        <el-table
+          :data="gTableData"
+          v-if="gTableData"
+          ref="elTable"
+          :header-cell-style="{
+            backgroundColor: `rgb(238, 238, 241)`,
+            'text-align': 'center',
+          }"
+          :row-style="{
+            height: `0`,
+          }"
+          :header-row-style="{
+            height: `0`,
+          }"
+          header-align="center"
+          @selection-change="taskTableSelection"
+        >
+          <!-- v-loading -->
+          <el-table-column
+            prop="name"
+            label="闆嗙兢鍚嶇О"
+            align="center"
+          ></el-table-column>
+          <el-table-column label="IP鍦板潃" align="center">
+            <template slot-scope="scope">
+              <div>{{ scope.row.ip }}</div>
+            </template>
+          </el-table-column>
+
+          <el-table-column label="鎿嶄綔" align="center">
+            <template slot-scope="scope">
+              <div class="operation">
+                <el-button size="mini" @click="applyAdd(scope.row)"
+                  >鐢宠娣诲姞璁惧</el-button
+                >
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column type="expand">
+            <template slot-scope="scope">
+              <div class="video-item">
+                <el-table
+                  ref="singleTable"
+                  :data="scope.row.deviceList"
+                  highlight-current-row
+                  @current-change="handleCurrentChange"
+                  style="width: 100%"
+                >
+                  <el-table-column label="搴忓彿" type="index" width="50">
+                  </el-table-column>
+                  <el-table-column property="id" label="鏃ユ湡" width="120">
+                  </el-table-column>
+                  <el-table-column property="ip" label="濮撳悕" width="120">
+                  </el-table-column>
+                  <el-table-column property="name" label="鍦板潃">
+                  </el-table-column>
+                </el-table>
+              </div>
+            </template>
+          </el-table-column>
+        </el-table>
+
+        <el-pagination
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+          :current-page="currentPage4"
+          :page-sizes="[10, 20, 50]"
+          :page-size="10"
+          layout="total, sizes, prev, pager, next, jumper"
+          :total="30"
+        >
+        </el-pagination>
+
+        <el-dialog
+          width="400px"
+          class="inner-dial"
+          v-drag
+          title="璇疯緭鍏ヨ澶囩鐞嗙殑鎺堟潈瀵嗛挜"
+          :visible.sync="innerVisible"
+          append-to-body
+          :modal="false"
+        >
+          <div class="code-text">瀵嗛挜淇℃伅璇疯闂澶囩鐞嗕汉鍛�</div>
+          <el-input
+            v-model="password"
+            size="small"
+            placeholder="璇疯緭鍏ユ巿鏉冨瘑閽�"
+            style="width: 200px"
+          ></el-input>
+          <span class="err-pw">瀵嗙爜閿欒 </span>
+
+          <span slot="footer" class="dialog-footer">
+            <el-button size="small" @click="innerVisible = false"
+              >鍙� 娑�</el-button
+            >
+            <el-button type="primary" size="small" @click="innerVisible = false"
+              >纭� 瀹�</el-button
+            >
+          </span>
+        </el-dialog>
+        <span slot="footer" class="dialog-footer">
+          <el-button @click="dialogVisible = false">鍙� 娑�</el-button>
+          <el-button type="primary" @click="dialogVisible = false"
+            >纭� 瀹�</el-button
+          >
+        </span>
+      </el-dialog>
+
+      <el-menu
+        :default-active="activeIndex"
+        v-if="!isInDetail"
+        class="el-menu-demo"
+        mode="horizontal"
+        active-text-color="#3D60E1"
+        @select="handleSelect"
+      >
+        <el-menu-item index="1">鍏ㄩ儴锛坽{ 23 }}锛�</el-menu-item>
+        <el-menu-item index="2">鍦ㄧ嚎锛坽{ 23 }}锛�</el-menu-item>
+        <el-menu-item index="3">绂荤嚎锛坽{ 23 }}锛�</el-menu-item>
+      </el-menu>
+
+      <el-table
+        v-if="showTable && !isInDetail"
+        ref="multipleTable"
+        highlight-current-row
+        :data="jTableData"
+        style="width: 100%"
+        :header-cell-style="{ background: '#EEEEF1', color: '#222222' }"
+      >
+        <el-table-column
+          align="center"
+          prop="name"
+          label="璁惧鍚嶇О"
+        ></el-table-column>
+        <el-table-column
+          align="center"
+          prop="id"
+          label="璁惧ID"
+        ></el-table-column>
+        <el-table-column
+          align="center"
+          prop="ip"
+          label="IP鍦板潃"
+        ></el-table-column>
+        <el-table-column
+          align="center"
+          prop="downloadTime"
+          label="瀹夎鏃堕棿"
+        ></el-table-column>
+        <el-table-column
+          align="center"
+          prop="firstTime"
+          label="棣栨浣跨敤鏃堕棿"
+        ></el-table-column>
+        <el-table-column
+          align="center"
+          prop="group"
+          label="鎵�灞為泦缇�"
+        ></el-table-column>
+        <el-table-column
+          align="center"
+          prop="state"
+          label="鐘舵��"
+        ></el-table-column>
+        <el-table-column label="鎿嶄綔" :align="'center'">
+          <template slot-scope="scope">
+            <div class="circle-bot">
+              <div class="dot"></div>
+              鍦ㄧ嚎{{ scope.row.state }}
+            </div>
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <div class="cards-group" v-show="!showTable && !isInDetail">
+        <el-row :gutter="20">
+          <el-col
+            :xs="5"
+            :sm="5"
+            :md="5"
+            :lg="5"
+            v-for="(item, i) in cardList"
+            :key="i"
+          >
+            <div class="card-item" @click="checkDetail">
+              <div class="card-icon"></div>
+              <div class="server-name">鏈嶅姟鍣�20.10</div>
+              <div class="server-ip">192.168.20.10:7009/</div>
+              <el-divider></el-divider>
+
+              <div class="info-list">
+                <div class="item">
+                  <div class="item-name">鍐呭瓨</div>
+                  <div class="bar-outer">
+                    <div
+                      class="bar-inner"
+                      :style="{ width: widthObj.storage }"
+                    ></div>
+                  </div>
+                  <span class="percent-text">{{ widthObj.storage }}</span>
+                </div>
+                <div class="item">
+                  <div class="item-name">绠楀姏</div>
+                  <div class="bar-outer">
+                    <div
+                      class="bar-inner"
+                      :style="{ width: widthObj.power, background: '#F99D9D' }"
+                    ></div>
+                  </div>
+                  <span class="percent-text">{{ widthObj.power }}</span>
+                </div>
+                <div class="item">
+                  <div class="item-name">CPU</div>
+                  <div class="bar-outer">
+                    <div
+                      class="bar-inner"
+                      :style="{ width: widthObj.cpu }"
+                    ></div>
+                  </div>
+                  <span class="percent-text">{{ widthObj.cpu }}</span>
+                </div>
+                <div class="item">
+                  <div class="item-name">纭洏</div>
+                  <div class="bar-outer">
+                    <div
+                      class="bar-inner"
+                      :style="{ width: widthObj.hard }"
+                    ></div>
+                  </div>
+                  <span class="percent-text">{{ widthObj.hard }}</span>
+                </div>
+              </div>
+            </div>
+          </el-col>
+        </el-row>
+      </div>
+
+      <div class="detail-page" v-if="isInDetail">
+        <div class="detail-top">
+          <div class="detail-title">鏈嶅姟鍣�20.10</div>
+          <div class="device-time">璁惧褰撳墠鏃堕棿锛歿{ "2021-03-04" }}</div>
+          <div class="btn-group">
+            <div class="btn">鍔犲叆闆嗙兢</div>
+            <div class="btn">璁惧閲嶅惎</div>
+            <div class="btn">绉婚櫎璁惧</div>
+          </div>
+        </div>
+
+        <div class="detail-info">
+          <div class="basic-info">
+            <div class="basic-info-title">璁惧鍩烘湰淇℃伅</div>
+            <el-divider></el-divider>
+            <div class="info-content">
+              <div class="single-content">
+                <div class="head-title">璁惧淇℃伅</div>
+                <div class="bar-content">
+                  <span>璁惧ID</span>
+                  <span>DWOFWE1039120</span>
+                </div>
+                <div class="bar-content">
+                  <span>璁惧ID</span>
+                  <span>DWOFWE1039120</span>
+                </div>
+                <div class="bar-content">
+                  <span>璁惧ID</span>
+                  <span>DWOFWE1039120</span>
+                </div>
+                <div class="bar-content">
+                  <span>璁惧ID</span>
+                  <span>DWOFWE1039120</span>
+                </div>
+              </div>
+              <div class="single-content">
+                <div class="head-title">纭欢淇℃伅</div>
+                <div class="bar-content">
+                  <span>璁惧ID</span>
+                  <span>DWOFWE1039120</span>
+                </div>
+                <div class="bar-content">
+                  <span>璁惧ID</span>
+                  <span>DWOFWE1039120</span>
+                </div>
+              </div>
+            </div>
+          </div>
+          <div class="info-right">
+            <div class="performance">
+              <div class="basic-info-title">璁惧鎬ц兘</div>
+              <el-divider></el-divider>
+              <div class="performance-content">
+                <el-progress
+                  type="circle"
+                  :percentage="25"
+                  :width="70"
+                  :stroke-width="15"
+                ></el-progress>
+                <el-progress
+                  type="circle"
+                  color="rgba(49, 249, 170, 1)"
+                  :percentage="25"
+                  :width="70"
+                  :stroke-width="15"
+                ></el-progress>
+                <el-progress
+                  type="circle"
+                  color="rgba(249, 210, 49, 1)"
+                  :percentage="25"
+                  :width="70"
+                  :stroke-width="15"
+                ></el-progress>
+                <el-progress
+                  type="circle"
+                  color="rgba(249, 129, 129, 1)"
+                  :percentage="25"
+                  :width="70"
+                  :stroke-width="15"
+                ></el-progress>
+              </div>
+              <div class="names">
+                <div class="name">鍐呭瓨</div>
+                <div class="name">绠楀姏</div>
+                <div class="name">CPU</div>
+                <div class="name">纭洏</div>
+              </div>
+            </div>
+            <div class="version">
+              <div class="basic-info-title">璁惧鐗堟湰淇℃伅</div>
+              <el-divider></el-divider>
+              <div class="info-content">
+                <div class="single-content">
+                  <div class="bar-content">
+                    <span>璁惧ID</span>
+                    <span>DWOFWE1039120</span>
+                  </div>
+                  <div class="check-new">
+                    <span class="text">妫�娴嬪埌鏈夋柊鐗堟湰锛�2.23.1</span>
+                    <div class="btn">鏇存柊</div>
+                  </div>
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+
+        <div class="count-list">
+          <div class="count-item">
+            <div class="desc">绠楁硶鎬婚噺</div>
+            <div class="num">{{ 22 }}</div>
+          </div>
+          <div class="count-item">
+            <div class="desc">搴旂敤鎬婚噺</div>
+            <div class="num">{{ 22 }}</div>
+          </div>
+          <div class="count-item">
+            <div class="desc">绠楁硶寰呮洿鏂版�婚噺</div>
+            <div class="num">{{ 22 }}</div>
+          </div>
+          <div class="count-item">
+            <div class="desc">搴旂敤寰呮洿鏂版�婚噺</div>
+            <div class="num">{{ 22 }}</div>
+          </div>
+        </div>
+        <div class="skd-list">
+          <div class="basic-info-title">
+            <span class="small-title">瀹夎鐨勭畻娉�</span>
+            <el-select v-model="value" placeholder="璇烽�夋嫨" size="mini">
+              <el-option
+                v-for="item in options"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+          </div>
+          <el-divider></el-divider>
+          <div class="list-display">
+            <el-row :gutter="20" style="padding: 15px 15px 5px 15px">
+              <el-col
+                :xs="5"
+                :sm="5"
+                :md="5"
+                :lg="5"
+                v-for="(item, i) in sdkList"
+                :key="i"
+              >
+                <div
+                  class="item-card"
+                  :class="{ willUpGrade: item.isUpgrade }"
+                  v-loading="item.upgradeLoading"
+                  element-loading-text="绠楁硶涓嬭浇涓�"
+                  element-loading-background="rgba(0,0,0,.8)"
+                >
+                  <i class="iconfont iconupdate" v-if="1"></i>
+                  <div class="up">
+                    <div class="img-wrap"></div>
+                    <div class="right-desc">
+                      <div>
+                        <div class="card-title">鏈甫瀹夊叏甯芥娴�</div>
+                        <div class="tag-btn">{{ "杞" }}</div>
+                      </div>
+                    </div>
+                  </div>
+                  <div class="down">
+                    <div class="down-bar">瀹夎鏃堕棿</div>
+                    <div class="down-bar">杩囨湡鏃堕棿</div>
+                    <div class="down-bar">婵�娲荤爜</div>
+                  </div>
+
+                  <div class="card-mask">
+                    <i class="iconfont iconupdate" v-if="item.isUpgrade"></i>
+                    <div class="left-top">
+                      <div>褰撳墠鐗堟湰锛歿{ 2121 }}</div>
+                      <div v-if="1">鏈�鏂扮増鏈細{{ 32231 }}</div>
+                    </div>
+                    <div class="btns">
+                      <el-button type="primary" size="small">鍗歌浇</el-button>
+                      <el-button
+                        type="warning"
+                        size="small"
+                        @click="upgradeSDK(item)"
+                        >鍗囩骇</el-button
+                      >
+                    </div>
+                  </div>
+                </div>
+              </el-col>
+            </el-row>
+          </div>
+        </div>
+
+        <div class="app-list">
+          <div class="basic-info-title">
+            <span class="small-title">瀹夎鐨勫簲鐢�</span>
+            <el-select v-model="value" placeholder="璇烽�夋嫨" size="mini">
+              <el-option
+                v-for="item in options"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+          </div>
+          <el-divider></el-divider>
+
+          <div class="list-display">
+            <el-row :gutter="20" style="padding: 15px 15px 5px 15px">
+              <el-col
+                :xs="5"
+                :sm="5"
+                :md="5"
+                :lg="5"
+                v-for="(item, i) in sdkList"
+                :key="i"
+              >
+                <div class="item-card">
+                  <i class="iconfont iconupdate" v-if="1"></i>
+                  <div class="up">
+                    <div class="img-wrap"></div>
+                    <div class="right-desc">
+                      <div>
+                        <div class="card-title">鏈甫瀹夊叏甯芥娴�</div>
+                        <div class="tag-btn">{{ "杞" }}</div>
+                      </div>
+                    </div>
+                  </div>
+                  <div class="down">
+                    <div class="down-bar">瀹夎鏃堕棿</div>
+                    <div class="down-bar">杩囨湡鏃堕棿</div>
+                    <div class="down-bar">婵�娲荤爜</div>
+                  </div>
+                  <div class="card-mask">
+                    <div class="left-top">
+                      <div>褰撳墠鐗堟湰锛歿{ 2121 }}</div>
+                      <div v-if="1">鏈�鏂扮増鏈細{{ 32231 }}</div>
+                    </div>
+                    <div class="btns">
+                      <el-button type="primary" size="small">鍗歌浇</el-button>
+                      <el-button type="warning" size="small">鍗囩骇</el-button>
+                    </div>
+                  </div>
+                </div>
+              </el-col>
+            </el-row>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "VideoManage",
+  components: {},
+  data() {
+    return {
+      input3: "",
+      dialogVisible: false,
+      screenHeight: 0,
+      jTableData: [
+        {
+          name: "澶ц泧涓�",
+          id: "efefw",
+          ip: "2123",
+          downloadTime: "239:212",
+          firstTime: "fe12",
+          group: "feee",
+          state: "fefe",
+        },
+      ],
+      gTableData: [
+        {
+          name: "鏈嶅姟鍣�20.10",
+          ip: "11111",
+          deviceList: [
+            {
+              id: "21312",
+              ip: "2232fef",
+              name: "eofs",
+            },
+            {
+              id: "3423",
+              ip: "2232eef",
+              name: "fe",
+            },
+            {
+              id: "45435",
+              ip: "2232fgg",
+              name: "eoffaefws",
+            },
+          ],
+        },
+        {
+          name: "鏈嶅姟鍣�20.11",
+          ip: "22222",
+        },
+      ],
+      currentPage4: 4,
+      groups: [
+        {
+          barColor: "#535FF4",
+          name: "鍏ㄩ儴璁惧",
+        },
+        {
+          barColor: "#A07EF0",
+          name: "Basic闆嗙兢",
+        },
+        {
+          barColor: "#EE6779",
+          name: "瀛︽牎闆嗙兢",
+        },
+        {
+          barColor: "#67C6F1",
+          name: "鏈姞鍏ラ泦缇�",
+        },
+      ],
+      highlightCardIndex: 0,
+      cardList: [{}, {}, {}, {}, {}, {}, {}, {}, {}],
+      widthObj: {
+        storage: "50%",
+        power: "30%",
+        cpu: "50%",
+        hard: "70%",
+      },
+      showTable: true,
+      isInDetail: false,
+      sdkList: [
+        { isUpgrade: false, upgradeLoading: false },
+        { isUpgrade: false, upgradeLoading: false },
+        { isUpgrade: false, upgradeLoading: false },
+        { isUpgrade: true, upgradeLoading: false },
+        { isUpgrade: false, upgradeLoading: false },
+        { isUpgrade: true, upgradeLoading: false },
+        { isUpgrade: false, upgradeLoading: false },
+        { isUpgrade: true, upgradeLoading: false },
+        { isUpgrade: true, upgradeLoading: false },
+        { isUpgrade: true, upgradeLoading: false },
+        { isUpgrade: false, upgradeLoading: false },
+      ],
+      appList: [{}, {}, {}, {}, {}, {}, {}],
+      options: [
+        {
+          value: "閫夐」1",
+          label: "榛勯噾绯�",
+        },
+        {
+          value: "閫夐」2",
+          label: "鍙岀毊濂�",
+        },
+        {
+          value: "閫夐」3",
+          label: "铓典粩鐓�",
+        },
+        {
+          value: "閫夐」4",
+          label: "榫欓』闈�",
+        },
+        {
+          value: "閫夐」5",
+          label: "鍖椾含鐑ら腑",
+        },
+      ],
+      value: "",
+      activeIndex: "1",
+      innerVisible: false,
+      password: "",
+    };
+  },
+  mounted() {
+    this.screenHeight = document.documentElement.clientHeight;
+    window.onresize = () => {
+      return (() => {
+        this.screenHeight = document.documentElement.clientHeight;
+      })();
+    };
+    this.$refs[`item_${0}`][0].style.backgroundColor = "#353A8A";
+  },
+  methods: {
+    upgradeSDK(item) {
+      item.upgradeLoading = true;
+      // setTimeout(() => {
+      // item.upgradeLoading=false
+
+      // }, 2400);
+    },
+    applyAdd(item) {
+      this.innerVisible = true;
+    },
+    handleSelect(key, keyPath) {
+      console.log(key, keyPath);
+    },
+    backToList() {
+      this.isInDetail = false;
+    },
+    checkDetail() {
+      this.isInDetail = true;
+    },
+    addDevice() {
+      this.dialogVisible = true;
+    },
+    clickCard(i) {
+      this.$refs[`item_${this.highlightCardIndex}`][0].style.backgroundColor =
+        "#25283A";
+      this.highlightCardIndex = i;
+      this.$refs[`item_${i}`][0].style.backgroundColor = "#353A8A";
+    },
+  },
+  directives: {
+    drag(el, binding) {
+      const dialogHeaderEl = el.querySelector(".el-dialog__header");
+      const dragDom = el.querySelector(".el-dialog");
+      dialogHeaderEl.style.cursor = "move";
+      const sty =
+        dragDom.currentStyle || window.getComputedStyle(dragDom, null);
+      dialogHeaderEl.onmousedown = (e) => {
+        const disX = e.clientX - dialogHeaderEl.offsetLeft;
+        const disY = e.clientY - dialogHeaderEl.offsetTop;
+        let styL, styT;
+
+        if (sty.left.includes("%")) {
+          styL =
+            +document.body.clientWidth * (+sty.left.replace(/\%/g, "") / 100);
+          styT =
+            +document.body.clientHeight * (+sty.top.replace(/\%/g, "") / 100);
+        } else {
+          styL = +sty.left.replace(/\px/g, "");
+          styT = +sty.top.replace(/\px/g, "");
+        }
+        document.onmousemove = function (e) {
+          const l = e.clientX - disX;
+          const t = e.clientY - disY;
+          dragDom.style.left = `${l + styL}px`;
+          dragDom.style.top = `${t + styT}px`;
+        };
+        document.onmouseup = function (e) {
+          document.onmousemove = null;
+          document.onmouseup = null;
+        };
+      };
+    },
+  },
+  watch: {
+    // isInDetail(v){
+    //   debugger
+    //   if (v) {
+    //     document.getElementsByClassName("column-right").style.backgroundColor = 'rgba(240, 242, 245, 1)'
+    //   } else {
+    //     document.getElementsByClassName("column-right").style.backgroundColor = 'initial'
+    //   }
+    // }
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.column {
+  height: 100%;
+  display: flex;
+  flex-direction: row;
+  flex: 1;
+  flex-basis: auto;
+  box-sizing: border-box;
+}
+.circle-bot {
+  width: 55px;
+  text-align: center;
+  margin: 0 auto;
+  font-size: 12px;
+  font-weight: 400;
+  color: #00b948;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  line-height: 16px;
+  .dot {
+    width: 5px;
+    height: 5px;
+    background: #00b948;
+    border-radius: 50%;
+    display: inline-block;
+    margin-right: 3px;
+  }
+}
+.column-left {
+  background-color: #2f325a;
+  height: 100%;
+  width: 300px;
+  overflow: auto;
+  box-sizing: border-box;
+  flex-shrink: 0;
+  padding: 10px;
+  .left-title {
+    font-size: 25px;
+    color: #ffffff;
+    text-align: left;
+    padding: 10px;
+    padding-top: 5px;
+  }
+  .left-item {
+    border-radius: 8px;
+    height: 100px;
+    margin-bottom: 10px;
+    cursor: pointer;
+    display: flex;
+    align-items: center;
+    box-sizing: border-box;
+    color: #ffffff;
+    background-color: #25283a;
+    .cir-all {
+      margin-left: 15px;
+      margin-right: 5px;
+    }
+    .pie {
+      position: relative;
+    }
+
+    .circleCenter {
+      position: absolute;
+      width: 60px;
+      top: 22px;
+
+      text-align: center;
+      left: 0px;
+      font-size: 15px;
+      font-weight: 600;
+    }
+
+    .desc-item {
+      height: 80px;
+      .desc-name {
+        text-align: left;
+        font-size: 16px;
+        padding: 10px;
+      }
+      .desc-count {
+        text-align: left;
+        padding: 0 10px 10px 10px;
+        .count-name {
+          font-size: 14px;
+          color: #7477a2;
+        }
+        .num {
+          font-size: 24px;
+          font-family: Impact;
+          font-weight: 400;
+          color: #5781ff;
+        }
+      }
+    }
+  }
+  .left-item:hover {
+    background-color: #353a8a;
+  }
+}
+.column-right {
+  flex: 1;
+  flex-basis: auto;
+  overflow: auto;
+  // background-color: rgba(240, 242, 245, 1);
+  box-sizing: border-box;
+  padding: 10px 15px;
+  position: relative;
+  .title {
+    text-align: left;
+    font-size: 16px;
+    font-weight: 600;
+    color: #333333;
+    padding: 5px 15px;
+    .m-t {
+      cursor: pointer;
+    }
+    .m-t:hover {
+      font-weight: 600;
+      color: #3d68e1;
+    }
+    .sep {
+      margin: 0 10px 0px 15px;
+      font-size: 20px;
+      color: lightgray;
+    }
+  }
+  .el-menu-item {
+    font-size: 15px;
+
+    font-weight: 600;
+    padding: 0 15px;
+  }
+
+  .el-menu--horizontal > .el-menu-item {
+    height: 50px;
+    line-height: 50px;
+  }
+  .area-left {
+    height: 40px;
+    display: flex;
+    width: 150px;
+    justify-content: space-between;
+    align-items: center;
+    position: absolute;
+    top: 47px;
+    right: 15px;
+    z-index: 1;
+    .icon {
+      cursor: pointer;
+      color: #333333;
+    }
+    .icon:hover {
+      color: #3d5ee1 !important;
+    }
+    .add-btn {
+      display: flex;
+      align-items: center;
+      width: 90px;
+      cursor: pointer;
+      font-size: 16px;
+      justify-content: space-evenly;
+      color: #3d62e1;
+      .icon {
+        font-size: 18px;
+        color: #3d5ee1;
+        line-height: 24px;
+      }
+      .add-text {
+        height: 24px;
+        line-height: 24px;
+      }
+    }
+    .add-btn:hover {
+      font-weight: 600;
+    }
+  }
+  .el-table {
+    margin-top: 15px;
+  }
+  .cards-group {
+    margin-top: 15px;
+
+    .card-item {
+      height: 270px;
+      margin-bottom: 20px;
+      border-radius: 4px;
+      box-shadow: 0px 0px 7px 0px rgba(167, 167, 167, 0.53);
+      padding: 15px;
+      background-color: #fff;
+      position: relative;
+      box-sizing: border-box;
+      cursor: pointer;
+
+      .card-icon {
+        height: 75px;
+        width: 75px;
+        background-color: gainsboro;
+        margin: 0 auto;
+      }
+      .server-name {
+        margin: 5px auto;
+        font-size: 16px;
+        font-weight: bold;
+        color: #333333;
+      }
+      .server-ip {
+        font-size: 14px;
+        margin-bottom: 5px;
+        color: #ccccd2;
+      }
+      .info-list {
+        margin-top: 13px;
+        .item {
+          display: flex;
+          align-items: center;
+          height: 24px;
+          .item-name {
+            font-size: 14px;
+            color: #333333;
+            min-width: 28px;
+            // width: 18%;
+            margin-right: 5px;
+          }
+          .bar-outer {
+            height: 11px;
+            background-color: #eeeef1;
+            overflow: hidden;
+            position: relative;
+            width: 70%;
+            vertical-align: middle;
+            margin-right: 6px;
+            .bar-inner {
+              opacity: 0.5;
+
+              position: absolute;
+              left: 0;
+              top: 0;
+              height: 100%;
+              background-color: #bfccf6;
+              text-align: right;
+              border-radius: 6px;
+              line-height: 1;
+              white-space: nowrap;
+              transition: width 0.6s ease;
+            }
+          }
+          .percent-text {
+            font-size: 14px;
+          }
+        }
+      }
+    }
+    .card-item:hover {
+      box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.4);
+    }
+    .el-col-lg-5 {
+      width: 20%;
+    }
+  }
+
+  .detail-page {
+    .detail-top {
+      height: 50px;
+      padding: 0 20px;
+      background-color: #fff;
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+      border-radius: 5px;
+      .detail-title {
+        font-size: 16px;
+        font-weight: 600;
+      }
+      .device-time {
+        font-size: 14px;
+      }
+      .btn-group {
+        width: 270px;
+        display: flex;
+        justify-content: space-between;
+        align-items: center;
+      }
+    }
+    .basic-info-title {
+      text-align: left;
+      padding: 8px 15px;
+      font-size: 14px;
+      display: flex;
+      justify-content: space-between;
+      .small-title {
+        font-size: 16px;
+        line-height: 28px;
+      }
+      .el-select {
+        width: 140px;
+      }
+    }
+    .detail-info {
+      width: 100%;
+      height: 300px;
+      display: flex;
+      justify-content: space-between;
+      margin-top: 10px;
+      .basic-info {
+        height: 300px;
+        width: 60%;
+        background-color: #fff;
+        margin-right: 10px;
+      }
+
+      .info-content {
+        padding: 15px 50px;
+        .single-content {
+          margin-bottom: 10px;
+          .head-title {
+            text-align: left;
+            margin-bottom: 10px;
+          }
+          .bar-content {
+            display: flex;
+            justify-content: space-between;
+            background-color: #f7f9fa;
+            margin-bottom: 4px;
+            padding: 2px 10px;
+            height: 20px;
+            color: #a1a1a1;
+            align-items: center;
+          }
+        }
+      }
+      .info-right {
+        height: 300px;
+        width: 40%;
+        .performance {
+          height: 170px;
+          background-color: #fff;
+          .performance-content {
+            margin-top: 20px;
+            display: flex;
+            justify-content: space-evenly;
+          }
+          .names {
+            margin-top: 10px;
+            display: flex;
+            justify-content: space-evenly;
+            .name {
+              width: 70px;
+              text-align: center;
+            }
+          }
+        }
+        .version {
+          margin-top: 10px;
+          height: 120px;
+          background-color: #fff;
+          .check-new {
+            .text {
+              margin-right: 10px;
+            }
+            align-items: center;
+            display: flex;
+            justify-content: space-between;
+            padding: 0 10px;
+          }
+        }
+      }
+    }
+    .count-list {
+      margin-top: 10px;
+      background-color: #fff;
+      display: flex;
+      justify-content: space-evenly;
+      align-items: center;
+      padding: 15px;
+
+      .count-item {
+        width: 25%;
+        height: 55px;
+        border-right: 1px solid rgba(177, 179, 181, 1);
+        .desc {
+          height: 20px;
+          line-height: 20px;
+          font-size: 14px;
+          color: rgba(0, 0, 0, 0.447058);
+        }
+        .num {
+          height: 35px;
+          line-height: 35px;
+          font-size: 24px;
+        }
+      }
+      .count-item:last-child {
+        border: none;
+      }
+    }
+    .list-display {
+      .el-col-lg-5 {
+        width: 20%;
+      }
+    }
+    .item-card {
+      border: 1px solid rgba(233, 233, 233, 1);
+      height: 145px;
+      position: relative;
+      margin-bottom: 15px;
+      svg {
+        position: absolute;
+        top: 50%;
+        left: 50%;
+        transform: translate(-50%, -50%);
+      }
+      .iconupdate {
+        color: #01e667;
+        position: absolute;
+        top: 8px;
+        right: 8px;
+        font-size: 25px;
+      }
+
+      .up {
+        height: 70px;
+        display: flex;
+        background-color: rgba(247, 249, 250, 1);
+        .img-wrap {
+          width: 70px;
+          height: 100%;
+          background-color: cornsilk;
+        }
+        .right-desc {
+          display: flex;
+          align-items: center;
+          padding: 10px;
+          .card-title {
+            font-size: 14px;
+            font-weight: 600;
+            margin-bottom: 5px;
+          }
+          .tag-btn {
+            background-color: cornflowerblue;
+            color: white;
+            border-radius: 15px;
+            width: 55px;
+            height: 18px;
+            line-height: 18px;
+          }
+        }
+      }
+      .down {
+        height: 75px;
+        display: flex;
+        flex-direction: column;
+        justify-content: center;
+
+        .down-bar {
+          height: 16px;
+          padding: 2px 15px;
+
+          text-align: left;
+        }
+      }
+    }
+    .item-card:hover {
+      .card-mask {
+        display: block;
+      }
+    }
+    .skd-list {
+      min-height: 300px;
+      background-color: #fff;
+      margin: 10px 0;
+    }
+    .app-list {
+      min-height: 300px;
+      background-color: #fff;
+      margin: 10px 0;
+    }
+  }
+}
+.inner-dial {
+  .el-dialog__body {
+    text-align: left;
+    padding: 10px 50px;
+    .code-text {
+      margin: 10px 0;
+    }
+    .err-pw {
+      color: red;
+      margin-left: 10px;
+    }
+  }
+  .el-dialog__header {
+    padding: 10px 20px;
+    border-bottom: 1px solid #eee;
+  }
+  .el-dialog__title {
+    font-size: 16px;
+  }
+}
+.device-dial {
+  .el-dialog__body {
+    padding: 10px 20px 15px 20px;
+  }
+}
+.el-dialog {
+  .el-dialog__header {
+    padding: 10px 20px;
+    text-align: left;
+    .el-dialog__headerbtn {
+      top: 13px;
+    }
+    .el-dialog__headerbtn .el-dialog__close {
+      color: #909399;
+    }
+  }
+}
+.heigher-index {
+  position: absolute;
+  top: 0;
+  z-index: 10;
+  width: 100%;
+  height: 100%;
+}
+
+.el-divider--horizontal {
+  margin: 0;
+}
+.btn {
+  height: 25px;
+  width: 80px;
+  font-size: 13px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  background-color: rgba(229, 240, 255, 1);
+  border: 1px solid rgba(215, 215, 215, 1);
+  cursor: pointer;
+  border-radius: 4px;
+}
+.card-mask {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  background: rgba(0, 0, 0, 0.5);
+  backdrop-filter: blur(0.5px) brightness(100%);
+  text-align: center;
+  z-index: 1;
+  display: none;
+  // svg {
+  //   position: absolute;
+  //   top: 49%;
+  //   left: 50%;
+  //   transform: translate(-50%, -50%);
+  //   z-index: 33;
+  // }
+  .left-top {
+    position: absolute;
+    left: 10px;
+    top: 6px;
+
+    font-size: 14px;
+    color: #fff;
+    text-align: left;
+  }
+  .btns {
+    position: absolute;
+    bottom: 12px;
+    right: 10px;
+    .el-button--small {
+      padding: 7px 13px;
+      font-size: 14px;
+    }
+  }
+}
+.input-with-select .el-input-group__prepend {
+  background-color: #fff;
+}
+</style>
diff --git a/src/pages/deviceCenter/index/main.ts b/src/pages/deviceCenter/index/main.ts
new file mode 100644
index 0000000..36c7ac2
--- /dev/null
+++ b/src/pages/deviceCenter/index/main.ts
@@ -0,0 +1,30 @@
+import Vue from "vue";
+import App from './App.vue';
+
+import ElementUI from 'element-ui';
+import 'element-ui/lib/theme-chalk/index.css';
+import "@/assets/css/element-variables.scss";
+
+import ToggleButton from 'vue-js-toggle-button';
+import VueAwesomeSwiper from "vue-awesome-swiper";
+import "swiper/dist/css/swiper.css";
+import * as VueWindow from "@hscmap/vue-window";
+import moment from 'moment';
+import Mixin from "./mixins";
+
+Vue.prototype.$moment = moment;
+Vue.use(ElementUI);
+Vue.use(ToggleButton);
+Vue.use(VueAwesomeSwiper as any);
+Vue.use(VueWindow);
+Vue.filter('moment', function (value, formatString) {
+  formatString = formatString || 'YYYY-MM-DD HH:mm:ss';
+  return moment(value).format(formatString);
+
+});
+Vue.mixin(Mixin);
+
+new Vue({
+  el: '#app',
+  render: h => h(App)
+})
diff --git a/src/pages/deviceCenter/index/mixins.ts b/src/pages/deviceCenter/index/mixins.ts
new file mode 100644
index 0000000..52fb92b
--- /dev/null
+++ b/src/pages/deviceCenter/index/mixins.ts
@@ -0,0 +1,25 @@
+import TreeDataPool from "@/Pool/TreeData";
+import DataStackPool from "@/Pool/dataStack"
+import DataPool from "@/Pool/PollData"
+import VideoManageData from "@/Pool/VideoManageData";
+import TaskMange from '@/Pool/TaskMange'
+
+/* eslint-disable */
+const onlyTreeDataPool = new TreeDataPool
+const onlyDataStack = new DataStackPool
+const onlyDataPool = new DataPool
+const onlyVideoManageData = new VideoManageData
+const onlyTaskMange = new TaskMange
+
+const mixin = {
+  data() {
+    return {
+      TreeDataPool: onlyTreeDataPool,
+      DataStackPool: onlyDataStack,
+      VideoManageData: onlyVideoManageData,
+      TaskMange: onlyTaskMange,
+      PollData: onlyDataPool
+    };
+  },
+};
+export default mixin;
\ No newline at end of file
diff --git a/src/pages/settings/components/BasicSetting.vue b/src/pages/settings/components/BasicSetting.vue
index b720c44..604374d 100644
--- a/src/pages/settings/components/BasicSetting.vue
+++ b/src/pages/settings/components/BasicSetting.vue
@@ -178,26 +178,8 @@
       <el-tab-pane label="鏃堕棿閰嶇疆" name="timeSet" v-if="isShow('settings:timeSet')">
         <el-form label-width="100px">
           <el-form-item label="璁惧鏃堕棿">
-            <!-- <el-input v-model="equipmentTime" placeholder="璇疯緭鍏�" size="small"></el-input> -->
             {{ equipmentTime }}
           </el-form-item>
-
-          <!-- <el-form-item label="鏃跺尯" prop="timezone">
-            <el-select
-              v-model="timezone"
-              placeholder="璇烽�夋嫨"
-              style="width: 360px; height: 32px"
-              size="small"
-              @change="checkTimeZone"
-            >
-              <el-option
-                v-for="item in timeZoneOption"
-                :key="item.value"
-                :label="item.label"
-                :value="item.value"
-              ></el-option>
-            </el-select>
-          </el-form-item>-->
           <div style="text-align: left;padding: 10px 0px">
             <div class="time-type">NTP鏍℃椂</div>
             <div style="padding: 10px 0px;">
@@ -349,15 +331,15 @@
     RadioSet
   },
   computed: {
-    timeZoneOption() {
-      let options = []
-      TimeZones.forEach(zone => {
-        options = options.concat(zone.utc.map(v => {
-          return { value: v, label: v }
-        }))
-      })
-      return options
-    },
+    // timeZoneOption() {
+    //   let options = []
+    //   TimeZones.forEach(zone => {
+    //     options = options.concat(zone.utc.map(v => {
+    //       return { value: v, label: v }
+    //     }))
+    //   })
+    //   return options
+    // },
     isAdmin() {
       if (
         sessionStorage.getItem("userInfo") &&
@@ -503,7 +485,6 @@
       this.initResourceConfig();
       this.initClockConf();
       //this.markStartTime();
-
     });
   },
   beforeDestroy() {
@@ -578,7 +559,6 @@
     },
     runClock() {
       this.equipmentTime = this.formatTime(++this.timestamp, 'Y-M-D h:m:s');
-      // console.log(this.equipmentTime)
       this.clockTimer = setTimeout(() => {
         this.runClock();
       }, 1000)
@@ -720,7 +700,6 @@
             message: "璁剧疆鎴愬姛"
           });
         }
-
         this.initClockConf();
       })
     },
diff --git a/src/pages/settings/components/ClusterManagement.vue b/src/pages/settings/components/ClusterManagement.vue
index d18c0c1..bedd193 100644
--- a/src/pages/settings/components/ClusterManagement.vue
+++ b/src/pages/settings/components/ClusterManagement.vue
@@ -321,12 +321,12 @@
     checkPsd(psd) {
       return psd.trim().length === 6
     },
-    cleanValue() {
-      this.members = [];
-    },
-    sHandleClick(tab, event) {
-      console.log(tab, event);
-    },
+    // cleanValue() {
+    //   this.members = [];
+    // },
+    // sHandleClick(tab, event) {
+    //   console.log(tab, event);
+    // },
     submitForm(formName) {
       this.$refs[formName].validate(valid => {
         if (valid) {
@@ -347,25 +347,25 @@
       });
     },
 
-    saveForm(formName) {
-      this.$refs[formName].validate(valid => {
-        if (valid) {
-          alert("submit!");
-          let json = {
-            enable: this.vrIpForm.enable,
-            serve_port: this.vrIpForm.serve_port,
-            virtual_ip: this.vrIpForm.virtual_ip,
+    // saveForm(formName) {
+    //   this.$refs[formName].validate(valid => {
+    //     if (valid) {
+    //       alert("submit!");
+    //       let json = {
+    //         enable: this.vrIpForm.enable,
+    //         serve_port: this.vrIpForm.serve_port,
+    //         virtual_ip: this.vrIpForm.virtual_ip,
 
-          };
-          setVrrp(json).then(() => {
-            this.getVrrpInfo();
-          });
-        } else {
-          console.log("error submit!!");
-          return false;
-        }
-      });
-    },
+    //       };
+    //       setVrrp(json).then(() => {
+    //         this.getVrrpInfo();
+    //       });
+    //     } else {
+    //       console.log("error submit!!");
+    //       return false;
+    //     }
+    //   });
+    // },
 
     join(formName) {
       let _this = this;
@@ -552,16 +552,16 @@
         }
       }
     },
-    getVrrpInfo() {
-      getVrrp().then(res => {
-        if (res.success) {
-          this.vrIpForm.virtual_ip = res.data.virtual_ip;
-          this.vrIpForm.enable = res.data.enable;
-        }
-      }).catch(e => {
-        console.log(e)
-      })
-    },
+    // getVrrpInfo() {
+    //   getVrrp().then(res => {
+    //     if (res.success) {
+    //       this.vrIpForm.virtual_ip = res.data.virtual_ip;
+    //       this.vrIpForm.enable = res.data.enable;
+    //     }
+    //   }).catch(e => {
+    //     console.log(e)
+    //   })
+    // },
     async updateCluster() {
       if (this.ruleForm.clustername === "") {
         this.$message({
@@ -614,7 +614,15 @@
           this.members = [];
           this.innerNodes = [];
         }
-      }).catch(() => { });
+      }).catch(() => {
+         this.ruleForm.clustername = "";
+          this.ruleForm.clusterpwd = ""
+          this.clusterid = "";
+          this.isHasColony = false;
+          this.activeName = "1";
+          this.members = [];
+          this.innerNodes = [];
+       });
 
     },
     joinNode(event, node) {
diff --git a/src/pages/shuohuangMonitorAnalyze/components/guideIndex.vue b/src/pages/shuohuangMonitorAnalyze/components/guideIndex.vue
index d528eb6..9075503 100644
--- a/src/pages/shuohuangMonitorAnalyze/components/guideIndex.vue
+++ b/src/pages/shuohuangMonitorAnalyze/components/guideIndex.vue
@@ -570,8 +570,8 @@
           {
             name: '鏁伴噺',
             type: 'bar',
-            barWidth: '24%',
-            data: [21, 102, 100, 1, 7, 14]
+            barWidth: '60%',
+            data: [{value:21,itemStyle:{color:'#3aa0ff'}},{value:102,itemStyle:{color:'#36cbcb'}},{value:100,itemStyle:{color:'#4dcb73'}},{value:1,itemStyle:{color:'#fad337'}},{value:7,itemStyle:{color:'#f2637b'}}, {value:14,itemStyle:{color:'#975fe4'}}]
           }
         ]
       },
@@ -641,18 +641,18 @@
             name: '寮傚父浜嬩欢',
             type: 'pie',
             color: ['#3aa0ff', '#36cbcb', '#4dcb73', '#fad337', '#f2637b', '#975fe4'],
-            radius: ['70%', '90%'],
+            radius: ['50%', '80%'],
             //center: ['40%','60%'],
             avoidLabelOverlap: false,
             label: {
               show: false,
-              position: 'center',
+              // position: 'center',
               formatter: '{b}\n{c} '
             },
             emphasis: {
               label: {
                 show: true,
-                fontSize: '30',
+                fontSize: '20',
                 fontWeight: 'bold'
               }
             },
@@ -910,24 +910,35 @@
             name: '寮傚父浜嬩欢',
             type: 'pie',
             color: ['#3aa0ff', '#36cbcb', '#4dcb73', '#fad337', '#f2637b', '#975fe4'],
-            radius: ['70%', '90%'],
+            radius: ['50%', '80%'],
             //center: ['40%','60%'],
             avoidLabelOverlap: false,
             label: {
               show: false,
-              position: 'center',
+              // position: 'center',
               formatter: '{b}\n{c} '
             },
             emphasis: {
               label: {
                 show: true,
-                fontSize: '30',
+                fontSize: '20',
                 fontWeight: 'bold'
               }
             },
-            labelLine: {
-              show: false
+            itemStyle:{
+              normal:{
+                label:{
+                  show:true,
+                  formatter: '{b}\n{c} ',
+                  labelLine:{
+                    show:true
+                  }
+                }
+              }
             },
+            // labelLine: {
+            //   show: false
+            // },
             data: [
               { value: 32, name: '闃叉姢鍦版' },
               { value: 55, name: '杩涘嚭绔�' },
@@ -1110,6 +1121,46 @@
   },
 
 }
+
+
+
+//                     	        title : {
+//                     	            /*  text: '鏌愮珯鐐圭敤鎴疯闂潵婧�',
+//                     	              subtext: '绾睘铏氭瀯',
+//                     	              x:'center'*/
+//                     	        },
+//                     	        tooltip : {
+//                     	            trigger: 'item',
+//                     	            formatter: "{a} <br/>{b} : {c} ({d}%)"
+//                     	        },
+//                     	        legend: {
+//                     	            orient: 'vertical',
+//                     	            left: 'right',
+//                     	            bottom:'80px',
+//                     	            data: ['浼佷笟','涓綋','绀句細缁勭粐','浜嬩笟鍗曚綅','鏈哄叧鍗曚綅','鍏朵粬']
+//                     	        },
+//                     	        series : [
+//                     	            {
+//                     	                name: '鍗犳瘮鎯呭喌',
+//                     	                type: 'pie',
+//                     	                radius : '55%',
+//                     	                center: ['40%', '60%'],
+//                     	                data: data,
+// /*鍦╯eries涓坊鍔爄temStyle鍗冲彲鐩磋鏄剧ず楗煎瀷鏁板��*/
+//                     	                itemStyle:{ 
+// 								        normal:{ 
+// 								           label:{ 
+// 								              show: true, 
+// 								              formatter: '{b} : {c} ({d}%)' 
+// 								              }, 
+// 								              labelLine :{show:true} 
+// 								              } 
+// 								         } 
+//                     	            }
+//                     	        ]
+                    	        
+//                     	    };
+//                     	    myChart_qyhhmd.setOption(option,true)
 </script>
 
 <style lang="scss">
diff --git a/src/pages/shuohuangMonitorAnalyze/components/searchForVideoAnalyze.vue b/src/pages/shuohuangMonitorAnalyze/components/searchForVideoAnalyze.vue
index b2763e7..8645349 100644
--- a/src/pages/shuohuangMonitorAnalyze/components/searchForVideoAnalyze.vue
+++ b/src/pages/shuohuangMonitorAnalyze/components/searchForVideoAnalyze.vue
@@ -360,11 +360,11 @@
 
        -->
       <!-- <div > -->
+          <!-- :modal="false" -->
         <el-dialog v-drag  v-resize
           class="dialog-video"
           :visible="videoDialogVisible"
-          @close="videoDialogVisible = false"
-          :modal="false"
+          @close="closeDial"
           :close-on-click-modal="false"
           :destroy-on-close="true"
           :modal-append-to-body="false"
@@ -375,7 +375,7 @@
               <span>鎾斁瑙嗛</span>
             </div>
           </div>
-          <video-analyze :videoDetails="selectedVideo" />
+          <video-analyze v-if="videoDialogVisible" :videoDetails="selectedVideo" />
         </el-dialog>
       <!-- </div> -->
 
@@ -516,6 +516,10 @@
         }
       );
     },
+    closeDial(){
+      this.videoDialogVisible = false
+      this.selectedVideo={}
+    },
     handleTabSizeChange(size) {
       this.tabPageSize = size;
       this.filterSearchData();
diff --git a/src/pages/shuohuangMonitorAnalyze/components/taskManage.vue b/src/pages/shuohuangMonitorAnalyze/components/taskManage.vue
index 1d93278..e0130a2 100644
--- a/src/pages/shuohuangMonitorAnalyze/components/taskManage.vue
+++ b/src/pages/shuohuangMonitorAnalyze/components/taskManage.vue
@@ -304,7 +304,6 @@
       }
     },
     searchName(val) {
-      console.log(this.personList, val);
       if (val == "") {
         this.searchMemberByOrg();
       }
@@ -330,7 +329,7 @@
         checkedCount > 0 && checkedCount < this.personList.length;
     },
     cancelDistribute(row) {
-      let arr = row.LKGList.map((x) => x.ID);
+      let arr = row.LKGList.map(x => x.ID);
       cancelMission({ LkgIDs: arr }).then((res) => {
         if (res.success) {
           this.$notify({
@@ -408,7 +407,6 @@
       let arr = pickList.map((a) => {
         return a.map((item) => item.ID);
       });
-
       addToAssignList({
         UserID: this.memberChecked,
         LkgIDs: arr,
diff --git a/src/pages/shuohuangMonitorAnalyze/components/timeShortcut.vue b/src/pages/shuohuangMonitorAnalyze/components/timeShortcut.vue
index 9d3c697..0aa24ee 100644
--- a/src/pages/shuohuangMonitorAnalyze/components/timeShortcut.vue
+++ b/src/pages/shuohuangMonitorAnalyze/components/timeShortcut.vue
@@ -74,6 +74,7 @@
 
 <style lang="scss">
 .time-shortcut {
+  margin-right: 62px;
   ul {
     display: flex;
     li {
diff --git a/src/pages/shuohuangMonitorAnalyze/components/videoAnalyze.vue b/src/pages/shuohuangMonitorAnalyze/components/videoAnalyze.vue
index 37885b5..c1a6ea0 100644
--- a/src/pages/shuohuangMonitorAnalyze/components/videoAnalyze.vue
+++ b/src/pages/shuohuangMonitorAnalyze/components/videoAnalyze.vue
@@ -73,7 +73,6 @@
               <div style="display: none"></div>
               <div class="currentPlayer">
                 <ali-player
-                  @playing="getPlayStatus"
                   @pause="isStop = true"
                   @play="isStop = false"
                   @timeupdate="timeUpdate"
@@ -112,7 +111,6 @@
                     @pause="isStop = true"
                     @play="isStop = false"
                     :ref="`player_${videoArrs[index].ID}`"
-                    @ready="videoReady"
                   />
                 </div>
               </template>
@@ -125,7 +123,7 @@
                 v-for="(item, index) in eventMarks"
                 :key="index"
               >
-                <div slot="content"> 
+                <div slot="content">
                   {{ getTimeStr(item.offset) }}<br />{{ item.text }}
                 </div>
                 <div
@@ -147,39 +145,43 @@
                 <div
                   class="label-dot"
                   :style="{
-                    left: (item.offset/maxSecond)*100 + '%',
+                    left: (item.offset / maxSecond) * 100 + '%',
                   }"
                   @click="dotJump(item.offset)"
                 ></div>
               </el-tooltip>
+              <div ref="time-clip" class="time-clip"></div>
 
-                <el-tooltip placement="top" :offset="440-hoverOffset"
-                :hide-after="0" :visible-arrow="false" 
-                >
-  <div slot="content" >{{hoverTime}}</div>
               <el-slider
                 v-model="curTime"
-                :format-tooltip="formatTooltip"
+                :show-tooltip="false"
                 :max="maxSecond"
-                @mousemove.native="triggerHover"
+                @mousemove.native.stop="triggerHover"
+                @mouseleave.native="leaveBar"
+                @mouseover.native="intoBar"
                 @change="progressChange"
-                @input="inTimeChange"
               ></el-slider>
-</el-tooltip>
-              
-            </div>
+            </div> 
             <div class="control-zone">
               <span class="time">{{ curPlayTime }} / {{ maxVideoTime }}</span>
-              
-
-              <div class="play-btn" @click="playAll" v-if="showPlayBtn">
-
-                <span class="icon iconfont">&#xe628;</span>
-
-              </div>
-              <div class="stop-btn" @click="pauseAll" v-else>
-
-                <span class="icon iconfont">&#xe6fc;</span>
+              <div class="play-btn">
+                <div class="group">
+                  <i class="el-icon-d-arrow-left" @click="moveBar(-10)"></i>
+                  <i
+                    class="el-icon-video-play"
+                    style="font-size: 29px; cursor: pointer"
+                    @click="playAll"
+                    v-if="showPlayBtn"
+                  ></i>
+                  <i
+                    class="el-icon-video-pause"
+                    style="font-size: 29px; cursor: pointer"
+                    @click="pauseAll"
+                    v-else
+                  ></i>
+                  <i class="el-icon-d-arrow-right" @click="moveBar(10)"></i>
+                </div>
+                <!-- <span class="icon iconfont">&#xe628;</span> -->
               </div>
             </div>
           </div>
@@ -216,8 +218,8 @@
                 >
                   <div class="time">
                     <span
-                      >{{ zeroize(Math.floor(mark.Time / 60)) }}:{{
-                        zeroize(mark.Time % 60)
+                      >{{ pad0(Math.floor(mark.Time / 60)) }}:{{
+                        pad0(mark.Time % 60)
                       }}</span
                     >
                     <i class="el-icon-edit" @click="editCurLabel(mark)"></i>
@@ -286,7 +288,7 @@
       </div>
       <div class="btns">
         <el-button @click="cancelLabelChecked" size="small">鍙栨秷</el-button>
-        <el-button @click="submitLabelChecked()" size="small" type="primary"
+        <el-button @click="submitLabelChecked" size="small" type="primary"
           >纭畾</el-button
         >
       </div>
@@ -307,6 +309,27 @@
 } from "@/api/shuohuang";
 import DatasetChart from "./charts/datasetForVideo";
 import AliPlayer from "./aliPlayer/index";
+
+function throttle(fn, delay) {
+  // 璁板綍涓婁竴娆″嚱鏁拌Е鍙戠殑鏃堕棿浠ュ強瀹氫箟涓�涓畾鏃跺櫒
+  var lastTime, timer;
+  var delay = delay || 500;
+  return function (e) {
+    var nowTime = Date.now();
+    if (lastTime && nowTime - lastTime < delay) {
+      clearTimeout(timer);
+      timer = setTimeout(function () {
+        // 璁板綍涓婁竴娆″嚱鏁拌Е鍙戠殑鏃堕棿
+        lastTime = nowTime;
+        // 淇this鎸囧悜闂
+        fn.call(this, e);
+      }, delay);
+    } else {
+      lastTime = nowTime;
+      fn.call(this, e);
+    }
+  };
+}
 
 export default {
   name: "VideoAnalyze",
@@ -353,8 +376,6 @@
       curPlayTime: "00:00",
       maxSecond: 0,
       isStop: false,
-      hoverTime:"",
-      hoverOffset:0,
     };
   },
   watch: {
@@ -369,10 +390,13 @@
       deep: true,
     },
     videoDetails: {
-      handler(newVal, oldVal) {
+      handler(newVal) {
         this.getCurVideos(newVal);
       },
       deep: true,
+    },
+    curTime(newVal) {
+      this.curPlayTime = this.getTimeStr(newVal);
     },
   },
   mounted() {
@@ -381,15 +405,36 @@
     this.getCurVideos(this.videoDetails);
     this.getRelatedVideos(this.videoDetails);
   },
+  destroyed() {
+    this.videoArrs.length = 0;
+  },
   methods: {
-    triggerHover(e){
-      this.hoverOffset=e.offsetX
-      this.hoverTime=this.getTimeStr((e.offsetX/880)*this.maxSecond)
+    triggerHover(e) {
+      let fn = throttle(this.hoverAction, 2000);
+      fn(e);
     },
-    getPlayStatus(e) {
-      console.log(e, 1111);
+    hoverAction(e) {
+      console.log(e.target.className);
+      if (
+        e.target.className == "el-slider__button-wrapper hover" ||
+        e.target.className == "el-tooltip el-slider__button hover"
+      ) {
+        this.$refs["time-clip"].style["left"] =
+          (this.curTime / this.maxSecond) * 880 - 20 + "px";
+        this.$refs["time-clip"].innerHTML = this.curPlayTime;
+        return;
+      }
+      this.$refs["time-clip"].style["left"] = e.offsetX - 20 + "px";
+      this.$refs["time-clip"].innerHTML = this.getTimeStr(
+        (e.offsetX / 880) * this.maxSecond
+      );
     },
-    videoReady(a, b) {},
+    intoBar(e) {
+      this.$refs["time-clip"].style["display"] = "block";
+    },
+    leaveBar(e) {
+      this.$refs["time-clip"].style["display"] = "none";
+    },
     playAll() {
       this.showPlayBtn = false;
       if (this.guid == 1) {
@@ -413,45 +458,37 @@
         });
       }
     },
-    inTimeChange(val) {},
+    moveBar(val) {
+      this.curTime += val;
+      this.progressChange(this.curTime);
+    },
     progressChange(val) {
-      console.log(val);
       this.showPlayBtn = false;
-      this.curPlayTime = this.getTimeStr(val);
       let that = this;
       if (this.guid == 1) {
         this.$refs[`player_${this.curVideo.ID}`][0].pause();
         this.$refs[`player_${this.curVideo.ID}`][0].seek(val);
-        this.$refs[`player_${this.curVideo.ID}`][0].play();
+        // this.$refs[`player_${this.curVideo.ID}`][0].play();
         setTimeout(() => {
           let curT = that.$refs[
             `player_${that.curVideo.ID}`
           ][0].getCurrentTime();
-          that.barRolling(curT);
         }, 600);
       } else {
         this.videoArrs.forEach((v, i) => {
           this.$refs[`player_${v.ID}`][0].seek(val);
-          this.$refs[`player_${v.ID}`][0].play();
+          // this.$refs[`player_${v.ID}`][0].play();
           if (i == 0) {
             let curT = this.$refs[`player_${v.ID}`][0].getCurrentTime();
-            this.barRolling(curT);
           }
         });
       }
     },
     getTimeStr(sec) {
-      return `${
-        Math.floor(sec / 60) < 10
-          ? "0" + Math.floor(sec / 60)
-          : Math.floor(sec / 60)
-      }:${
-        Math.floor(sec % 60) < 10
-          ? "0" + Math.floor(sec % 60)
-          : Math.floor(sec % 60)
-      }`;
+      return `${this.pad0(Math.floor(sec / 60))}:${this.pad0(
+        Math.floor(sec % 60)
+      )}`;
     },
-    barRolling(curT) {},
     timeUpdate(e, index) {
       if (this.isStop) {
         return;
@@ -471,10 +508,6 @@
       } else {
         this.curTime = curT;
       }
-      this.curPlayTime = this.getTimeStr(this.curTime);
-    },
-    formatTooltip(val) {
-      return this.curPlayTime;
     },
     videoMouseEnter(e) {
       let target = e.target;
@@ -500,18 +533,27 @@
     },
     handleCommand(cmd) {
       let _this = this;
-      this.curCamera = cmd.Camera;
-      this.curRoomVideos = this.allCurVideos.filter((item) => {
+
+      getCarVideos({
+        TrainNumber: cmd.TrainNumber,
+        CarNumber: cmd.CarNumber,
+        Driver1: cmd.Driver1,
+      }).then((res) => {
+        _this.allCurVideos = res.data;
+      _this.curCamera = cmd.Camera;
+      _this.curRoomVideos = _this.allCurVideos.filter((item) => {
         return item.Camera == cmd.Camera;
       });
-      this.curVideo = this.curRoomVideos.find((item) => {
-        return item.UniqeID == this.curVideo.UniqeID;
+      _this.curVideo = _this.curRoomVideos.find((item) => {
+        return item.ID == cmd.ID;
       });
-      this.$nextTick(() => {
+      _this.$nextTick(() => {
         _this.$refs[`player_${_this.curVideo.ID}`][0].init();
       });
+      });
+      
     },
-    zeroize(val) {
+    pad0(val) {
       return val < 10 ? "0" + val : val;
     },
     checkCurVideo(index) {
@@ -531,13 +573,13 @@
           item.marks = _this.mergeMarks(item);
         });
         _this.curVideo = res.data.find((item) => item.ID == v.ID);
-        _this.curVideo.marks.forEach(item=>{
+        _this.curVideo.marks.forEach((item) => {
           if (item.type == 0) {
-            _this.eventMarks.push(item)
+            _this.eventMarks.push(item);
           } else {
-            _this.labelMarks.push(item)
+            _this.labelMarks.push(item);
           }
-        })
+        });
         if (_this.guid == 1) {
           _this.maxVideoTime = _this.curVideo.VideoTime;
         }
@@ -562,10 +604,10 @@
         let arr = [];
         let map = {};
         res.data.forEach((item) => {
-          this.popDownArr.push(item);
+          _this.popDownArr.push(item);
         });
-        if (this.popDownArr.length) {
-          this.curCamera = this.popDownArr[0].Camera;
+        if (_this.popDownArr.length) {
+          _this.curCamera = _this.popDownArr[0].Camera;
         }
       });
     },
@@ -610,7 +652,6 @@
           console.log(`calc(` + 100 / guid + `% -10px)`);
           this.$refs[`gridVideoItem_${i}`][0].style.width =
             `calc(` + 100 / guid + `%)`;
-          // this.$refs["playerWrap"].offsetWidth / guid + "px";
           this.$refs[`gridVideoItem_${i}`][0].style.height =
             `calc(` + 100 / guid + `%)`;
           // this.$refs["playerWrap"].offsetHeight / guid + "px";
@@ -621,9 +662,9 @@
     cancelLabelChecked() {
       this.labelDialogVisible = false;
     },
-    dotJump(offset){
-      this.curTime = offset
-      this.progressChange(offset)
+    dotJump(offset) {
+      this.curTime = offset;
+      this.progressChange(offset);
     },
     submitLabelChecked() {
       let _this = this;
@@ -645,23 +686,27 @@
         Codes: this.labelCheckedList.join(","),
         Desc: desc.join("锛�"),
       };
+      
       editLabel(query).then((rsp) => {
         if (rsp && rsp.success) {
           _this.labelDialogVisible = false;
-          this.$set(_this.curVideo, "LableLst", []);
-          //_this.curVideo.LableLst = [];
+          _this.$set(_this.curVideo, "LableLst", []);
           rsp.data.forEach((label) => {
             if (label.ParentID == _this.curVideo.ID) {
               _this.curVideo.LableLst.push(label);
             }
           });
-
-          this.$message.success("娣诲姞鎴愬姛");
+          _this.labelMarks.push({
+            type: 1,
+            offset: +query.Time,
+            text: query.Desc,
+          });
+          _this.$message.success("娣诲姞鎴愬姛");
           // 鏍囨敞
-          _this.setMarks(this.curVideo);
+          _this.setMarks(_this.curVideo);
           _this.$parent.$parent.filterSearchData();
         } else {
-          this.$message.warning(rsp.msg);
+          _this.$message.warning(rsp.msg);
         }
       });
     },
@@ -669,7 +714,6 @@
       this.labelCheckedList = [];
       this.selectedLabelId = "";
       this.labelDialogVisible = true;
-
       // 淇濆瓨鐐瑰嚮鏍囨敞鐨勬椂闂�
       this.setLabelTime = this.$refs[`player_${video.ID}`][0].getCurrentTime();
     },
@@ -680,34 +724,46 @@
     },
     removeCurLabel(mark) {
       let _this = this;
-      delLabel({ ID: mark.ID, ParentID: this.curVideo.ID }).then((rsp) => {
+      let obj = {
+        Desc: mark.Desc,
+        ParentUniqID: mark.ParentUniqID,
+        Time: mark.Time,
+        ParentID:mark.ParentID
+      };
+      delLabel(obj).then((rsp) => {
         if (rsp && rsp.success) {
           _this.curVideo.LableLst = rsp.data;
-          this.$message.success("鍒犻櫎鎴愬姛");
+          _this.$message.success("鍒犻櫎鎴愬姛");
           // 鏍囨敞
+          _this.labelMarks.length = 0;
+          _this.curVideo.LableLst.forEach((x) => {
+            _this.labelMarks.push({
+              type: 1,
+              offset: +x.Time,
+              text: x.Desc,
+            });
+          });
           _this.setMarks(_this.curVideo);
           _this.$parent.$parent.filterSearchData();
         } else {
-          this.$message.warning(rsp.msg);
+          _this.$message.warning(rsp.msg);
         }
       });
     },
     mergeMarks(videoInfo) {
       const eMarks = videoInfo.EventLst.map((item) => {
-        let obj = {
+        return {
           offset: item.SecondsInVideo,
           text: item.Event + (item.Desc == "" ? "" : ": " + item.Desc),
           type: 0,
         };
-        return obj;
       });
       const labMarks = videoInfo.LableLst.map((lable) => {
-        let obj = {
+        return {
           offset: +lable.Time,
           text: lable.Desc,
           type: 1,
         };
-        return obj;
       });
       return eMarks.concat(labMarks);
     },
@@ -728,9 +784,7 @@
   text-align: left;
   .content-top {
     margin-bottom: 15px;
-
     // height: calc(60% + -16px);
-
     .grid-check {
       text-align: right;
       margin-bottom: 3px;
@@ -749,7 +803,6 @@
       }
       span {
         font-size: 17px;
-
         color: #cacaca;
         padding-left: 12px;
         cursor: pointer;
@@ -761,14 +814,12 @@
     .video-area {
       display: flex;
       height: 100%;
-
       .info-list {
         width: 180px;
         min-width: 180px;
         margin-right: 10px;
         .v-name-block {
           height: 484px;
-
           overflow: auto;
         }
         .video-name {
@@ -814,9 +865,6 @@
               float: left;
             }
           }
-          // .prism-controlbar{
-          //   display: none;
-          // }
           .currentPlayer {
             border: 2px solid aqua;
             height: 100%;
@@ -834,22 +882,18 @@
             margin: 0px 30px;
             position: relative;
             .self-dot {
-              // top: 16px;
               position: absolute;
-              height: 6px;
+              height: 8px;
               width: 6px;
               z-index: 1;
               background-color: lightcoral;
-              // border-radius: 30%;
-              // pointer-events: none;
               cursor: pointer;
               -webkit-transform: translateX(-50%);
               transform: translateX(-50%);
             }
-            .label-dot{
-              // top: 16px;
+            .label-dot {
               position: absolute;
-              height: 6px;
+              height: 8px;
               width: 6px;
               z-index: 1;
               background-color: yellowgreen;
@@ -857,11 +901,19 @@
               -webkit-transform: translateX(-50%);
               transform: translateX(-50%);
             }
-            .el-slider{
-                  margin: 16px 0;
-                  .el-slider__runway{
-                    margin: 0;
-                  }
+            .el-slider {
+              margin: 15px 0;
+
+              .el-slider__runway {
+                margin: 0;
+                height: 8px;
+                .el-slider__bar {
+                  height: 8px;
+                }
+                .el-slider__button-wrapper {
+                  width: 16px;
+                }
+              }
             }
             .el-slider__button {
               width: 12px;
@@ -870,33 +922,44 @@
             .el-slider__stop {
               background-color: lightcoral;
             }
+            .time-clip {
+              width: 40px;
+              background-color: dimgray;
+              color: white;
+              display: none;
+              font-size: 12px;
+              top: -26px;
+              border-radius: 3px;
+              left: -20px;
+              height: 19px;
+              text-align: center;
+              line-height: 19px;
+              position: absolute;
+            }
           }
           .control-zone {
             .time {
               float: left;
               margin-left: 23px;
-              // color: #fff;
             }
             .play-btn {
-              width: 24px;
-              height: 24px;
-              cursor: pointer;
-              // background: url(/apps/shuohuangMonitorAnalyze/img/smallplay.png)
-              
+              width: 200px;
+              height: 27px;
+              border-radius: 4px;
               margin: 0 auto;
-              .iconfont{
-                    font-size: 25px;
+              .group {
+                text-align: center;
+                .el-icon-d-arrow-left {
+                  cursor: pointer;
+                  margin-right: 20px;
+                  font-size: 27px;
+                }
+                .el-icon-d-arrow-right {
+                  cursor: pointer;
+                  font-size: 27px;
+                  margin-left: 20px;
+                }
               }
-            }
-            .stop-btn {
-              width: 24px;
-              height: 24px;
-              cursor: pointer;
-              // background: url(/apps/shuohuangMonitorAnalyze/img/smallpause.png)
-              .iconfont{
-                    font-size: 25px;
-              }
-              margin: 0 auto;
             }
           }
         }
@@ -973,9 +1036,6 @@
       }
       p.label {
         line-height: 36px;
-      }
-      .label-radio {
-        padding: 20px;
       }
       .label-check {
         padding: 20px;
diff --git a/src/pages/systemSettings/components/CloudNode.vue b/src/pages/systemSettings/components/CloudNode.vue
new file mode 100644
index 0000000..800651a
--- /dev/null
+++ b/src/pages/systemSettings/components/CloudNode.vue
@@ -0,0 +1,149 @@
+<template>
+  <div class="cloud">
+    <div class="inner">
+      <div class="rect">
+        <serfDiagram
+          ref="inside-nodes"
+          :members="insideNodes"
+          :agent="agentName"
+          :sizeX="insideSizeX"
+          :sizeY="insideSizeY"
+          :startX="insideStartX"
+          :isShowHover="true"
+          class="inside-nodes"
+        ></serfDiagram>
+      </div>
+    </div>
+    <div class="outer" v-if="outsideNodes.length">
+      <serfDiagram
+        ref="outer-nodes"
+        :members="outsideNodes"
+        :agent="agentName"
+        :sizeX="280"
+        :sizeY="370"
+        :startX="60"
+        class="outer-nodes"
+      ></serfDiagram>
+    </div>
+  </div>
+</template>
+<script>
+import SerfDiagram from "@/components/serfDiagram";
+export default {
+  name: "cloudNode",
+  props: {
+    nodes: Array,
+  },
+  components: {
+    SerfDiagram,
+  },
+  data() {
+    return {
+      agentName: "",
+      nodeIcons: [],
+      //insideNodes: [],
+      BaseWidth: 150,
+      BaseHeight: 70,
+      minWidth: 0,
+      minHeight: 0,
+    };
+  },
+  mounted() {
+    console.log(this.nodes);
+    //this.getInsideNodes();
+  },
+  methods: {
+    getRandom(index) {
+      if (index % 2 == 0) {
+        return Math.random() * 20;
+      } else {
+        return Math.random() * 50;
+      }
+    },
+    getInsideNodes() {
+      let arr = this.nodes.filter(
+        (item) => item.hardwareType == "01" || item.hardwareType == "02"
+      );
+      let len = arr.length;
+      let lefts = [];
+      let tops = [];
+      this.insideNodes = arr.map((item, index) => {
+        lefts.push((20 - len) * (index + 1) + this.getRandom(index));
+        tops.push(30 * (index + 1));
+        return {
+          l: 10 + this.getRandom(index),
+          t: 30 * (index + 1),
+          nodeName: item.nodeName,
+          id: item.id,
+          workType: item.workType,
+        };
+      });
+      this.minWidth = Math.max(...lefts) - Math.min(...lefts);
+      this.minHeight = Math.max(...tops) - Math.min(...tops);
+      console.log("w,h", this.minWidth, this.minHeight);
+    },
+  },
+  computed: {
+    cloudPic() {
+      return "/images/settings/cloud.png";
+    },
+    insideNodes() {
+      return this.nodes.filter(
+        (item) => item.hardwareType == "01" || item.hardwareType == "02"
+      );
+    },
+    insideSizeX() {
+      return 160 + 200 * 0.2 * this.insideNodes.length <= 400
+        ? 160 + 200 * 0.2 * this.insideNodes.length
+        : 400;
+    },
+    insideSizeY() {
+      return 140 + 200 * 0.2 * this.insideNodes.length <= 380
+        ? 140 + 200 * 0.2 * this.insideNodes.length
+        : 380;
+    },
+    insideStartX() {
+      return this.insideSizeX / 3;
+    },
+    outsideNodes() {
+      return this.nodes.filter((item) => item.hardwareType == "03");
+    },
+  },
+};
+</script>
+<style lang="scss">
+.cloud {
+  width: 100%;
+  display: flex;
+  .inner {
+    background: url("/images/settings/easy-cloud.png") no-repeat;
+    background-size: 100%;
+    margin-top: -55px;
+    margin-left: 55px;
+
+    .rect {
+      position: relative;
+      margin: 130px 100px 70px;
+      .node {
+        position: absolute;
+        .node-icon {
+          width: 40px;
+          height: 40px;
+        }
+        .node-name {
+          font-size: 14px;
+          color: #333;
+        }
+      }
+    }
+  }
+  .outer {
+    width: 40%;
+    position: relative;
+    text-align: left;
+    .node {
+      position: absolute;
+    }
+  }
+}
+</style>
\ No newline at end of file
diff --git a/src/pages/systemSettings/components/switchBar.vue b/src/pages/systemSettings/components/switchBar.vue
new file mode 100644
index 0000000..0cbc558
--- /dev/null
+++ b/src/pages/systemSettings/components/switchBar.vue
@@ -0,0 +1,42 @@
+<template>
+  <div class="switch-bar">
+    <div class="name">{{ barName }}</div>
+    <el-switch
+      v-model="value"
+      active-color="rgba(61, 104, 225, 1)"
+      @change="switchChange"
+    >
+    </el-switch>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      // value: false,
+    };
+  },
+  props: ["barName","value"],
+  methods: {
+    switchChange(val) {
+      this.$emit("switchChange",val);
+    },
+  },
+};
+</script>
+<style lang="scss">
+.switch-bar {
+  display: flex;
+  align-items: center;
+  height: 50px;
+  padding: 0 25px;
+  background-color: rgba(248, 248, 248, 1);
+  justify-content: space-between;
+  border-radius: 12px;
+  margin-bottom: 10px;
+  .name {
+    font-size: 14px;
+  }
+}
+</style>
diff --git a/src/pages/systemSettings/index/App.vue b/src/pages/systemSettings/index/App.vue
new file mode 100644
index 0000000..b13a647
--- /dev/null
+++ b/src/pages/systemSettings/index/App.vue
@@ -0,0 +1,1286 @@
+<template>
+  <div class="container">
+    <div class="container-left">
+      <div
+        class="left-card"
+        v-for="(item, index) in menuArr"
+        :key="index"
+        @click="openMenu(item, index)"
+      >
+        <span class="icon iconfont">&#xe646;</span>
+        <span class="card-text">{{ item.name }}</span>
+      </div>
+    </div>
+
+    <div
+      class="container-center"
+      v-if="activePage == '璐︽埛' || activePage == '鏃ユ湡鏃堕棿'"
+    >
+      <div class="account-left" v-if="activePage == '璐︽埛'">
+        <div class="account-list">
+          <div
+            class="account-card"
+            v-for="(item, index) in accountArr"
+            :key="index"
+          >
+            <div class="touxiang">
+              <img src="" alt="" />
+            </div>
+            <span class="user-name">{{ item.name }}</span>
+          </div>
+        </div>
+        <div class="add-account">
+          <span class="icon iconfont" @click="showAddAccount">&#xe646;</span>
+        </div>
+      </div>
+      <div class="datetime-left" v-if="activePage == '鏃ユ湡鏃堕棿'">
+        <div class="time-card">
+          <div class="head">
+            <span class="icon iconfont">&#xe690;</span>
+            <span>璁惧鏃堕棿</span>
+          </div>
+          <div class="time-main">{{ equipmentTime }}</div>
+          <div class="date-bot">
+            <span class="year">{{ equipmentDate }}</span>
+            <span class="week">{{ weekday }}</span>
+          </div>
+        </div>
+
+        <div class="line">
+          <div class="name">NTP鏍℃椂</div>
+          <el-switch v-model="isNtp" active-color="rgba(61, 104, 225, 1)">
+          </el-switch>
+        </div>
+
+        <div class="line">
+          <div class="name">鎵嬪姩鏍″</div>
+          <el-switch v-model="isManual" active-color="rgba(61, 104, 225, 1)">
+          </el-switch>
+        </div>
+      </div>
+    </div>
+    <div
+      class="container-right"
+      v-if="activePage == '璐︽埛' || activePage == '鏃ユ湡鏃堕棿'"
+    >
+      <div class="account-right" v-if="activePage == '璐︽埛'">
+        <div class="account-content" v-if="inAccountDetail == false">
+          <div class="content-top">
+            <div class="touxiang-big"></div>
+            <div class="user-desc">
+              <div class="username">椋炲埄娴�</div>
+              <div class="nickname">
+                <span>鍏斿厰</span>
+                <span class="icon iconfont">&#xe60c;</span>
+              </div>
+            </div>
+          </div>
+          <div class="list-btn">
+            <div class="item-btn" @click="showChangePassword">淇敼瀵嗙爜</div>
+            <div class="item-btn" @click="deleteAccount">鍒犻櫎璐︽埛</div>
+            <div class="item-btn" @click="openPermission">鏉冮檺璁剧疆</div>
+          </div>
+        </div>
+
+        <div class="change-pw" v-if="inAccountDetail && isChangePw">
+          <div class="title">淇敼瀵嗙爜</div>
+
+          <div class="p-title">褰撳墠瀵嗙爜锛�</div>
+
+          <el-input
+            placeholder="蹇呭~"
+            v-model="input1"
+            show-password
+          ></el-input>
+          <div class="p-title">鏂板瘑鐮侊細</div>
+          <el-input
+            placeholder="蹇呭~"
+            v-model="input2"
+            show-password
+          ></el-input>
+          <div class="p-title">纭瀵嗙爜锛�</div>
+          <el-input
+            placeholder="蹇呭~"
+            v-model="input3"
+            show-password
+          ></el-input>
+
+          <div class="btns">
+            <div class="cancel" @click="cancelChangePassword">鍙栨秷</div>
+            <div class="ok">淇濆瓨</div>
+          </div>
+        </div>
+
+        <div class="permission" v-if="inAccountDetail && isSetPermission">
+          <div class="title">鏉冮檺绠$悊</div>
+
+          <div class="line">
+            <div class="name">瀹炴椂鐩戞帶</div>
+            <el-switch
+              v-model="isRealtime"
+              active-color="rgba(61, 104, 225, 1)"
+            >
+            </el-switch>
+          </div>
+          <div class="line">
+            <div class="name">缁熻鏌ヨ</div>
+            <el-switch v-model="isCount" active-color="rgba(61, 104, 225, 1)">
+            </el-switch>
+          </div>
+          <div class="line">
+            <div class="name">绠楀姏绠$悊</div>
+            <el-switch
+              v-model="isCalculate"
+              active-color="rgba(61, 104, 225, 1)"
+            >
+            </el-switch>
+          </div>
+
+          <div class="btns">
+            <div class="cancel" @click="cancelSet">鍙栨秷</div>
+            <div class="ok">淇濆瓨</div>
+          </div>
+        </div>
+
+        <div class="add-account-page" v-if="inAccountDetail && isAddAccount">
+          <div class="title">娣诲姞璐︽埛</div>
+          <div class="upload-group">
+            <div
+              class="upload-jpg"
+              v-for="(item, index) in jpgArr"
+              :key="index"
+            ></div>
+            <div
+              class="upload-jpg"
+              style="height: 0px; visibility: hidden"
+            ></div>
+            <div
+              class="upload-jpg"
+              style="height: 0px; visibility: hidden"
+            ></div>
+            <div
+              class="upload-jpg"
+              style="height: 0px; visibility: hidden"
+            ></div>
+            <div
+              class="upload-jpg"
+              style="height: 0px; visibility: hidden"
+            ></div>
+          </div>
+          <div class="fill-group">
+            <div class="p-title">鐢ㄦ埛鍚嶏細</div>
+            <el-input
+              placeholder="蹇呭~"
+              v-model="input1"
+              show-password
+            ></el-input>
+            <div class="p-title">鏄电О</div>
+            <el-input
+              placeholder="閫夊~"
+              v-model="input2"
+              show-password
+            ></el-input>
+            <div class="p-title">瀵嗙爜锛�</div>
+            <el-input
+              placeholder="蹇呭~"
+              v-model="input3"
+              show-password
+            ></el-input>
+            <div class="p-title">纭瀵嗙爜锛�</div>
+            <el-input
+              placeholder="蹇呭~"
+              v-model="input3"
+              show-password
+            ></el-input>
+          </div>
+          <div class="btns">
+            <div class="cancel" @click="cancelAdd">鍙栨秷</div>
+            <div class="ok">淇濆瓨</div>
+          </div>
+        </div>
+      </div>
+
+      <div class="datetime-right" v-if="activePage == '鏃ユ湡鏃堕棿'">
+        <div class="ntp-time" v-if="isNtp">
+          <el-form label-width="160px">
+            <el-form-item label="鏈嶅姟鍣ㄥ湴鍧�">
+              <!-- :disabled="syncType === '2'" -->
+              <ip-input
+                :ip="ntpServer"
+                @on-blur="ntpServer = arguments[0]"
+              ></ip-input>
+            </el-form-item>
+
+            <el-form-item label="鏍℃椂鏃堕棿闂撮殧锛堝垎閽燂級">
+              <div class="right">
+                <el-input-number
+                  v-model.number="timeInterval"
+                  :min="1"
+                  :max="60"
+                  placeholder="璇疯緭鍏�"
+                  size="small"
+                  :controls="false"
+                ></el-input-number>
+                <!-- :disabled="syncType === '2'" -->
+                <!-- :disabled="syncType === '2'" -->
+                <el-button
+                  type="text"
+                  @click="testNTP"
+                  :loading="ntpTestLoading"
+                  >娴嬭瘯</el-button
+                >
+              </div>
+            </el-form-item>
+          </el-form>
+        </div>
+
+        <div class="manual-time" v-if="isManual">
+          <switchBar
+            :barName="`鍚屾鏈绠楁満鏃堕棿`"
+            @switchChange="syncBrowser"
+            :value="isSyncBrowser"
+          ></switchBar>
+
+          <div class="clock-wrap">
+            <div class="clock">
+              <div class="hour">
+                <div class="dnum" @click="showInput('Hour')">
+                  <span v-show="!showHourInput">{{ syncHour }}</span>
+                  <input
+                    class="input-box"
+                    v-show="showHourInput"
+                    ref="iptHour"
+                    oninput="value=value.replace(/[^\d]/g,'');if(value.length>2)value=value.slice(0,2);if(+value>23)value='23'"
+                    type="text"
+                    v-model="inputHour"
+                    @blur="hideInput('Hour')"
+                    @keydown.enter="hideInput('Hour')"
+                  />
+                </div>
+                <div class="control">
+                  <span class="icon iconfont" @click="plusOne('hrs')"
+                    >&#xe60e;</span
+                  >
+                  <span class="icon iconfont fanzhuan" @click="minusOne('hrs')"
+                    >&#xe60e;</span
+                  >
+                </div>
+              </div>
+              <div class="sep">:</div>
+              <div class="mins">
+                <div class="dnum" @click="showInput('Min')">
+                  <span v-show="!showMinInput">{{ syncMin }}</span>
+                  <input
+                    class="input-box"
+                    v-show="showMinInput"
+                    ref="iptMin"
+                    oninput="value=value.replace(/[^\d]/g,'');if(value.length>2)value=value.slice(0,2);if(+value>59)value='59'"
+                    type="text"
+                    v-model="inputMin"
+                    @blur="hideInput('Min')"
+                    @keydown.enter="hideInput('Min')"
+                  />
+                </div>
+                <div class="control">
+                  <span class="icon iconfont" @click="plusOne('min')"
+                    >&#xe60e;</span
+                  >
+                  <span class="icon iconfont fanzhuan" @click="minusOne('min')"
+                    >&#xe60e;</span
+                  >
+                </div>
+              </div>
+              <div class="sep">:</div>
+              <div class="mins">
+                <div class="dnum" @click="showInput('Sec')">
+                  <span v-show="!showSecInput">{{ syncSec }}</span>
+                  <input
+                    class="input-box"
+                    v-show="showSecInput"
+                    ref="iptSec"
+                    oninput="value=value.replace(/[^\d]/g,'');if(value.length>2)value=value.slice(0,2);if(+value>59)value='59'"
+                    type="text"
+                    v-model="inputSec"
+                    @blur="hideInput('Sec')"
+                    @keydown.enter="hideInput('Sec')"
+                  />
+                </div>
+                <div class="control">
+                  <span class="icon iconfont" @click="plusOne('sec')"
+                    >&#xe60e;</span
+                  >
+                  <span class="icon iconfont fanzhuan" @click="minusOne('sec')"
+                    >&#xe60e;</span
+                  >
+                </div>
+              </div>
+            </div>
+          </div>
+
+          <div class="adjust-bar">
+            <div class="minus" @click="minusOne('yrs')">-</div>
+            <div class="middle" @click="showInput('Yrs')">
+              <span v-show="!showYrsInput">{{ syncYrs }}</span>
+              <input
+                class="input-box"
+                v-show="showYrsInput"
+                ref="iptYrs"
+                oninput="value=value.replace(/[^\d]/g,'');if(value.length>4)value=value.slice(0,4);"
+                type="text"
+                v-model="inputYrs"
+                @blur="hideInput('Yrs')"
+                @keydown.enter="hideInput('Yrs')"
+              />
+              骞�
+            </div>
+            <div class="plus" @click="plusOne('yrs')">+</div>
+          </div>
+          <div class="adjust-bar">
+            <div class="minus" @click="minusOne('mth')">-</div>
+            <div class="middle">
+
+                 <span v-show="!showMonthInput">{{ syncMonth }}</span>
+              <input
+                class="input-box"
+                v-show="showMonthInput"
+                ref="iptYrs"
+                oninput="value=value.replace(/[^\d]/g,'');if(value.length>4)value=value.slice(0,4);"
+                type="text"
+                v-model="inputMonth"
+                @blur="hideInput('Month')"
+                @keydown.enter="hideInput('Month')"
+              />
+              鏈�
+
+
+            </div>
+
+
+
+            <div class="plus" @click="plusOne('mth')">+</div>
+          </div>
+          <div class="adjust-bar">
+            <div class="minus" @click="minusOne('day')">-</div>
+            <div class="middle">{{ syncDay }} 鏃�</div>
+            <div class="plus" @click="plusOne('day')">+</div>
+          </div>
+        </div>
+
+        <div class="btns">
+          <div class="cancel" @click="cancelChangePassword">鍙栨秷</div>
+          <div class="ok" @click="submitClock">淇濆瓨</div>
+        </div>
+      </div>
+    </div>
+
+    <clusterManagement
+      v-if="activePage == '闆嗙兢绠$悊'"
+      style="width: 100%"
+    ></clusterManagement>
+    <netSettings
+      v-if="activePage == '缃戠粶璁剧疆'"
+      style="width: 100%"
+    ></netSettings>
+    <keyboardLanguage
+      v-if="activePage == '閿洏鍜岃瑷�'"
+      style="width: 100%"
+    ></keyboardLanguage>
+    <generalSettings
+      v-if="activePage == '閫氱敤璁剧疆'"
+      style="width: 100%"
+    ></generalSettings>
+  </div>
+</template>
+
+<script>
+import {
+  getDevInfo,
+  getAlarmConfig,
+  saveDevInfo,
+  saveAlarmConfig,
+  getClockInfo,
+  saveClockInfo,
+  testNTPserver,
+  getResourceConfig,
+  saveResourceConfig,
+} from "@/api/system";
+import switchBar from "../components/switchBar";
+import ipInput from "@/components/subComponents/IPInput";
+import clusterManagement from "../views/clusterManagement";
+import netSettings from "../views/NetSettings";
+import keyboardLanguage from "../views/keyboardLanguage";
+import generalSettings from "../views/generalSettings";
+export default {
+  name: "settings",
+  components: {
+    switchBar,
+    ipInput,
+    clusterManagement,
+    netSettings,
+    keyboardLanguage,
+    generalSettings,
+  },
+  data() {
+    return {
+      showAccount: true,
+      syncYrs: "",
+      syncMonth: "",
+      syncHour: "",
+      syncDay: "",
+      syncMin: "",
+      syncSec: "00",
+      isSyncBrowser: false,
+      showDateTime: false,
+      isAddAccount: false,
+      isCount: false,
+      isCalculate: false,
+      browserTimer: null,
+      timezone: "",
+      isRealtime: false,
+      showHourInput: false,
+      showMinInput: false,
+      showSecInput: false,
+      showYrsInput: false,
+
+      timestamp: 0,
+      inAccountDetail: false,
+      isChangePw: false,
+      isSetPermission: false,
+      timeInterval: 10,
+      ntpServer: "",
+      syncType: "1",
+      equipmentTime: "",
+      equipmentDate: "",
+      ntpTestLoading: false,
+      settime: "",
+      weekday: "",
+      menuArr: [
+        { name: "璐︽埛" },
+        { name: "鏃ユ湡鏃堕棿" },
+        { name: "闆嗙兢绠$悊" },
+        { name: "缃戠粶璁剧疆" },
+        { name: "閿洏鍜岃瑷�" },
+        { name: "閫氱敤璁剧疆" },
+      ],
+      accountArr: [{ name: "璐濊拏" }, { name: "鏈辫开" }, { name: "鍗″皵" }],
+      jpgArr: [{}, {}, {}, {}, {}, {}, {}, {}, {}],
+      isManual: false,
+      isNtp: true,
+      activePage: "璐︽埛",
+      activeIndex: 0,
+      clockTimer: null,
+      inputHour: "",
+      inputMin: "",
+      inputSec: "",
+      inputYrs: "",
+    };
+  },
+  beforeDestroy() {
+    clearTimeout(this.clockTimer);
+    clearInterval(this.browserTimer);
+  },
+  mounted() {
+    const s = document.getElementsByClassName("left-card")[0];
+    s.style.backgroundColor = "rgba(61, 104, 225, 1)";
+    s.style.color = "#fff";
+    this.$nextTick(() => {
+      // this.initSysinfo();
+      // this.initResourceConfig();
+      this.initClockConf();
+    });
+  },
+  methods: {
+    minusOne(typ) {
+      this.isSyncBrowser = false;
+      this.syncBrowser(false);
+      let num;
+      switch (typ) {
+        case "hrs":
+          num = +this.syncHour - 1;
+          if (num == -1) {
+            num = 23;
+          }
+          this.syncHour = this.padZero(num);
+          break;
+        case "min":
+          num = +this.syncMin - 1;
+          if (num == -1) {
+            num = 59;
+          }
+          this.syncMin = this.padZero(num);
+          break;
+        case "sec":
+          num = +this.syncSec + 1;
+          if (num == -1) {
+            num = 59;
+          }
+          this.syncSec = this.padZero(num);
+          break;
+        case "yrs":
+          num = +this.syncYrs - 1;
+          this.syncYrs = this.padZero(num);
+          break;
+        case "mth":
+          num = +this.syncMonth - 1;
+          if (num == 0) {
+            num = 12;
+            this.minusOne("yrs");
+          }
+          this.syncMonth = this.padZero(num);
+          break;
+        case "day":
+          num = +this.syncDay - 1;
+          if (num == 0) {
+            this.minusOne("mth");
+            const maxDay = new Date(
+              +this.syncYrs,
+              +this.syncMonth,
+              0
+            ).getDate();
+            num = maxDay;
+          }
+          this.syncDay = this.padZero(num);
+          break;
+        default:
+          break;
+      }
+    },
+    getMaxDay() {
+      const maxDay = new Date(+this.syncYrs, +this.syncMonth, 0).getDate();
+      if (this.syncDay > maxDay) {
+        this.syncDay = maxDay;
+      }
+    },
+    plusOne(typ) {
+      this.isSyncBrowser = false;
+      this.syncBrowser(false);
+      let num;
+      switch (typ) {
+        case "hrs":
+          num = +this.syncHour + 1;
+          if (num == 24) {
+            num = 0;
+          }
+          this.syncHour = this.padZero(num);
+          break;
+        case "min":
+          num = +this.syncMin + 1;
+          if (num == 60) {
+            num = 0;
+          }
+          this.syncMin = this.padZero(num);
+          break;
+        case "sec":
+          num = +this.syncSec + 1;
+          if (num == 60) {
+            num = 0;
+          }
+          this.syncSec = this.padZero(num);
+          break;
+        case "yrs":
+          num = +this.syncYrs + 1;
+          this.syncYrs = this.padZero(num);
+          break;
+        case "mth":
+          num = +this.syncMonth + 1;
+          if (num == 13) {
+            num = 1;
+          }
+          this.syncMonth = this.padZero(num);
+          break;
+        case "day":
+          num = +this.syncDay + 1;
+          const maxDay = new Date(+this.syncYrs, +this.syncMonth, 0).getDate();
+          if (num > maxDay) {
+            num = 1;
+          }
+          //
+          this.syncDay = this.padZero(num);
+          break;
+        default:
+          break;
+      }
+    },
+    submitClock() {
+      if (this.syncType === "1") {
+        if (this.ntpServer === "") {
+          this.$notify({
+            type: "error",
+            message: "NTP 鏈嶅姟鍣ㄥ湴鍧�涓嶈兘涓虹┖",
+          });
+          return false;
+        } else if (this.timeInterval === "") {
+          this.timeInterval = 1;
+        }
+      } else {
+        if (this.settime === "") {
+          this.$notify({
+            type: "error",
+            message: "璁剧疆鏃堕棿涓嶈兘涓虹┖",
+          });
+          return false;
+        }
+      }
+      let requestBody = {
+        timeZone: this.timezone,
+        ntp: this.syncType === "1",
+        ntpServer: this.ntpServer,
+        interval: this.timeInterval,
+        newTime: this.settime,
+      };
+      saveClockInfo(requestBody).then((rsp) => {
+        if (rsp && rsp.success) {
+          this.$notify({
+            type: "success",
+            message: "璁剧疆鎴愬姛",
+          });
+        }
+        this.initClockConf();
+      });
+    },
+    formatTime(number, format) {
+      var formateArr = ["Y", "M", "D", "h", "m", "s"];
+      var returnArr = [];
+
+      var date = new Date(number * 1000);
+      returnArr.push(date.getFullYear());
+      returnArr.push(this.formatNumber(date.getMonth() + 1));
+      returnArr.push(this.formatNumber(date.getDate()));
+
+      returnArr.push(this.formatNumber(date.getHours()));
+      returnArr.push(this.formatNumber(date.getMinutes()));
+      returnArr.push(this.formatNumber(date.getSeconds()));
+
+      this.weekday = "鏄熸湡" + "鏃ヤ竴浜屼笁鍥涗簲鍏�".charAt(date.getDay());
+      for (var i in returnArr) {
+        format = format.replace(formateArr[i], returnArr[i]);
+      }
+      return format;
+    },
+    padZero(n) {
+      n = +n;
+      return n < 10 ? "0" + n : "" + n;
+    },
+    //鏁版嵁杞寲
+    formatNumber(n) {
+      n = n.toString();
+      return n[1] ? n : "0" + n;
+    },
+    initClockConf(ntpTest = false) {
+      getClockInfo().then((rsp) => {
+        if (rsp && rsp.success) {
+          this.timezone = rsp.data.time_zone;
+          if (!ntpTest) {
+            this.syncType = rsp.data.ntp ? "1" : "2";
+          }
+          if (rsp.data.ntp) {
+            this.ntpServer = rsp.data.ntp_server;
+            this.timeInterval = rsp.data.interval;
+          }
+          this.timestamp = rsp.data.local_time;
+          if (this.clockTimer === null) {
+            this.runClock();
+          }
+        }
+      });
+    },
+    openMenu(item, i) {
+      const old = document.getElementsByClassName("left-card")[
+        this.activeIndex
+      ];
+      old.style.backgroundColor = "initial";
+      old.style.color = "rgba(81, 81, 81, 1)";
+
+      this.activePage = item.name;
+      this.activeIndex = i;
+      const s = document.getElementsByClassName("left-card")[i];
+      s.style.backgroundColor = "rgba(61, 104, 225, 1)";
+      s.style.color = "#fff";
+    },
+    showInput(typ) {
+      this[`show${typ}Input`] = true;
+      this.$nextTick(() => {
+        this.$refs[`ipt${typ}`].focus();
+      });
+    },
+    hideInput(typ) {
+      if (this[`input${typ}`]) {
+        this[`sync${typ}`] = this.padZero(this[`input${typ}`]);
+      }
+      this[`show${typ}Input`] = false;
+      this[`input${typ}`] = "";
+    },
+    syncBrowser(val) {
+      this.isSyncBrowser = val;
+      if (val == false) {
+        console.log(12121);
+        clearInterval(this.browserTimer);
+      } else {
+        this.browserTimer = setInterval(() => {
+          let timestamp = new Date().getTime() / 1000;
+          this.settime = this.formatTime(timestamp, "Y-M-D h:m:s");
+          let [arr1, arr2] = this.settime.split(" ");
+          [this.syncYrs, this.syncMonth, this.syncDay] = arr1.split("-");
+          [this.syncHour, this.syncMin, this.syncSec] = arr2.split(":");
+        }, 1000);
+      }
+    },
+    openChangePw() {},
+    showAddAccount() {
+      this.inAccountDetail = true;
+      this.isAddAccount = true;
+    },
+    cancelAdd() {
+      this.inAccountDetail = false;
+      this.isAddAccount = false;
+    },
+    cancelChangePassword() {
+      this.isChangePw = false;
+      this.inAccountDetail = false;
+    },
+    testNTP() {
+      this.ntpTestLoading = true;
+      testNTPserver({ server: this.ntpServer })
+        .then((rsp) => {
+          if (rsp && rsp.success) {
+            this.$notify({
+              type: "success",
+              message: "鏃堕棿鍚屾鎴愬姛",
+            });
+          } else {
+            this.$notify({
+              type: "error",
+              message: "鏃堕棿鍚屾澶辫触",
+            });
+          }
+          this.ntpTestLoading = false;
+          this.initClockConf(true);
+        })
+        .catch((err) => {
+          this.$notify({
+            type: "error",
+            message: "鏃堕棿鍚屾澶辫触,璇锋鏌ユ湇鍔″櫒ip",
+          });
+          this.ntpTestLoading = false;
+        });
+    },
+    cancelSet() {
+      this.isSetPermission = false;
+      this.inAccountDetail = false;
+    },
+    showChangePassword() {
+      this.isChangePw = true;
+      this.inAccountDetail = true;
+    },
+    runClock() {
+      const str = this.formatTime(++this.timestamp, "Y-M-D h:m:s");
+      [this.equipmentDate, this.equipmentTime] = str.split(" ");
+      this.clockTimer = setTimeout(() => {
+        this.runClock();
+      }, 1000);
+    },
+    deleteAccount() {
+      this.$confirm("鎮ㄦ槸鍚︾‘璁ゅ垹闄よ处鎴凤紵", "鍒犻櫎璐︽埛", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+      })
+        .then(() => {
+          this.$message({
+            type: "success",
+            message: "鍒犻櫎鎴愬姛!",
+          });
+        })
+        .catch(() => {});
+    },
+    openPermission() {
+      this.inAccountDetail = true;
+      this.isSetPermission = true;
+    },
+  },
+
+  watch: {
+    isManual(v) {
+      this.isNtp = !v;
+      v && (this.syncType = "2");
+      if (v) {
+        [
+          this.syncYrs,
+          this.syncMonth,
+          this.syncDay,
+        ] = this.equipmentDate.split("-");
+        [this.syncHour, this.syncMin, this.syncSec] = this.equipmentTime.split(
+          ":"
+        );
+      }
+    },
+    isNtp(v) {
+      this.isManual = !v;
+      v && (this.syncType = "1");
+    },
+  },
+};
+</script>
+<style lang="scss">
+.container {
+  height: 100%;
+  display: flex;
+  flex-direction: row;
+  flex: 1;
+  flex-basis: auto;
+  box-sizing: border-box;
+  .container-left {
+    height: 100%;
+    width: 210px;
+    overflow: auto;
+    box-sizing: border-box;
+    flex-shrink: 0;
+    padding: 10px;
+    border-right: 5px solid rgba(248, 248, 248, 1);
+    box-sizing: border-box;
+    .left-card {
+      height: 55px;
+      cursor: pointer;
+      border-radius: 12px;
+      margin-bottom: 10px;
+      display: flex;
+      align-items: center;
+      .iconfont {
+        margin-left: 25px;
+        margin-right: 10px;
+        font-size: 24px;
+      }
+      .card-text {
+        font-size: 16px;
+      }
+    }
+    .left-card:hover {
+      background-color: rgba(61, 104, 225, 1);
+      color: #fff;
+    }
+  }
+  .container-center {
+    height: 100%;
+    width: 280px;
+    overflow: auto;
+    flex-shrink: 0;
+    padding: 10px;
+    border-right: 5px solid rgba(248, 248, 248, 1);
+    box-sizing: border-box;
+    .account-left {
+      .account-list {
+        height: 530px;
+      }
+      .add-account {
+        color: rgba(61, 104, 225, 1);
+        .iconfont {
+          cursor: pointer;
+          font-size: 30px;
+        }
+      }
+      .account-card {
+        height: 40px;
+        background-color: goldenrod;
+        margin-bottom: 10px;
+        display: flex;
+        align-items: center;
+        padding: 0 20px;
+        .touxiang {
+          height: 30px;
+          width: 30px;
+          background-color: green;
+        }
+        .user-name {
+          margin-left: 10px;
+        }
+      }
+    }
+    .datetime-left {
+      .time-card {
+        height: 105px;
+        background-color: rgba(248, 248, 248, 1);
+        margin-bottom: 30px;
+        border-radius: 10px;
+        .head {
+          height: 30px;
+          line-height: 30px;
+          text-align: left;
+          box-sizing: border-box;
+          padding: 0 10px;
+          font-size: 14px;
+          .icon {
+            margin-right: 5px;
+            color: rgba(61, 104, 225, 1);
+          }
+        }
+        .time-main {
+          height: 42px;
+          line-height: 42px;
+          font-family: Consolas;
+          font-size: 36px;
+        }
+        .date-bot {
+          height: 25px;
+          font-size: 14px;
+          line-height: 25px;
+          color: #868686;
+          display: flex;
+          justify-content: space-evenly;
+        }
+      }
+      .line {
+        display: flex;
+        align-items: center;
+        height: 50px;
+        padding: 0 25px;
+        background-color: rgba(248, 248, 248, 1);
+        justify-content: space-between;
+        border-radius: 12px;
+        margin-bottom: 10px;
+        .name {
+          font-size: 14px;
+        }
+      }
+    }
+  }
+  .container-right {
+    flex: 1;
+    flex-basis: auto;
+    overflow: auto;
+    box-sizing: border-box;
+    position: relative;
+
+    padding: 20px 40px;
+    .account-right {
+      .account-content {
+        .content-top {
+          height: 150px;
+          background-color: antiquewhite;
+          display: flex;
+          align-items: center;
+          justify-content: center;
+          .touxiang-big {
+            width: 100px;
+            height: 100px;
+            background-color: indigo;
+          }
+          .user-desc {
+            background-color: khaki;
+            height: 100px;
+            width: 150px;
+            display: flex;
+            flex-direction: column;
+            align-items: baseline;
+            .username {
+              margin: 5px 15px;
+            }
+            .nickname {
+              margin: 5px 15px;
+            }
+          }
+        }
+        .list-btn {
+          display: flex;
+
+          flex-direction: column;
+          align-items: center;
+          .item-btn {
+            width: 500px;
+            height: 50px;
+            background-color: rgba(240, 240, 240, 1);
+            margin-bottom: 10px;
+          }
+        }
+      }
+      .change-pw {
+        .p-title {
+          text-align: left;
+        }
+      }
+      .permission {
+        .line {
+          display: flex;
+          align-items: center;
+          height: 50px;
+          padding: 0 25px;
+          background-color: rgba(248, 248, 248, 1);
+          justify-content: space-between;
+          border-radius: 12px;
+          margin-bottom: 10px;
+          .name {
+            font-size: 14px;
+          }
+        }
+      }
+
+      .add-account-page {
+        background-color: lightcyan;
+        padding: 10px 50px;
+        .upload-group {
+          background-color: lightgrey;
+          height: 100px;
+          display: flex;
+          .upload-jpg {
+            height: 40px;
+            width: 40px;
+            background-color: lightcoral;
+            margin-bottom: 20px;
+          }
+        }
+        .fill-group {
+          .p-title {
+            text-align: left;
+          }
+        }
+      }
+    }
+    .datetime-right {
+      .el-form-item.is-required:not(.is-no-asterisk)
+        > .el-form-item__label:before,
+      .el-form-item.is-required:not(.is-no-asterisk)
+        .el-form-item__label-wrap
+        > .el-form-item__label:before {
+        display: none;
+      }
+      .el-form-item {
+        margin-bottom: 10px;
+        height: 50px;
+        background: #f8f8f8;
+        padding: 4px 20px;
+        -webkit-box-sizing: border-box;
+        box-sizing: border-box;
+        border-radius: 10px;
+        .el-form-item__label {
+          text-align: left;
+          line-height: 42px;
+        }
+      }
+      .el-form-item__content {
+        line-height: 40px;
+        position: relative;
+        font-size: 14px;
+      }
+      .ip-input-container {
+        max-width: none !important;
+      }
+      .ntp-time {
+        .right {
+          display: flex;
+          align-items: baseline;
+          .el-input-number--small {
+            width: 100%;
+          }
+          .el-button--text {
+            margin-left: 10px;
+            text-decoration: underline;
+          }
+        }
+        .ntp-bar {
+          height: 40px;
+          background-color: rgba(248, 248, 248, 1);
+          display: flex;
+          align-items: center;
+          justify-content: space-between;
+          padding: 0 10px;
+          border-radius: 10px;
+          margin-bottom: 10px;
+          .title {
+            min-width: 70px;
+          }
+          .input-area {
+            width: 450px;
+            height: 30px;
+            background-color: rgba(240, 240, 240, 1);
+            border-radius: 10px;
+            line-height: 30px;
+            font-size: 14px;
+          }
+        }
+        .int-bar {
+          height: 40px;
+          background-color: rgba(248, 248, 248, 1);
+          display: flex;
+          align-items: center;
+          justify-content: space-between;
+          padding: 0 10px;
+          border-radius: 10px;
+          margin-bottom: 10px;
+          .title {
+            min-width: 130px;
+          }
+          .right {
+            width: 450px;
+            display: flex;
+            align-items: center;
+            height: 30px;
+
+            .input-area {
+              // width: 410px;
+              background-color: rgba(240, 240, 240, 1);
+              border-radius: 10px;
+              line-height: 30px;
+              width: -webkit-fill-available;
+
+              font-size: 14px;
+            }
+            .test {
+              width: 40px;
+            }
+          }
+        }
+      }
+      .manual-time {
+        .clock-wrap {
+          height: 75px;
+
+          background-color: #f8f8f8;
+          display: flex;
+          justify-content: center;
+          align-items: center;
+          margin-bottom: 10px;
+          border-radius: 10px;
+          .clock {
+            display: flex;
+            align-items: center;
+            height: 90px;
+            justify-content: space-evenly;
+            .iconfont {
+              cursor: pointer;
+              color: rgba(134, 134, 134, 1);
+            }
+            .iconfont:hover {
+              background-color: gainsboro;
+            }
+            .hour {
+              background-color: rgba(240, 240, 240, 1);
+              display: flex;
+              align-items: center;
+              width: 100px;
+              height: 50px;
+              justify-content: space-evenly;
+              border-radius: 10px;
+            }
+            .dnum {
+              width: 40px;
+              height: 40px;
+              line-height: 40px;
+              font-size: 34px;
+              font-family: Consolas;
+              display: flex;
+              align-items: center;
+              .input-box {
+                width: inherit;
+                border: none;
+                border-radius: 5px;
+                height: 35px;
+                font-size: 28px;
+                text-align: center;
+              }
+
+              .input-box:focus {
+                outline: none;
+              }
+            }
+            .control {
+              width: 20px;
+              .fanzhuan {
+                display: inline-block;
+                -moz-transform: scaleY(-1);
+                -webkit-transform: scaleY(-1);
+                -o-transform: scaleY(-1);
+                transform: scaleY(-1);
+              }
+            }
+            .sep {
+              font-family: Consolas;
+              width: 40px;
+              font-size: 34px;
+              height: 40px;
+              line-height: 40px;
+            }
+            .mins {
+              background-color: #f0f0f0;
+              display: flex;
+              align-items: center;
+              width: 110px;
+              height: 50px;
+              justify-content: space-evenly;
+              border-radius: 10px;
+            }
+          }
+        }
+        .adjust-bar {
+          display: flex;
+          justify-content: space-between;
+          align-items: center;
+          margin-bottom: 10px;
+          border-radius: 10px;
+          height: 50px;
+          background-color: rgba(248, 248, 248, 1);
+          .middle {
+            font-size: 14px;
+          }
+           .input-box {
+                width: 80px;
+                border: none;
+                border-radius: 5px;
+                height: 25px;
+                font-size: 18px;
+                text-align: center;
+              }
+
+              .input-box:focus {
+                outline: none;
+              }
+          .minus {
+            width: 50px;
+            height: 50px;
+            background-color: #f0f0f0;
+            font-size: 35px;
+            border-radius: 10px;
+            cursor: pointer;
+            line-height: 50px;
+            color: rgba(134, 134, 134, 1);
+          }
+          .plus {
+            width: 50px;
+            height: 50px;
+            cursor: pointer;
+            background-color: #f0f0f0;
+            font-size: 35px;
+            border-radius: 10px;
+            line-height: 50px;
+            color: rgba(134, 134, 134, 1);
+          }
+        }
+      }
+    }
+    .btns {
+      display: flex;
+      justify-content: space-between;
+      margin-top: 200px;
+
+      .cancel {
+        height: 40px;
+        width: 48%;
+
+        border-radius: 8px;
+        background-color: rgba(240, 240, 240, 1);
+        line-height: 40px;
+        font-size: 14px;
+      }
+      .ok {
+        height: 40px;
+        width: 48%;
+
+        border-radius: 8px;
+        background-color: rgba(61, 104, 225, 1);
+        color: #fff;
+        line-height: 40px;
+        font-size: 14px;
+      }
+    }
+  }
+}
+</style>
+
+
diff --git a/src/pages/systemSettings/index/main.ts b/src/pages/systemSettings/index/main.ts
new file mode 100644
index 0000000..491ea9a
--- /dev/null
+++ b/src/pages/systemSettings/index/main.ts
@@ -0,0 +1,12 @@
+import Vue from 'vue';
+import App from './App.vue';
+
+import ElementUI from 'element-ui';
+import 'element-ui/lib/theme-chalk/index.css';
+import "@/assets/css/element-variables.scss";
+Vue.use(ElementUI)
+
+new Vue({
+  el: '#app',
+  render: h => h(App)
+})
diff --git a/src/pages/systemSettings/views/NetSettings.vue b/src/pages/systemSettings/views/NetSettings.vue
new file mode 100644
index 0000000..b2e0eac
--- /dev/null
+++ b/src/pages/systemSettings/views/NetSettings.vue
@@ -0,0 +1,570 @@
+<template>
+  <div class="all">
+    <div class="cluster-content">
+      <div class="cluster-center" ref="left">
+        <div class="menu-item" @click="openRight('net')">
+          <div><span class="icon iconfont">&#xe646;</span>缃戠粶璁剧疆</div>
+          <div class="status">宸茶繛鎺�</div>
+        </div>
+        <div class="menu-item" @click="openRight('wifi')">
+          <div><span class="icon iconfont">&#xe646;</span>鏃犵嚎缃戠粶</div>
+          <div class="status">宸茶繛鎺�</div>
+        </div>
+        <div class="menu-item" @click="openRight('wire')">
+          <div><span class="icon iconfont">&#xe646;</span>鏈夌嚎缃戠粶</div>
+          <div class="status">宸茶繛鎺�</div>
+        </div>
+      </div>
+      <div class="cluster-right">
+        <div class="net-set" v-if="activePage == 'net'">
+          <div class="title">缃戠粶璁剧疆</div>
+          <el-form
+            :model="ruleForm"
+            :rules="rules"
+            ref="joinForm"
+            class="join-form"
+            label-width="150px"
+            v-loading="joinLoading"
+          >
+            <el-form-item label="璁惧鍚嶇О" prop="deviceName">
+              <el-input
+                v-model="ruleForm.deviceName"
+                size="small"
+                placeholder="蹇呭~"
+              ></el-input>
+            </el-form-item>
+
+            <el-form-item label="绔彛" prop="port">
+              <el-input
+                v-model="ruleForm.port"
+                placeholder="閫夊~锛屽閮ㄨ闂殑绔彛"
+                size="small"
+              ></el-input>
+            </el-form-item>
+            <div class="save-btn">淇濆瓨</div>
+          </el-form>
+        </div>
+
+        <div class="wifi" v-if="activePage == 'wifi' && !inWifiDetail">
+          <switchBar
+            :barName="`鏃犵嚎缃戝崱`"
+            @switchChange="wifiControl"
+            :value="isOpenWifi"
+          ></switchBar>
+
+          <div class="wifi-option" v-for="(item, i) in wifiList" :key="i">
+            <div class="name">
+              <span class="icon iconfont">&#xe646;</span>
+              <span> {{ item.name }} </span>
+            </div>
+
+            <div class="more-detail">
+              <span class="icon iconfont">&#xe676;</span>
+              <span
+                class="icon iconfont"
+                style="margin-left: 10px"
+                @click="checkWifi(item)"
+                >&#xe640;</span
+              >
+            </div>
+          </div>
+        </div>
+        <div class="wifi-detail" v-if="activePage == 'wifi' && inWifiDetail">
+          <div class="btns">
+            <div class="left">鍒犻櫎</div>
+            <div class="right">鏂紑杩炴帴</div>
+          </div>
+
+          <div class="title">閫氱敤</div>
+
+          <el-form
+            :model="wifiForm"
+            :rules="wifiFormRules"
+            ref="wifiForm"
+            class="join-form"
+            label-width="150px"
+          >
+            <!-- v-loading="joinLoading" -->
+            <el-form-item label="鍚嶇О" prop="name">
+              <div class="wifi-name">{{ 12123 }}</div>
+            </el-form-item>
+
+            <el-form-item label="瀵嗙爜" prop="password">
+              <el-input
+                v-model="wifiForm.password"
+                placeholder="璇疯緭鍏ュ瘑鐮�"
+                size="small"
+                show-password
+              ></el-input>
+            </el-form-item>
+          </el-form>
+
+          <switchBar
+            :barName="`楂樼骇璁剧疆`"
+            @switchChange="highClassSetting"
+            :value="isHighClass"
+          ></switchBar>
+          <div class="title">IPV4</div>
+
+          <!-- <el-form
+            :model="ipv4Form"
+            :rules="ipv4FormRules"
+            ref="ipv4Form"
+            class="join-form"
+            label-width="150px"
+          >
+            <el-form-item label="瀵嗙爜" prop="password">
+              <el-input
+                v-model="wifiForm.password"
+                placeholder="璇疯緭鍏ュ瘑鐮�"
+                size="small"
+                show-password
+              ></el-input>
+            </el-form-item>
+          </el-form> -->
+
+          <el-form
+            :model="ipv4Form"
+            :rules="ipv4FormRules"
+            ref="ipv4Form"
+            label-width="150px"
+          >
+            <el-form-item label="鏂规硶">
+              <el-select v-model="value" placeholder="璇烽�夋嫨" size="small">
+                <el-option
+                  v-for="item in options"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
+                >
+                </el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item label="IP" prop="ip">
+              <ip-input
+                :ip="ipv4Form.ip"
+                @on-blur="ipv4Form.ip = arguments[0]"
+              ></ip-input>
+            </el-form-item>
+            <el-form-item label="瀛愮綉鎺╃爜" prop="subMask">
+              <ip-input
+                :ip="ipv4Form.subMask"
+                @on-blur="ipv4Form.subMask = arguments[0]"
+              ></ip-input>
+            </el-form-item>
+
+            <el-form-item label="缃戝叧" prop="gateway">
+              <ip-input
+                :ip="ipv4Form.gateway"
+                @on-blur="ipv4Form.gateway = arguments[0]"
+              ></ip-input>
+            </el-form-item>
+            <el-form-item label="棣栭�塂NS" prop="dns">
+              <ip-input
+                :ip="ipv4Form.dns1"
+                @on-blur="ipv4Form.dns1 = arguments[0]"
+              ></ip-input>
+            </el-form-item>
+            <el-form-item label="澶囩敤DNS" prop="dns">
+              <ip-input
+                :ip="ipv4Form.dns2"
+                @on-blur="ipv4Form.dns2 = arguments[0]"
+              ></ip-input>
+            </el-form-item>
+          </el-form>
+
+          <div class="title">IPV6</div>
+
+          <el-form
+            :model="ipv6Form"
+            :rules="ipv6FormRules"
+            ref="ipv4Form"
+            label-width="150px"
+          >
+            <el-form-item label="鏂规硶">
+              <el-select v-model="value" placeholder="璇烽�夋嫨" size="small">
+                <el-option
+                  v-for="item in options"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
+                >
+                </el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item label="IP鍦板潃" prop="ip">
+              <ip-input
+                :ip="ipv6Form.ip"
+                @on-blur="ipv6Form.ip = arguments[0]"
+              ></ip-input>
+            </el-form-item>
+            <el-form-item label="鍓嶇紑" prop="subMask">
+              <div style="display: flex">
+                <el-input
+                  v-model="wifiForm.password"
+                  placeholder=""
+                  size="small"
+                ></el-input>
+
+                <div class="ad">-</div>
+                <div class="ad">+</div>
+                <div class="ad">閲嶇疆</div>
+              </div>
+            </el-form-item>
+
+            <el-form-item label="缃戝叧" prop="gateway">
+              <ip-input
+                :ip="ipv6Form.gateway"
+                @on-blur="ipv6Form.gateway = arguments[0]"
+              ></ip-input>
+            </el-form-item>
+            <el-form-item label="棣栭�塂NS" prop="dns">
+              <ip-input
+                :ip="ipv6Form.dns1"
+                @on-blur="ipv6Form.dns1 = arguments[0]"
+              ></ip-input>
+            </el-form-item>
+            <el-form-item label="澶囩敤DNS" prop="dns">
+              <ip-input
+                :ip="ipv6Form.dns2"
+                @on-blur="ipv6Form.dns2 = arguments[0]"
+              ></ip-input>
+            </el-form-item>
+          </el-form>
+
+          <div class="btns">
+            <div class="left">鍙栨秷</div>
+            <div class="right">淇濆瓨</div>
+          </div>
+        </div>
+
+        <div class="wire" v-if="activePage == 'wire' && !inWireDetail">
+          <div
+            class="wire-bar"
+            v-for="(item, i) in wireArr"
+            :key="i"
+            @click="checkWire(item)"
+          >
+            <div class="name">{{ item.name }}</div>
+
+            <div class="right">
+              <span class="icon iconfont">&#xe676;</span>
+
+              <el-switch
+                v-model="value"
+                active-color="rgba(61, 104, 225, 1)"
+                @change="switchChange"
+              >
+              </el-switch>
+            </div>
+          </div>
+        </div>
+        <div class="wire-detail" v-if="activePage == 'wire' && inWireDetail">
+            <div class="title">缃戠粶璁剧疆</div>
+          <el-form
+            :model="wireForm"
+            :rules="wireFormRules"
+            ref="wireForm"
+            label-width="150px"
+          >
+     <el-form-item label="缃戠粶鍚嶇О" prop="name">
+              <div class="wifi-name">{{ 12123 }}</div>
+            </el-form-item>
+            <el-form-item label="缃戝崱" prop="name">
+              <div class="wifi-name">{{ 12123 }}</div>
+            </el-form-item>
+            <el-form-item label="IP" prop="ip">
+              <ip-input
+                :ip="wireForm.ip"
+                @on-blur="wireForm.ip = arguments[0]"
+              ></ip-input>
+            </el-form-item>
+            <el-form-item label="瀛愮綉鎺╃爜" prop="subMask">
+              <ip-input
+                :ip="wireForm.subMask"
+                @on-blur="wireForm.subMask = arguments[0]"
+              ></ip-input>
+            </el-form-item>
+
+            <el-form-item label="缃戝叧" prop="gateway">
+              <ip-input
+                :ip="ipv4Form.gateway"
+                @on-blur="ipv4Form.gateway = arguments[0]"
+              ></ip-input>
+            </el-form-item>
+            <el-form-item label="棣栭�塂NS" prop="dns">
+              <ip-input
+                :ip="ipv4Form.dns1"
+                @on-blur="ipv4Form.dns1 = arguments[0]"
+              ></ip-input>
+            </el-form-item>
+            <el-form-item label="澶囩敤DNS" prop="dns">
+              <ip-input
+                :ip="ipv4Form.dns2"
+                @on-blur="ipv4Form.dns2 = arguments[0]"
+              ></ip-input>
+            </el-form-item>
+          </el-form>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import {
+  createSerfCluster,
+  randomPwd,
+  search,
+  getSearchNodes,
+  stopSearching,
+  findCluster,
+  updateClusterName,
+  joinCluster,
+  leave,
+  getVrrp,
+  setVrrp,
+  createESNode,
+  addESNode,
+  getEsClusterInfo,
+} from "@/api/clusterManage";
+import cloudNode from "../components/CloudNode";
+import ipInput from "@/components/subComponents/IPInput";
+import { isIPv4 } from "@/scripts/validate";
+import switchBar from "../components/switchBar";
+
+export default {
+  data() {
+    const checkPwd = (rule, value, callback) => {
+      if (!value) {
+        return callback(new Error("瀵嗙爜涓嶈兘涓虹┖"));
+      }
+      setTimeout(() => {
+        if (value.length != 6) {
+          callback(new Error("瀵嗙爜搴斾负6浣�!"));
+        } else {
+          callback();
+        }
+      }, 1000);
+    };
+    return {
+      isHighClass: false,
+
+      ruleForm: {
+        deviceName: "",
+        port: "",
+      },
+      wifiForm: {
+        name: "",
+        password: "",
+      },
+      wireArr: [{ name: "鏈夌嚎缃戠粶1" }, { name: "鏈夌嚎缃戠粶2" }],
+      inWifiDetail: false,
+      wifiList: [{ name: "鏃犵嚎缃戠粶1" }, { name: "鏃犵嚎缃戠粶2" }],
+      isOpenWifi: false,
+      inWireDetail: false,
+      wireForm:{
+
+      },
+      wireFormRules:{
+
+      },
+      activePage: "net",
+      rules: {
+        deviceName: [
+          { required: true, message: "璇疯緭鍏ヨ澶囧悕绉�", trigger: "change" },
+        ],
+      },
+      ipv4Form: {},
+      ipv6Form: {},
+      ipv4FormRules: {},
+      ipv6FormRules: {},
+      options: [
+        {
+          value: "閫夐」1",
+          label: "鎵嬪姩",
+        },
+        {
+          value: "閫夐」2",
+          label: "鑷姩",
+        },
+      ],
+      value: "",
+    };
+  },
+  components: {
+    cloudNode,
+    ipInput,
+    switchBar,
+  },
+  mounted() {},
+  beforeDestroy() {},
+  props: ["barName"],
+  methods: {
+    openRight(typ) {
+      this.activePage = typ;
+    },
+    wifiControl(val) {},
+    checkWifi() {
+      this.inWifiDetail = true;
+    },
+    checkWire(item) {
+      this.inWireDetail = true;
+    },
+  },
+};
+</script>
+<style lang="scss">
+.all {
+  width: 100%;
+}
+
+.cluster-content {
+  height: 100%;
+  display: flex;
+  flex-direction: row;
+  flex: 1;
+  flex-basis: auto;
+  box-sizing: border-box;
+  .cluster-center {
+    height: 100%;
+    width: 260px;
+    overflow: auto;
+    box-sizing: border-box;
+    flex-shrink: 0;
+    padding: 10px;
+    background-color: lavender;
+    .menu-item {
+      background-color: #f8f8f8;
+      height: 40px;
+      margin-bottom: 10px;
+      border-radius: 8px;
+      line-height: 40px;
+      box-sizing: border-box;
+      font-size: 14px;
+      padding: 0 20px;
+      display: flex;
+      justify-content: space-between;
+    }
+  }
+  .cluster-right {
+    flex: 1;
+    flex-basis: auto;
+    overflow: auto;
+    // background-color: rgba(240, 242, 245, 1);
+    box-sizing: border-box;
+    position: relative;
+    padding: 20px 40px;
+    // .create-new .join-exist {
+    .el-form-item.is-required:not(.is-no-asterisk)
+      > .el-form-item__label:before,
+    .el-form-item.is-required:not(.is-no-asterisk)
+      .el-form-item__label-wrap
+      > .el-form-item__label:before {
+      display: none;
+    }
+    .el-select {
+      width: 100%;
+    }
+    .el-form-item {
+      margin-bottom: 10px;
+      height: 50px;
+      background: #f8f8f8;
+      padding: 4px 20px;
+      -webkit-box-sizing: border-box;
+      box-sizing: border-box;
+      border-radius: 10px;
+      .el-form-item__label {
+        text-align: left;
+        line-height: 42px;
+      }
+    }
+    .el-form-item__content {
+      line-height: 40px;
+      position: relative;
+      font-size: 14px;
+    }
+    .ip-input-container {
+      max-width: none !important;
+    }
+    // }
+    .wifi {
+      .wifi-option {
+        height: 50px;
+        background-color: #f8f8f8;
+        display: flex;
+        justify-content: space-between;
+        align-items: center;
+        box-sizing: border-box;
+        padding: 0 20px;
+        margin-bottom: 10px;
+      }
+    }
+    .wifi-detail {
+      .btns {
+        display: flex;
+        justify-content: space-between;
+        .left {
+          background-color: rgba(240, 240, 240, 1);
+          height: 40px;
+          line-height: 40px;
+          width: 48%;
+          border-radius: 10px;
+        }
+        .right {
+          background-color: rgba(61, 104, 225, 1);
+          height: 40px;
+          line-height: 40px;
+          width: 48%;
+          color: #fff;
+          border-radius: 10px;
+        }
+      }
+      .wifi-name {
+        height: 40px;
+        background-color: #f0f0f0;
+        text-align: left;
+        box-sizing: border-box;
+        padding: 0 20px;
+      }
+      .ad {
+        min-width: 35px;
+        background-color: rgba(240, 240, 240, 1);
+        height: 35px;
+        margin: 4px 0px 4px 5px;
+        border-radius: 5px;
+        line-height: 35px;
+      }
+    }
+    .wire {
+      .wire-bar {
+        height: 50px;
+        background-color: aliceblue;
+        display: flex;
+        justify-content: space-between;
+        box-sizing: border-box;
+        padding: 0 20px;
+        align-items: center;
+      }
+      .wifi-name {
+        height: 40px;
+        background-color: #f0f0f0;
+        text-align: left;
+        box-sizing: border-box;
+        padding: 0 20px;
+      }
+    }
+    .save-btn {
+      background-color: #3d68e1;
+      width: 240px;
+      height: 40px;
+      margin: 0 auto;
+      border-radius: 10px;
+      color: #fff;
+      line-height: 40px;
+      font-size: 14px;
+      margin-top: 20px;
+    }
+  }
+}
+</style>
diff --git a/src/pages/systemSettings/views/clusterManagement.vue b/src/pages/systemSettings/views/clusterManagement.vue
new file mode 100644
index 0000000..89b4dc2
--- /dev/null
+++ b/src/pages/systemSettings/views/clusterManagement.vue
@@ -0,0 +1,714 @@
+<template>
+  <div class="all">
+    <div class="cluster-guanli" v-if="showCurCluster">
+      <cloud-node :nodes="innerNodes"></cloud-node>
+
+      <div class="bar">
+        <div class="title">闆嗙兢鍚嶇О</div>
+        <div class="input-area">
+          <div class="text" v-show="!isFillingName">
+            {{ ruleForm.clustername }}
+          </div>
+          <el-input
+            v-show="isFillingName"
+            size="mini"
+            v-model="selfForm.clustername"
+            placeholder="璇疯緭鍏ュ唴瀹�"
+          ></el-input>
+          <span
+            class="icon iconfont"
+            @click="startInput(1)"
+            v-show="!isFillingName"
+            >&#xe60c;</span
+          >
+          <span
+            class="icon iconfont"
+            @click="clearInput(1)"
+            v-show="isFillingName"
+            >&#xe649;</span
+          >
+          <span
+            class="icon iconfont"
+            @click="updateCluster(1)"
+            v-show="isFillingName"
+            >&#xe62a;</span
+          >
+        </div>
+      </div>
+      <div class="bar">
+        <div class="title">闆嗙兢ID</div>
+        <div class="input-area">
+          <div class="text">{{ clusterid }}</div>
+        </div>
+      </div>
+      <div class="bar">
+        <div class="title">闆嗙兢瀵嗙爜</div>
+        <div class="input-area">
+          <div class="text">{{ ruleForm.clusterpwd }}</div>
+        </div>
+      </div>
+      <div class="bar">
+        <div class="title">闆嗙兢IP</div>
+        <div class="input-area">
+          <div class="text" v-show="!isFillingIp">{{ ruleForm.virtualIp }}</div>
+
+          <ip-input
+            v-if="isFillingIp"
+            :ip="selfForm.virtualIp"
+            :on-blur="onIpBlur"
+            class="ip-input-comp"
+          ></ip-input>
+          <span
+            class="icon iconfont"
+            v-show="!isFillingIp"
+            @click="startInput(2)"
+            >&#xe60c;</span
+          >
+          <span
+            class="icon iconfont"
+            @click="clearInput(2)"
+            v-show="isFillingIp"
+            >&#xe649;</span
+          >
+          <span
+            class="icon iconfont"
+            @click="updateCluster(2)"
+            v-show="isFillingIp"
+            >&#xe62a;</span
+          >
+        </div>
+      </div>
+
+      <div class="exit" @click="exitCluster">閫�鍑洪泦缇�</div>
+    </div>
+
+    <div class="cluster-content">
+      <div class="cluster-center" ref="left" v-if="!showCurCluster">
+        <div class="menu-item" @click="isCreate = true">鍒涘缓闆嗙兢</div>
+        <div class="menu-item" @click="isCreate = false">鍔犲叆宸叉湁闆嗙兢</div>
+      </div>
+      <div class="cluster-right" v-if="!showCurCluster">
+        <div class="create-new" v-if="isCreate">
+          <el-form
+            :model="ruleForm"
+            :rules="rules"
+            ref="ruleForm"
+            label-width="150px"
+          >
+            <el-form-item label="闆嗙兢鍚嶇О" prop="clustername">
+              <el-input
+                v-model="ruleForm.clustername"
+                placeholder="鎵嬪姩杈撳叆, 濡傗�滈泦缇鈥�"
+                size="small"
+              ></el-input>
+            </el-form-item>
+            <el-form-item label="闆嗙兢ID">
+              <el-input
+                v-model="clusterid"
+                placeholder="涓嶅厑璁歌緭鍏�,淇濆瓨鍚庡洖鏄�"
+                disabled
+                size="small"
+              ></el-input>
+            </el-form-item>
+            <el-form-item label="闆嗙兢瀵嗙爜" prop="clusterpwd">
+              <el-input
+                v-model="ruleForm.clusterpwd"
+                placeholder="璇疯緭鍏�6浣嶅瘑鐮�,鎴栫偣鍑荤敓鎴�"
+                size="small"
+              >
+                <el-button type="text" slot="suffix" @click="getPSW"
+                  >鐢熸垚瀵嗙爜</el-button
+                >
+              </el-input>
+            </el-form-item>
+            <el-form-item label="闆嗙兢IP" prop="virtualIp">
+              <ip-input
+                :ip="ruleForm.virtualIp"
+                :on-blur="onIpBlur"
+                class="ip-input-comp"
+              ></ip-input>
+            </el-form-item>
+          </el-form>
+          <div class="save-btn" @click="saveCluster('ruleForm')">淇濆瓨</div>
+        </div>
+        <div class="join-exist" v-if="!isCreate">
+          <el-form
+            :model="joinForm"
+            :rules="joinRules"
+            ref="joinForm"
+            class="join-form"
+            label-width="150px"
+            v-loading="joinLoading"
+          >
+            <el-form-item label="闆嗙兢ID" prop="clusterid">
+              <el-input v-model="joinForm.clusterid" size="small"></el-input>
+            </el-form-item>
+
+            <el-form-item label="IP鍦板潃" prop="clusterip">
+              <el-input
+                v-model="joinForm.clusterip"
+                placeholder="璇疯緭鍏ラ泦缇ゅ唴浠绘剰IP鍦板潃"
+                size="small"
+                autocomplete="new-password"
+              ></el-input>
+            </el-form-item>
+            <el-form-item label="闆嗙兢瀵嗙爜" prop="clusterpwd">
+              <el-input
+                v-model="joinForm.clusterpwd"
+                placeholder="璇疯緭鍏ラ泦缇ゅ瘑鐮�"
+                show-password
+                autocomplete="new-password"
+                size="small"
+              >
+                <el-button
+                  type="text"
+                  slot="suffix"
+                  @click="searchColony"
+                  v-show="!searchDis"
+                  >鎼滅储闆嗙兢</el-button
+                >
+                <el-button
+                  type="text"
+                  slot="suffix"
+                  v-show="searchDis"
+                  @click="stopSearch"
+                >
+                  <i class="el-icon-loading"></i>鍋滄鎼滅储
+                </el-button>
+              </el-input>
+            </el-form-item>
+          </el-form>
+
+          <div class="save-btn" @click="join('joinForm')">鍔犲叆闆嗙兢</div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import {
+  createSerfCluster,
+  randomPwd,
+  search,
+  getSearchNodes,
+  stopSearching,
+  findCluster,
+  updateClusterName,
+  joinCluster,
+  leave,
+  getVrrp,
+  setVrrp,
+  createESNode,
+  addESNode,
+  getEsClusterInfo,
+} from "@/api/clusterManage";
+import cloudNode from "../components/CloudNode";
+import ipInput from "@/components/subComponents/IPInput";
+import { isIPv4 } from "@/scripts/validate";
+
+export default {
+  data() {
+    const checkPwd = (rule, value, callback) => {
+      if (!value) {
+        return callback(new Error("瀵嗙爜涓嶈兘涓虹┖"));
+      }
+      setTimeout(() => {
+        if (value.length != 6) {
+          callback(new Error("瀵嗙爜搴斾负6浣�!"));
+        } else {
+          callback();
+        }
+      }, 1000);
+    };
+    return {
+      innerNodes: [],
+      intervalTimer: null,
+      isFillingName: false,
+      isFillingIp: false,
+      inputName: "",
+      inputIp: "",
+      serverIp: "",
+      members: [],
+      virtualIp: "192.168.1.188",
+      searchDis: false,
+      ruleForm: {
+        clustername: "",
+        clusterpwd: "",
+        virtualIp: "",
+      },
+      selfForm: {
+        virtualIp: "",
+        clustername: "",
+      },
+      joinForm: {
+        clusterid: "",
+        clusterip: "",
+        clusterpwd: "",
+      },
+      isSearch: false,
+      showCurCluster: true,
+      loading: false,
+      joinLoading: false,
+      isHasColony: false,
+      clusterid: "",
+      searchNum: "",
+      scheduleId: "",
+      isCreate: true,
+      rules: {
+        clustername: [
+          { required: true, message: "璇疯緭鍏ラ泦缇ゅ悕绉�", trigger: "change" },
+        ],
+        clusterpwd: [{ validator: checkPwd, trigger: "change" }],
+        virtualIp: [{ required: true, validator: isIPv4, trigger: "change" }],
+      },
+      joinRules: {
+        clusterid: [
+          { required: true, message: "璇疯緭鍏ラ泦缇D", trigger: "change" },
+        ],
+        clusterip: [{ required: true, validator: isIPv4, trigger: "change" }],
+        clusterpwd: [{ validator: checkPwd, trigger: "change" }],
+      },
+    };
+  },
+  components: {
+    cloudNode,
+    ipInput,
+  },
+  mounted() {
+    this.findCluster();
+    let _this = this;
+    this.intervalTimer = setInterval(() => {
+      _this.findCluster();
+    }, 30000);
+  },
+  beforeDestroy() {
+    clearInterval(this.intervalTimer);
+  },
+  props: ["barName"],
+  methods: {
+    async createCluster(json) {
+      let res = await createSerfCluster(json);
+      this.$notify({
+        title: res.success ? "鎴愬姛" : "澶辫触",
+        message: res.msg,
+        type: res.success ? "success" : "error",
+      });
+    },
+    //鎼滅储闆嗙兢
+    async getSearchNodes() {
+      let res = await getSearchNodes();
+      if (res && res.success) {
+        let list = res.data.map((i) => {
+          let obj = {};
+          obj.cluster_id = i.clusterID ? i.clusterID : "";
+          obj.create_time = i.create_time ? i.create_time : "";
+          obj.id = i.nodeID ? i.nodeID : "";
+          obj.node_id = i.nodeID ? i.nodeID : "";
+          obj.Address = i.nodeAddress ? i.nodeAddress : "";
+          obj.nodeName = i.nodeAddress ? i.nodeAddress : "";
+          obj.role = i.role ? i.role : "pc";
+          return obj;
+        });
+        list.map((i) => {
+          let found = this.members.find((element) => {
+            return element.node_id === i.node_id;
+          });
+          if (found === undefined) {
+            this.members.push(i);
+          }
+        });
+      }
+    },
+    async joinCluster(json) {
+      let res = await joinCluster(json);
+      if (res.success) {
+        this.members = []
+      }
+      this.$notify({
+        title: res.success ? "鎴愬姛" : "澶辫触",
+        message: res.msg,
+        type: res.success ? "success" : "error"
+      });
+    },
+    join(formName) {
+      let _this = this;
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+          _this.joinLoading = true;
+          let nodeIps = _this.members.map((i) => {
+            return i.Address;
+          });
+          let data = {
+            clusterId: _this.joinForm.clusterid,
+            password: _this.joinForm.clusterpwd,
+            nodeIps: [_this.joinForm.clusterip],
+          };
+          _this
+            .joinCluster(data)
+            .then(() => {
+              _this.joinLoading = false;
+              _this.findCluster();
+            })
+            .catch((e) => {
+              _this.joinLoading = false;
+            });
+        } else {
+          return false;
+        }
+      });
+    },
+    setSchedule() {
+      this.scheduleId = window.setInterval(() => {
+        this.getSearchNodes();
+      }, 1000);
+    },
+    async searchColony() {
+      this.isSearch = true;
+      this.$refs["joinForm"].clearValidate();
+      this.$refs["joinForm"].validateField("clusterpwd");
+      if (this.joinForm.clusterpwd.trim().length === 6) {
+        this.members = [];
+        const data = {
+          password: this.joinForm.clusterpwd,
+        };
+        this.search(data)
+          .then(() => {
+            this.setSchedule();
+          })
+          .catch(() => {
+            this.searchDis = false;
+            this.loading = false;
+            this.isSearch = false;
+          });
+      } else {
+        this.searchDis = false;
+        this.loading = false;
+        this.isSearch = false;
+        return false;
+      }
+    },
+    async search(data) {
+      let res = await search(data);
+      if (res && res.success) {
+        this.searchNum = res.data;
+      }
+      this.searchDis = true;
+      this.loading = true;
+      window.setTimeout(() => {
+        this.stopSearch();
+      }, 10 * 1000);
+    },
+    async stopSearch() {
+      if (!this.loading) {
+        return true;
+      }
+      stopSearching({
+        searchNum: this.searchNum,
+      })
+        .then((res) => {
+        this.loading = false;
+          this.searchDis = false;
+          window.clearInterval(this.scheduleId);
+        })
+        .catch((err) => {
+          this.$notify({
+            type: "error",
+            duration: 1000,
+            message: "鍋滄鎼滅储鎶ラ敊锛�",
+          });
+        });
+    },
+    saveCluster(formName) {
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+          let data = {
+            clusterId: this.clusterid,
+            clusterName: this.ruleForm.clustername,
+            password: this.ruleForm.clusterpwd,
+            virtualIp: this.ruleForm.virtualIp,
+          };
+          this.createCluster(data).then(() => {
+            this.findCluster();
+          });
+        } else {
+          return false;
+        }
+      });
+    },
+    getPSW() {
+      var chars =
+        "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+      var uuid = [];
+
+      for (let i = 0; i < 6; i++) {
+        uuid[i] = chars[0 | (Math.random() * 50)];
+      }
+
+      this.ruleForm.clusterpwd = uuid.join("");
+    },
+    exitCluster() {
+      clearInterval(this.intervalTimer);
+      this.showCurCluster = false;
+      this.ruleForm.virtualIp = "";
+      this.ruleForm.clustername = "";
+      this.ruleForm.clusterpwd = "";
+      this.clusterid = "";
+    },
+    clearInput(typ) {
+      if (typ == 1) {
+        this.selfForm.clustername = "";
+        this.isFillingName = false;
+      } else {
+        this.selfForm.virtualIp = "";
+        this.isFillingIp = false;
+      }
+    },
+    async randomPwd() {
+      let res = await randomPwd();
+      if (res && res.success) {
+        this.ruleForm.clusterpwd = res.data;
+      }
+    },
+    startInput(typ) {
+      if (typ == 1) {
+        this.selfForm.clustername = this.ruleForm.clustername;
+        this.isFillingName = true;
+      } else {
+        this.selfForm.virtualIp = this.ruleForm.virtualIp;
+        this.isFillingIp = true;
+      }
+    },
+    onIpBlur(ip) {
+      console.log(ip);
+      this.ruleForm.virtualIp = ip;
+    },
+    async updateCluster(v) {
+      if (v == 1) {
+        this.ruleForm.clustername = this.selfForm.clustername;
+      }
+      if (this.ruleForm.clustername === "") {
+        this.$message({
+          type: "error",
+          message: "闆嗙兢鍚嶇О涓嶈兘涓虹┖",
+        });
+        return;
+      }
+      const data = {
+        clusterName: this.ruleForm.clustername,
+        virtualIp: this.ruleForm.virtualIp,
+      };
+      let res = await updateClusterName(data);
+      if (res.success) {
+        this.findCluster();
+      }
+      this.$notify({
+        title: res.success ? "鎴愬姛" : "澶辫触",
+        message: res.msg,
+        type: res.success ? "success" : "error",
+      });
+      this.isFillingIp = false;
+      this.isFillingName = false;
+    },
+    async findCluster() {
+      let res = await findCluster();
+      if (res && res.success) {
+        if (res.data && res.data.clusterId) {
+          this.isHasColony = true;
+          this.clusterid = res.data.clusterId;
+          this.ruleForm.clustername = res.data.clusterName;
+          this.ruleForm.clusterpwd = "******";
+          this.ruleForm.virtualIp = res.data.virtualIp;
+          this.isSearch = false;
+          this.innerNodes = res.data.nodes.map((i) => {
+            let obj = {};
+            obj.device_type = i.device_type;
+            obj.workType = i.device_type.substr(2, 2);
+            obj.hardwareType = i.device_type.substr(4, 2);
+            obj.cluster_id = i.cluster_id;
+            obj.clusterName = res.data.clusterName;
+            obj.create_time = i.create_time;
+            obj.id = i.id;
+            obj.node_id = i.node_id;
+            obj.node_ip = i.node_ip;
+            obj.nodeName = i.node_name;
+            obj.Address = i.node_ip;
+            obj.role = i.drift_state ? i.drift_state : "pc";
+            return obj;
+          });
+        } else {
+          this.isHasColony = false;
+        }
+      }
+    },
+    clearInnerNodes() {
+      this.innerNodes = [];
+    },
+  },
+};
+</script>
+<style lang="scss">
+.all {
+  width: 100%;
+}
+.cluster-guanli {
+  margin: 0 auto;
+  width: 520px;
+  .bar {
+    height: 40px;
+    background-color: rgba(248, 248, 248, 1);
+    margin-bottom: 10px;
+    display: flex;
+    box-sizing: border-box;
+    padding: 0 20px;
+    justify-content: space-between;
+    align-items: center;
+    .input-area {
+      display: flex;
+      width: 340px;
+      height: 30px;
+      line-height: 30px;
+      justify-content: inherit;
+      //   padding: 0 20px;
+      box-sizing: border-box;
+    }
+  }
+  .exit {
+    background-color: #3d68e1;
+    width: 240px;
+    height: 40px;
+    margin: 0 auto;
+    border-radius: 10px;
+    color: #fff;
+    line-height: 40px;
+    font-size: 14px;
+    margin-top: 20px;
+  }
+}
+.cluster-content {
+  height: 100%;
+  display: flex;
+  flex-direction: row;
+  flex: 1;
+  flex-basis: auto;
+  box-sizing: border-box;
+  .cluster-center {
+    height: 100%;
+    width: 260px;
+    overflow: auto;
+    box-sizing: border-box;
+    flex-shrink: 0;
+    padding: 10px;
+    background-color: lightpink;
+    .menu-item {
+      background-color: #f8f8f8;
+      height: 40px;
+      margin-bottom: 10px;
+      border-radius: 8px;
+      line-height: 40px;
+      font-size: 14px;
+    }
+  }
+  .cluster-right {
+    flex: 1;
+    flex-basis: auto;
+    overflow: auto;
+    // background-color: rgba(240, 242, 245, 1);
+    box-sizing: border-box;
+    position: relative;
+    padding: 20px 40px;
+    // .create-new .join-exist {
+    .el-form-item.is-required:not(.is-no-asterisk)
+      > .el-form-item__label:before,
+    .el-form-item.is-required:not(.is-no-asterisk)
+      .el-form-item__label-wrap
+      > .el-form-item__label:before {
+      display: none;
+    }
+    .el-form-item {
+      margin-bottom: 10px;
+      height: 50px;
+      background: #f8f8f8;
+      padding: 4px 20px;
+      -webkit-box-sizing: border-box;
+      box-sizing: border-box;
+      border-radius: 10px;
+      .el-form-item__label {
+        text-align: left;
+        line-height: 42px;
+      }
+    }
+    .el-form-item__content {
+      line-height: 40px;
+      position: relative;
+      font-size: 14px;
+    }
+    .ip-input-container {
+      max-width: none !important;
+    }
+    // }
+    .ntp-bar {
+      height: 40px;
+      background-color: rgba(248, 248, 248, 1);
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      padding: 0 10px;
+      border-radius: 10px;
+      margin-bottom: 10px;
+      .title {
+        min-width: 70px;
+      }
+      .input-area {
+        min-width: 400px;
+        height: 30px;
+        background-color: rgba(240, 240, 240, 1);
+        border-radius: 10px;
+        line-height: 30px;
+        font-size: 14px;
+      }
+    }
+    .int-bar {
+      height: 40px;
+      background-color: rgba(248, 248, 248, 1);
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      padding: 0 10px;
+      border-radius: 10px;
+      margin-bottom: 10px;
+      .title {
+        min-width: 70px;
+      }
+      .right {
+        min-width: 400px;
+        display: flex;
+        align-items: center;
+        height: 30px;
+        .input-area {
+          background-color: rgba(240, 240, 240, 1);
+          border-radius: 10px;
+          line-height: 30px;
+          width: -webkit-fill-available;
+
+          font-size: 14px;
+        }
+        .test {
+          width: 70px;
+        }
+      }
+    }
+    .save-btn {
+      background-color: #3d68e1;
+      width: 240px;
+      height: 40px;
+      margin: 0 auto;
+      border-radius: 10px;
+      color: #fff;
+      line-height: 40px;
+      font-size: 14px;
+      margin-top: 20px;
+    }
+  }
+}
+</style>
diff --git a/src/pages/systemSettings/views/generalSettings.vue b/src/pages/systemSettings/views/generalSettings.vue
new file mode 100644
index 0000000..b07b8b5
--- /dev/null
+++ b/src/pages/systemSettings/views/generalSettings.vue
@@ -0,0 +1,311 @@
+<template>
+  <div class="all">
+    <div class="cluster-content">
+      <div class="cluster-center" ref="left">
+        <div class="menu-item" @click="openRight('basic')">
+          <div>璁惧淇℃伅</div>
+        </div>
+        <div class="menu-item" @click="openRight('video')">
+          <div>浜嬩欢褰曞儚鏃堕暱</div>
+        </div>
+        <div class="menu-item" @click="openRight('sound')">
+          <div>浜嬩欢澹伴煶</div>
+        </div>
+      </div>
+      <div class="cluster-right">
+        <div class="lang" v-if="activePage == 'basic'">
+          <div class="bar" v-for="(item, i) in basioInfoList" :key="i">
+            <span class="name">{{ item.name }}</span>
+            <span class="name">{{ item.desc }}</span>
+          </div>
+        </div>
+        <div class="lang" v-if="activePage == 'video'">
+          <div class="min-dur">
+            <div class="title">瑙嗛鎴彇鏈�鐭椂闀�</div>
+            <div class="entity">
+              <div class="sec">{{ alarmConf.min_video_len }} s</div>
+              <div class="block">
+                <el-slider
+                  v-model="alarmConf.min_video_len"
+                  :min="0"
+                  :max="100"
+                  show-input
+                >
+                </el-slider>
+              </div>
+              &nbsp;s
+            </div>
+          </div>
+          <div class="min-dur">
+            <div class="title">瑙嗛鎴彇鏈�闀挎椂闀�</div>
+            <div class="entity">
+              <div class="sec">{{ alarmConf.max_video_len }} s</div>
+              <div class="block">
+                <el-slider
+                  v-model="alarmConf.max_video_len"
+                  :min="0"
+                  :max="100"
+                  show-input
+                >
+                </el-slider>
+              </div>
+              &nbsp;s
+            </div>
+          </div>
+        </div>
+        <div class="lang" v-if="activePage == 'sound'">
+            <div class="title">浜嬩欢澹伴煶</div>
+          <div class="bar" v-for="(item, i) in keyboardList" :key="i">
+            <span class="name">
+              <span class="icon iconfont">&#xe646;</span>{{ item.name }}</span
+            >
+            <div class="btns">
+              <span class="icon iconfont">&#xe646;</span>
+              <span class="icon iconfont">&#xe646;</span>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import {
+  createSerfCluster,
+  randomPwd,
+  search,
+  getSearchNodes,
+  stopSearching,
+  findCluster,
+  updateClusterName,
+  joinCluster,
+  leave,
+  getVrrp,
+  setVrrp,
+  createESNode,
+  addESNode,
+  getEsClusterInfo,
+} from "@/api/clusterManage";
+import cloudNode from "../components/CloudNode";
+import ipInput from "@/components/subComponents/IPInput";
+import { isIPv4 } from "@/scripts/validate";
+import switchBar from "../components/switchBar";
+
+export default {
+  data() {
+    const checkPwd = (rule, value, callback) => {
+      if (!value) {
+        return callback(new Error("瀵嗙爜涓嶈兘涓虹┖"));
+      }
+      setTimeout(() => {
+        if (value.length != 6) {
+          callback(new Error("瀵嗙爜搴斾负6浣�!"));
+        } else {
+          callback();
+        }
+      }, 1000);
+    };
+    return {
+      isHighClass: false,
+
+      ruleForm: {
+        deviceName: "",
+        port: "",
+      },
+      wifiForm: {
+        name: "",
+        password: "",
+      },
+      wireArr: [{ name: "鏈夌嚎缃戠粶1" }, { name: "鏈夌嚎缃戠粶2" }],
+      inWifiDetail: false,
+      wifiList: [{ name: "鏃犵嚎缃戠粶1" }, { name: "鏃犵嚎缃戠粶2" }],
+      isOpenWifi: false,
+      inWireDetail: false,
+      wireForm: {},
+      alarmConf: {
+        min_video_len: 0,
+        max_video_len: 0,
+      },
+      basioInfoList: [
+        { name: "绠�浣撲腑鏂�", desc: "fesF" },
+        { name: "鑻辨枃", desc: "fesF" },
+        { name: "绻佷綋涓枃锛堥娓級", desc: "fesF" },
+      ],
+      keyboardList: [{ name: "Hanyu Pinyin(algtr)" }, { name: "ENG" }],
+
+      wireFormRules: {},
+      activePage: "basic",
+      rules: {
+        deviceName: [
+          { required: true, message: "璇疯緭鍏ヨ澶囧悕绉�", trigger: "change" },
+        ],
+      },
+      ipv4Form: {},
+      ipv6Form: {},
+      ipv4FormRules: {},
+      ipv6FormRules: {},
+      options: [
+        {
+          value: "閫夐」1",
+          label: "鎵嬪姩",
+        },
+        {
+          value: "閫夐」2",
+          label: "鑷姩",
+        },
+      ],
+      value: "",
+    };
+  },
+  components: {
+    cloudNode,
+    ipInput,
+    switchBar,
+  },
+  mounted() {},
+  beforeDestroy() {},
+  props: ["barName"],
+  methods: {
+    openRight(typ) {
+      this.activePage = typ;
+    },
+    wifiControl(val) {},
+    checkWifi() {
+      this.inWifiDetail = true;
+    },
+    checkWire(item) {
+      this.inWireDetail = true;
+    },
+  },
+};
+</script>
+<style lang="scss">
+.all {
+  width: 100%;
+}
+
+.cluster-content {
+  height: 100%;
+  display: flex;
+  flex-direction: row;
+  flex: 1;
+  flex-basis: auto;
+  box-sizing: border-box;
+  .cluster-center {
+    height: 100%;
+    width: 260px;
+    overflow: auto;
+    box-sizing: border-box;
+    flex-shrink: 0;
+    padding: 10px;
+    background-color: lavender;
+    .menu-item {
+      background-color: #f8f8f8;
+      height: 40px;
+      margin-bottom: 10px;
+      border-radius: 8px;
+      line-height: 40px;
+      box-sizing: border-box;
+      font-size: 14px;
+      padding: 0 20px;
+      display: flex;
+      justify-content: space-between;
+    }
+  }
+  .cluster-right {
+    flex: 1;
+    flex-basis: auto;
+    overflow: auto;
+    // background-color: rgba(240, 242, 245, 1);
+    box-sizing: border-box;
+    position: relative;
+    padding: 20px 40px;
+    // .create-new .join-exist {
+    .el-form-item.is-required:not(.is-no-asterisk)
+      > .el-form-item__label:before,
+    .el-form-item.is-required:not(.is-no-asterisk)
+      .el-form-item__label-wrap
+      > .el-form-item__label:before {
+      display: none;
+    }
+    .el-select {
+      width: 100%;
+    }
+    .el-form-item {
+      margin-bottom: 10px;
+      height: 50px;
+      background: #f8f8f8;
+      padding: 4px 20px;
+      -webkit-box-sizing: border-box;
+      box-sizing: border-box;
+      border-radius: 10px;
+      .el-form-item__label {
+        text-align: left;
+        line-height: 42px;
+      }
+    }
+    .el-form-item__content {
+      line-height: 40px;
+      position: relative;
+      font-size: 14px;
+    }
+    .ip-input-container {
+      max-width: none !important;
+    }
+    .lang {
+      .bar {
+        height: 50px;
+        background-color: aliceblue;
+        border-radius: 10px;
+        line-height: 50px;
+        box-sizing: border-box;
+        padding: 0 20px;
+        display: flex;
+        justify-content: space-between;
+        margin-bottom: 10px;
+      }
+      .min-dur {
+        box-sizing: border-box;
+        padding: 0 10px;
+        background-color: rgba(248, 248, 248, 1);
+        height: 100px;
+        margin-bottom: 20px;
+        border-radius: 15px;
+        .title {
+          height: 50px;
+          line-height: 50px;
+          text-align: left;
+          box-sizing: border-box;
+          padding: 0 10px;
+        }
+      }
+      .entity {
+        display: flex;
+        align-items: center;
+        height: 30px;
+
+        .sec {
+          min-width: 30px;
+          line-height: 80px;
+          margin-right: 15px;
+        }
+        .block {
+          flex: auto;
+        }
+      }
+    }
+    .save-btn {
+      background-color: #3d68e1;
+      width: 240px;
+      height: 40px;
+      margin: 0 auto;
+      border-radius: 10px;
+      color: #fff;
+      line-height: 40px;
+      font-size: 14px;
+      margin-top: 20px;
+    }
+  }
+}
+</style>
diff --git a/src/pages/systemSettings/views/keyboardLanguage.vue b/src/pages/systemSettings/views/keyboardLanguage.vue
new file mode 100644
index 0000000..e916747
--- /dev/null
+++ b/src/pages/systemSettings/views/keyboardLanguage.vue
@@ -0,0 +1,240 @@
+<template>
+  <div class="all">
+    <div class="cluster-content">
+      <div class="cluster-center" ref="left">
+        <div class="menu-item" @click="openRight('lang')">
+          <div>绯荤粺璇█</div>
+        </div>
+        <div class="menu-item" @click="openRight('keyboard')">
+          <div>閿洏绠$悊</div>
+        </div>
+      </div>
+      <div class="cluster-right">
+        <div class="lang" v-if="activePage=='lang'">
+          <div class="title">璇█鍒楄〃</div>
+          <div class="bar" v-for="(item, i) in langList" :key="i">
+            <span class="name">{{ item.name }}</span>
+            <span class="icon iconfont">&#xe646;</span>
+          </div>
+        </div>
+        <div class="lang" v-if="activePage=='keyboard'">
+          <div class="title">閿洏甯冨眬</div>
+          <div class="bar" v-for="(item, i) in keyboardList" :key="i">
+            <span class="name">{{ item.name }}</span>
+            <span class="icon iconfont">&#xe646;</span>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import {
+  createSerfCluster,
+  randomPwd,
+  search,
+  getSearchNodes,
+  stopSearching,
+  findCluster,
+  updateClusterName,
+  joinCluster,
+  leave,
+  getVrrp,
+  setVrrp,
+  createESNode,
+  addESNode,
+  getEsClusterInfo,
+} from "@/api/clusterManage";
+import cloudNode from "../components/CloudNode";
+import ipInput from "@/components/subComponents/IPInput";
+import { isIPv4 } from "@/scripts/validate";
+import switchBar from "../components/switchBar";
+
+export default {
+  data() {
+    const checkPwd = (rule, value, callback) => {
+      if (!value) {
+        return callback(new Error("瀵嗙爜涓嶈兘涓虹┖"));
+      }
+      setTimeout(() => {
+        if (value.length != 6) {
+          callback(new Error("瀵嗙爜搴斾负6浣�!"));
+        } else {
+          callback();
+        }
+      }, 1000);
+    };
+    return {
+      isHighClass: false,
+
+      ruleForm: {
+        deviceName: "",
+        port: "",
+      },
+      wifiForm: {
+        name: "",
+        password: "",
+      },
+      wireArr: [{ name: "鏈夌嚎缃戠粶1" }, { name: "鏈夌嚎缃戠粶2" }],
+      inWifiDetail: false,
+      wifiList: [{ name: "鏃犵嚎缃戠粶1" }, { name: "鏃犵嚎缃戠粶2" }],
+      isOpenWifi: false,
+      inWireDetail: false,
+      wireForm: {},
+      langList: [
+        { name: "绠�浣撲腑鏂�" },
+        { name: "鑻辨枃" },
+        { name: "绻佷綋涓枃锛堥娓級" },
+      ],
+        keyboardList: [
+        { name: "Hanyu Pinyin(algtr)" },
+        { name: "ENG" },
+      ],
+      
+      wireFormRules: {},
+      activePage: "lang",
+      rules: {
+        deviceName: [
+          { required: true, message: "璇疯緭鍏ヨ澶囧悕绉�", trigger: "change" },
+        ],
+      },
+      ipv4Form: {},
+      ipv6Form: {},
+      ipv4FormRules: {},
+      ipv6FormRules: {},
+      options: [
+        {
+          value: "閫夐」1",
+          label: "鎵嬪姩",
+        },
+        {
+          value: "閫夐」2",
+          label: "鑷姩",
+        },
+      ],
+      value: "",
+    };
+  },
+  components: {
+    cloudNode,
+    ipInput,
+    switchBar,
+  },
+  mounted() {},
+  beforeDestroy() {},
+  props: ["barName"],
+  methods: {
+    openRight(typ) {
+      this.activePage = typ;
+    },
+    wifiControl(val) {},
+    checkWifi() {
+      this.inWifiDetail = true;
+    },
+    checkWire(item) {
+      this.inWireDetail = true;
+    },
+  },
+};
+</script>
+<style lang="scss">
+.all {
+  width: 100%;
+}
+
+.cluster-content {
+  height: 100%;
+  display: flex;
+  flex-direction: row;
+  flex: 1;
+  flex-basis: auto;
+  box-sizing: border-box;
+  .cluster-center {
+    height: 100%;
+    width: 260px;
+    overflow: auto;
+    box-sizing: border-box;
+    flex-shrink: 0;
+    padding: 10px;
+    background-color: lavender;
+    .menu-item {
+      background-color: #f8f8f8;
+      height: 40px;
+      margin-bottom: 10px;
+      border-radius: 8px;
+      line-height: 40px;
+      box-sizing: border-box;
+      font-size: 14px;
+      padding: 0 20px;
+      display: flex;
+      justify-content: space-between;
+    }
+  }
+  .cluster-right {
+    flex: 1;
+    flex-basis: auto;
+    overflow: auto;
+    // background-color: rgba(240, 242, 245, 1);
+    box-sizing: border-box;
+    position: relative;
+    padding: 20px 40px;
+    // .create-new .join-exist {
+    .el-form-item.is-required:not(.is-no-asterisk)
+      > .el-form-item__label:before,
+    .el-form-item.is-required:not(.is-no-asterisk)
+      .el-form-item__label-wrap
+      > .el-form-item__label:before {
+      display: none;
+    }
+    .el-select {
+      width: 100%;
+    }
+    .el-form-item {
+      margin-bottom: 10px;
+      height: 50px;
+      background: #f8f8f8;
+      padding: 4px 20px;
+      -webkit-box-sizing: border-box;
+      box-sizing: border-box;
+      border-radius: 10px;
+      .el-form-item__label {
+        text-align: left;
+        line-height: 42px;
+      }
+    }
+    .el-form-item__content {
+      line-height: 40px;
+      position: relative;
+      font-size: 14px;
+    }
+    .ip-input-container {
+      max-width: none !important;
+    }
+    .lang {
+      .bar {
+        height: 50px;
+        background-color: aliceblue;
+        border-radius: 10px;
+        line-height: 50px;
+        box-sizing: border-box;
+        padding: 0 20px;
+        display: flex;
+        justify-content: space-between;
+        margin-bottom: 10px;
+      }
+    }
+    .save-btn {
+      background-color: #3d68e1;
+      width: 240px;
+      height: 40px;
+      margin: 0 auto;
+      border-radius: 10px;
+      color: #fff;
+      line-height: 40px;
+      font-size: 14px;
+      margin-top: 20px;
+    }
+  }
+}
+</style>
diff --git a/vue.config.js b/vue.config.js
index bb448d4..a4d5c7b 100644
--- a/vue.config.js
+++ b/vue.config.js
@@ -40,8 +40,8 @@
   // }
 })
 
-const serverUrl = "http://58.118.225.79:41243" // 缇婁簲
-// const serverUrl = "http://192.168.20.10:7003"
+// const serverUrl = "http://58.118.225.79:41243" // 缇婁簲
+const serverUrl = "http://192.168.20.10:7003"
 
 module.exports = {
   pages,

--
Gitblit v1.8.0