Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
S
saas-lab
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
EzijingWeb
saas-lab
Commits
8b6f8dd9
提交
8b6f8dd9
authored
8月 08, 2025
作者:
王鹏飞
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
feat: add restart functionality to useLive composable and update live monitor to…
feat: add restart functionality to useLive composable and update live monitor to handle camera permissions
上级
faef753a
显示空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
29 行增加
和
7 行删除
+29
-7
useLive.ts
src/composables/useLive.ts
+13
-2
useLiveMonitor.ts
src/composables/useLiveMonitor.ts
+16
-5
没有找到文件。
src/composables/useLive.ts
浏览文件 @
8b6f8dd9
...
...
@@ -37,7 +37,7 @@ export function useLive({ enabledUserMedia = true, onStart, onRecord, onStop }:
const
currentMicrophone
=
computed
(()
=>
microphones
.
value
[
0
]?.
deviceId
)
// 创建媒体流
const
{
stream
}
=
useUserMedia
({
const
{
stream
,
restart
}
=
useUserMedia
({
enabled
:
enabledUserMedia
,
constraints
:
{
video
:
{
deviceId
:
currentCamera
as
any
},
audio
:
{
deviceId
:
currentMicrophone
as
any
}
},
})
...
...
@@ -98,7 +98,18 @@ export function useLive({ enabledUserMedia = true, onStart, onRecord, onStop }:
// 停止录制
const
stop
=
()
=>
{
if
(
mediaRecorder
)
mediaRecorder
.
stop
()
mediaRecorder
=
null
}
return
{
stream
,
start
,
stop
,
startTime
,
endTime
,
duration
,
currentTime
}
// 重新开始
const
handleRestart
=
async
()
=>
{
// 停止录制
stop
()
// 重新获取流
await
restart
()
// 开始录制
start
()
}
return
{
stream
,
start
,
stop
,
restart
:
handleRestart
,
startTime
,
endTime
,
duration
,
currentTime
}
}
src/composables/useLiveMonitor.ts
浏览文件 @
8b6f8dd9
...
...
@@ -3,6 +3,7 @@ import { useLive, readBlobAsBase64 } from '@/composables/useLive'
import
{
useSocket
}
from
'@/composables/useSocket'
import
md5
from
'blueimp-md5'
import
{
ElMessageBox
}
from
'element-plus'
import
{
usePermission
}
from
'@vueuse/core'
export
function
useLiveMonitor
({
autoStart
=
false
}:
{
autoStart
?:
boolean
}
=
{})
{
const
userStore
=
useUserStore
()
...
...
@@ -24,7 +25,7 @@ export function useLiveMonitor({ autoStart = false }: { autoStart?: boolean } =
},
})
const
{
stream
,
startTime
,
start
,
stop
}
=
useLive
({
const
{
stream
,
startTime
,
start
,
stop
,
restart
}
=
useLive
({
enabledUserMedia
:
autoStart
,
onRecord
:
async
(
blob
)
=>
{
const
base64Data
=
await
readBlobAsBase64
(
blob
)
...
...
@@ -37,18 +38,28 @@ export function useLiveMonitor({ autoStart = false }: { autoStart?: boolean } =
},
})
watchEffect
(()
=>
{
if
(
autoStart
)
{
const
cameraPermission
=
usePermission
(
'camera'
)
const
showMessageBox
=
()
=>
{
ElMessageBox
.
alert
(
'本次考试要求全程开启摄像头,请点击‘确定’允许摄像头访问,以便正常参加考试。'
,
'温馨提示'
,
{
confirmButtonText
:
'确定'
,
beforeClose
:
(
action
,
instance
,
done
)
=>
{
if
(
stream
.
value
)
done
()
console
.
log
(
'stream'
,
stream
.
value
)
console
.
log
(
'cameraPermission'
,
cameraPermission
.
value
)
if
(
stream
.
value
&&
cameraPermission
.
value
===
'granted'
)
done
()
},
callback
:
()
=>
{
start
()
re
start
()
},
})
}
watchEffect
(()
=>
{
if
(
cameraPermission
.
value
===
'denied'
)
showMessageBox
()
})
onMounted
(()
=>
{
if
(
autoStart
)
showMessageBox
()
})
onUnmounted
(()
=>
{
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论