fix(aiot): 删除实时视频模块
删除 views/aiot/video 和 api/aiot/video 目录, 撤回 auth.ts 中的菜单过滤逻辑。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,43 +0,0 @@
|
|||||||
import { wvpRequestClient } from '#/api/aiot/request';
|
|
||||||
|
|
||||||
export namespace AiotVideoApi {
|
|
||||||
/** 流信息 */
|
|
||||||
export interface StreamInfo {
|
|
||||||
app?: string;
|
|
||||||
stream?: string;
|
|
||||||
ip?: string;
|
|
||||||
flv?: string;
|
|
||||||
ws_flv?: string;
|
|
||||||
rtmp?: string;
|
|
||||||
hls?: string;
|
|
||||||
rtsp?: string;
|
|
||||||
mediaServerId?: string;
|
|
||||||
tracks?: StreamTrack[];
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface StreamTrack {
|
|
||||||
codec_id?: number;
|
|
||||||
codec_id_name?: string;
|
|
||||||
ready?: boolean;
|
|
||||||
type?: number;
|
|
||||||
width?: number;
|
|
||||||
height?: number;
|
|
||||||
fps?: number;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ==================== 视频播放 API ====================
|
|
||||||
|
|
||||||
/** 开始播放 */
|
|
||||||
export function playStart(deviceId: string, channelId: string) {
|
|
||||||
return wvpRequestClient.get<AiotVideoApi.StreamInfo>(
|
|
||||||
`/aiot/video/play/start/${deviceId}/${channelId}`,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** 停止播放 */
|
|
||||||
export function playStop(deviceId: string, channelId: string) {
|
|
||||||
return wvpRequestClient.get(
|
|
||||||
`/aiot/video/play/stop/${deviceId}/${channelId}`,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -138,18 +138,7 @@ export const useAuthStore = defineStore('auth', () => {
|
|||||||
userStore.setUserInfo(authPermissionInfo.user);
|
userStore.setUserInfo(authPermissionInfo.user);
|
||||||
userStore.setUserRoles(authPermissionInfo.roles);
|
userStore.setUserRoles(authPermissionInfo.roles);
|
||||||
// accessStore
|
// accessStore
|
||||||
// 过滤掉 visible=false 的菜单项(含子菜单递归过滤)
|
accessStore.setAccessMenus(authPermissionInfo.menus);
|
||||||
const filterVisibleMenus = (menus: any[]): any[] => {
|
|
||||||
return menus
|
|
||||||
.filter((menu) => menu.visible !== false)
|
|
||||||
.map((menu) => ({
|
|
||||||
...menu,
|
|
||||||
children: menu.children
|
|
||||||
? filterVisibleMenus(menu.children)
|
|
||||||
: undefined,
|
|
||||||
}));
|
|
||||||
};
|
|
||||||
accessStore.setAccessMenus(filterVisibleMenus(authPermissionInfo.menus));
|
|
||||||
accessStore.setAccessCodes(authPermissionInfo.permissions);
|
accessStore.setAccessCodes(authPermissionInfo.permissions);
|
||||||
return authPermissionInfo;
|
return authPermissionInfo;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,112 +0,0 @@
|
|||||||
<script setup lang="ts">
|
|
||||||
import type { AiotVideoApi } from '#/api/aiot/video';
|
|
||||||
|
|
||||||
import { ref } from 'vue';
|
|
||||||
|
|
||||||
import { Page } from '@vben/common-ui';
|
|
||||||
|
|
||||||
import { Button, Card, Input, message, Select, Space } from 'ant-design-vue';
|
|
||||||
|
|
||||||
import { playStart, playStop } from '#/api/aiot/video';
|
|
||||||
|
|
||||||
defineOptions({ name: 'AiotVideoLive' });
|
|
||||||
|
|
||||||
const deviceId = ref('');
|
|
||||||
const channelId = ref('');
|
|
||||||
const streamInfo = ref<AiotVideoApi.StreamInfo | null>(null);
|
|
||||||
const loading = ref(false);
|
|
||||||
const playing = ref(false);
|
|
||||||
|
|
||||||
/** 开始播放 */
|
|
||||||
async function handlePlay() {
|
|
||||||
if (!deviceId.value || !channelId.value) {
|
|
||||||
message.warning('请输入设备ID和通道ID');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
loading.value = true;
|
|
||||||
try {
|
|
||||||
const info = await playStart(deviceId.value, channelId.value);
|
|
||||||
streamInfo.value = info;
|
|
||||||
playing.value = true;
|
|
||||||
message.success('播放请求已发送');
|
|
||||||
} catch (error) {
|
|
||||||
console.error('播放失败:', error);
|
|
||||||
message.error('播放失败');
|
|
||||||
} finally {
|
|
||||||
loading.value = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** 停止播放 */
|
|
||||||
async function handleStop() {
|
|
||||||
if (!deviceId.value || !channelId.value) return;
|
|
||||||
|
|
||||||
try {
|
|
||||||
await playStop(deviceId.value, channelId.value);
|
|
||||||
playing.value = false;
|
|
||||||
streamInfo.value = null;
|
|
||||||
message.success('已停止播放');
|
|
||||||
} catch (error) {
|
|
||||||
console.error('停止播放失败:', error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<Page auto-content-height>
|
|
||||||
<Card title="实时视频播放">
|
|
||||||
<div class="mb-4">
|
|
||||||
<Space>
|
|
||||||
<Input
|
|
||||||
v-model:value="deviceId"
|
|
||||||
placeholder="设备ID"
|
|
||||||
style="width: 200px"
|
|
||||||
/>
|
|
||||||
<Input
|
|
||||||
v-model:value="channelId"
|
|
||||||
placeholder="通道ID"
|
|
||||||
style="width: 200px"
|
|
||||||
/>
|
|
||||||
<Button
|
|
||||||
type="primary"
|
|
||||||
:loading="loading"
|
|
||||||
:disabled="playing"
|
|
||||||
@click="handlePlay"
|
|
||||||
>
|
|
||||||
开始播放
|
|
||||||
</Button>
|
|
||||||
<Button :disabled="!playing" danger @click="handleStop">
|
|
||||||
停止播放
|
|
||||||
</Button>
|
|
||||||
</Space>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- 播放器区域 -->
|
|
||||||
<div v-if="streamInfo" class="mt-4">
|
|
||||||
<div class="mb-2 text-gray-500">
|
|
||||||
流地址:{{ streamInfo.flv || streamInfo.ws_flv || '-' }}
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
v-if="streamInfo.ws_flv || streamInfo.flv"
|
|
||||||
class="bg-black rounded"
|
|
||||||
style="width: 100%; max-width: 800px; aspect-ratio: 16/9"
|
|
||||||
>
|
|
||||||
<video
|
|
||||||
:src="streamInfo.flv"
|
|
||||||
autoplay
|
|
||||||
controls
|
|
||||||
style="width: 100%; height: 100%"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
v-else
|
|
||||||
class="flex items-center justify-center bg-gray-100 rounded"
|
|
||||||
style="width: 100%; max-width: 800px; aspect-ratio: 16/9"
|
|
||||||
>
|
|
||||||
<span class="text-gray-400">请选择通道开始播放</span>
|
|
||||||
</div>
|
|
||||||
</Card>
|
|
||||||
</Page>
|
|
||||||
</template>
|
|
||||||
Reference in New Issue
Block a user