可视化门禁页面逻辑修改

This commit is contained in:
15683799673 2025-08-07 23:14:13 +08:00
parent e82a42b6a9
commit 73232037cc
2 changed files with 102 additions and 28 deletions

View File

@ -9,14 +9,7 @@ defineOptions({ inheritAttrs: false });
withDefaults(defineProps<{ showSearch?: boolean }>(), { showSearch: true }); withDefaults(defineProps<{ showSearch?: boolean }>(), { showSearch: true });
const emit = defineEmits<{ const emit = defineEmits(['checked', 'reload', 'select']);
checked: [];
/**
* 点击节点的事件
*/
reload: [];
select: [];
}>();
const searchValue = defineModel('searchValue', { const searchValue = defineModel('searchValue', {
type: String, type: String,
@ -39,6 +32,7 @@ async function loadChannelTree() {
function handleNode(nodes: any[], level: number) { function handleNode(nodes: any[], level: number) {
nodes.forEach((node) => { nodes.forEach((node) => {
node.key = node.id;
if (node.level < level) { if (node.level < level) {
node.disabled = true; node.disabled = true;
} }
@ -107,7 +101,13 @@ function checkNodeData() {
const checkData: any = {}; const checkData: any = {};
/**
* 树选中时间
* @param _keys 当前选中的节点key
* @param nodes 当前选中的节点
*/
function onTreeCheck(_keys: any, nodes: any) { function onTreeCheck(_keys: any, nodes: any) {
// nodes
const { checked, checkedNodes } = nodes; const { checked, checkedNodes } = nodes;
// //
checkedNodes.forEach((node: any) => { checkedNodes.forEach((node: any) => {
@ -119,8 +119,7 @@ function onTreeCheck(_keys: any, nodes: any) {
delete checkData[id]; delete checkData[id];
} }
}); });
const data = toRaw(checkedNodes); emit('checked', _keys, nodes);
emit('checked', checked, data);
} }
onMounted(loadChannelTree); onMounted(loadChannelTree);

View File

@ -1,7 +1,7 @@
<template> <template>
<Page :auto-content-height="true"> <Page :auto-content-height="true">
<div class="flex h-full gap-[8px]"> <div class="flex h-full gap-[8px]">
<DpTree class="h-[87vh] w-[300px]" @checked="onNodeChecked" /> <DpTree class="h-full w-[300px]" @checked="onNodeChecked" />
<div class="bg-background flex-1"> <div class="bg-background flex-1">
<div class="video-play-area flex h-full flex-wrap"> <div class="video-play-area flex h-full flex-wrap">
<div <div
@ -27,7 +27,7 @@
<script setup lang="ts"> <script setup lang="ts">
import DpTree from './dp-tree.vue'; import DpTree from './dp-tree.vue';
import { Page } from '@vben/common-ui'; import { Page } from '@vben/common-ui';
import { ref } from 'vue'; import { onMounted, ref, toRaw } from 'vue';
import mpegts from 'mpegts.js'; import mpegts from 'mpegts.js';
import { addStreamProxy } from '#/api/sis/stream'; import { addStreamProxy } from '#/api/sis/stream';
import { message } from 'ant-design-vue'; import { message } from 'ant-design-vue';
@ -36,13 +36,13 @@ import { message } from 'ant-design-vue';
* 屏幕播放器数量 * 屏幕播放器数量
*/ */
const selected = 'selected'; const selected = 'selected';
const playerNum = ref(4); const playerNum = ref(1);
/** /**
* 屏幕播放器样式 * 屏幕播放器样式
*/ */
const playerStyle = ref({ const playerStyle = ref({
width: '50%', width: '100%',
height: '50%', height: '100%',
}); });
const currentSelectPlayerIndex = ref(-1); const currentSelectPlayerIndex = ref(-1);
@ -61,22 +61,77 @@ const setItemRef = (el: any) => {
} }
}; };
function onNodeChecked(checked, nodes: any[]) { /**
* 处理带有子节点的数据
* @param node
* @param newNode
*/
function handleParentNoe(node: any, newNode: any[] = []) {
node.forEach((item: any) => {
if (item.level === 6) {
newNode.push(toRaw(item.data));
}
if (item.children && item.children.length >= 1) {
handleParentNoe(item.children, newNode);
}
})
}
/**
* 节点选中时间处理
* @param _val 选中节点id
* @param checked 是否选中
* @param node 节点数据
*/
function onNodeChecked(
_val: any,
{ checked, node }: { checked: boolean; node: any },
) {
//
let checkNode: any = [];
handleParentNoe([node], checkNode);
//
if (checked) { if (checked) {
console.log(nodes); /**
nodes.forEach((node: any) => { * 如果当前页面有选择播放未知并且播放视频只有一个则播放到制定位置
const { data, level } = node; */
// if (currentSelectPlayerIndex.value !== -1 && checkNode.length == 1) {
if (level == 6) { doPlayer(checkNode[0], currentSelectPlayerIndex.value - 1);
const index = }
currentSelectPlayerIndex.value === -1 // currentSelectPlayerIndex
? 0 else {
: currentSelectPlayerIndex.value; //
doPlayer(data, index); const freeArr: number[] = []; //
for (let i = 0; i < playerNum.value; i++) {
const playerData = playerList[i];
if (!playerData) {
freeArr.push(i);
}
}
//
if (checkNode.length <= freeArr.length) {
for (let j = 0; j < checkNode.length; j++) {
doPlayer(checkNode[j], freeArr[j]);
}
}
//
else {
for (let i = 0; i < playerNum.value; i++) {
doPlayer(checkNode[i], i);
}
}
}
}
//
else {
checkNode.forEach((item: any) => {
for (let i = 0; i < playerNum.value; i++) {
const player = playerList[i];
if (player && player.data.id === item.id) {
closePlayer(i);
}
} }
}); });
} else {
} }
} }
@ -129,6 +184,7 @@ function doPlayer(nodeData: any, index: number = 0) {
playerList[index] = { playerList[index] = {
player, player,
data: nodeData, data: nodeData,
el: videoElement,
}; };
} else { } else {
console.log('视频播放元素获取异常'); console.log('视频播放元素获取异常');
@ -169,6 +225,7 @@ function changeElPlayer(playerInfo: any, index: number) {
playerList[index] = { playerList[index] = {
player, player,
data: playerData, data: playerData,
el: videoElement,
}; };
} else { } else {
console.log('视频播放元素获取异常'); console.log('视频播放元素获取异常');
@ -202,6 +259,24 @@ function closePlayer(index: number) {
} }
} }
} }
function catchUp() {
playerList.forEach((playerData) => {
if (playerData) {
const { player, el } = playerData;
const end = player.buffered.end(player.buffered.length - 1);
const diff = end - el.currentTime;
if (diff > 2) {
// 2
el.currentTime = end - 0.5; //
}
}
});
}
onMounted(() => {
setInterval(catchUp, 10000);
});
</script> </script>
<style> <style>
.player { .player {