StreamEditForm.vue 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. <template>
  2. <div class="tab-content edit-content">
  3. <div class="drawer-body">
  4. <el-form ref="elFormRef" :model="form" :rules="rules" label-width="auto" class="stream-form">
  5. <el-form-item :label="t('名称') + ':'" prop="name">
  6. <el-input v-model="form.name" :placeholder="t('例如: 测试推流-001')" style="width: 300px" />
  7. </el-form-item>
  8. <el-form-item :label="t('LSS 节点') + ':'" prop="lssId">
  9. <el-select v-model="form.lssId" :placeholder="t('请选择 LSS 节点')" clearable filterable style="width: 300px">
  10. <el-option
  11. v-for="lss in lssOptions"
  12. :key="lss.lssId"
  13. :label="`${lss.lssId} - ${lss.lssName}`"
  14. :value="lss.lssId"
  15. />
  16. </el-select>
  17. </el-form-item>
  18. <el-form-item :label="t('摄像头') + ':'" prop="cameraId">
  19. <el-select v-model="form.cameraId" :placeholder="t('请选择摄像头')" clearable filterable style="width: 300px">
  20. <el-option
  21. v-for="camera in cameraOptions"
  22. :key="camera.cameraId"
  23. :label="`${camera.cameraId} - ${camera.cameraName}`"
  24. :value="camera.cameraId"
  25. />
  26. </el-select>
  27. </el-form-item>
  28. <el-form-item :label="t('推流方式') + ':'" prop="pushMethod">
  29. <el-select disabled v-model="form.pushMethod" :placeholder="t('请选择')" style="width: 300px">
  30. <el-option label="ffmpeg" value="ffmpeg" />
  31. </el-select>
  32. </el-form-item>
  33. <el-form-item :label="t('命令模板') + ':'" prop="commandTemplate">
  34. <CodeEditor
  35. v-model="form.commandTemplate"
  36. language="bash"
  37. height="400px"
  38. placeholder="#!/bin/bash&#10;# FFmpeg 命令模板,可使用 {RTSP_URL} 等变量"
  39. />
  40. </el-form-item>
  41. </el-form>
  42. </div>
  43. <div class="drawer-footer">
  44. <el-button @click="$emit('cancel')">{{ t('取消') }}</el-button>
  45. <el-button type="primary" :loading="submitLoading" @click="$emit('submit')">
  46. {{ isEdit ? t('更新') : t('添加') }}
  47. </el-button>
  48. </div>
  49. </div>
  50. </template>
  51. <script setup lang="ts">
  52. import { ref } from 'vue'
  53. import { useI18n } from 'vue-i18n'
  54. import type { FormInstance, FormRules } from 'element-plus'
  55. import CodeEditor from '@/components/CodeEditor.vue'
  56. import type { LssNodeDTO, CameraInfoDTO } from '@/types'
  57. import type { StreamForm } from '../types'
  58. const { t } = useI18n({ useScope: 'global' })
  59. defineProps<{
  60. form: StreamForm
  61. rules: FormRules
  62. isEdit: boolean
  63. submitLoading: boolean
  64. lssOptions: LssNodeDTO[]
  65. cameraOptions: CameraInfoDTO[]
  66. }>()
  67. defineEmits<{
  68. submit: []
  69. cancel: []
  70. }>()
  71. const elFormRef = ref<FormInstance>()
  72. defineExpose({
  73. formRef: elFormRef
  74. })
  75. </script>
  76. <style scoped lang="scss">
  77. .tab-content {
  78. flex: 1;
  79. min-height: 0;
  80. display: flex;
  81. flex-direction: column;
  82. overflow: hidden;
  83. }
  84. .edit-content {
  85. .drawer-body {
  86. flex: 1;
  87. overflow-y: auto;
  88. }
  89. }
  90. .drawer-body {
  91. flex: 1;
  92. overflow-y: auto;
  93. padding: 20px;
  94. }
  95. .stream-form {
  96. :deep(.el-form-item) {
  97. margin-bottom: 18px;
  98. }
  99. :deep(.el-form-item__label) {
  100. color: #606266;
  101. font-size: 14px;
  102. }
  103. }
  104. .drawer-footer {
  105. flex-shrink: 0;
  106. display: flex;
  107. justify-content: flex-end;
  108. padding: 12px 20px;
  109. border-top: 1px solid #e5e7eb;
  110. gap: 12px;
  111. }
  112. </style>