PlatformEdit.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. <template>
  2. <div id="PlatformEdit" style="width: 100%">
  3. <div class="page-header">
  4. <div class="page-title">
  5. <el-button icon="el-icon-back" size="mini" style="font-size: 20px; color: #000;" type="text" @click="close" ></el-button>
  6. <el-divider direction="vertical"></el-divider>
  7. 添加上级平台
  8. </div>
  9. <div class="page-header-btn">
  10. <div style="display: inline;">
  11. <el-button icon="el-icon-close" size="mini" style="font-size: 20px; color: #000;" type="text" @click="close" ></el-button>
  12. </div>
  13. </div>
  14. </div>
  15. <div id="shared" style="text-align: right; margin-top: 1rem; background-color: #FFFFFF; padding-top: 2rem;">
  16. <el-row :gutter="24">
  17. <el-col :span="11">
  18. <el-form ref="platform1" :rules="rules" :model="value" size="medium" label-width="160px">
  19. <el-form-item label="名称" prop="name">
  20. <el-input v-model="value.name"></el-input>
  21. </el-form-item>
  22. <el-form-item label="SIP服务国标编码" prop="serverGBId">
  23. <el-input v-model="value.serverGBId" clearable @input="serverGBIdChange"></el-input>
  24. </el-form-item>
  25. <el-form-item label="SIP服务国标域" prop="serverGBDomain">
  26. <el-input v-model="value.serverGBDomain" clearable></el-input>
  27. </el-form-item>
  28. <el-form-item label="SIP服务IP" prop="serverIp">
  29. <el-input v-model="value.serverIp" clearable></el-input>
  30. </el-form-item>
  31. <el-form-item label="SIP服务端口" prop="serverPort">
  32. <el-input v-model="value.serverPort" clearable type="number"></el-input>
  33. </el-form-item>
  34. <el-form-item label="设备国标编号" prop="deviceGBId">
  35. <el-input v-model="value.deviceGBId" clearable @input="deviceGBIdChange"></el-input>
  36. </el-form-item>
  37. <el-form-item label="本地IP" prop="deviceIp">
  38. <el-select v-model="value.deviceIp" placeholder="请选择与上级相通的网卡" style="width: 100%">
  39. <el-option
  40. v-for="ip in deviceIps"
  41. :key="ip"
  42. :label="ip"
  43. :value="ip">
  44. </el-option>
  45. </el-select>
  46. </el-form-item>
  47. <el-form-item label="本地端口" prop="devicePort">
  48. <el-input v-model="value.devicePort" :disabled="true" type="number"></el-input>
  49. </el-form-item>
  50. <el-form-item label="SIP认证用户名" prop="username">
  51. <el-input v-model="value.username"></el-input>
  52. </el-form-item>
  53. <el-form-item label="SIP认证密码" prop="password">
  54. <el-input v-model="value.password"></el-input>
  55. </el-form-item>
  56. <el-form-item label="注册周期(秒)" prop="expires">
  57. <el-input v-model="value.expires"></el-input>
  58. </el-form-item>
  59. <el-form-item label="心跳周期(秒)" prop="keepTimeout">
  60. <el-input v-model="value.keepTimeout"></el-input>
  61. </el-form-item>
  62. </el-form>
  63. </el-col>
  64. <el-col :span="12">
  65. <el-form ref="platform2" :rules="rules" :model="value" size="medium" label-width="160px">
  66. <el-form-item label="SDP发流IP" prop="sendStreamIp">
  67. <el-input v-model="value.sendStreamIp"></el-input>
  68. </el-form-item>
  69. <el-form-item label="信令传输" prop="transport">
  70. <el-select
  71. v-model="value.transport"
  72. style="width: 100%"
  73. placeholder="请选择信令传输方式"
  74. >
  75. <el-option label="UDP" value="UDP"></el-option>
  76. <el-option label="TCP" value="TCP"></el-option>
  77. </el-select>
  78. </el-form-item>
  79. <el-form-item label="保密属性" >
  80. <el-select v-model="value.secrecy" style="width: 100%" placeholder="请选择保密属性">
  81. <el-option label="不涉密" :value="0"></el-option>
  82. <el-option label="涉密" :value="1"></el-option>
  83. </el-select>
  84. </el-form-item>
  85. <el-form-item label="目录分组" prop="catalogGroup">
  86. <el-select
  87. v-model="value.catalogGroup"
  88. style="width: 100%"
  89. placeholder="请选择目录分组"
  90. >
  91. <el-option label="1" value="1"></el-option>
  92. <el-option label="2" value="2"></el-option>
  93. <el-option label="4" value="4"></el-option>
  94. <el-option label="8" value="8"></el-option>
  95. </el-select>
  96. </el-form-item>
  97. <el-form-item label="字符集" prop="characterSet">
  98. <el-select
  99. v-model="value.characterSet"
  100. style="width: 100%"
  101. placeholder="请选择字符集"
  102. >
  103. <el-option label="GB2312" value="GB2312"></el-option>
  104. <el-option label="UTF-8" value="UTF-8"></el-option>
  105. </el-select>
  106. </el-form-item>
  107. <el-form-item label="行政区划" prop="civilCode">
  108. <el-input v-model="value.civilCode" clearable></el-input>
  109. </el-form-item>
  110. <el-form-item label="平台厂商" prop="manufacturer">
  111. <el-input v-model="value.manufacturer" clearable></el-input>
  112. </el-form-item>
  113. <el-form-item label="平台型号" prop="model">
  114. <el-input v-model="value.model" clearable></el-input>
  115. </el-form-item>
  116. <el-form-item label="平台安装地址" prop="address">
  117. <el-input v-model="value.address" clearable></el-input>
  118. </el-form-item>
  119. <el-form-item label="其他选项" >
  120. <div style="text-align: left">
  121. <el-checkbox label="启用" v-model="value.enable" @change="checkExpires"></el-checkbox>
  122. <!-- <el-checkbox label="云台控制" v-model="value.ptz"></el-checkbox>-->
  123. <el-checkbox label="RTCP保活" v-model="value.rtcp" @change="rtcpCheckBoxChange"></el-checkbox>
  124. <el-checkbox label="消息通道" v-model="value.asMessageChannel"></el-checkbox>
  125. <el-checkbox label="主动推送通道" v-model="value.autoPushChannel"></el-checkbox>
  126. <el-checkbox label="推送平台信息" :true-label="1" :false-label="0" v-model="value.catalogWithPlatform"></el-checkbox>
  127. <el-checkbox label="推送分组信息" :true-label="1" :false-label="0" v-model="value.catalogWithGroup"></el-checkbox>
  128. <el-checkbox label="推送行政区划" :true-label="1" :false-label="0" v-model="value.catalogWithRegion"></el-checkbox>
  129. </div>
  130. </el-form-item>
  131. <el-form-item>
  132. <el-button type="primary" @click="onSubmit">{{
  133. onSubmit_text
  134. }}
  135. </el-button>
  136. <el-button @click="close">取消</el-button>
  137. </el-form-item>
  138. </el-form>
  139. </el-col>
  140. </el-row>
  141. </div>
  142. </div>
  143. </template>
  144. <script>
  145. export default {
  146. name: "platformEdit",
  147. props: [ 'value', 'closeEdit', 'deviceIps'],
  148. components: {
  149. },
  150. created() {
  151. },
  152. watch: {
  153. value(newValue, oldValue){
  154. this.streamProxy = newValue;
  155. }
  156. },
  157. data() {
  158. var deviceGBIdRules = async (rule, value, callback) => {
  159. console.log(value);
  160. if (value === "") {
  161. callback(new Error("请输入设备国标编号"));
  162. } else {
  163. var exit = await this.deviceGBIdExit(value);
  164. if (exit) {
  165. callback(new Error("设备国标编号格式错误或已存在"));
  166. } else {
  167. callback();
  168. }
  169. }
  170. }
  171. return {
  172. listChangeCallback: null,
  173. showDialog: false,
  174. isLoging: false,
  175. onSubmit_text: "立即创建",
  176. rules: {
  177. name: [{required: true, message: "请输入平台名称", trigger: "blur"}],
  178. serverGBId: [
  179. {required: true, message: "请输入SIP服务国标编码", trigger: "blur"},
  180. ],
  181. serverGBDomain: [
  182. {required: true, message: "请输入SIP服务国标域", trigger: "blur"},
  183. ],
  184. serverIp: [{required: true, message: "请输入SIP服务IP", trigger: "blur"}],
  185. serverPort: [{required: true, message: "请输入SIP服务端口", trigger: "blur"}],
  186. deviceGBId: [{validator: deviceGBIdRules, trigger: "blur"}],
  187. username: [{required: false, message: "请输入SIP认证用户名", trigger: "blur"}],
  188. password: [{required: false, message: "请输入SIP认证密码", trigger: "blur"}],
  189. expires: [{required: true, message: "请输入注册周期", trigger: "blur"}],
  190. keepTimeout: [{required: true, message: "请输入心跳周期", trigger: "blur"}],
  191. transport: [{required: true, message: "请选择信令传输", trigger: "blur"}],
  192. characterSet: [{required: true, message: "请选择编码字符集", trigger: "blur"}],
  193. deviceIp: [{required: true, message: "请选择本地IP", trigger: "blur"}],
  194. },
  195. saveLoading: false,
  196. };
  197. },
  198. methods: {
  199. onSubmit: function () {
  200. this.saveLoading = true;
  201. if (this.value.id) {
  202. this.$axios({
  203. method: 'post',
  204. url: "/api/platform/update",
  205. data: this.value
  206. }).then((res) => {
  207. this.saveLoading = false;
  208. if (res.data.code === 0) {
  209. this.$message({
  210. showClose: true,
  211. message: "保存成功",
  212. type: "success",
  213. });
  214. this.showDialog = false;
  215. if (this.closeEdit) {
  216. this.closeEdit();
  217. }
  218. } else {
  219. this.$message({
  220. showClose: true,
  221. message: res.data.msg,
  222. type: "error",
  223. });
  224. }
  225. }).catch((error) => {
  226. this.saveLoading = false;
  227. console.log(error);
  228. });
  229. }else {
  230. this.$axios({
  231. method: 'post',
  232. url: "/api/platform/add",
  233. data: this.value
  234. }).then((res) => {
  235. this.saveLoading = false;
  236. if (res.data.code === 0) {
  237. this.$message({
  238. showClose: true,
  239. message: "保存成功",
  240. type: "success",
  241. });
  242. if (this.closeEdit) {
  243. this.closeEdit();
  244. }
  245. } else {
  246. this.$message({
  247. showClose: true,
  248. message: res.data.msg,
  249. type: "error",
  250. });
  251. }
  252. }).catch((error) => {
  253. this.saveLoading = false;
  254. console.log(error);
  255. });
  256. }
  257. },
  258. serverGBIdChange: function () {
  259. if (this.value.serverGBId.length > 10) {
  260. this.value.serverGBDomain = this.value.serverGBId.substr(0, 10);
  261. }
  262. },
  263. deviceGBIdChange: function () {
  264. this.value.username = this.value.deviceGBId;
  265. },
  266. checkExpires: function () {
  267. if (this.value.enable && this.value.expires === "0") {
  268. this.value.expires = "3600";
  269. }
  270. },
  271. rtcpCheckBoxChange: function (result) {
  272. if (result) {
  273. this.$message({
  274. showClose: true,
  275. message: "开启RTCP保活需要上级平台支持,可以避免无效推流",
  276. type: "warning",
  277. });
  278. }
  279. },
  280. deviceGBIdExit: async function (deviceGbId) {
  281. let result = false;
  282. await this.$axios({
  283. method:"get",
  284. url:`/api/platform/exit/${deviceGbId}`
  285. }).then((res)=> {
  286. result = res.data;
  287. }).catch((error)=> {
  288. console.log(error);
  289. });
  290. return result;
  291. },
  292. close: function () {
  293. this.closeEdit()
  294. },
  295. },
  296. };
  297. </script>
  298. <style>
  299. .channel-form {
  300. display: grid;
  301. background-color: #FFFFFF;
  302. padding: 1rem 2rem 0 2rem;
  303. grid-template-columns: 1fr 1fr 1fr;
  304. gap: 1rem;
  305. }
  306. </style>