From 0876e51d0f968ce38a048a78f9ebafcb8841f9bc Mon Sep 17 00:00:00 2001
From: hanbaoshan <hanbaoshan@aiotlink.com>
Date: 星期三, 29 七月 2020 20:49:22 +0800
Subject: [PATCH] 添加系统维护

---
 src/pages/settings/index/App.vue               |   11 
 src/pages/vindicate/index/App.vue              |  515 ++++++++++++++++++++++++++++++++++++++++++++++
 src/pages/vindicate/index/main.ts              |   13 +
 package.json                                   |    1 
 src/pages/settings/components/BasicSetting.vue |  112 +++-------
 5 files changed, 570 insertions(+), 82 deletions(-)

diff --git a/package.json b/package.json
index 73eb3ab..7266107 100644
--- a/package.json
+++ b/package.json
@@ -14,6 +14,7 @@
     "echarts": "^4.8.0",
     "element-ui": "^2.13.2",
     "less-loader": "^6.2.0",
+    "moment": "^2.27.0",
     "pug": "^3.0.0",
     "pug-plain-loader": "^1.0.0",
     "qs": "^6.9.4",
diff --git a/src/pages/settings/components/BasicSetting.vue b/src/pages/settings/components/BasicSetting.vue
index 5806be8..3562a61 100644
--- a/src/pages/settings/components/BasicSetting.vue
+++ b/src/pages/settings/components/BasicSetting.vue
@@ -5,6 +5,7 @@
       v-model="activeName"
       v-loading="loading"
       :element-loading-text="loadingText"
+      type="card"
     >
       <!-- 鏈満淇℃伅 -->
       <el-tab-pane label="鏈満淇℃伅" name="first">
@@ -17,6 +18,7 @@
           class="menu-css"
           @open="menuOpen"
           @close="menuClose"
+          
         >
           <!-- 鏈満淇℃伅 -->
           <el-submenu index="0">
@@ -351,34 +353,25 @@
         <cluster-management></cluster-management>
       </el-tab-pane>
       <el-tab-pane label="澶栭儴缃戠粶" name="fourth">
-        <el-row :gutter="20">
-          <el-col :span="10">
-            <div>
-              <div class="flex-box">
-                <div style="line-height:32px;">
-                  <el-radio v-model="ipServer.diyOrLocalIP" :label="1">璁剧疆澶栭儴IP</el-radio>
-                  <el-radio v-model="ipServer.diyOrLocalIP" :label="0">閫夌敤鏈満IP</el-radio>
-                </div>
-                <div class="ml10" style="width:205px;">
-                  <ip-input :ip="ipServer.ip" @on-blur="ipServer.ip = arguments[0]"></ip-input>
-                </div>
-              </div>
-              <div class="flex-box p5" >
-                <span style="line-height:32px;">鍩熷悕</span>
-                <div style="margin-left:14px;width:205px;">
-                  <el-input size="small" style v-model="ipServer.localhost"></el-input>
-                </div>
-              </div>
-              <div class="flex-box" >
-                <span style="line-height:32px;">鏈湴鏂囦欢绔彛</span>
-                <div style="margin-left:14px;width:205px;">
-                  <el-input size="small" style v-model="ipServer.localFilePort"></el-input>
-                </div>
-              </div>
-            </div>
-          </el-col>
-          <!-- <el-col :span="14">
-            <div>
+        <div class="flex-box">
+          <label>璁剧疆澶栭儴IP</label>
+          <div style="width:300px;">
+            <ip-input :ip="ipServer.ip" @on-blur="ipServer.ip = arguments[0]"></ip-input>
+          </div>
+          <el-checkbox label="閫夌敤鏈満IP" size="small" style="margin-left: 20px"></el-checkbox>
+        </div>
+        <div class="flex-box">
+          <label>鍩熷悕</label>
+          <el-input size="small"  v-model="ipServer.localhost"></el-input>
+        </div>
+        <div class="flex-box">
+          <label>鏈湴鏂囦欢绔彛</label>
+          <el-input size="small"  v-model="ipServer.localFilePort"></el-input>
+        </div>
+        <div class="mt15 save-btn" style="width:460px; margin-bottom:20px; float:left;">
+          <el-button type="primary" @click="submitResource" size="small">淇濆瓨</el-button>
+        </div>
+        <div>
               <el-table
                 :data="ipServer.fileTable"
                 border
@@ -416,11 +409,6 @@
                 </el-table-column>
               </el-table>
             </div>
-          </el-col>-->
-        </el-row>
-        <div class="mt15 save-btn" style="width:1000px;float:left;">
-          <el-button type="primary" @click="submitResource" size="small">淇濆瓨</el-button>
-        </div>
       </el-tab-pane>
       <el-tab-pane label="鏉冮檺绠$悊" name="user" >
         <authority-management v-if="activeName === 'user'"></authority-management>
@@ -1088,7 +1076,7 @@
   height: 100%;
   .el-form {
     width: 1000px;
-    margin-top: 30px;
+    
     // margin-left: -80px;
     .el-form-item {
       text-align: left;
@@ -1148,49 +1136,7 @@
     font-weight: 600;
     background-color: #e4e6ed;
   }
-  #e-basic-setting {
-    .el-tabs__header {
-      border: 0px solid #dcdfe6;
-      .el-tabs__item {
-        padding: 5px 50px;
-        height: 50px;
-        font-family: PingFangSC-Regular;
-        font-size: 14px;
-        color: #222222;
-        text-align: center;
-        border: 0px solid transparent;
-      }
-      .el-tabs__item:nth-child(2) {
-        padding-left: 50px;
-      }
-      .el-tabs__item:last-child {
-        padding-right: 50px;
-      }
-      .el-tabs__item.is-active {
-        color: #ff7733;
-        font-weight: bold;
-        // border-right-color: #fff;
-        // border-left-color: #fff;
-      }
-      .el-tabs__item:not(.is-disabled):hover {
-        color: #ff7733;
-      }
-    }
-    .el-tabs__active-bar {
-      background-color: #ff7733;
-    }
-    .xiangqin-label {
-      text-align: left;
-      width: 85px;
-      font-size: 14px;
-      line-height: 30px;
-    }
-    .xiangqing-info {
-      text-align: left;
-      font-size: 14px;
-      line-height: 30px;
-    }
-  }
+ 
 
   #cut_min_duration {
     .el-slider__bar {
@@ -1272,6 +1218,16 @@
 }
 </style>
 <style lang="scss" scoped>
+.flex-box{
+  display: flex;
+  height: 50px;
+  label{
+    width: 120px;
+  } 
+  .el-input{
+    width: 300px;
+  }
+}
 .menu-css,
 .el-menu {
   border-right: none;
@@ -1280,7 +1236,7 @@
   margin: 0;
   padding-left: 0;
   background-color: #ffffff;
-
+  
   .tree-font {
     font-family: PingFangSC-Medium;
     font-size: 14px;
diff --git a/src/pages/settings/index/App.vue b/src/pages/settings/index/App.vue
index 84c1bb0..e5a2172 100644
--- a/src/pages/settings/index/App.vue
+++ b/src/pages/settings/index/App.vue
@@ -74,7 +74,7 @@
   width: 100% !important;
   box-sizing: border-box;
   padding: 10px;
-  background-color: #e9ebf2;
+  background-color: #f8f9fb;
   .s-system-manage-breadcrumb {
     height: 5%;
     box-sizing: border-box;
@@ -107,7 +107,7 @@
       }
       .el-tabs__item.is-active {
         color: #3d68e1;
-        font-weight: bold;
+      
         // border-right-color: #fff;
         // border-left-color: #fff;
       }
@@ -116,12 +116,15 @@
       }
     }
   }
+  .el-tabs__header{
+    margin-bottom: 0;
+  }
   .el-tabs__content {
     height: calc(100% - 64px);
-    width: calc(100% - 20px);
     box-sizing: border-box;
     overflow-y: auto;
-    padding: 10px 40px !important;
+    padding: 20px 40px !important;
+    background: #fff;
     .el-tab-pane {
       width: 100%;
       .s-title {
diff --git a/src/pages/vindicate/index/App.vue b/src/pages/vindicate/index/App.vue
new file mode 100644
index 0000000..8ff9750
--- /dev/null
+++ b/src/pages/vindicate/index/App.vue
@@ -0,0 +1,515 @@
+<template>
+    <el-tabs
+      id="systemMaintenance"
+      v-model="activeName"
+      v-loading="loading"
+      :element-loading-text="loadingText"
+    >
+      <el-tab-pane label="璁惧缁存姢" name="first" >
+        <div class="s-system-maintenance">
+        <div class="box-card">
+          <div class="ui-top-view">
+            <div class="ui-top-title">閲嶅惎</div>
+          </div>
+          <el-divider></el-divider>
+
+          <div class="box-card-content">
+   
+              
+                <el-button type="primary" size="small" style="width:80px" @click="reboot">閲嶅惎</el-button>
+        
+              
+                <b class="card-text">閲嶅惎鑺傜偣</b>
+           
+      
+            <el-row style="margin-top:20px">
+              <el-col>
+                <vue-cron :expression="rebootCron" @update="setRebootCron" />
+              </el-col>
+            </el-row>
+          </div>
+        </div>
+        <!--
+        <div class="box-card">
+          <div class="ui-top-view">
+            <div class="ui-top-title">鎭㈠榛樿鍊�</div>
+          </div>
+          <el-divider></el-divider>
+
+          <div class="box-card-content">
+            <el-row>
+              <el-col :span="1">
+                <el-button type="primary" size="small">绠�鍗曟仮澶�</el-button>
+              </el-col>
+              <el-col :span="23">
+                <b class="card-text">绠�鍗曟仮澶嶈澶囧弬鏁�</b>
+              </el-col>
+            </el-row>
+            <el-row style="margin-top:20px">
+              <el-col :span="1">
+                <el-button type="primary" size="small">瀹屽叏鎭㈠</el-button>
+              </el-col>
+              <el-col :span="23">
+                <b class="card-text">瀹屽叏鎭㈠璁惧鍙傛暟鍒板嚭鍘傝缃�</b>
+              </el-col>
+            </el-row>
+          </div>
+        </div>
+        
+        <div class="box-card">
+          <div class="ui-top-view">
+            <div class="ui-top-title">鍙傛暟瀵煎叆瀵煎嚭</div>
+          </div>
+          <el-divider></el-divider>
+
+          <div class="box-card-content">
+            <el-row :gutter="4">
+              <el-col :span="1">
+                <el-button type="info" size="small" style="width:80px">瀵煎叆</el-button>
+              </el-col>
+              <el-col :span="3" style="padding-left:30px">
+                <el-input placeholder="涓婁紶鍙傛暟鏂囦欢" size="small" :readonly="true">
+                  <el-upload slot="suffix" action="https://jsonplaceholder.typicode.com/posts/">
+                    <el-button
+                      type="text"
+                      icon="el-icon-upload2"
+                      size="small"
+                      style="font-size:18px; color:#0088ff"
+                    ></el-button>
+                  </el-upload>
+                </el-input>
+              </el-col>
+            </el-row>
+            <el-row style="margin-top:20px">
+              <el-col :span="1">
+                <el-button type="primary" size="small">璁惧鍙傛暟</el-button>
+              </el-col>
+              <el-col :span="23">
+                <b class="card-text">鍙傛暟瀵煎嚭</b>
+              </el-col>
+            </el-row>
+          </div>
+        </div>
+        -->
+        <div class="box-card">
+          <div class="ui-top-view">
+            <div class="ui-top-title">鍗囩骇</div>
+          </div>
+        </div>
+        <el-divider></el-divider>
+        <div class="box-card-content">
+          <el-row :gutter="4">
+            <el-col :span="6">
+              <file-uploader
+                single
+                uploadPlaceholder="涓婁紶鍗囩骇鏂囦欢"
+                url="/data/api-v/sysset/patchUpdate"
+                @complete="onFileUpload"
+                @file-added="onFileAdded"
+              />
+            </el-col>
+            <el-col :span="2">
+              <el-button
+                type="primary"
+                size="small"
+                style="width:80px"
+                @click="upgrade"
+                :disabled="!fileAdded"
+                :loading="upgrading"
+              >鍗囩骇</el-button>
+            </el-col>
+            <el-col :span="16" class="upload-msg">
+              <span v-html="patchUpdateStatus"></span>
+            </el-col>
+          </el-row>
+        </div>
+      </div>
+      </el-tab-pane>
+      <el-tab-pane label="鏁版嵁搴撶淮鎶�" name="second" >
+        <div class="box"> 
+          <p class="title">
+            <label>鏁版嵁娓呯悊</label>
+          </p>  
+          <div class="range">
+            <div class="left">
+              <p>閫夋嫨鏁版嵁鑼冨洿锛�</p>
+            </div>  
+            <div class="middle">
+              <el-date-picker
+                v-model="dataRange"
+                type="daterange"
+                range-separator="鑷�"
+                start-placeholder="寮�濮嬫棩鏈�"
+                end-placeholder="缁撴潫鏃ユ湡"
+                style="height:38px"
+                :picker-options="pickerOptions"
+              ></el-date-picker>
+            </div>
+            <div class="right">
+              <el-button @click="deleteData" style="height:38px;background:#ff0000;color:white">鍒犻櫎鏁版嵁</el-button>
+            </div>  
+          </div>  
+          <div class="tip">
+            <i class="iconfont icontishi-zhuyi"></i>
+            <p class="zhuyi">璇锋敞鎰忥紝鎸変互涓婃棩鏈熻寖鍥村垹闄ょ殑鏁版嵁涓嶅彲鎭㈠锛岀珛鍗崇敓鏁堬紝璇疯皑鎱庢搷浣�</p>
+          </div>  
+        </div>  
+      </el-tab-pane>  
+    </el-tabs>  
+
+</template>
+
+<script>
+import { rebootServer, getDevInfo, getRebootTask, setRebootTask, fileUpload, doUpgrade,deleteDate } from "@/api/system"
+import VueCron from "@/components/subComponents/VueCron"
+import FileUploader from "@/components/subComponents/FileUpload/index"
+
+export default {
+  components: {
+    VueCron,
+    FileUploader
+  },
+  data() {
+    return {
+      timer: null,
+      buttonAuthority: sessionStorage.getItem("buttonAuthoritys") || [],
+      rebootCron: "",
+      activeName: "first",
+      restartValue: "涓嶉噸鍚�",
+      restartTimeValue: new Date(2019, 9, 10, 18, 40),
+      loading: false,
+      loadingText: '',
+      probeSum: 0,
+      patchUpdateStatus: "",
+      dataRange: [
+        this.$moment().format("YYYY-MM-DD HH:mm:ss"),
+        this.$moment().format("YYYY-MM-DD HH:mm:ss")
+      ],
+      fileUploadUrl: fileUpload,
+      patchFile: {},
+      pickerOptions: {
+        disabledDate(time) {
+          var day = new Date()
+          day.setTime(day.getTime() - 24 * 60 * 60 * 1000)
+          return time.getTime() > day;
+        },
+      },
+      upgrading: false,
+      fileAdded: false
+    };
+  },
+  mounted() {
+    this.getRebootCron()
+    if (!this.isShow('videoSystem:sysManage:sysfix')) {
+      console.log("榛樿鏄剧ず鏁版嵁搴撶淮鎶�")
+      this.activeName = "second"
+    }
+  },
+  computed: {
+    isAdmin() {
+      if (
+        sessionStorage.getItem('userInfo') &&
+        sessionStorage.getItem('userInfo') !== ''
+      ) {
+        let loginName = JSON.parse(sessionStorage.getItem('userInfo')).username
+        return (
+          loginName === 'superadmin' || loginName === 'basic'
+        )
+      }
+      return false;
+    }
+  },
+  methods: {
+    isShow (authority) {
+      if (this.isAdmin) {
+        return true
+      } else if (
+        this.buttonAuthority.indexOf(',' + authority + ',') > -1
+      ) {
+        return true
+      } else {
+        return false
+      }
+    },
+    format(array) {
+      return [
+        this.$moment(array[0]).format("YYYY-MM-DD"),
+        this.$moment(array[1]).format("YYYY-MM-DD")
+      ];
+    },
+    getRebootCron() {
+      getRebootTask().then(rsp => {
+        this.rebootCron = rsp.data
+      })
+    },
+    setRebootCron(value) {
+      this.rebootCron = value
+      setRebootTask({ task: value }).then(rsp => {
+        if (rsp && rsp.success) {
+          this.$notify({
+            type: "success",
+            message: "閰嶇疆鎴愬姛"
+          })
+        }
+      }).catch(err => {
+        this.$notify({
+          type: "error",
+          message: "閰嶇疆澶辫触"
+        })
+      })
+    },
+    reboot() {
+      this.$confirm('纭畾瑕侀噸鍚鑺傜偣鍚�?', {
+        center: true,
+        cancelButtonClass: 'comfirm-class-cancle',
+        confirmButtonClass: 'comfirm-class-sure'
+      }).then(() => {
+        this.loading = true;
+        this.loadingText = "鏅鸿兘璁$畻鑺傜偣姝e湪閲嶅惎锛岃鑰愬績绛夊緟..."
+        rebootServer().then(rsp => {
+          this.probeServer(this.reLogin)
+        }).catch(err => {
+          if (err.status == 400) {
+            this.loading = false;
+            this.$notify({
+              type: "error",
+              message: "閲嶅惎璁$畻鑺傜偣澶辫触"
+            })
+          } else {
+            this.probeServer(this.reLogin)
+          }
+        })
+      })
+    },
+    deleteData() {
+      var timeRange = this.format(this.dataRange);
+      var showStartTime = timeRange[0]
+      var showEndTime = timeRange[1]
+      console.log("鏃堕棿锛�",showStartTime,showEndTime)
+      this.$confirm("鎻愮ず锛�"+showStartTime+" 鑷� "+showEndTime+" 浜х敓鐨勫叏閮ㄦ暟鎹皢琚垹闄わ紝姝ゆ搷浣滅珛鍗崇敓鏁堬紝涓嶅彲鎭㈠锛屾槸鍚﹀垹闄わ紵", {
+        center: true,
+        cancelButtonClass: "comfirm-class-cancle",
+        confirmButtonClass: "comfirm-class-sure"
+      }).then(() => {
+        this.loading = true
+        this.loadingText = "姝e湪鍒犻櫎鏁版嵁锛岃绋嶅�欙紒"
+        var param = {
+          startTime: showStartTime,
+          endTime: showEndTime
+        }
+        deleteDate(param).then(resp => {
+          if (resp.success) {
+            this.$message({
+              type: "success",
+              message: "鍒犻櫎鏁版嵁鎴愬姛"
+            })
+            this.loading = false
+          }
+        }).catch(err => {
+          this.$message({
+            type: "error",
+            message: "鍒犻櫎鏁版嵁澶辫触锛�"
+          })
+          this.loading = false
+        })
+
+      }).catch(() => {
+        console.log("鍙栨秷浜嗭紒")
+      })
+    },
+    reLogin() {
+      this.$router.push("/")
+    },
+    probeServer(callback) {
+      this.probeSum++;
+      let _this = this
+      if (this.probeSum > 60) {
+        this.$confirm('杩炴帴鏈嶅姟鍣ㄥけ璐�, 璇峰埛鏂伴〉闈㈡垨鑱旂郴绠$悊鍛�', '澶辫触', {
+          type: 'error',
+          cancelButtonClass: 'comfirm-class-cancle',
+          confirmButtonClass: 'comfirm-class-sure'
+        }).then(() => {
+          // _this.$router.push("/")
+          callback()
+        })
+        return
+      }
+
+      this.timer = setTimeout(() => {
+        getDevInfo().then(() => {
+          // _this.$router.push("/")
+          callback()
+        }).catch(err => {
+          _this.probeServer(callback)
+        })
+      }, 10000)
+    },
+    onFileUpload(file) {
+      this.patchUpdateStatus = `<span style="color:green">涓婁紶鎴愬姛, 鐐瑰嚮鍗囩骇鎸夐挳寮�濮嬪崌绾�</span>`
+      this.patchFile = { ...file }
+      this.fileAdded = true
+    },
+    onFileAdded() {
+      this.patchUpdateStatus = ""
+    },
+    upgrade() {
+      this.upgrading = true
+      this.patchUpdateStatus = `<span style="color:red">姝e湪鍗囩骇...</span>`
+      doUpgrade(this.patchFile).then(rsp => {
+        this.upgrading = false
+
+        if (rsp && rsp.success) {
+          clearTimeout(this.timer)
+          this.doneUpgrade()
+        }
+      }).catch(err => {
+        if (err.code) {
+          this.upgrading = false
+          this.patchUpdateStatus = `<span style="color:red">${err.data}</span>`
+          clearTimeout(this.timer)
+        } else {
+          this.probeServer(this.doneUpgrade)
+        }
+      })
+    },
+    doneUpgrade() {
+      this.upgrading = false
+      this.patchUpdateStatus = `<span style="color:green">鍗囩骇鎴愬姛</span>`
+      let _this = this
+      this.$confirm('鍗囩骇鎴愬姛, 璇烽噸鏂扮櫥褰曠郴缁�', '鎴愬姛', {
+        type: 'success',
+        cancelButtonClass: 'comfirm-class-cancle',
+        confirmButtonClass: 'comfirm-class-sure'
+      }).then(() => {
+        _this.reLogin()
+      })
+    }
+  }
+};
+</script>
+<style lang="scss">
+.s-system-maintenance {
+  width: 100%;
+  height: 100%;
+  .box-card {
+    text-align: left;
+    height: auto;
+    margin: 10px 0px;
+    .box-card-content {
+      padding-bottom: 40px;
+      .card-text {
+        padding: 0 30px;
+        line-height: 32px;
+      }
+    }
+  }
+
+  .upload-icon {
+    font-size: 18px;
+    color: #0088ff;
+  }
+  .upload-msg {
+    padding-left: 10px;
+    text-align: left;
+    span {
+      line-height: 32px;
+      font-size: 13px;
+    }
+  }
+}
+.box{
+  width: 50%;
+  min-width: 700px;
+  height: 270px;
+  border: 1px solid #eee;
+  .title {
+    font-size:20px;
+    font-weight: bold;
+    text-align: left;
+    padding: 20px;
+    border-bottom: 1px solid #eee;
+  }
+  .range {
+    width: 100%;
+    padding-top: 30px;
+    height: 38px;
+    .left {
+      width: 120px;
+      float: left;
+      text-align: right;
+      font-size: 14px;
+      p {
+        height: 38px;
+        line-height: 38px;
+        margin: 0;
+      }
+    }
+    .middle {
+      width: 50%;
+      min-width: 400px;
+      height: 38px;
+      float: left;
+    }
+    .right {
+      width: 20%;
+      height: 38px;
+      float: left;
+    }
+  }
+  .tip {
+    width: 100%;
+    padding: 30px 0px 0px 30px;
+    height: 34px;
+
+    .zhuyi {
+      font-size: 14px;
+      height: 34px;
+      line-height: 34px;
+      margin-left: 20px;
+      float: left;
+    }
+    i {
+      font-size: 32px;
+      color: #e99038;
+      float: left;
+    }
+  }
+}
+#systemMaintenance{
+
+  .el-tabs__header {
+      border: 0px solid #dcdfe6;
+      .el-tabs__item {
+        padding: 5px 50px;
+        height: 50px;
+        font-family: PingFangSC-Regular;
+        font-size: 14px;
+        color: #222222;
+        text-align: center;
+        border: 0px solid transparent;
+      }
+      .el-tabs__item:nth-child(2) {
+        padding-left: 50px;
+      }
+      .el-tabs__item:last-child {
+        padding-right: 50px;
+      }
+      .el-tabs__item.is-active {
+        color: #ff7733;
+        font-weight: bold;
+        // border-right-color: #fff;
+        // border-left-color: #fff;
+      }
+      .el-tabs__item:not(.is-disabled):hover {
+        color: #ff7733;
+      }
+      
+  }
+  .el-tabs__active-bar {
+    background-color: #ff7733;
+  }
+  .el-tabs__content {
+    padding-left: 15px !important;
+  }
+}
+</style>
diff --git a/src/pages/vindicate/index/main.ts b/src/pages/vindicate/index/main.ts
new file mode 100644
index 0000000..4ccbf7e
--- /dev/null
+++ b/src/pages/vindicate/index/main.ts
@@ -0,0 +1,13 @@
+import Vue from 'vue'
+import ElementUI from 'element-ui'
+import 'element-ui/lib/theme-chalk/index.css'
+import moment from 'moment';
+import App from './App.vue'
+
+Vue.use(ElementUI)
+Vue.prototype.$moment = moment;
+
+new Vue({
+  el: '#app',
+  render: h => h(App)
+})
\ No newline at end of file

--
Gitblit v1.8.0