Commit c44a27b8896b68ea494e014034af3d545add8d01
Merge branch 'fix/video-component' into 'main_dev'
fix: 视频组件视频流为必选&&视频新增loading加载 See merge request yunteng/thingskit-scada!222
Showing
2 changed files
with
63 additions
and
51 deletions
@@ -66,9 +66,13 @@ const [register, { getFieldsValue, validate, setFieldsValue }] = useForm({ | @@ -66,9 +66,13 @@ const [register, { getFieldsValue, validate, setFieldsValue }] = useForm({ | ||
66 | field: VideoFormFieldsEnum.VIDEO_ID, | 66 | field: VideoFormFieldsEnum.VIDEO_ID, |
67 | label: VideoFormFieldsNameEnum.VIDEO_ID, | 67 | label: VideoFormFieldsNameEnum.VIDEO_ID, |
68 | component: ComponentEnum.API_SELECT, | 68 | component: ComponentEnum.API_SELECT, |
69 | + required: true, | ||
69 | componentProps: ({ formModel }) => { | 70 | componentProps: ({ formModel }) => { |
70 | return { | 71 | return { |
71 | - api: getCameraList, | 72 | + api: async (params: Record<'organizationId', string>) => { |
73 | + if (!params.organizationId) return [] | ||
74 | + return await getCameraList(params) | ||
75 | + }, | ||
72 | params: { | 76 | params: { |
73 | organizationId: formModel[ContentDataFieldsEnum.ORG_ID], | 77 | organizationId: formModel[ContentDataFieldsEnum.ORG_ID], |
74 | }, | 78 | }, |
@@ -167,9 +171,10 @@ createPublicFormContext(nodeDataActinType) | @@ -167,9 +171,10 @@ createPublicFormContext(nodeDataActinType) | ||
167 | 171 | ||
168 | <style lang="less" scoped> | 172 | <style lang="less" scoped> |
169 | .form-container { | 173 | .form-container { |
174 | + @apply text-sm; | ||
175 | + | ||
176 | + :deep(.ant-divider) { | ||
170 | @apply text-sm; | 177 | @apply text-sm; |
171 | - :deep(.ant-divider) { | ||
172 | - @apply text-sm; | ||
173 | - } | ||
174 | } | 178 | } |
179 | +} | ||
175 | </style> | 180 | </style> |
1 | <script setup lang="ts"> | 1 | <script setup lang="ts"> |
2 | +import { Spin } from 'ant-design-vue' | ||
2 | import { computed, nextTick, onMounted, onUnmounted, ref, toRaw, unref } from 'vue' | 3 | import { computed, nextTick, onMounted, onUnmounted, ref, toRaw, unref } from 'vue' |
3 | import 'video.js/dist/video-js.css' | 4 | import 'video.js/dist/video-js.css' |
4 | 5 | ||
@@ -21,6 +22,7 @@ const props = defineProps<{ | @@ -21,6 +22,7 @@ const props = defineProps<{ | ||
21 | // 获取节点数据 | 22 | // 获取节点数据 |
22 | const contentDataStore = useContentDataStore() | 23 | const contentDataStore = useContentDataStore() |
23 | const { getResult } = useFingerprint() | 24 | const { getResult } = useFingerprint() |
25 | +const loading = ref(false) | ||
24 | 26 | ||
25 | const getOptions = computed<VideoJsPlayerOptions>(() => { | 27 | const getOptions = computed<VideoJsPlayerOptions>(() => { |
26 | const { config } = props || {} | 28 | const { config } = props || {} |
@@ -47,53 +49,58 @@ const playSource = ref<Record<'src' | 'type', string>>( | @@ -47,53 +49,58 @@ const playSource = ref<Record<'src' | 'type', string>>( | ||
47 | 49 | ||
48 | // 数据绑定获取的url | 50 | // 数据绑定获取的url |
49 | const handleGetVideoPlay = async () => { | 51 | const handleGetVideoPlay = async () => { |
50 | - const { dataSourceJson } = unref(videoConfig)[0] || {} | ||
51 | - const { videoOption } = dataSourceJson || {} | ||
52 | - const { id, accessMode, videoUrl, deviceId, channelId } = videoOption || {} | ||
53 | - let type = getVideoTypeByUrl(videoUrl!) | ||
54 | - let playUrl = videoUrl | ||
55 | - | ||
56 | - // 判断是否是流媒体播放 | ||
57 | - if (accessMode === VideoAccessModeEnum.Streaming && id) { | ||
58 | - const { data: { url } = { url: '' } } = await getStreamingPlayUrl(id!) | ||
59 | - playUrl = url | ||
60 | - playUrl && (type = getVideoTypeByUrl(playUrl!)) | ||
61 | - } | ||
62 | - else if (accessMode === VideoAccessModeEnum.GBT28181 && deviceId && channelId) { | ||
63 | - const { | ||
64 | - data: { flv }, | ||
65 | - } = await getVideoControlStart({ channelId, deviceId }) | 52 | + try { |
53 | + loading.value = true | ||
54 | + const { dataSourceJson } = unref(videoConfig)[0] || {} | ||
55 | + const { videoOption } = dataSourceJson || {} | ||
56 | + const { id, accessMode, videoUrl, deviceId, channelId } = videoOption || {} | ||
57 | + let type = getVideoTypeByUrl(videoUrl!) | ||
58 | + let playUrl = videoUrl | ||
59 | + // 判断是否是流媒体播放 | ||
60 | + if (accessMode === VideoAccessModeEnum.Streaming && id) { | ||
61 | + const { data: { url } = { url: '' } } = await getStreamingPlayUrl(id!) | ||
62 | + playUrl = url | ||
63 | + playUrl && (type = getVideoTypeByUrl(playUrl!)) | ||
64 | + } | ||
65 | + else if (accessMode === VideoAccessModeEnum.GBT28181 && deviceId && channelId) { | ||
66 | + const { | ||
67 | + data: { flv }, | ||
68 | + } = await getVideoControlStart({ channelId, deviceId }) | ||
66 | 69 | ||
67 | - playUrl = flv | ||
68 | - type = VideoPlayerType.flv | ||
69 | - } | 70 | + playUrl = flv |
71 | + type = VideoPlayerType.flv | ||
72 | + } | ||
70 | 73 | ||
71 | - // 判断是否是rtsp播放 | ||
72 | - if (isRtspProtocol(videoUrl!)) { | ||
73 | - const result = await getResult() | ||
74 | - const { visitorId } = result | ||
75 | - playUrl = getFlvPlayUrl(playUrl!, visitorId) | ||
76 | - withToken.value = true | ||
77 | - } | 74 | + // 判断是否是rtsp播放 |
75 | + if (isRtspProtocol(videoUrl!)) { | ||
76 | + const result = await getResult() | ||
77 | + const { visitorId } = result | ||
78 | + playUrl = getFlvPlayUrl(playUrl!, visitorId) | ||
79 | + withToken.value = true | ||
80 | + } | ||
78 | 81 | ||
79 | - playSource.value = { | ||
80 | - src: playUrl!, | ||
81 | - type, | ||
82 | - } | 82 | + playSource.value = { |
83 | + src: playUrl!, | ||
84 | + type, | ||
85 | + } | ||
83 | 86 | ||
84 | - const instance = unref(basicVideoPlayEl)?.customInit((options) => { | ||
85 | - if (unref(withToken)) { | ||
86 | - (options as any).flvjs.config.headers = { | ||
87 | - 'X-Authorization': `Bearer ${isShareMode() ? getShareJwtToken() : getJwtToken()}`, | 87 | + const instance = unref(basicVideoPlayEl)?.customInit((options) => { |
88 | + if (unref(withToken)) { | ||
89 | + (options as any).flvjs.config.headers = { | ||
90 | + 'X-Authorization': `Bearer ${isShareMode() ? getShareJwtToken() : getJwtToken()}`, | ||
91 | + } | ||
88 | } | 92 | } |
89 | - } | ||
90 | - return { | ||
91 | - ...options, | ||
92 | - sources: [toRaw(unref(playSource))], | ||
93 | - } as VideoJsPlayerOptions | ||
94 | - }) | 93 | + return { |
94 | + ...options, | ||
95 | + sources: [toRaw(unref(playSource))], | ||
96 | + } as VideoJsPlayerOptions | ||
97 | + }) | ||
95 | 98 | ||
96 | - instance?.play() | 99 | + instance?.play() |
100 | + } | ||
101 | + finally { | ||
102 | + loading.value = false | ||
103 | + } | ||
97 | } | 104 | } |
98 | 105 | ||
99 | // 默认播放 | 106 | // 默认播放 |
@@ -135,12 +142,12 @@ onUnmounted(async () => { | @@ -135,12 +142,12 @@ onUnmounted(async () => { | ||
135 | 142 | ||
136 | <template> | 143 | <template> |
137 | <div class="w-full h-full flex justify-center items-center"> | 144 | <div class="w-full h-full flex justify-center items-center"> |
138 | - <!-- <Spin :spinning="loading" wrapper-class-name="video-spin" class="w-full h-full"> --> | ||
139 | - <BasicVideoPlay | ||
140 | - ref="basicVideoPlayEl" :options="getOptions" :with-token="withToken" | ||
141 | - :immediate-init-on-mounted="false" | ||
142 | - /> | ||
143 | - <!-- </Spin> --> | 145 | + <Spin :spinning="loading"> |
146 | + <BasicVideoPlay | ||
147 | + ref="basicVideoPlayEl" :options="getOptions" :with-token="withToken" | ||
148 | + :immediate-init-on-mounted="false" | ||
149 | + /> | ||
150 | + </Spin> | ||
144 | </div> | 151 | </div> |
145 | </template> | 152 | </template> |
146 | 153 |