<template> 
 | 
  <div id="addlatform" v-loading="isLoging"> 
 | 
    <el-dialog 
 | 
      title="添加平台" 
 | 
      width="70%" 
 | 
      top="2rem" 
 | 
      :close-on-click-modal="false" 
 | 
      :visible.sync="showDialog" 
 | 
      :destroy-on-close="true" 
 | 
      @close="close()" 
 | 
    > 
 | 
      <div id="shared" style="text-align: right; margin-top: 1rem"> 
 | 
        <el-row :gutter="24"> 
 | 
          <el-col :span="11"> 
 | 
            <el-form ref="platform1" :rules="rules" :model="platform" label-width="160px"> 
 | 
              <el-form-item label="名称" prop="name"> 
 | 
                <el-input v-model="platform.name"></el-input> 
 | 
              </el-form-item> 
 | 
              <el-form-item label="SIP服务国标编码" prop="serverGBId"> 
 | 
                <el-input v-model="platform.serverGBId" clearable @input="serverGBIdChange"></el-input> 
 | 
              </el-form-item> 
 | 
              <el-form-item label="SIP服务国标域" prop="serverGBDomain"> 
 | 
                <el-input v-model="platform.serverGBDomain" clearable></el-input> 
 | 
              </el-form-item> 
 | 
              <el-form-item label="SIP服务IP" prop="serverIP"> 
 | 
                <el-input v-model="platform.serverIP" clearable></el-input> 
 | 
              </el-form-item> 
 | 
              <el-form-item label="SIP服务端口" prop="serverPort"> 
 | 
                <el-input v-model="platform.serverPort" clearable type="number"></el-input> 
 | 
              </el-form-item> 
 | 
              <el-form-item label="设备国标编号" prop="deviceGBId"> 
 | 
                <el-input v-model="platform.deviceGBId" clearable @input="deviceGBIdChange"></el-input> 
 | 
              </el-form-item> 
 | 
              <el-form-item label="本地IP" prop="deviceIp"> 
 | 
                <el-input v-model="platform.deviceIp" :disabled="true"></el-input> 
 | 
              </el-form-item> 
 | 
              <el-form-item label="本地端口" prop="devicePort"> 
 | 
                <el-input v-model="platform.devicePort" :disabled="true" type="number"></el-input> 
 | 
              </el-form-item> 
 | 
              <el-form-item label="SIP认证用户名" prop="username"> 
 | 
                <el-input v-model="platform.username"></el-input> 
 | 
              </el-form-item> 
 | 
            </el-form> 
 | 
          </el-col> 
 | 
          <el-col :span="12"> 
 | 
            <el-form ref="platform2" :rules="rules" :model="platform" label-width="160px"> 
 | 
              <el-form-item label="行政区划" prop="administrativeDivision"> 
 | 
                <el-input v-model="platform.administrativeDivision" clearable></el-input> 
 | 
              </el-form-item> 
 | 
              <el-form-item label="SIP认证密码" prop="password"> 
 | 
                <el-input v-model="platform.password" ></el-input> 
 | 
              </el-form-item> 
 | 
              <el-form-item label="注册周期(秒)" prop="expires"> 
 | 
                <el-input v-model="platform.expires"></el-input> 
 | 
              </el-form-item> 
 | 
              <el-form-item label="心跳周期(秒)" prop="keepTimeout"> 
 | 
                <el-input v-model="platform.keepTimeout"></el-input> 
 | 
              </el-form-item> 
 | 
              <el-form-item label="信令传输" prop="transport"> 
 | 
                <el-select 
 | 
                  v-model="platform.transport" 
 | 
                  style="width: 100%" 
 | 
                  placeholder="请选择信令传输方式" 
 | 
                > 
 | 
                  <el-option label="UDP" value="UDP"></el-option> 
 | 
                  <el-option label="TCP" value="TCP"></el-option> 
 | 
                </el-select> 
 | 
              </el-form-item> 
 | 
              <el-form-item label="目录分组" prop="catalogGroup"> 
 | 
                <el-select 
 | 
                  v-model="platform.catalogGroup" 
 | 
                  style="width: 100%" 
 | 
                  placeholder="请选择目录分组" 
 | 
                > 
 | 
                  <el-option label="1" value="1"></el-option> 
 | 
                  <el-option label="2" value="2"></el-option> 
 | 
                  <el-option label="4" value="4"></el-option> 
 | 
                  <el-option label="8" value="8"></el-option> 
 | 
                </el-select> 
 | 
              </el-form-item> 
 | 
              <el-form-item label="字符集" prop="characterSet"> 
 | 
                <el-select 
 | 
                  v-model="platform.characterSet" 
 | 
                  style="width: 100%" 
 | 
                  placeholder="请选择字符集" 
 | 
                > 
 | 
                  <el-option label="GB2312" value="GB2312"></el-option> 
 | 
                  <el-option label="UTF-8" value="UTF-8"></el-option> 
 | 
                </el-select> 
 | 
              </el-form-item> 
 | 
              <el-form-item label="其他选项"> 
 | 
                <el-checkbox label="启用" v-model="platform.enable" @change="checkExpires"></el-checkbox> 
 | 
<!--                <el-checkbox label="云台控制" v-model="platform.ptz"></el-checkbox>--> 
 | 
                <el-checkbox label="拉起推流" v-model="platform.startOfflinePush"></el-checkbox> 
 | 
                <el-checkbox label="RTCP保活" v-model="platform.rtcp" @change="rtcpCheckBoxChange"></el-checkbox> 
 | 
                <el-checkbox label="消息通道" v-model="platform.asMessageChannel" ></el-checkbox> 
 | 
                <el-checkbox label="推送通道" v-model="platform.autoPushChannel" ></el-checkbox> 
 | 
              </el-form-item> 
 | 
              <el-form-item> 
 | 
                <el-button type="primary" @click="onSubmit">{{ 
 | 
                  onSubmit_text 
 | 
                }}</el-button> 
 | 
                <el-button @click="close">取消</el-button> 
 | 
              </el-form-item> 
 | 
            </el-form> 
 | 
          </el-col> 
 | 
        </el-row> 
 | 
      </div> 
 | 
    </el-dialog> 
 | 
  </div> 
 | 
</template> 
 | 
  
 | 
<script> 
 | 
export default { 
 | 
  name: "platformEdit", 
 | 
  props: {}, 
 | 
  computed: {}, 
 | 
  data() { 
 | 
    var deviceGBIdRules = async (rule, value, callback) => { 
 | 
      console.log(value); 
 | 
      if (value === "") { 
 | 
        callback(new Error("请输入设备国标编号")); 
 | 
      } else { 
 | 
        var exit = await this.deviceGBIdExit(value); 
 | 
        if (exit) { 
 | 
          callback(new Error("设备国标编号已存在")); 
 | 
        } else { 
 | 
          callback(); 
 | 
        } 
 | 
      } 
 | 
    }; 
 | 
    return { 
 | 
      listChangeCallback: null, 
 | 
      showDialog: false, 
 | 
      isLoging: false, 
 | 
      onSubmit_text: "立即创建", 
 | 
      saveUrl: "/api/platform/save", 
 | 
  
 | 
      platform: { 
 | 
        id: null, 
 | 
        enable: true, 
 | 
        ptz: true, 
 | 
        rtcp: false, 
 | 
        asMessageChannel: false, 
 | 
        autoPushChannel: false, 
 | 
        name: null, 
 | 
        serverGBId: null, 
 | 
        serverGBDomain: null, 
 | 
        serverIP: null, 
 | 
        serverPort: null, 
 | 
        deviceGBId: null, 
 | 
        deviceIp: null, 
 | 
        devicePort: null, 
 | 
        username: null, 
 | 
        password: null, 
 | 
        expires: 3600, 
 | 
        keepTimeout: 60, 
 | 
        transport: "UDP", 
 | 
        characterSet: "GB2312", 
 | 
        startOfflinePush: false, 
 | 
        catalogGroup: 1, 
 | 
        administrativeDivision: null, 
 | 
      }, 
 | 
      rules: { 
 | 
        name: [{ required: true, message: "请输入平台名称", trigger: "blur" }], 
 | 
        serverGBId: [ 
 | 
          { required: true, message: "请输入SIP服务国标编码", trigger: "blur" }, 
 | 
        ], 
 | 
        serverGBDomain: [ 
 | 
          { required: true, message: "请输入SIP服务国标域", trigger: "blur" }, 
 | 
        ], 
 | 
        serverIP: [{ required: true, message: "请输入SIP服务IP", trigger: "blur" }], 
 | 
        serverPort: [{ required: true, message: "请输入SIP服务端口", trigger: "blur" }], 
 | 
        deviceGBId: [{ validator: deviceGBIdRules, trigger: "blur" }], 
 | 
        username: [{ required: false, message: "请输入SIP认证用户名", trigger: "blur" }], 
 | 
        password: [{ required: false, message: "请输入SIP认证密码", trigger: "blur" }], 
 | 
        expires: [{ required: true, message: "请输入注册周期", trigger: "blur" }], 
 | 
        keepTimeout: [{ required: true, message: "请输入心跳周期", trigger: "blur" }], 
 | 
        transport: [{ required: true, message: "请选择信令传输", trigger: "blur" }], 
 | 
        characterSet: [{ required: true, message: "请选择编码字符集", trigger: "blur" }], 
 | 
      }, 
 | 
    }; 
 | 
  }, 
 | 
  methods: { 
 | 
    openDialog: function (platform, callback) { 
 | 
      var that = this; 
 | 
      if (platform == null) { 
 | 
        this.onSubmit_text = "立即创建"; 
 | 
        this.saveUrl = "/api/platform/add"; 
 | 
        this.$axios({ 
 | 
          method: 'get', 
 | 
          url:`/api/platform/server_config` 
 | 
        }).then(function (res) { 
 | 
          console.log(res); 
 | 
          if (res.data.code === 0) { 
 | 
            that.platform.deviceGBId = res.data.data.username; 
 | 
            that.platform.deviceIp = res.data.data.deviceIp; 
 | 
            that.platform.devicePort = res.data.data.devicePort; 
 | 
            that.platform.username = res.data.data.username; 
 | 
            that.platform.password = res.data.data.password; 
 | 
            that.platform.administrativeDivision = res.data.data.username.substr(0, 6); 
 | 
          } 
 | 
  
 | 
        }).catch(function (error) { 
 | 
          console.log(error); 
 | 
        }); 
 | 
      }else { 
 | 
        this.platform.id = platform.id; 
 | 
        this.platform.enable = platform.enable; 
 | 
        this.platform.ptz = platform.ptz; 
 | 
        this.platform.rtcp = platform.rtcp; 
 | 
        this.platform.asMessageChannel = platform.asMessageChannel; 
 | 
        this.platform.autoPushChannel = platform.autoPushChannel; 
 | 
        this.platform.name = platform.name; 
 | 
        this.platform.serverGBId = platform.serverGBId; 
 | 
        this.platform.serverGBDomain = platform.serverGBDomain; 
 | 
        this.platform.serverIP = platform.serverIP; 
 | 
        this.platform.serverPort = platform.serverPort; 
 | 
        this.platform.deviceGBId = platform.deviceGBId; 
 | 
        this.platform.deviceIp = platform.deviceIp; 
 | 
        this.platform.devicePort = platform.devicePort; 
 | 
        this.platform.username = platform.username; 
 | 
        this.platform.password = platform.password; 
 | 
        this.platform.expires = platform.expires; 
 | 
        this.platform.keepTimeout = platform.keepTimeout; 
 | 
        this.platform.transport = platform.transport; 
 | 
        this.platform.characterSet = platform.characterSet; 
 | 
        this.platform.catalogId = platform.catalogId; 
 | 
        this.platform.startOfflinePush = platform.startOfflinePush; 
 | 
        this.platform.catalogGroup = platform.catalogGroup; 
 | 
        this.platform.administrativeDivision = platform.administrativeDivision; 
 | 
        this.onSubmit_text = "保存"; 
 | 
        this.saveUrl = "/api/platform/save"; 
 | 
      } 
 | 
      this.showDialog = true; 
 | 
      this.listChangeCallback = callback; 
 | 
    }, 
 | 
    serverGBIdChange: function () { 
 | 
      if (this.platform.serverGBId.length > 10) { 
 | 
        this.platform.serverGBDomain = this.platform.serverGBId.substr(0, 10); 
 | 
      } 
 | 
    }, 
 | 
    deviceGBIdChange: function () { 
 | 
  
 | 
      this.platform.username = this.platform.deviceGBId ; 
 | 
      if (this.platform.administrativeDivision == null) { 
 | 
        this.platform.administrativeDivision = this.platform.deviceGBId.substr(0, 6); 
 | 
      } 
 | 
    }, 
 | 
    onSubmit: function () { 
 | 
      this.saveForm() 
 | 
    }, 
 | 
    saveForm: function (){ 
 | 
      this.$axios({ 
 | 
        method: 'post', 
 | 
        url: this.saveUrl, 
 | 
        data: this.platform 
 | 
      }).then((res) =>{ 
 | 
        if (res.data.code === 0) { 
 | 
          this.$message({ 
 | 
            showClose: true, 
 | 
            message: "保存成功", 
 | 
            type: "success", 
 | 
          }); 
 | 
          this.showDialog = false; 
 | 
          if (this.listChangeCallback != null) { 
 | 
            this.listChangeCallback(); 
 | 
          } 
 | 
        }else { 
 | 
          this.$message({ 
 | 
            showClose: true, 
 | 
            message: res.data.msg, 
 | 
            type: "error", 
 | 
          }); 
 | 
        } 
 | 
      }).catch((error)=> { 
 | 
        console.log(error); 
 | 
      }); 
 | 
    }, 
 | 
    close: function () { 
 | 
      this.showDialog = false; 
 | 
      this.$refs.platform1.resetFields(); 
 | 
      this.$refs.platform2.resetFields(); 
 | 
      this.platform = { 
 | 
        id: null, 
 | 
        enable: true, 
 | 
        ptz: true, 
 | 
        rtcp: false, 
 | 
        asMessageChannel: false, 
 | 
        autoPushChannel: false, 
 | 
        name: null, 
 | 
        serverGBId: null, 
 | 
        administrativeDivision: null, 
 | 
        serverGBDomain: null, 
 | 
        serverIP: null, 
 | 
        serverPort: null, 
 | 
        deviceGBId: null, 
 | 
        deviceIp: null, 
 | 
        devicePort: null, 
 | 
        username: null, 
 | 
        password: null, 
 | 
        expires: 3600, 
 | 
        keepTimeout: 60, 
 | 
        transport: "UDP", 
 | 
        characterSet: "GB2312", 
 | 
        startOfflinePush: false, 
 | 
        catalogGroup: 1, 
 | 
      } 
 | 
    }, 
 | 
    deviceGBIdExit: async function (deviceGbId) { 
 | 
      var result = false; 
 | 
      var that = this; 
 | 
      await that.$axios({ 
 | 
                method: 'get', 
 | 
                url:`/api/platform/exit/${deviceGbId}`}) 
 | 
        .then(function (res) { 
 | 
            if (res.data.code === 0) { 
 | 
              result = res.data.data; 
 | 
            } 
 | 
        }) 
 | 
        .catch(function (error) { 
 | 
          console.log(error); 
 | 
        }); 
 | 
      return result; 
 | 
    }, 
 | 
    checkExpires: function() { 
 | 
      if (this.platform.enable && this.platform.expires === "0") { 
 | 
        this.platform.expires = "3600"; 
 | 
      } 
 | 
    }, 
 | 
    rtcpCheckBoxChange: function (result){ 
 | 
      if (result) { 
 | 
        this.$message({ 
 | 
          showClose: true, 
 | 
          message: "开启RTCP保活需要上级平台支持,可以避免无效推流", 
 | 
          type: "warning", 
 | 
        }); 
 | 
      } 
 | 
    }, 
 | 
  }, 
 | 
}; 
 | 
</script> 
 | 
  
 | 
<style> 
 | 
/* 谷歌 */ 
 | 
input::-webkit-outer-spin-button, 
 | 
input::-webkit-inner-spin-button { 
 | 
  -webkit-appearance: none; 
 | 
  appearance: none; 
 | 
  margin: 0; 
 | 
} 
 | 
/* 火狐 */ 
 | 
input{ 
 | 
  -moz-appearance:textfield; 
 | 
} 
 | 
.control-wrapper-not-used { 
 | 
  position: relative; 
 | 
  width: 6.25rem; 
 | 
  height: 6.25rem; 
 | 
  max-width: 6.25rem; 
 | 
  max-height: 6.25rem; 
 | 
  border-radius: 100%; 
 | 
  margin-top: 2.5rem; 
 | 
  margin-left: 0.5rem; 
 | 
  float: left; 
 | 
} 
 | 
  
 | 
.control-panel { 
 | 
  position: relative; 
 | 
  top: 0; 
 | 
  left: 5rem; 
 | 
  height: 11rem; 
 | 
  max-height: 11rem; 
 | 
} 
 | 
  
 | 
.control-btn { 
 | 
  display: flex; 
 | 
  justify-content: center; 
 | 
  position: absolute; 
 | 
  width: 44%; 
 | 
  height: 44%; 
 | 
  border-radius: 5px; 
 | 
  border: 1px solid #78aee4; 
 | 
  box-sizing: border-box; 
 | 
  transition: all 0.3s linear; 
 | 
} 
 | 
  
 | 
.control-btn i { 
 | 
  font-size: 20px; 
 | 
  color: #78aee4; 
 | 
  display: flex; 
 | 
  justify-content: center; 
 | 
  align-items: center; 
 | 
} 
 | 
  
 | 
.control-round { 
 | 
  position: absolute; 
 | 
  top: 21%; 
 | 
  left: 21%; 
 | 
  width: 58%; 
 | 
  height: 58%; 
 | 
  background: #fff; 
 | 
  border-radius: 100%; 
 | 
} 
 | 
  
 | 
.control-round-inner { 
 | 
  position: absolute; 
 | 
  left: 13%; 
 | 
  top: 13%; 
 | 
  display: flex; 
 | 
  justify-content: center; 
 | 
  align-items: center; 
 | 
  width: 70%; 
 | 
  height: 70%; 
 | 
  font-size: 40px; 
 | 
  color: #78aee4; 
 | 
  border: 1px solid #78aee4; 
 | 
  border-radius: 100%; 
 | 
  transition: all 0.3s linear; 
 | 
} 
 | 
  
 | 
.control-inner-btn { 
 | 
  position: absolute; 
 | 
  width: 60%; 
 | 
  height: 60%; 
 | 
  background: #fafafa; 
 | 
} 
 | 
  
 | 
.control-top { 
 | 
  top: -8%; 
 | 
  left: 27%; 
 | 
  transform: rotate(-45deg); 
 | 
  border-radius: 5px 100% 5px 0; 
 | 
} 
 | 
  
 | 
.control-top i { 
 | 
  transform: rotate(45deg); 
 | 
  border-radius: 5px 100% 5px 0; 
 | 
} 
 | 
  
 | 
.control-top .control-inner { 
 | 
  left: -1px; 
 | 
  bottom: 0; 
 | 
  border-top: 1px solid #78aee4; 
 | 
  border-right: 1px solid #78aee4; 
 | 
  border-radius: 0 100% 0 0; 
 | 
} 
 | 
  
 | 
.control-top .fa { 
 | 
  transform: rotate(45deg) translateY(-7px); 
 | 
} 
 | 
  
 | 
.control-left { 
 | 
  top: 27%; 
 | 
  left: -8%; 
 | 
  transform: rotate(45deg); 
 | 
  border-radius: 5px 0 5px 100%; 
 | 
} 
 | 
  
 | 
.control-left i { 
 | 
  transform: rotate(-45deg); 
 | 
} 
 | 
  
 | 
.control-left .control-inner { 
 | 
  right: -1px; 
 | 
  top: -1px; 
 | 
  border-bottom: 1px solid #78aee4; 
 | 
  border-left: 1px solid #78aee4; 
 | 
  border-radius: 0 0 0 100%; 
 | 
} 
 | 
  
 | 
.control-left .fa { 
 | 
  transform: rotate(-45deg) translateX(-7px); 
 | 
} 
 | 
  
 | 
.control-right { 
 | 
  top: 27%; 
 | 
  right: -8%; 
 | 
  transform: rotate(45deg); 
 | 
  border-radius: 5px 100% 5px 0; 
 | 
} 
 | 
  
 | 
.control-right i { 
 | 
  transform: rotate(-45deg); 
 | 
} 
 | 
  
 | 
.control-right .control-inner { 
 | 
  left: -1px; 
 | 
  bottom: -1px; 
 | 
  border-top: 1px solid #78aee4; 
 | 
  border-right: 1px solid #78aee4; 
 | 
  border-radius: 0 100% 0 0; 
 | 
} 
 | 
  
 | 
.control-right .fa { 
 | 
  transform: rotate(-45deg) translateX(7px); 
 | 
} 
 | 
  
 | 
.control-bottom { 
 | 
  left: 27%; 
 | 
  bottom: -8%; 
 | 
  transform: rotate(45deg); 
 | 
  border-radius: 0 5px 100% 5px; 
 | 
} 
 | 
  
 | 
.control-bottom i { 
 | 
  transform: rotate(-45deg); 
 | 
} 
 | 
  
 | 
.control-bottom .control-inner { 
 | 
  top: -1px; 
 | 
  left: -1px; 
 | 
  border-bottom: 1px solid #78aee4; 
 | 
  border-right: 1px solid #78aee4; 
 | 
  border-radius: 0 0 100% 0; 
 | 
} 
 | 
  
 | 
.control-bottom .fa { 
 | 
  transform: rotate(-45deg) translateY(7px); 
 | 
} 
 | 
</style> 
 |