BigShow.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393
  1. <!--大屏显示组件-->
  2. <template>
  3. <div>
  4. <draggable
  5. v-for="item in currentBigshow"
  6. element="div"
  7. v-model="signalPreList"
  8. :options="dragOptions2"
  9. :class="['split_screen', bigScreenObj[item.ID].splitStatus === 0 ? 'split_screen_one' : bigScreenObj[item.ID].splitStatus === 1 ? 'split_screen_four' : bigScreenObj[item.ID].splitStatus === 2 ? 'split_screen_nine' : 'split_screen_sixteen']"
  10. :style="{
  11. float:'left',
  12. width:item.Width*bigScale + 'px',
  13. height:item.Height*bigScale + 'px',
  14. left:item.Left*bigScale+'px',
  15. top:item.Top*bigScale+'px',
  16. zIndex:item.ZIndex,
  17. display:item.IsVisibility ? 'black' : 'none',
  18. }"
  19. :id="item.ID"
  20. >
  21. <VueDragResize
  22. v-for="itemV in bigScreenObj[item.ID].signalArr" :key="itemV.Id" class="sitem"
  23. :w="itemV.width" :h="itemV.height" :parentLimitation="false"
  24. :x="itemV.left" :y="itemV.top"
  25. @dragstop="() => dragStop(itemV)"
  26. @resizestop="() => resizeSignal(itemV)"
  27. >
  28. <div ref="signal">
  29. {{itemV.deviceID}}
  30. <!--<VideoPlayer
  31. ref="videoPlayer"
  32. :options="playerOptions"
  33. :playsinline="true"
  34. />-->
  35. <div class="closeBtn" @click.stop="closeSignal(itemV)">×</div>
  36. </div>
  37. </VueDragResize>
  38. <div v-for="itemD in bigScreenObj[item.ID].bindList" :key="itemD" class="sitem2">
  39. {{itemD}}
  40. </div>
  41. </draggable>
  42. </div>
  43. </template>
  44. <script>
  45. import {mapState} from 'vuex'
  46. import draggable from 'vuedraggable'
  47. import VueDragResize from 'vue-drag-resize'
  48. import '../assets/less/splitscreen.less'
  49. import {elePosition, getElementLeft, getElementTop, getStaticFile, guId} from "../../utils/tools"
  50. import {reqRefreshView} from "../api"
  51. import VideoPlayer from "./player.vue"
  52. export default {
  53. data() {
  54. return {
  55. streamWindows:[], // 传递出去的信号源位置信息
  56. currentBigshow:[], // 当前显示的大屏
  57. playerOptions: { // rtmp视频流配置
  58. sources: [
  59. {
  60. "src": "rtmp://58.200.131.2:1935/livetv/hunantv",
  61. "type": "rtmp/flv"
  62. }
  63. ],
  64. techOrder: ['flash'],
  65. autoplay: true,
  66. controls: false,
  67. fluid:true,
  68. aspectRatio: '200:93',
  69. preload: 'auto',
  70. notSupportedMessage: '此视频暂无法播放,请稍后再试',
  71. },
  72. screenPosition:{}, // 大屏在视口中的位置
  73. }
  74. },
  75. components: {
  76. draggable,
  77. VueDragResize,
  78. VideoPlayer
  79. },
  80. async beforeCreate() {
  81. // 加载大屏json文件
  82. const bigScreenJson = await getStaticFile('EnityBigScreen.Data')
  83. // 过滤出显示的大屏
  84. this.currentBigshow = bigScreenJson.filter(item => item.IsVisibility === true)
  85. // 给大屏对象进行初始化显示
  86. const obj = {}
  87. this.currentBigshow.forEach(item => {
  88. obj[item.ID] = {
  89. bindList:[],
  90. splitStatus:0,
  91. signalArr:[],
  92. width:item.Width,
  93. height:item.Height
  94. }
  95. const num = item.BindList.length
  96. // 拼接屏数量
  97. for(let i=0;i<num;i++){
  98. obj[item.ID].bindList.push(i+1)
  99. }
  100. // 根据拼接屏数量得到分屏状态
  101. obj[item.ID].splitStatus = Math.floor(Math.sqrt(num)-1)
  102. })
  103. this.$store.dispatch('updateBigscreenObj',obj)
  104. },
  105. updated() {
  106. // 获取大屏在视口中的位置
  107. this.currentBigshow.forEach(item => {
  108. const screenDiv = document.getElementById(item.ID)
  109. this.screenPosition[item.ID] = {
  110. top:getElementTop(screenDiv),
  111. left:getElementLeft(screenDiv)
  112. }
  113. })
  114. },
  115. methods: {
  116. // 大屏开窗接口提交
  117. reqRefreshBigScreen(arr) {
  118. /*const streamWindows = []
  119. setTimeout(async () => {
  120. const elementArr = this.$refs.signal ? this.$refs.signal.filter(item => item.clientWidth !== 0) : []
  121. if(elementArr){
  122. elementArr.forEach((item,index) => {
  123. // 获取元素绝对位置的横坐标和纵坐标
  124. const left = getElementLeft(item)
  125. const top = getElementTop(item)
  126. streamWindows.push({
  127. left,
  128. top,
  129. width:arr[index].width,
  130. height:arr[index].height,
  131. id:0,
  132. sourceId:arr[index].sourceId,
  133. widthScale:arr[index].width/(this.currentBigshow[0].Width*this.$store.state.bigScale),
  134. heightScale:arr[index].height/(this.currentBigshow[0].Height*this.$store.state.bigScale),
  135. orginRect:{}
  136. })
  137. })
  138. const data = {
  139. bigScreenId:this.currentBigshow[0].ID,
  140. streamWindows
  141. }
  142. this.streamWindows = streamWindows
  143. // 调用大屏开窗接口
  144. await reqRefreshView(data)
  145. }
  146. })*/
  147. },
  148. // 拖动结束
  149. dragStop(item) {
  150. const arr2 = this.$store.state.signalPreList
  151. this.reqRefreshBigScreen(arr2)
  152. },
  153. // 缩放结束
  154. async resizeSignal(itemV) {
  155. /*const arr = this.$data.streamWindows
  156. // 找出当前改动的信号源
  157. const currentItem = arr.filter(item => item.sourceId === itemV.sourceId)
  158. currentItem[0].width = obj.width
  159. currentItem[0].height = obj.height
  160. currentItem[0].widthScale = obj.width/(this.currentBigshow[0].Width*this.$store.state.bigScale)
  161. currentItem[0].heightScale = obj.height/(this.currentBigshow[0].Height*this.$store.state.bigScale)
  162. const otherItems = arr.filter(item => item.sourceId !== itemV.sourceId)
  163. const newStreamWindows = [...currentItem,...otherItems]
  164. this.streamWindows = newStreamWindows
  165. this.reqRefreshBigScreen(newStreamWindows)*/
  166. },
  167. // 关闭信号源
  168. closeSignal(signal) {
  169. const bigscreenId = signal.bigscreenId
  170. const bigScreenObj = this.$store.state.bigScreenObj
  171. // 1.找出是哪个大屏下的信号源发生了改变,过滤掉删除的那个
  172. const newSignalPreList = this.bigScreenObj[bigscreenId].signalArr.filter(item => item.Id !== signal.Id)
  173. // 2.重新赋值
  174. bigScreenObj[bigscreenId].signalArr = newSignalPreList
  175. },
  176. },
  177. computed: {
  178. ...mapState(['splitScreenStatus', 'bigScale','positionNum','curOpeBigscreenId','bigScreenObj']),
  179. /*signalPreList: {
  180. get() {
  181. return this.$store.state.signalPreList
  182. },
  183. set(arr) {
  184. let len = arr.length
  185. const positionNum = this.$store.state.positionNum
  186. if(len>0){
  187. // 对监视的信号源数组进行深度克隆,解决赋加Id一样的问题
  188. const arr2 = []
  189. arr.forEach(item => {arr2.push(JSON.parse(JSON.stringify(item)))})
  190. // 删除数据的最后一项,重新赋值再添加
  191. arr2.pop()
  192. // 给新增的信号源进行赋值
  193. const signalObj = arr[len-1]
  194. signalObj.Id = guId()
  195. signalObj.splitScreenStatus = this.$store.state.splitScreenStatus + 1
  196. signalObj.width = this.currentBigshow[0].Width * this.$store.state.bigScale / (this.$store.state.splitScreenStatus+1)
  197. signalObj.height = this.currentBigshow[0].Height * this.$store.state.bigScale / (this.$store.state.splitScreenStatus+1)
  198. signalObj.widthScale = signalObj.width / (this.currentBigshow[0].Width * this.$store.state.bigScale)
  199. signalObj.heightScale = signalObj.height / (this.currentBigshow[0].Height * this.$store.state.bigScale)
  200. let width = this.currentBigshow[0].Width*this.$store.state.bigScale/(signalObj.splitScreenStatus)
  201. let height = this.currentBigshow[0].Height*this.$store.state.bigScale/(signalObj.splitScreenStatus)
  202. const res = elePosition(width,height,positionNum,this.screenPosition.top,this.screenPosition.left,this.$store.state.splitScreenStatus+1)
  203. signalObj.top = res.top - this.screenPosition.top
  204. signalObj.left = res.left - this.screenPosition.left
  205. this.$store.dispatch('updateSignalPreList', [...arr2,signalObj])
  206. }else {
  207. this.$store.dispatch('updateSignalPreList', arr)
  208. }
  209. }
  210. },*/
  211. /*signals: {
  212. get() {
  213. return this.signals
  214. },
  215. set(arr) {
  216. const val = this.$store.state.bigScreenObj
  217. const bigscreenId = this.$store.state.curOpeBigscreenId
  218. const bigScale = this.$store.state.bigScale
  219. const positionNum = this.$store.state.positionNum
  220. let len = arr.length
  221. if(len){
  222. const arr2 = []
  223. arr.forEach(item => {arr2.push(JSON.parse(JSON.stringify(item)))})
  224. arr2.pop()
  225. const lastObj = arr[len-1]
  226. lastObj.Id = guId()
  227. lastObj.splitScreenStatus = val[bigscreenId].splitStatus + 1
  228. lastObj.width = val[bigscreenId].width * bigScale / lastObj.splitScreenStatus
  229. lastObj.height = val[bigscreenId].height * bigScale / lastObj.splitScreenStatus
  230. lastObj.widthScale = lastObj.width / (val[bigscreenId].width * bigScale)
  231. lastObj.heightScale = lastObj.height / (val[bigscreenId].height * bigScale)
  232. const positionInfo = elePosition(lastObj.width,lastObj.height,positionNum,this.screenPosition[bigscreenId].top,this.screenPosition[bigscreenId].left,val[bigscreenId].splitStatus+1)
  233. lastObj.top = positionInfo.top - this.screenPosition[bigscreenId].top
  234. lastObj.left = positionInfo.left - this.screenPosition[bigscreenId].left
  235. console.log([...arr2,lastObj])
  236. // val[bigscreenId].signalArr = [...arr2,lastObj]
  237. // this.$store.dispatch('updateBigscreenObj',val)
  238. /!*signals.push(signalObj)
  239. console.log(val)
  240. this.$store.dispatch('updateBigscreenObj',val)*!/
  241. }
  242. }
  243. },*/
  244. signalPreList: {
  245. get() {
  246. return this.$store.getters.currentSignalArr
  247. },
  248. set(arr) {
  249. const bigscreenId = this.$store.state.curOpeBigscreenId
  250. const bigScreenObj = this.$store.state.bigScreenObj
  251. const bigScale = this.$store.state.bigScale
  252. const positionNum = this.$store.state.positionNum
  253. const arr2 = []
  254. arr.forEach(item => {
  255. arr2.push(JSON.parse(JSON.stringify(item)))
  256. })
  257. let lastObj = arr2[arr.length-1]
  258. lastObj.Id = guId()
  259. lastObj.bigscreenId = bigscreenId
  260. lastObj.splitScreenStatus = bigScreenObj[bigscreenId].splitStatus + 1
  261. lastObj.width = bigScreenObj[bigscreenId].width * bigScale / lastObj.splitScreenStatus
  262. lastObj.height = bigScreenObj[bigscreenId].height * bigScale / lastObj.splitScreenStatus
  263. lastObj.widthScale = lastObj.width / (bigScreenObj[bigscreenId].width * bigScale)
  264. lastObj.heightScale = lastObj.height / (bigScreenObj[bigscreenId].height * bigScale)
  265. const positionInfo = elePosition(lastObj.width,lastObj.height,positionNum,this.screenPosition[bigscreenId].top,this.screenPosition[bigscreenId].left,bigScreenObj[bigscreenId].splitStatus+1)
  266. lastObj.top = positionInfo.top - this.screenPosition[bigscreenId].top
  267. lastObj.left = positionInfo.left - this.screenPosition[bigscreenId].left
  268. bigScreenObj[bigscreenId].signalArr = arr2
  269. console.log(bigScreenObj)
  270. /*bigScreenObj[bigscreenId].signalArr = arr
  271. console.log(arr,bigScreenObj)
  272. this.$store.dispatch('updateBigscreenObj',bigScreenObj)*/
  273. }
  274. },
  275. // 拖拽选线配置
  276. dragOptions1() {
  277. return {
  278. animation: 0,
  279. group: {
  280. name: "description",
  281. pull: 'clone',
  282. put: false
  283. },
  284. ghostClass: "ghost",
  285. }
  286. },
  287. dragOptions2() {
  288. return {
  289. animation: 0,
  290. group: "description",
  291. disabled:false,
  292. sort:false,
  293. }
  294. },
  295. player() {
  296. return this.$refs.videoPlayer.player
  297. }
  298. },
  299. watch: {
  300. // 监视大屏对象的变化(深度监视)
  301. bigScreenObj: {
  302. handler: function (val) {
  303. const bigscreenId = this.$store.state.curOpeBigscreenId
  304. const bigScale = this.$store.state.bigScale
  305. const positionNum = this.$store.state.positionNum
  306. if(bigscreenId){
  307. }
  308. /*
  309. if(bigscreenId){
  310. /!*const arr = val[bigscreenId].signalArr
  311. let len = arr.length
  312. if(len){
  313. // 给新增的信号源进行赋值
  314. const signalObj = arr[len-1]
  315. signalObj.Id = guId()
  316. signalObj.splitScreenStatus = val[bigscreenId].splitStatus + 1
  317. signalObj.width = val[bigscreenId].width * bigScale / signalObj.splitScreenStatus
  318. signalObj.height = val[bigscreenId].height * bigScale / signalObj.splitScreenStatus
  319. signalObj.widthScale = signalObj.width / (val[bigscreenId].width * bigScale)
  320. signalObj.heightScale = signalObj.height / (val[bigscreenId].height * bigScale)
  321. const positionInfo = elePosition(signalObj.width,signalObj.height,positionNum,this.screenPosition[bigscreenId].top,this.screenPosition[bigscreenId].left,val[bigscreenId].splitStatus+1)
  322. signalObj.top = positionInfo.top - this.screenPosition[bigscreenId].top
  323. signalObj.left = positionInfo.left- this.screenPosition[bigscreenId].left
  324. }*!/
  325. const arr = []
  326. val[bigscreenId].signalArr.forEach(item => {
  327. arr.push(JSON.parse(JSON.stringify(item)))
  328. })
  329. arr.forEach(item => {
  330. item.Id = guId()
  331. item.splitScreenStatus = val[bigscreenId].splitStatus + 1
  332. item.width = val[bigscreenId].width * bigScale / item.splitScreenStatus
  333. item.height = val[bigscreenId].height * bigScale / item.splitScreenStatus
  334. item.widthScale = item.width / (val[bigscreenId].width * bigScale)
  335. item.heightScale = item.height / (val[bigscreenId].height * bigScale)
  336. const positionInfo = elePosition(item.width,item.height,positionNum,this.screenPosition[bigscreenId].top,this.screenPosition[bigscreenId].left,val[bigscreenId].splitStatus+1)
  337. item.top = positionInfo.top - this.screenPosition[bigscreenId].top
  338. item.left = positionInfo.left- this.screenPosition[bigscreenId].left
  339. })
  340. }*/
  341. },
  342. deep:true
  343. },
  344. // 监视大屏中的信号源,只要变动,就调用回调函数
  345. signalPreList: function (arr) {
  346. this.reqRefreshBigScreen(arr)
  347. },
  348. // 监视分屏的状态
  349. splitScreenStatus: function(num) {
  350. this.$data.bindList = []
  351. for (let i=0;i<(num+1)*(num+1);i++){
  352. this.$data.bindList.push(i+1)
  353. }
  354. this.reqRefreshBigScreen(this.$data.streamWindows)
  355. }
  356. }
  357. }
  358. </script>