Commit b27f4f977541d254b809364e85985e0059c17e5e

Authored by fengwotao
1 parent c8eb67f7

feat(src/packages): 信息下的摄像头,修改流媒体获取方式

@@ -12,7 +12,8 @@ enum Api { @@ -12,7 +12,8 @@ enum Api {
12 BASEORIGINATION = '/organization/me/list/', 12 BASEORIGINATION = '/organization/me/list/',
13 VIDEO = '/video/list', 13 VIDEO = '/video/list',
14 DEVICE_PROFILE = '/device_profile/me/list', 14 DEVICE_PROFILE = '/device_profile/me/list',
15 - DEVICE = '/device' 15 + DEVICE = '/device',
  16 + VIDEOURL = '/video/url/'
16 } 17 }
17 18
18 export const getDictItemByCode = (value: string) => { 19 export const getDictItemByCode = (value: string) => {
@@ -99,3 +100,9 @@ export const getDeviceList = (params: any, data?: object) => @@ -99,3 +100,9 @@ export const getDeviceList = (params: any, data?: object) =>
99 params, 100 params,
100 data 101 data
101 }) 102 })
  103 +
  104 +//获取平台视频流播放地址
  105 +export const getVideoUrl = (id: string) =>
  106 + defHttp.get({
  107 + url: `${Api.VIDEOURL}${id}`
  108 + })
@@ -11,7 +11,8 @@ export enum sourceTypeEnum { @@ -11,7 +11,8 @@ export enum sourceTypeEnum {
11 export const option = { 11 export const option = {
12 dataset: [ 12 dataset: [
13 { 13 {
14 - url: '', 14 + byIdUrl: '', //通过接口获取的url
  15 + url: '', //直接获取视频列表的url
15 sourceType: 'custom', 16 sourceType: 'custom',
16 organization: '' 17 organization: ''
17 } 18 }
@@ -28,13 +28,17 @@ @@ -28,13 +28,17 @@
28 key-field="id" 28 key-field="id"
29 children-field="children" 29 children-field="children"
30 :options="originationOption" 30 :options="originationOption"
31 - @update:value="handleUpdateTreeValue($event, item)" 31 + @update:value="handleUpdateTreeValue($event)"
32 /> 32 />
33 </setting-item> 33 </setting-item>
34 </setting-item-box> 34 </setting-item-box>
35 <setting-item-box v-if="item.sourceType === sourceTypeEnum.PLATFORM" name="视频" :alone="true"> 35 <setting-item-box v-if="item.sourceType === sourceTypeEnum.PLATFORM" name="视频" :alone="true">
36 <setting-item> 36 <setting-item>
37 - <n-select v-model:value="item.url" :options="videoOptions" /> 37 + <n-select
  38 + v-model:value="item.url"
  39 + @update:value="(value:string,e:any) => handleSelect(value,e, index)"
  40 + :options="videoOptions"
  41 + />
38 </setting-item> 42 </setting-item>
39 </setting-item-box> 43 </setting-item-box>
40 <n-button size="small" @click="optionData.dataset.splice(index, 1)"> - </n-button> 44 <n-button size="small" @click="optionData.dataset.splice(index, 1)"> - </n-button>
@@ -43,7 +47,7 @@ @@ -43,7 +47,7 @@
43 style="margin-left: 10px" 47 style="margin-left: 10px"
44 v-if="optionData.dataset.length < 9" 48 v-if="optionData.dataset.length < 9"
45 size="small" 49 size="small"
46 - @click="optionData.dataset.push({ url: '', sourceType: 'custom', organization: '' })" 50 + @click="optionData.dataset.push({ url: '', sourceType: 'custom', organization: '', byIdUrl: '' })"
47 > 51 >
48 + 52 +
49 </n-button> 53 </n-button>
@@ -54,7 +58,7 @@ @@ -54,7 +58,7 @@
54 import { PropType, ref, onMounted } from 'vue' 58 import { PropType, ref, onMounted } from 'vue'
55 import { option, sourceTypeEnum } from './config' 59 import { option, sourceTypeEnum } from './config'
56 import { CollapseItem, SettingItemBox, SettingItem } from '@/components/Pages/ChartItemSetting' 60 import { CollapseItem, SettingItemBox, SettingItem } from '@/components/Pages/ChartItemSetting'
57 -import { getOrganizationList, getVideoList } from '@/api/external/common/index' 61 +import { getOrganizationList, getVideoList, getVideoUrl } from '@/api/external/common/index'
58 import { NTreeSelect } from 'naive-ui' 62 import { NTreeSelect } from 'naive-ui'
59 63
60 const props = defineProps({ 64 const props = defineProps({
@@ -84,13 +88,18 @@ const getOriginationList = async () => { @@ -84,13 +88,18 @@ const getOriginationList = async () => {
84 originationOption.value = res 88 originationOption.value = res
85 } 89 }
86 90
87 -const handleUpdateTreeValue = (e: any, value: object) => { 91 +const handleUpdateTreeValue = (e: any) => {
88 getVideoLists(e) 92 getVideoLists(e)
89 } 93 }
90 94
91 const getVideoLists = async (organizationId: string) => { 95 const getVideoLists = async (organizationId: string) => {
92 const res = await getVideoList({ organizationId }) 96 const res = await getVideoList({ organizationId })
93 - videoOptions.value = res?.data?.map((item: any) => ({ label: item.name, value: item.videoUrl })) 97 + videoOptions.value = res?.data?.map((item: any) => ({
  98 + label: item.name,
  99 + value: item.accessMode === 1 ? item.id : item.videoUrl,
  100 + id: item.id,
  101 + accessMode: item.accessMode
  102 + }))
94 } 103 }
95 104
96 const handleChecked = ({ target }: any, values: object) => { 105 const handleChecked = ({ target }: any, values: object) => {
@@ -100,6 +109,24 @@ const handleChecked = ({ target }: any, values: object) => { @@ -100,6 +109,24 @@ const handleChecked = ({ target }: any, values: object) => {
100 } 109 }
101 } 110 }
102 111
  112 +const getVideoUrlById = async (e: any, id: string, index: number) => {
  113 + const res = await getVideoUrl(id)
  114 + if (!res) return
  115 + const { url } = res.data
  116 + props.optionData.dataset.forEach((item: any, itemIndex: number) => {
  117 + if (itemIndex === index) {
  118 + item.byIdUrl = url
  119 + }
  120 + })
  121 +}
  122 +
  123 +const handleSelect = (value: string, e: any, index: number) => {
  124 + const { accessMode, id } = e
  125 + if (accessMode === 1) {
  126 + getVideoUrlById(e, id, index)
  127 + }
  128 +}
  129 +
103 onMounted(() => { 130 onMounted(() => {
104 props.optionData.dataset.forEach((item: any) => { 131 props.optionData.dataset.forEach((item: any) => {
105 if (item.sourceType === sourceTypeEnum.PLATFORM) { 132 if (item.sourceType === sourceTypeEnum.PLATFORM) {
1 <template> 1 <template>
2 - <div  
3 - @mouseenter="handleMouseenter"  
4 - @mouseleave="handleMouseleave"  
5 - class="banner-box" ref="root"> 2 + <div @mouseenter="handleMouseenter" @mouseleave="handleMouseleave" class="banner-box" ref="root">
6 <div class="wrapper"> 3 <div class="wrapper">
7 <div v-for="(item, index) in option.dataset" :key="index + item" :class="item.className" :style="item.sty"> 4 <div v-for="(item, index) in option.dataset" :key="index + item" :class="item.className" :style="item.sty">
8 <CameraItem 5 <CameraItem
@@ -10,7 +7,7 @@ @@ -10,7 +7,7 @@
10 :name="item.name" 7 :name="item.name"
11 :avatar="item.avatar" 8 :avatar="item.avatar"
12 :key="item + index" 9 :key="item + index"
13 - :sourceSrc="item.url" 10 + :sourceSrc="!item.byIdUrl ? item.url : item.byIdUrl"
14 :w="w" 11 :w="w"
15 :h="h" 12 :h="h"
16 :index="index" 13 :index="index"
@@ -70,10 +70,14 @@ watch( @@ -70,10 +70,14 @@ watch(
70 () => props.path, 70 () => props.path,
71 () => { 71 () => {
72 if (props.path && props.autoPlay) { 72 if (props.path && props.autoPlay) {
73 - player?.pause()  
74 - player?.load()  
75 - player?.src(props.path)  
76 - player?.play() 73 + try {
  74 + player?.pause()
  75 + player?.load()
  76 + player?.src(props.path)
  77 + player?.play()
  78 + } catch (e) {
  79 + console.log(e)
  80 + }
77 } 81 }
78 }, 82 },
79 { 83 {
@@ -9,6 +9,7 @@ export enum sourceTypeEnum { @@ -9,6 +9,7 @@ export enum sourceTypeEnum {
9 } 9 }
10 10
11 export const option = { 11 export const option = {
  12 + url:'',
12 dataset: '', 13 dataset: '',
13 autoplay: false, 14 autoplay: false,
14 poster: '', 15 poster: '',
@@ -55,7 +55,7 @@ @@ -55,7 +55,7 @@
55 </setting-item-box> 55 </setting-item-box>
56 <setting-item-box v-if="optionData.sourceType === sourceTypeEnum.PLATFORM" name="视频" :alone="true"> 56 <setting-item-box v-if="optionData.sourceType === sourceTypeEnum.PLATFORM" name="视频" :alone="true">
57 <setting-item> 57 <setting-item>
58 - <n-select v-model:value="optionData.dataset" :options="videoOptions" /> 58 + <n-select @update:value="handleSelect" v-model:value="optionData.dataset" :options="videoOptions" />
59 </setting-item> 59 </setting-item>
60 </setting-item-box> 60 </setting-item-box>
61 <setting-item-box name="自动播放"> 61 <setting-item-box name="自动播放">
@@ -75,7 +75,7 @@ import { uploadFile } from '@/api/external/contentSave/content' @@ -75,7 +75,7 @@ import { uploadFile } from '@/api/external/contentSave/content'
75 import { UploadCustomRequestOptions, NTreeSelect } from 'naive-ui' 75 import { UploadCustomRequestOptions, NTreeSelect } from 'naive-ui'
76 import { backgroundImageSize } from '@/settings/designSetting' 76 import { backgroundImageSize } from '@/settings/designSetting'
77 import { fetchRouteParamsLocation } from '@/utils' 77 import { fetchRouteParamsLocation } from '@/utils'
78 -import { getOrganizationList, getVideoList } from '@/api/external/common/index' 78 +import { getOrganizationList, getVideoList, getVideoUrl } from '@/api/external/common/index'
79 79
80 const props = defineProps({ 80 const props = defineProps({
81 optionData: { 81 optionData: {
@@ -113,16 +113,38 @@ const handleUpdateTreeValue = (value: string) => { @@ -113,16 +113,38 @@ const handleUpdateTreeValue = (value: string) => {
113 113
114 const getVideoLists = async (organizationId: string) => { 114 const getVideoLists = async (organizationId: string) => {
115 const res = await getVideoList({ organizationId }) 115 const res = await getVideoList({ organizationId })
116 - videoOptions.value = res?.data?.map((item: any) => ({ label: item.name, value: item.videoUrl })) 116 + videoOptions.value = res?.data?.map((item: any) => ({
  117 + label: item.name,
  118 + value: item.accessMode === 1 ? item.id : item.videoUrl,
  119 + id: item.id,
  120 + accessMode: item.accessMode
  121 + }))
  122 +}
  123 +
  124 +const getVideoUrlById = async (id: string) => {
  125 + const res = await getVideoUrl(id)
  126 + if (!res) return
  127 + const { url } = res.data
  128 + props.optionData.url = url
117 } 129 }
118 130
119 const handleChecked = ({ target }: any) => { 131 const handleChecked = ({ target }: any) => {
  132 + props.optionData.dataset = ''
120 const { value } = target 133 const { value } = target
121 if (value === sourceTypeEnum.PLATFORM) { 134 if (value === sourceTypeEnum.PLATFORM) {
122 getOriginationList() 135 getOriginationList()
123 } 136 }
124 } 137 }
125 138
  139 +const handleSelect = (value: string, e: any) => {
  140 + const { accessMode, id } = e
  141 + if (accessMode === 1) {
  142 + getVideoUrlById(id)
  143 + } else {
  144 + props.optionData.url = ''
  145 + }
  146 +}
  147 +
126 onMounted(() => { 148 onMounted(() => {
127 if (props.optionData.sourceType === sourceTypeEnum.PLATFORM) { 149 if (props.optionData.sourceType === sourceTypeEnum.PLATFORM) {
128 getOriginationList() 150 getOriginationList()
@@ -18,7 +18,7 @@ const props = defineProps({ @@ -18,7 +18,7 @@ const props = defineProps({
18 18
19 const { h } = toRefs(props.chartConfig.attr) 19 const { h } = toRefs(props.chartConfig.attr)
20 20
21 -const { autoplay, dataset, poster } = toRefs(props.chartConfig.option) 21 +const { autoplay, dataset, poster, url } = toRefs(props.chartConfig.option)
22 22
23 const option = shallowReactive({ 23 const option = shallowReactive({
24 dataset: configOption.dataset, 24 dataset: configOption.dataset,
@@ -28,7 +28,11 @@ const option = shallowReactive({ @@ -28,7 +28,11 @@ const option = shallowReactive({
28 watch( 28 watch(
29 () => dataset?.value, 29 () => dataset?.value,
30 (newData: string) => { 30 (newData: string) => {
31 - option.dataset = newData 31 + if (url.value) {
  32 + option.dataset = url.value
  33 + } else {
  34 + option.dataset = newData
  35 + }
32 }, 36 },
33 { 37 {
34 immediate: true 38 immediate: true