mediaServer-edit.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  1. <template>
  2. <div id="mediaServerEdit" v-loading="isLoging">
  3. <el-dialog title="流媒体服务器节点" :width="dialogWidth" top="2rem" :close-on-click-modal="false" v-model="showDialog" :destroy-on-close="true" @close="close()">
  4. <div id="formStep" style="margin-top: 1rem; margin-right: 20px">
  5. <el-form v-if="currentStep == 1" ref="mediaServerRef" :rules="rules" :model="mediaServerForm" label-width="280px" style="width: 70%">
  6. <!-- <el-form-item label="所属租户" prop="productName">-->
  7. <!-- <el-input readonly v-model="mediaServerForm.tenantName" placeholder="请选择所属租户">-->
  8. <!-- <el-button slot="append" @click="selectUser()">选择</el-button>-->
  9. <!-- </el-input>-->
  10. <!-- </el-form-item>-->
  11. <el-form-item label="服务器IP" prop="ip">
  12. <el-input v-model="mediaServerForm.ip" placeholder="媒体服务IP" clearable></el-input>
  13. </el-form-item>
  14. <el-form-item label="Http端口" prop="portHttp">
  15. <el-input v-model="mediaServerForm.portHttp" placeholder="媒体服务HTTP端口" clearable></el-input>
  16. </el-form-item>
  17. <el-form-item label="服务密钥" prop="secret">
  18. <el-input v-model="mediaServerForm.secret" placeholder="媒体服务SECRET" clearable></el-input>
  19. </el-form-item>
  20. <el-form-item>
  21. <div style="float: right; font-size: 28px">
  22. <el-button @click="close">取消</el-button>
  23. <el-button type="success" @click="checkServer" :loading="btnLoading">测试</el-button>
  24. <el-button type="primary" v-if="currentStep === 1 && serverCheck === 1" @click="next">下一步</el-button>
  25. </div>
  26. </el-form-item>
  27. </el-form>
  28. <el-row :gutter="24">
  29. <el-col :span="12">
  30. <el-form v-if="currentStep === 2 || currentStep === 3" ref="mediaServerRef1" :rules="rules" :model="mediaServerForm" label-width="140px" :disabled="!editFlag">
  31. <el-form-item label="配置名称" prop="serverId">
  32. <el-input v-model="mediaServerForm.serverId" placeholder="配置名称" clearable></el-input>
  33. </el-form-item>
  34. <el-form-item label="服务器IP" prop="ip">
  35. <el-input v-if="currentStep === 2" v-model="mediaServerForm.ip" disabled></el-input>
  36. <el-input v-if="currentStep === 3" v-model="mediaServerForm.ip"></el-input>
  37. </el-form-item>
  38. <el-form-item label="播放协议" prop="protocol">
  39. <el-select v-model="mediaServerForm.protocol" style="width: 100%">
  40. <el-option key="http" label="http" value="http"></el-option>
  41. <el-option key="https" label="https" value="https"></el-option>
  42. </el-select>
  43. </el-form-item>
  44. <el-form-item label="HookUrl" prop="hookurl">
  45. <el-input v-model="mediaServerForm.hookurl" placeholder="HookUrl" clearable></el-input>
  46. </el-form-item>
  47. <el-form-item label="Http端口" prop="portHttp">
  48. <el-input v-if="currentStep === 2" v-model="mediaServerForm.portHttp" disabled></el-input>
  49. <el-input v-if="currentStep === 3" v-model="mediaServerForm.portHttp"></el-input>
  50. </el-form-item>
  51. <el-form-item label="Https端口" prop="portHttps">
  52. <el-input v-model="mediaServerForm.portHttps" placeholder="Https端口" clearable></el-input>
  53. </el-form-item>
  54. <el-form-item label="Rtsp端口" prop="portRtsp">
  55. <el-input v-model="mediaServerForm.portRtsp" placeholder="Rtsp端口" clearable></el-input>
  56. </el-form-item>
  57. </el-form>
  58. </el-col>
  59. <el-col :span="12">
  60. <el-form v-if="currentStep === 2 || currentStep === 3" ref="mediaServerForm2" :rules="rules" :model="mediaServerForm" label-width="180px" :disabled="!editFlag">
  61. <el-form-item label="流媒体密钥" prop="secret">
  62. <el-input v-if="currentStep === 2" v-model="mediaServerForm.secret" disabled></el-input>
  63. <el-input v-if="currentStep === 3" v-model="mediaServerForm.secret"></el-input>
  64. </el-form-item>
  65. <el-form-item label="服务器域名" prop="domain">
  66. <el-input v-model="mediaServerForm.domain" placeholder="服务器域名" clearable></el-input>
  67. </el-form-item>
  68. <el-form-item label="自动配置">
  69. <el-switch v-model="mediaServerForm.autoConfig"></el-switch>
  70. </el-form-item>
  71. <el-form-item label="收流模式">
  72. <el-switch active-text="多端口" inactive-text="单端口" @change="portRangeChange" v-model="mediaServerForm.rtpEnable"></el-switch>
  73. </el-form-item>
  74. <el-form-item v-if="!mediaServerForm.rtpEnable" label="收流端口" prop="rtpProxyPort">
  75. <el-input v-model.number="mediaServerForm.rtpProxyPort" clearable></el-input>
  76. </el-form-item>
  77. <el-form-item v-if="mediaServerForm.rtpEnable" label="收流端口">
  78. <el-input v-model="rtpPortRange1" placeholder="起始" @change="portRangeChange" clearable style="width: 100px" prop="rtpPortRange1"></el-input>
  79. <el-input v-model="rtpPortRange2" placeholder="终止" @change="portRangeChange" clearable style="width: 100px" prop="rtpPortRange2" ></el-input>
  80. </el-form-item>
  81. <el-form-item label="Rtmp端口" prop="portRtmp">
  82. <el-input v-model="mediaServerForm.portRtmp" placeholder="Rtmp端口" clearable></el-input>
  83. </el-form-item>
  84. <el-form-item label="录像管理端口" prop="recordPort">
  85. <el-input v-model.number="mediaServerForm.recordPort" :disabled="!editFlag">
  86. <el-button v-if="mediaServerForm.recordPort > 0" class="el-icon-check" slot="append" type="primary" @click="checkRecordServer"></el-button>
  87. </el-input>
  88. <i v-if="recordServerCheck === 1" class="el-icon-success" style="color: #3caf36; position: absolute; top: 14px"></i>
  89. <i v-if="recordServerCheck === 2" class="el-icon-loading" style="color: #3caf36; position: absolute; top: 14px"></i>
  90. <i v-if="recordServerCheck === -1" class="el-icon-error" style="color: #c80000; position: absolute; top: 14px"></i>
  91. </el-form-item>
  92. <el-form-item>
  93. <div style="float: right">
  94. <el-button type="primary" @click="onSubmit" v-if="editFlag">提交</el-button>
  95. <el-button @click="close" v-if="editFlag">关闭</el-button>
  96. </div>
  97. </el-form-item>
  98. </el-form>
  99. </el-col>
  100. </el-row>
  101. </div>
  102. </el-dialog>
  103. <!-- 选择用户 -->
  104. <user-list ref="userList" @userEvent="getUserData($event)" />
  105. </div>
  106. </template>
  107. <script setup name="MediaServerEdit">
  108. import { addmediaServer, checkmediaServer, updatemediaServer } from '@/api/iot/mediaServer';
  109. import userList from '@/views/iot/sip/user-list.vue';
  110. import { inject } from 'vue';
  111. const { proxy } = getCurrentInstance();
  112. const isValidIp = (rule, value, callback) => {
  113. // 校验IP是否符合规则
  114. var reg = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/;
  115. if (!reg.test(value)) {
  116. return callback(new Error('请输入有效的IP地址'));
  117. } else {
  118. callback();
  119. }
  120. return true;
  121. };
  122. const isValidPort = (rule, value, callback) => {
  123. // 校验IP是否符合规则
  124. var reg = /^(([0-9]|[1-9]\d{1,3}|[1-5]\d{4}|6[0-5]{2}[0-3][0-5]))$/;
  125. if (!reg.test(value)) {
  126. return callback(new Error('请输入有效的端口号'));
  127. } else {
  128. callback();
  129. }
  130. return true;
  131. };
  132. const props = defineProps({
  133. editFlag: {
  134. type: Boolean,
  135. default: false,
  136. }
  137. });
  138. const tempTenantId = ref('');
  139. const tempTenantName = ref('');
  140. const btnLoading = ref(false);
  141. const dialogWidth = ref('');
  142. const defaultWidth = ref(1000);
  143. const listChangeCallback = ref(null);
  144. const showDialog = ref(false);
  145. const isLoging = ref(false);
  146. const dialogLoading = ref(false);
  147. const currentStep = ref(1);
  148. const platformList = ref([]);
  149. const serverCheck = ref(0);
  150. const recordServerCheck = ref(0);
  151. const mediaServerForm = ref({
  152. serverId: '',
  153. ip: '',
  154. domain: '',
  155. productId: '',
  156. productName: '',
  157. tenantId: '',
  158. tenantName: '',
  159. autoConfig: true,
  160. hookurl: '',
  161. secret: '',
  162. portHttp: '',
  163. portHttps: '',
  164. recordPort: '',
  165. portRtmp: '',
  166. portRtsp: '',
  167. rtpEnable: true,
  168. rtpPortRange: '',
  169. rtpProxyPort: '',
  170. });
  171. const rtpPortRange1 = ref(30000);
  172. const rtpPortRange2 = ref(30100);
  173. const data = reactive({
  174. rules: {
  175. ip: [{ required: true, validator: isValidIp, message: '请输入有效的IP地址', trigger: 'blur' }],
  176. portHttp: [{ required: true, validator: isValidPort, message: '请输入有效的端口号', trigger: 'blur' }],
  177. portHttps: [{ required: true, validator: isValidPort, message: '请输入有效的端口号', trigger: 'blur' }],
  178. recordPort: [{ required: true, validator: isValidPort, message: '请输入有效的端口号', trigger: 'blur' }],
  179. portRtmp: [{ required: true, validator: isValidPort, message: '请输入有效的端口号', trigger: 'blur' }],
  180. portRtsp: [{ required: true, validator: isValidPort, message: '请输入有效的端口号', trigger: 'blur' }],
  181. rtpPortRange1: [{ required: true, validator: isValidPort, message: '请输入有效的端口号', trigger: 'blur' }],
  182. rtpPortRange2: [{ required: true, validator: isValidPort, message: '请输入有效的端口号', trigger: 'blur' }],
  183. rtpProxyPort: [{ required: true, validator: isValidPort, message: '请输入有效的端口号', trigger: 'blur' }],
  184. secret: [{ required: true, message: '请输入secret', trigger: 'blur' }],
  185. }
  186. })
  187. const { rules } = toRefs(data);
  188. function setDialogWidth() {
  189. let val = document.body.clientWidth;
  190. if (val < defaultWidth.value) {
  191. dialogWidth.value = '100%';
  192. } else {
  193. dialogWidth.value = defaultWidth.value + 'px';
  194. }
  195. }
  196. function openDialog(param, callback) {
  197. showDialog.value = true;
  198. listChangeCallback.value = callback;
  199. if (param != null) {
  200. if (param.autoConfig === 1) {
  201. param.autoConfig = param.autoConfig === 1;
  202. } else if (param.autoConfig === 0) {
  203. param.autoConfig = param.autoConfig === 1;
  204. }
  205. if (param.rtpEnable === 1) {
  206. param.rtpEnable = param.rtpEnable === 1;
  207. } else if (param.rtpEnable === 0) {
  208. param.rtpEnable = param.rtpEnable === 1;
  209. }
  210. mediaServerForm.value = param;
  211. currentStep.value = 3;
  212. if (param.rtpPortRange) {
  213. let rtpPortRange = mediaServerForm.value.rtpPortRange.split(',');
  214. if (rtpPortRange.length > 0) {
  215. rtpPortRange1.value = rtpPortRange[0];
  216. rtpPortRange2.value = rtpPortRange[1];
  217. }
  218. }
  219. }
  220. }
  221. function checkServer() {
  222. proxy.$refs["mediaServerRef"].validate((valid) => {
  223. if (valid) {
  224. btnLoading.value = true;
  225. serverCheck.value = 0;
  226. let query = {
  227. ip: mediaServerForm.value.ip,
  228. port: mediaServerForm.value.portHttp,
  229. secret: mediaServerForm.value.secret,
  230. };
  231. checkmediaServer(query).then((response) => {
  232. btnLoading.value = false;
  233. if (response.data != null) {
  234. mediaServerForm.value = response.data;
  235. mediaServerForm.value.autoConfig = true;
  236. mediaServerForm.value.rtpEnable = true;
  237. mediaServerForm.value.protocol = 'http';
  238. mediaServerForm.value.domain = 'gyjiot.com';
  239. mediaServerForm.value.enabled = 1;
  240. mediaServerForm.value.tenantId = tempTenantId.value;
  241. mediaServerForm.value.tenantName = tempTenantName.value;
  242. mediaServerForm.value.serverId = 'gyjiot';
  243. mediaServerForm.value.hookurl = 'java:38080';
  244. mediaServerForm.value.portHttps = 8443;
  245. mediaServerForm.value.recordPort = 18081;
  246. mediaServerForm.value.portRtmp = 1935;
  247. mediaServerForm.value.portRtsp = 554;
  248. mediaServerForm.value.rtpProxyPort = '';
  249. rtpPortRange1.value = 30000;
  250. rtpPortRange2.value = 30100;
  251. serverCheck.value = 1;
  252. proxy.$modal.alertSuccess('配置地址连接成功');
  253. } else {
  254. serverCheck.value = -1;
  255. proxy.$modal.alertError('配置地址无法连接');
  256. }
  257. })
  258. .catch((error) => {
  259. serverCheck.value = -1;
  260. proxy.$message({
  261. showClose: true,
  262. message: error,
  263. type: 'error',
  264. });
  265. });
  266. }
  267. });
  268. }
  269. function next() {
  270. currentStep.value = 2;
  271. defaultWidth.value = 900;
  272. setDialogWidth();
  273. }
  274. function checkRecordServer() {
  275. recordServerCheck.value = 2;
  276. if (mediaServerForm.value.recordPort <= 0 || mediaServerForm.value.recordPort > 65535) {
  277. recordServerCheck.value = -1;
  278. proxy.$message({
  279. showClose: true,
  280. message: '端口号应该在-65535之间',
  281. type: 'error',
  282. });
  283. return;
  284. }
  285. }
  286. function onSubmit() {
  287. dialogLoading.value = true;
  288. mediaServerForm.value.rtpEnable = mediaServerForm.value.rtpEnable ? 1 : 0;
  289. mediaServerForm.value.autoConfig = mediaServerForm.value.autoConfig ? 1 : 0;
  290. if (mediaServerForm.value.id != null) {
  291. updatemediaServer(mediaServerForm.value).then((response) => {
  292. proxy.$modal.msgSuccess('修改成功');
  293. showDialog.value = false;
  294. proxy.$emit('show');
  295. });
  296. } else {
  297. portRangeChange();
  298. addmediaServer(mediaServerForm.value).then((response) => {
  299. proxy.$modal.msgSuccess('新增成功');
  300. showDialog.value = false;
  301. proxy.$emit('show');
  302. });
  303. }
  304. }
  305. function close() {
  306. showDialog.value = false;
  307. dialogLoading.value = false;
  308. mediaServerForm.value = {
  309. serverId: '',
  310. ip: '',
  311. domain: '',
  312. autoConfig: true,
  313. hookurl: '',
  314. secret: '',
  315. portHttp: '',
  316. portHttps: '',
  317. recordPort: '',
  318. portRtmp: '',
  319. portRtsp: '',
  320. rtpEnable: true,
  321. rtpPortRange: '',
  322. rtpProxyPort: '',
  323. };
  324. rtpPortRange1.value = 30000;
  325. rtpPortRange2.value = 30100;
  326. listChangeCallback.value = null;
  327. currentStep.value = 1;
  328. }
  329. function portRangeChange() {
  330. if (mediaServerForm.value.rtpEnable) {
  331. mediaServerForm.value.rtpPortRange = rtpPortRange1.value + ',' + rtpPortRange2.value;
  332. console.log(mediaServerForm.value.rtpPortRange);
  333. }
  334. }
  335. function selectUser() {
  336. proxy.$refs.userList.open = true;
  337. proxy.$refs.userList.getList();
  338. }
  339. function getUserData(user) {
  340. tempTenantId.value = user.userId;
  341. tempTenantName.value = user.userName;
  342. mediaServerForm.value.tenantId = user.userId;
  343. mediaServerForm.value.tenantName = user.userName;
  344. }
  345. setDialogWidth()
  346. defineExpose({
  347. openDialog
  348. });
  349. </script>