| <template> | 
|   <div id="addStreamProxy" v-loading="isLoging"> | 
|     <el-dialog | 
|       title="添加代理" | 
|       width="40%" | 
|       top="2rem" | 
|       :close-on-click-modal="false" | 
|       :visible.sync="showDialog" | 
|       :destroy-on-close="true" | 
|       @close="close()" | 
|     > | 
|       <div id="shared" style="margin-top: 1rem;margin-right: 100px;"> | 
|         <el-form ref="streamProxy" :rules="rules" :model="proxyParam" label-width="140px" > | 
|               <el-form-item label="类型" prop="type"> | 
|                 <el-select | 
|                   v-model="proxyParam.type" | 
|                   style="width: 100%" | 
|                   placeholder="请选择代理类型" | 
|                 > | 
|                   <el-option label="默认" value="default"></el-option> | 
|                   <el-option label="FFmpeg" value="ffmpeg"></el-option> | 
|                 </el-select> | 
|               </el-form-item> | 
|               <el-form-item label="名称" prop="name"> | 
|                 <el-input v-model="proxyParam.name" clearable></el-input> | 
|               </el-form-item> | 
|               <el-form-item label="流应用名" prop="app"> | 
|                 <el-input v-model="proxyParam.app" clearable></el-input> | 
|               </el-form-item> | 
|               <el-form-item label="流ID" prop="stream"> | 
|                 <el-input v-model="proxyParam.stream" clearable></el-input> | 
|               </el-form-item> | 
|               <el-form-item label="拉流地址" prop="url" v-if="proxyParam.type=='default'"> | 
|                 <el-input v-model="proxyParam.url" clearable></el-input> | 
|               </el-form-item> | 
|               <el-form-item label="拉流地址" prop="srcUrl" v-if="proxyParam.type=='ffmpeg'"> | 
|                 <el-input v-model="proxyParam.srcUrl" clearable></el-input> | 
|               </el-form-item> | 
|               <el-form-item label="超时时间:毫秒" prop="timeoutMs" v-if="proxyParam.type=='ffmpeg'"> | 
|                 <el-input v-model="proxyParam.timeoutMs" clearable></el-input> | 
|               </el-form-item> | 
|               <el-form-item label="节点选择" prop="rtpType"> | 
|                 <el-select | 
|                   v-model="proxyParam.mediaServerId" | 
|                   @change="mediaServerIdChange" | 
|                   style="width: 100%" | 
|                   placeholder="请选择拉流节点" | 
|                 > | 
|                   <el-option | 
|                     v-for="item in mediaServerList" | 
|                     :key="item.id" | 
|                     :label="item.id" | 
|                     :value="item.id"> | 
|                   </el-option> | 
|                 </el-select> | 
|               </el-form-item> | 
|               <el-form-item label="FFmpeg命令模板" prop="ffmpegCmdKey" v-if="proxyParam.type=='ffmpeg'"> | 
|                 <el-select | 
|                   v-model="proxyParam.ffmpegCmdKey" | 
|                   style="width: 100%" | 
|                   placeholder="请选择FFmpeg命令模板" | 
|                 > | 
|                   <el-option | 
|                     v-for="item in Object.keys(ffmpegCmdList)" | 
|                     :key="item" | 
|                     :label="ffmpegCmdList[item]" | 
|                     :value="item"> | 
|                   </el-option> | 
|                 </el-select> | 
|               </el-form-item> | 
|               <el-form-item label="国标编码" prop="gbId"> | 
|                 <el-input v-model="proxyParam.gbId" placeholder="设置国标编码可推送到国标" clearable></el-input> | 
|               </el-form-item> | 
|               <el-form-item label="拉流方式" prop="rtpType" v-if="proxyParam.type=='default'"> | 
|                 <el-select | 
|                   v-model="proxyParam.rtpType" | 
|                   style="width: 100%" | 
|                   placeholder="请选择拉流方式" | 
|                 > | 
|                   <el-option label="TCP" value="0"></el-option> | 
|                   <el-option label="UDP" value="1"></el-option> | 
|                   <el-option label="组播" value="2"></el-option> | 
|                 </el-select> | 
|               </el-form-item> | 
|   | 
|             <el-form-item label="无人观看" prop="rtpType" > | 
|               <el-radio v-model="proxyParam.noneReader" label="0">不做处理</el-radio> | 
|               <el-radio v-model="proxyParam.noneReader" label="1">停用</el-radio> | 
|               <el-radio v-model="proxyParam.noneReader" label="2">移除</el-radio> | 
| <!--              <el-select--> | 
| <!--                @change="noneReaderHandler"--> | 
| <!--                v-model="proxyParam.noneReader"--> | 
| <!--                style="width: 100%"--> | 
| <!--                placeholder="请选择无人观看的处理方式"--> | 
| <!--              >--> | 
| <!--                <el-option label="不做处理" value="0"></el-option>--> | 
| <!--                <el-option label="停用" value="1"></el-option>--> | 
| <!--                <el-option label="移除" value="2"></el-option>--> | 
| <!--              </el-select>--> | 
|             </el-form-item> | 
|               <el-form-item label="其他选项"> | 
|                 <div style="float: left;"> | 
|                   <el-checkbox label="启用" v-model="proxyParam.enable" ></el-checkbox> | 
|                   <el-checkbox label="开启音频" v-model="proxyParam.enableAudio" ></el-checkbox> | 
|                   <el-checkbox label="录制" v-model="proxyParam.enableMp4" ></el-checkbox> | 
|                 </div> | 
|   | 
|               </el-form-item> | 
|               <el-form-item> | 
|                 <div style="float: right;"> | 
|                   <el-button type="primary" @click="onSubmit" :loading="dialogLoading" >{{onSubmit_text}}</el-button> | 
|                   <el-button @click="close">取消</el-button> | 
|                 </div> | 
|   | 
|               </el-form-item> | 
|             </el-form> | 
|       </div> | 
|     </el-dialog> | 
|   </div> | 
| </template> | 
|   | 
| <script> | 
| import MediaServer from './../service/MediaServer' | 
|   | 
| export default { | 
|   name: "streamProxyEdit", | 
|   props: {}, | 
|   computed: {}, | 
|   created() {}, | 
|   data() { | 
|     // var deviceGBIdRules = async (rule, value, callback) => { | 
|     //   console.log(value); | 
|     //   if (value === "") { | 
|     //     callback(new Error("请输入设备国标编号")); | 
|     //   } else { | 
|     //     var exit = await this.deviceGBIdExit(value); | 
|     //     console.log(exit); | 
|     //     console.log(exit == "true"); | 
|     //     console.log(exit === "true"); | 
|     //     if (exit) { | 
|     //       callback(new Error("设备国标编号已存在")); | 
|     //     } else { | 
|     //       callback(); | 
|     //     } | 
|     //   } | 
|     // }; | 
|     return { | 
|       listChangeCallback: null, | 
|       showDialog: false, | 
|       isLoging: false, | 
|       dialogLoading: false, | 
|       onSubmit_text: "立即创建", | 
|       platformList: [], | 
|       mediaServer: new MediaServer(), | 
|       proxyParam: { | 
|           name: null, | 
|           type: "default", | 
|           app: null, | 
|           stream: null, | 
|           url: "", | 
|           srcUrl: null, | 
|           timeoutMs: null, | 
|           ffmpegCmdKey: null, | 
|           gbId: null, | 
|           rtpType: null, | 
|           enable: true, | 
|           enableAudio: true, | 
|           enableMp4: false, | 
|           noneReader: null, | 
|           enableRemoveNoneReader: false, | 
|           enableDisableNoneReader: false, | 
|           platformGbId: null, | 
|           mediaServerId: null, | 
|       }, | 
|       mediaServerList:{}, | 
|       ffmpegCmdList:{}, | 
|   | 
|       rules: { | 
|         name: [{ required: true, message: "请输入名称", trigger: "blur" }], | 
|         app: [{ required: true, message: "请输入应用名", trigger: "blur" }], | 
|         stream: [{ required: true, message: "请输入流ID", trigger: "blur" }], | 
|         url: [{ required: true, message: "请输入要代理的流", trigger: "blur" }], | 
|         srcUrl: [{ required: true, message: "请输入要代理的流", trigger: "blur" }], | 
|         timeoutMs: [{ required: true, message: "请输入FFmpeg推流成功超时时间", trigger: "blur" }], | 
|         ffmpegCmdKey: [{ required: false, message: "请输入FFmpeg命令参数模板(可选)", trigger: "blur" }], | 
|       }, | 
|     }; | 
|   }, | 
|   methods: { | 
|     openDialog: function (proxyParam, callback) { | 
|       this.showDialog = true; | 
|       this.listChangeCallback = callback; | 
|       if (proxyParam != null) { | 
|         this.proxyParam = proxyParam; | 
|         this.proxyParam.noneReader = null; | 
|       } | 
|   | 
|       let that = this; | 
|       this.$axios({ | 
|         method: 'get', | 
|         url:`/api/platform/query/10000/1` | 
|       }).then(function (res) { | 
|         that.platformList = res.data.data.list; | 
|       }).catch(function (error) { | 
|         console.log(error); | 
|       }); | 
|       this.mediaServer.getOnlineMediaServerList((data)=>{ | 
|         this.mediaServerList = data.data; | 
|         this.proxyParam.mediaServerId = this.mediaServerList[0].id | 
|         this.mediaServerIdChange() | 
|       }) | 
|     }, | 
|     mediaServerIdChange:function (){ | 
|       let that = this; | 
|       if (that.proxyParam.mediaServerId !== "auto"){ | 
|         that.$axios({ | 
|           method: 'get', | 
|           url:`/api/proxy/ffmpeg_cmd/list`, | 
|           params: { | 
|             mediaServerId: that.proxyParam.mediaServerId | 
|           } | 
|         }).then(function (res) { | 
|           that.ffmpegCmdList = res.data.data; | 
|           that.proxyParam.ffmpegCmdKey = Object.keys(res.data.data)[0]; | 
|         }).catch(function (error) { | 
|           console.log(error); | 
|         }); | 
|       } | 
|   | 
|     }, | 
|     onSubmit: function () { | 
|       this.dialogLoading = true; | 
|       this.noneReaderHandler(); | 
|       this.$axios({ | 
|         method: 'post', | 
|         url:`/api/proxy/save`, | 
|         data: this.proxyParam | 
|       }).then((res)=> { | 
|         this.dialogLoading = false; | 
|         if (typeof (res.data.code) != "undefined" && res.data.code === 0) { | 
|           this.$message({ | 
|             showClose: true, | 
|             message: res.data.msg, | 
|             type: "success", | 
|           }); | 
|           this.showDialog = false; | 
|           if (this.listChangeCallback != null) { | 
|             this.listChangeCallback(); | 
|             this.dialogLoading = false; | 
|           } | 
|         } | 
|       }).catch((error) =>{ | 
|         console.log(error); | 
|         this.dialogLoading = false; | 
|       }); | 
|     }, | 
|     close: function () { | 
|       this.showDialog = false; | 
|       this.dialogLoading = false; | 
|       this.$refs.streamProxy.resetFields(); | 
|     }, | 
|     deviceGBIdExit: async function (deviceGbId) { | 
|       var result = false; | 
|       var that = this; | 
|       await that.$axios({ | 
|         method: 'get', | 
|         url:`/api/platform/exit/${deviceGbId}` | 
|       }).then(function (res) { | 
|         result = res.data; | 
|       }).catch(function (error) { | 
|         console.log(error); | 
|       }); | 
|       return result; | 
|     }, | 
|     checkExpires: function() { | 
|       if (this.platform.enable && this.platform.expires == "0") { | 
|         this.platform.expires = "300"; | 
|       } | 
|     }, | 
|     noneReaderHandler: function() { | 
|       if (this.proxyParam.noneReader === null || this.proxyParam.noneReader === "0") { | 
|         this.proxyParam.enableDisableNoneReader = false; | 
|         this.proxyParam.enableRemoveNoneReader = false; | 
|       }else if (this.proxyParam.noneReader === "1"){ | 
|         this.proxyParam.enableDisableNoneReader = true; | 
|         this.proxyParam.enableRemoveNoneReader = false; | 
|       }else if (this.proxyParam.noneReader ==="2"){ | 
|         this.proxyParam.enableDisableNoneReader = false; | 
|         this.proxyParam.enableRemoveNoneReader = true; | 
|       } | 
|     }, | 
|   }, | 
| }; | 
| </script> |