Toggle navigation
Toggle navigation
此项目
正在载入...
Sign in
李勇
/
McuClient
转到一个项目
Toggle navigation
项目
群组
代码片段
帮助
Toggle navigation pinning
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Network
Create a new issue
Builds
Commits
Authored by
AlexWang
2017-06-30 11:55:32 +0800
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
6b912647c119be471c30be7f55a60ed080d8ac32
6b912647
1 parent
d2c630d9
增加音频共享接口
隐藏空白字符变更
内嵌
并排对比
正在显示
6 个修改的文件
包含
990 行增加
和
893 行删除
src/EngineEntrance.js
src/MessageTypes.js
src/Sass.js
src/apes/ConferApe.js
src/apes/CursorApe.js
src/apes/MusicSharedApe.js
src/EngineEntrance.js
查看文件 @
6b91264
...
...
@@ -60,10 +60,10 @@ export default class MessageEntrance extends Emiter {
this
.
sdkInfo
=
_sdkInfo
;
loger
.
warn
(
this
.
sdkInfo
);
//检查是否是移动端
GlobalConfig
.
isMobile
=
mdetect
.
isMobileUA
();
if
(
GlobalConfig
.
isMobile
){
GlobalConfig
.
isMobile
=
mdetect
.
isMobileUA
();
if
(
GlobalConfig
.
isMobile
)
{
loger
.
warn
(
"当前设备是移动设备"
);
}
else
{
}
else
{
loger
.
warn
(
"当前设备是PC"
);
}
...
...
@@ -89,6 +89,7 @@ export default class MessageEntrance extends Emiter {
_sass
.
on
(
_sass
.
CLASS_SAVE_RECORD_INFO_SUCCESS
,
this
.
_sassSaveClassRecordInfoSuccessHandler
.
bind
(
this
));
//保存课堂录制信息
_sass
.
on
(
_sass
.
DELETE_DOCUMENT_SUCCESS
,
this
.
_sassDeleteDocumentSuccess
.
bind
(
this
));
//sass删除文档成功
_sass
.
on
(
_sass
.
DELETE_MEDIASHARE_SUCCESS
,
this
.
_sassDeleteMediaShareSuccess
.
bind
(
this
));
//sass删除媒体文件成功
_sass
.
on
(
_sass
.
DELETE_MUSICSHARE_SUCCESS
,
this
.
_sassDeleteMusicShareSuccess
.
bind
(
this
));
//sass删除MUSIC文件成功
//选点模块
_ipManager
=
new
IpManager
();
...
...
@@ -234,6 +235,10 @@ export default class MessageEntrance extends Emiter {
this
.
mediaSharedStop
=
this
.
_sendMediaSharedStop
.
bind
(
this
);
//停止
this
.
mediaSharedUpdate
=
this
.
_sendMediaSharedUpdate
.
bind
(
this
);
//更新媒体的状态
//音频共享模块
this
.
musicSharedUpload
=
this
.
_sendMusicSharedUpload
.
bind
(
this
);
//上传
this
.
musicSharedDelete
=
this
.
_sassDeletMusicShare
.
bind
(
this
);
//删除,先通过Sass删除,删除成功之后才删除MCU的
this
.
musicSharedPlay
=
this
.
_sendMusicSharedPlay
.
bind
(
this
);
//Music播放
this
.
musicSharedStop
=
this
.
_sendMusicSharedStop
.
bind
(
this
);
//Music停止
this
.
musicSharedUpdate
=
this
.
_sendMusicSharedUpdate
.
bind
(
this
);
//Music更新媒体的状态
...
...
@@ -720,10 +725,10 @@ export default class MessageEntrance extends Emiter {
loger
.
log
(
'加入课堂->.'
);
loger
.
warn
(
"课堂服务信息->"
);
loger
.
warn
(
'MCU服务器地址->mcu->'
,
GlobalConfig
.
MCUServerIP
,
GlobalConfig
.
MCUServerPort
);
loger
.
warn
(
'MCU服务器地址->mcu->'
,
GlobalConfig
.
MCUServerIP
,
GlobalConfig
.
MCUServerPort
);
loger
.
warn
(
'推流地址->MS->'
,
GlobalConfig
.
MS_PUBLISH_IP
,
GlobalConfig
.
MS_PUBLISH_PORT
);
loger
.
warn
(
'RTMP播流地址->RTMP->'
,
GlobalConfig
.
MS_PLAY_RTMP_IP
,
GlobalConfig
.
MS_PLAY_RTMP_PORT
);
loger
.
warn
(
'HLS播流地址->HLS->'
,
GlobalConfig
.
MS_PLAY_HLS_IP
,
GlobalConfig
.
MS_PLAY_HLS_PORT
);
loger
.
warn
(
'RTMP播流地址->RTMP->'
,
GlobalConfig
.
MS_PLAY_RTMP_IP
,
GlobalConfig
.
MS_PLAY_RTMP_PORT
);
loger
.
warn
(
'HLS播流地址->HLS->'
,
GlobalConfig
.
MS_PLAY_HLS_IP
,
GlobalConfig
.
MS_PLAY_HLS_PORT
);
if
(
_mcu
)
{
_mcu
.
joinMCU
(
GlobalConfig
.
getClassInfo
());
...
...
@@ -800,7 +805,7 @@ export default class MessageEntrance extends Emiter {
joinClassSuccessCallBackData
.
ssTunnelAppURL
=
GlobalConfig
.
ssTunnelAppURL
;
joinClassSuccessCallBackData
.
currentSceneTableId
=
GlobalConfig
.
currentSceneTableId
;
//文档区域的模块显示
joinClassSuccessCallBackData
.
serverAndLoacTimeDistanc
=
GlobalConfig
.
serverAndLoacTimeDistanc
;
joinClassSuccessCallBackData
.
serverAndLoacTimeDistanc
=
GlobalConfig
.
serverAndLoacTimeDistanc
;
loger
.
log
(
'加入课堂成功->'
);
loger
.
log
(
joinClassSuccessCallBackData
);
...
...
@@ -946,11 +951,17 @@ export default class MessageEntrance extends Emiter {
loger
.
log
(
'删除文档成功->'
,
_param
);
this
.
_sendDocumentDelete
(
_param
);
}
_sassDeleteMediaShareSuccess
(
_param
)
{
loger
.
log
(
'删除媒体文件成功->'
,
_param
);
this
.
_sendMediaSharedDelete
(
_param
);
}
_sassDeleteMusicShareSuccess
(
_param
)
{
loger
.
log
(
'删除Music文件成功->'
,
_param
);
this
.
_sendMusicSharedDelete
(
_param
);
}
//ConferApe
//开始上课
_sendStartClass
(
_param
)
{
...
...
@@ -1093,181 +1104,181 @@ export default class MessageEntrance extends Emiter {
//获取课堂所有参数 api/meeting/detail.do? flash中的接口文件是 getClassParam.do
_sassGetClassParamSuccessHandler
(
_data
)
{
loger
.
log
(
'获取课堂课堂信息完成.'
);
//包含整个课堂最全的信息,储存数据
if
(
_data
)
{
GlobalConfig
.
mcuDelay
=
_data
.
h5Delay
||
0
;
//mcu消息延迟的时间间隔,单位(秒),结合客户端传的messageDelay的值使用
GlobalConfig
.
className
=
_data
.
meetingName
||
""
;
GlobalConfig
.
classBeginTime
=
_data
.
beginTime
||
""
;
GlobalConfig
.
classEndTime
=
_data
.
endTime
||
""
;
GlobalConfig
.
userIp
=
_data
.
userIp
||
""
;
GlobalConfig
.
maxVideoChannels
=
_data
.
maxVideoChannels
;
GlobalConfig
.
maxAudioChannels
=
_data
.
maxAudioChannels
;
GlobalConfig
.
maxMediaChannels
=
Math
.
max
(
GlobalConfig
.
maxVideoChannels
,
GlobalConfig
.
maxAudioChannels
);
GlobalConfig
.
ssTunnelAppURL
=
_data
.
ssTunnelAppURL
||
''
;
//屏幕共享插件的地址
//视频质量相关设置,每次加入课堂都按最新的获取设置
GlobalConfig
.
fps
=
_data
.
fps
||
15
;
GlobalConfig
.
gop
=
_data
.
gop
||
3
;
GlobalConfig
.
videoQuality
=
parseInt
(
_data
.
videoQuality
);
GlobalConfig
.
curVideoQuality
=
GlobalConfig
.
videoQuality
;
//是否自动开始(身份是host的时候才用到的)
GlobalConfig
.
isAutoStartClass
=
_data
.
autoRecord
||
0
;
GlobalConfig
.
serverTime
=
_data
.
serverTime
||
new
Date
().
getTime
();
//获取服务器时间戳
GlobalConfig
.
serverAndLoacTimeDistanc
=
(
new
Date
().
getTime
()
-
GlobalConfig
.
serverTime
)
/
1000
;
//当前系统时间和服务器时间的差值 (秒)
loger
.
warn
(
"服务器时间:"
+
GlobalConfig
.
serverTime
+
" 系统时间:"
+
new
Date
().
getTime
()
+
" 时间差:"
+
GlobalConfig
.
serverAndLoacTimeDistanc
);
GlobalConfig
.
setDocListPrepare
(
_data
.
docListPrepare
);
//提前上传的文档列表
GlobalConfig
.
setRecordList
(
_data
.
recordList
);
//录制回放地址
GlobalConfig
.
setDocList
(
_data
.
docList
);
//文档地址
GlobalConfig
.
setMsList
(
_data
.
msList
);
//推流播流服务器地址(需要对列表中的地址进行分类,里面包含了推流和拉流的地址,目前主要是乐视的需要区分开)
GlobalConfig
.
setRsList
(
_data
.
rsList
);
//播放m3u8格式的地址(录制回放时使用)
GlobalConfig
.
setMcuList
(
_data
.
mcuList
);
//mcu
GlobalConfig
.
setMusicList
(
_data
.
musicList
);
//
GlobalConfig
.
setMusicListPrepare
(
_data
.
musicListPrepare
);
//提前上传的声音文件列表
GlobalConfig
.
setVideoCDNAddr
(
_data
.
videoCDNAddr
);
//cdn加速的拉流地址,直播的时候才使用
GlobalConfig
.
setMediaShareList
(
_data
.
sharedMediaList
);
//提前上传的媒体共享文件列表
//MCU地址
if
(
_data
.
mcuList
&&
_data
.
mcuList
.
length
>
0
)
{
//随机选择一个
let
index
=
parseInt
(
Math
.
random
()
*
_data
.
mcuList
.
length
);
GlobalConfig
.
MCUServerIP
=
_data
.
mcuList
[
index
].
ip
||
""
;
GlobalConfig
.
MCUServerPort
=
_data
.
mcuList
[
index
].
port
||
""
;
loger
.
log
(
'初始->MCU->.'
,
GlobalConfig
.
MCUServerIP
,
GlobalConfig
.
MCUServerPort
);
}
loger
.
log
(
'获取课堂课堂信息完成.'
);
//包含整个课堂最全的信息,储存数据
if
(
_data
)
{
GlobalConfig
.
mcuDelay
=
_data
.
h5Delay
||
0
;
//mcu消息延迟的时间间隔,单位(秒),结合客户端传的messageDelay的值使用
GlobalConfig
.
className
=
_data
.
meetingName
||
""
;
GlobalConfig
.
classBeginTime
=
_data
.
beginTime
||
""
;
GlobalConfig
.
classEndTime
=
_data
.
endTime
||
""
;
GlobalConfig
.
userIp
=
_data
.
userIp
||
""
;
//录制回放时m3u8播流地址
if
(
_data
.
rsList
&&
_data
.
rsList
.
length
>
0
)
{
let
index
=
parseInt
(
Math
.
random
()
*
_data
.
rsList
.
length
);
GlobalConfig
.
RS_RECORD_PLAY_IP
=
_data
.
rsList
[
index
].
ip
||
""
;
GlobalConfig
.
RS_RECORD_PLAY_PORT
=
_data
.
rsList
[
index
].
port
||
""
;
loger
.
log
(
'初始->RS->.'
,
GlobalConfig
.
RS_RECORD_PLAY_IP
,
GlobalConfig
.
RS_RECORD_PLAY_PORT
);
}
GlobalConfig
.
maxVideoChannels
=
_data
.
maxVideoChannels
;
GlobalConfig
.
maxAudioChannels
=
_data
.
maxAudioChannels
;
GlobalConfig
.
maxMediaChannels
=
Math
.
max
(
GlobalConfig
.
maxVideoChannels
,
GlobalConfig
.
maxAudioChannels
);
//上课中音视频推流地址
if
(
GlobalConfig
.
msList
&&
GlobalConfig
.
msList
.
length
>
0
)
{
let
index
=
parseInt
(
Math
.
random
()
*
GlobalConfig
.
msList
.
length
);
GlobalConfig
.
MS_PUBLISH_IP
=
GlobalConfig
.
msList
[
index
].
ip
||
""
;
GlobalConfig
.
MS_PUBLISH_PORT
=
GlobalConfig
.
msList
[
index
].
port
||
""
;
}
loger
.
log
(
'初始->MS->.'
,
GlobalConfig
.
MS_PUBLISH_IP
,
GlobalConfig
.
MS_PUBLISH_PORT
);
//播流的地址和推流地址需要分开的时候,单独设置拉流的地址 rtmp(目前乐视使用)
if
(
GlobalConfig
.
pullRtmpList
&&
GlobalConfig
.
pullRtmpList
.
length
>
0
)
{
//有单独的rtmp拉流地址
let
index
=
parseInt
(
Math
.
random
()
*
GlobalConfig
.
pullRtmpList
.
length
);
GlobalConfig
.
MS_PLAY_RTMP_IP
=
GlobalConfig
.
pullRtmpList
[
index
].
ip
||
""
;
GlobalConfig
.
MS_PLAY_RTMP_PORT
=
GlobalConfig
.
pullRtmpList
[
index
].
port
||
""
;
}
else
{
//如果没有单独的rtmp拉流地址,和推流地址一样即可
GlobalConfig
.
MS_PLAY_RTMP_IP
=
GlobalConfig
.
MS_PUBLISH_IP
;
GlobalConfig
.
MS_PLAY_RTMP_PORT
=
GlobalConfig
.
MS_PUBLISH_PORT
;
}
GlobalConfig
.
ssTunnelAppURL
=
_data
.
ssTunnelAppURL
||
''
;
//屏幕共享插件的地址
loger
.
log
(
'初始->MSPull->.'
,
GlobalConfig
.
MS_PLAY_RTMP_IP
,
GlobalConfig
.
MS_PLAY_RTMP_PORT
);
//视频质量相关设置,每次加入课堂都按最新的获取设置
GlobalConfig
.
fps
=
_data
.
fps
||
15
;
GlobalConfig
.
gop
=
_data
.
gop
||
3
;
GlobalConfig
.
videoQuality
=
parseInt
(
_data
.
videoQuality
);
GlobalConfig
.
curVideoQuality
=
GlobalConfig
.
videoQuality
;
//是否自动开始(身份是host的时候才用到的)
GlobalConfig
.
isAutoStartClass
=
_data
.
autoRecord
||
0
;
GlobalConfig
.
serverTime
=
_data
.
serverTime
||
new
Date
().
getTime
();
//获取服务器时间戳
GlobalConfig
.
serverAndLoacTimeDistanc
=
(
new
Date
().
getTime
()
-
GlobalConfig
.
serverTime
)
/
1000
;
//当前系统时间和服务器时间的差值 (秒)
loger
.
warn
(
"服务器时间:"
+
GlobalConfig
.
serverTime
+
" 系统时间:"
+
new
Date
().
getTime
()
+
" 时间差:"
+
GlobalConfig
.
serverAndLoacTimeDistanc
);
GlobalConfig
.
setDocListPrepare
(
_data
.
docListPrepare
);
//提前上传的文档列表
GlobalConfig
.
setRecordList
(
_data
.
recordList
);
//录制回放地址
GlobalConfig
.
setDocList
(
_data
.
docList
);
//文档地址
GlobalConfig
.
setMsList
(
_data
.
msList
);
//推流播流服务器地址(需要对列表中的地址进行分类,里面包含了推流和拉流的地址,目前主要是乐视的需要区分开)
GlobalConfig
.
setRsList
(
_data
.
rsList
);
//播放m3u8格式的地址(录制回放时使用)
GlobalConfig
.
setMcuList
(
_data
.
mcuList
);
//mcu
GlobalConfig
.
setMusicList
(
_data
.
musicList
);
//
GlobalConfig
.
setMusicListPrepare
(
_data
.
musicListPrepare
);
//提前上传的声音文件列表
GlobalConfig
.
setVideoCDNAddr
(
_data
.
videoCDNAddr
);
//cdn加速的拉流地址,直播的时候才使用
GlobalConfig
.
setMediaShareList
(
_data
.
sharedMediaList
);
//提前上传的媒体共享文件列表
//MCU地址
if
(
_data
.
mcuList
&&
_data
.
mcuList
.
length
>
0
)
{
//随机选择一个
let
index
=
parseInt
(
Math
.
random
()
*
_data
.
mcuList
.
length
);
GlobalConfig
.
MCUServerIP
=
_data
.
mcuList
[
index
].
ip
||
""
;
GlobalConfig
.
MCUServerPort
=
_data
.
mcuList
[
index
].
port
||
""
;
loger
.
log
(
'初始->MCU->.'
,
GlobalConfig
.
MCUServerIP
,
GlobalConfig
.
MCUServerPort
);
}
//播流的地址和推流地址需要分开的时候,单独设置拉流的地址 hls(目前乐视使用)
if
(
GlobalConfig
.
hlsList
&&
GlobalConfig
.
hlsList
.
length
>
0
)
{
//有单独的hls拉流地址
let
index
=
parseInt
(
Math
.
random
()
*
GlobalConfig
.
hlsList
.
length
);
GlobalConfig
.
MS_PLAY_HLS_IP
=
GlobalConfig
.
hlsList
[
index
].
ip
||
""
;
GlobalConfig
.
MS_PLAY_HLS_PORT
=
GlobalConfig
.
hlsList
[
index
].
port
||
""
;
}
else
{
//没有单独的hls拉流地址,和录制回放地址一样即可
GlobalConfig
.
MS_PLAY_HLS_IP
=
GlobalConfig
.
RS_RECORD_PLAY_IP
;
GlobalConfig
.
MS_PLAY_HLS_PORT
=
GlobalConfig
.
RS_RECORD_PLAY_PORT
;
}
loger
.
log
(
'初始->MSHls->.'
,
GlobalConfig
.
MS_PLAY_HLS_IP
,
GlobalConfig
.
MS_PLAY_HLS_PORT
);
//直播的时候,拉流(rtmp和hls)需要从 videoCDNAddr中获取
//20170531-新规则,所有课堂类型都支持加速
// if(GlobalConfig.classType==ApeConsts.CLASS_TYPE_2&&GlobalConfig.videoCDNAddrList.length>0){
//20170629-直播课堂和移动端设备的时候支持
if
(
GlobalConfig
.
classType
==
ApeConsts
.
CLASS_TYPE_2
||
GlobalConfig
.
isMobile
){
if
(
GlobalConfig
.
videoCDNAddrList
.
length
>
0
)
{
//videoCDNAddrList中rtmppush和hls是混在一起的,需要分离开;
let
listLen
=
GlobalConfig
.
videoCDNAddrList
.
length
;
for
(
let
i
=
0
;
i
<
listLen
;
i
++
)
{
let
ipItem
=
GlobalConfig
.
videoCDNAddrList
[
i
];
if
(
ipItem
)
{
if
(
ipItem
.
indexOf
(
'hls'
)
>=
0
)
{
//直播的时候m3u8拉流地址
GlobalConfig
.
MS_PLAY_HLS_IP
=
ipItem
;
//ip包含了端口
GlobalConfig
.
MS_PLAY_HLS_PORT
=
""
;
loger
.
log
(
'videoCDNAddr>初始->MSHls'
,
GlobalConfig
.
MS_PLAY_HLS_IP
);
}
else
if
(
ipItem
.
indexOf
(
'rtmppull'
)
>=
0
)
{
//直播的时候rtmp拉流地址
GlobalConfig
.
MS_PLAY_RTMP_IP
=
ipItem
;
//ip包含了端口
GlobalConfig
.
MS_PLAY_RTMP_PORT
=
''
;
loger
.
log
(
'videoCDNAddr->初始->MSPull'
,
GlobalConfig
.
MS_PLAY_RTMP_IP
);
}
//录制回放时m3u8播流地址
if
(
_data
.
rsList
&&
_data
.
rsList
.
length
>
0
)
{
let
index
=
parseInt
(
Math
.
random
()
*
_data
.
rsList
.
length
);
GlobalConfig
.
RS_RECORD_PLAY_IP
=
_data
.
rsList
[
index
].
ip
||
""
;
GlobalConfig
.
RS_RECORD_PLAY_PORT
=
_data
.
rsList
[
index
].
port
||
""
;
loger
.
log
(
'初始->RS->.'
,
GlobalConfig
.
RS_RECORD_PLAY_IP
,
GlobalConfig
.
RS_RECORD_PLAY_PORT
);
}
//上课中音视频推流地址
if
(
GlobalConfig
.
msList
&&
GlobalConfig
.
msList
.
length
>
0
)
{
let
index
=
parseInt
(
Math
.
random
()
*
GlobalConfig
.
msList
.
length
);
GlobalConfig
.
MS_PUBLISH_IP
=
GlobalConfig
.
msList
[
index
].
ip
||
""
;
GlobalConfig
.
MS_PUBLISH_PORT
=
GlobalConfig
.
msList
[
index
].
port
||
""
;
}
loger
.
log
(
'初始->MS->.'
,
GlobalConfig
.
MS_PUBLISH_IP
,
GlobalConfig
.
MS_PUBLISH_PORT
);
//播流的地址和推流地址需要分开的时候,单独设置拉流的地址 rtmp(目前乐视使用)
if
(
GlobalConfig
.
pullRtmpList
&&
GlobalConfig
.
pullRtmpList
.
length
>
0
)
{
//有单独的rtmp拉流地址
let
index
=
parseInt
(
Math
.
random
()
*
GlobalConfig
.
pullRtmpList
.
length
);
GlobalConfig
.
MS_PLAY_RTMP_IP
=
GlobalConfig
.
pullRtmpList
[
index
].
ip
||
""
;
GlobalConfig
.
MS_PLAY_RTMP_PORT
=
GlobalConfig
.
pullRtmpList
[
index
].
port
||
""
;
}
else
{
//如果没有单独的rtmp拉流地址,和推流地址一样即可
GlobalConfig
.
MS_PLAY_RTMP_IP
=
GlobalConfig
.
MS_PUBLISH_IP
;
GlobalConfig
.
MS_PLAY_RTMP_PORT
=
GlobalConfig
.
MS_PUBLISH_PORT
;
}
loger
.
log
(
'初始->MSPull->.'
,
GlobalConfig
.
MS_PLAY_RTMP_IP
,
GlobalConfig
.
MS_PLAY_RTMP_PORT
);
//播流的地址和推流地址需要分开的时候,单独设置拉流的地址 hls(目前乐视使用)
if
(
GlobalConfig
.
hlsList
&&
GlobalConfig
.
hlsList
.
length
>
0
)
{
//有单独的hls拉流地址
let
index
=
parseInt
(
Math
.
random
()
*
GlobalConfig
.
hlsList
.
length
);
GlobalConfig
.
MS_PLAY_HLS_IP
=
GlobalConfig
.
hlsList
[
index
].
ip
||
""
;
GlobalConfig
.
MS_PLAY_HLS_PORT
=
GlobalConfig
.
hlsList
[
index
].
port
||
""
;
}
else
{
//没有单独的hls拉流地址,和录制回放地址一样即可
GlobalConfig
.
MS_PLAY_HLS_IP
=
GlobalConfig
.
RS_RECORD_PLAY_IP
;
GlobalConfig
.
MS_PLAY_HLS_PORT
=
GlobalConfig
.
RS_RECORD_PLAY_PORT
;
}
loger
.
log
(
'初始->MSHls->.'
,
GlobalConfig
.
MS_PLAY_HLS_IP
,
GlobalConfig
.
MS_PLAY_HLS_PORT
);
//直播的时候,拉流(rtmp和hls)需要从 videoCDNAddr中获取
//20170531-新规则,所有课堂类型都支持加速
// if(GlobalConfig.classType==ApeConsts.CLASS_TYPE_2&&GlobalConfig.videoCDNAddrList.length>0){
//20170629-直播课堂和移动端设备的时候支持
if
(
GlobalConfig
.
classType
==
ApeConsts
.
CLASS_TYPE_2
||
GlobalConfig
.
isMobile
)
{
if
(
GlobalConfig
.
videoCDNAddrList
.
length
>
0
)
{
//videoCDNAddrList中rtmppush和hls是混在一起的,需要分离开;
let
listLen
=
GlobalConfig
.
videoCDNAddrList
.
length
;
for
(
let
i
=
0
;
i
<
listLen
;
i
++
)
{
let
ipItem
=
GlobalConfig
.
videoCDNAddrList
[
i
];
if
(
ipItem
)
{
if
(
ipItem
.
indexOf
(
'hls'
)
>=
0
)
{
//直播的时候m3u8拉流地址
GlobalConfig
.
MS_PLAY_HLS_IP
=
ipItem
;
//ip包含了端口
GlobalConfig
.
MS_PLAY_HLS_PORT
=
""
;
loger
.
log
(
'videoCDNAddr>初始->MSHls'
,
GlobalConfig
.
MS_PLAY_HLS_IP
);
}
else
if
(
ipItem
.
indexOf
(
'rtmppull'
)
>=
0
)
{
//直播的时候rtmp拉流地址
GlobalConfig
.
MS_PLAY_RTMP_IP
=
ipItem
;
//ip包含了端口
GlobalConfig
.
MS_PLAY_RTMP_PORT
=
''
;
loger
.
log
(
'videoCDNAddr->初始->MSPull'
,
GlobalConfig
.
MS_PLAY_RTMP_IP
);
}
}
}
else
{
loger
.
error
(
'videoCDNAddr数据无效->'
,
GlobalConfig
.
videoCDNAddr
);
}
}
else
{
loger
.
warn
(
'非直播课堂或不是移动端->不需要videoCDN加速'
);
}
//文档地址
if
(
_data
.
docList
&&
_data
.
docList
.
length
>
0
)
{
//doc上传地址,随机获取一个
let
index
=
parseInt
(
Math
.
random
()
*
_data
.
docList
.
length
);
loger
.
log
(
"docServer->"
,
_data
.
docList
[
index
]);
GlobalConfig
.
DOCServerIP
=
_data
.
docList
[
index
].
ip
||
""
;
GlobalConfig
.
DOCServerPort
=
_data
.
docList
[
index
].
port
||
""
;
loger
.
log
(
'初始->DOC->.'
,
GlobalConfig
.
DOCServerIP
,
GlobalConfig
.
DOCServerPort
);
}
else
{
loger
.
error
(
'videoCDNAddr数据无效->'
,
GlobalConfig
.
videoCDNAddr
);
}
}
else
{
loger
.
warn
(
'非直播课堂或不是移动端->不需要videoCDN加速'
);
}
//record
if
(
_data
.
recordList
&&
_data
.
recordList
.
length
>
0
)
{
let
index
=
parseInt
(
Math
.
random
()
*
_data
.
recordList
.
length
);
GlobalConfig
.
RecordServerIP
=
_data
.
recordList
[
index
].
ip
||
""
;
GlobalConfig
.
RecordServerPort
=
_data
.
recordList
[
index
].
port
||
""
;
loger
.
log
(
'初始->RECORD->.'
,
GlobalConfig
.
RecordServerIP
,
GlobalConfig
.
RecordServerPort
);
}
//文档地址
if
(
_data
.
docList
&&
_data
.
docList
.
length
>
0
)
{
//doc上传地址,随机获取一个
let
index
=
parseInt
(
Math
.
random
()
*
_data
.
docList
.
length
);
loger
.
log
(
"docServer->"
,
_data
.
docList
[
index
]);
GlobalConfig
.
DOCServerIP
=
_data
.
docList
[
index
].
ip
||
""
;
GlobalConfig
.
DOCServerPort
=
_data
.
docList
[
index
].
port
||
""
;
loger
.
log
(
'初始->DOC->.'
,
GlobalConfig
.
DOCServerIP
,
GlobalConfig
.
DOCServerPort
);
}
//record
if
(
_data
.
recordList
&&
_data
.
recordList
.
length
>
0
)
{
let
index
=
parseInt
(
Math
.
random
()
*
_data
.
recordList
.
length
);
GlobalConfig
.
RecordServerIP
=
_data
.
recordList
[
index
].
ip
||
""
;
GlobalConfig
.
RecordServerPort
=
_data
.
recordList
[
index
].
port
||
""
;
loger
.
log
(
'初始->RECORD->.'
,
GlobalConfig
.
RecordServerIP
,
GlobalConfig
.
RecordServerPort
);
}
//这里需要考虑是否加延迟处理,课堂信息刚获取完成,客户端需要根据数据创建界面UI,等创建完成后再加入课堂是最合适的(目前没有加延迟)
this
.
_emit
(
MessageTypes
.
CLASS_GET_INFO_SUCCESS
,
GlobalConfig
.
getClassInfo
());
if
(
_data
.
currentInfo
)
{
//根据从Sass获取的数据信息,同步最后一次保存的课堂状态信息
loger
.
log
(
"本地同步最后一次保存过的课堂状态信息"
);
try
{
GlobalConfig
.
setClassStatusInfo
(
JSON
.
parse
(
_data
.
currentInfo
));
}
catch
(
err
)
{
GlobalConfig
.
setClassStatusInfo
(
_data
.
currentInfo
);
}
loger
.
log
(
GlobalConfig
.
classStatusInfo
);
}
else
{
loger
.
log
(
"还没有保存过课堂状信息"
);
}
//这里需要考虑是否加延迟处理,课堂信息刚获取完成,客户端需要根据数据创建界面UI,等创建完成后再加入课堂是最合适的(目前没有加延迟)
this
.
_emit
(
MessageTypes
.
CLASS_GET_INFO_SUCCESS
,
GlobalConfig
.
getClassInfo
());
if
(
_data
.
currentInfo
)
{
//根据从Sass获取的数据信息,同步最后一次保存的课堂状态信息
loger
.
log
(
"本地同步最后一次保存过的课堂状态信息"
);
try
{
GlobalConfig
.
setClassStatusInfo
(
JSON
.
parse
(
_data
.
currentInfo
));
}
catch
(
err
)
{
GlobalConfig
.
setClassStatusInfo
(
_data
.
currentInfo
);
}
loger
.
log
(
GlobalConfig
.
classStatusInfo
);
}
else
{
loger
.
log
(
"还没有保存过课堂状信息"
);
}
//录制回放不需要获取ip信息和选点
if
(
GlobalConfig
.
isRecordPlayBack
)
{
if
(
_recordPlayback
)
{
//开启录制回放流程
loger
.
log
(
"开启录制回放流程"
);
_recordPlayback
.
readyRecordPlay
();
}
else
{
loger
.
warn
(
"开启录制回放流程失败->还未创建模块"
);
}
//录制回放不需要获取ip信息和选点
if
(
GlobalConfig
.
isRecordPlayBack
)
{
if
(
_recordPlayback
)
{
//开启录制回放流程
loger
.
log
(
"开启录制回放流程"
);
_recordPlayback
.
readyRecordPlay
();
}
else
{
//根据用户的userIp获取信息,选点
this
.
getUserIpInfo
();
loger
.
warn
(
"开启录制回放流程失败->还未创建模块"
);
}
}
else
{
//根据用户的userIp获取信息,选点
this
.
getUserIpInfo
();
}
}
//ChatApe
// 发送聊天消息
//ChatApe
// 发送聊天消息
_sendChatMsg
(
_messageInfo
)
{
if
(
!
_mcu
.
connected
)
{
loger
.
warn
(
GlobalConfig
.
getCurrentStatus
());
...
...
@@ -1675,7 +1686,33 @@ export default class MessageEntrance extends Emiter {
}
}
//删除
// 删除Music
_sassDeletMusicShare
(
_param
)
{
if
(
!
_mcu
.
connected
)
{
loger
.
warn
(
GlobalConfig
.
getCurrentStatus
());
return
;
}
//判断传入的参数是否存在
if
(
_param
==
null
||
EngineUtils
.
isEmptyObject
(
_param
))
{
loger
.
error
(
'删除媒体文件失败->参数错误'
,
_param
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_MUSICSHARE_DELETE_FAILED_PARAM
);
return
;
}
//判断必要的参数字段值
if
(
_param
.
itemIdx
==
null
||
isNaN
(
_param
.
itemIdx
)
||
_param
.
fileId
==
null
||
_param
.
fileId
==
""
)
{
loger
.
error
(
'删除媒体文件失败->'
,
_param
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_MUSICSHARE_DELETE_FAILED_PARAM
);
return
;
}
loger
.
log
(
'删除媒体文件->'
,
_param
);
if
(
_sass
)
{
_sass
.
sassDeletMusicShare
(
_param
);
}
}
//删除媒体
_sendMediaSharedDelete
(
_param
)
{
if
(
!
_mcu
.
connected
)
{
loger
.
warn
(
GlobalConfig
.
getCurrentStatus
());
...
...
@@ -1686,6 +1723,17 @@ export default class MessageEntrance extends Emiter {
}
}
//删除媒体
_sendMusicSharedDelete
(
_param
)
{
if
(
!
_mcu
.
connected
)
{
loger
.
warn
(
GlobalConfig
.
getCurrentStatus
());
return
;
}
if
(
_musicShareApe
)
{
_musicShareApe
.
musicSharedDelete
(
_param
);
}
}
//音乐更新
_sendMusicSharedUpdate
(
_param
)
{
if
(
!
_mcu
.
connected
)
{
...
...
@@ -1934,7 +1982,7 @@ export default class MessageEntrance extends Emiter {
joinClassSuccessCallBackData
.
ssTunnelAppURL
=
GlobalConfig
.
ssTunnelAppURL
;
joinClassSuccessCallBackData
.
currentSceneTableId
=
GlobalConfig
.
currentSceneTableId
;
//文档区域的模块显示
joinClassSuccessCallBackData
.
serverAndLoacTimeDistanc
=
GlobalConfig
.
serverAndLoacTimeDistanc
;
joinClassSuccessCallBackData
.
serverAndLoacTimeDistanc
=
GlobalConfig
.
serverAndLoacTimeDistanc
;
loger
.
log
(
joinClassSuccessCallBackData
);
//和加入课堂成功使用同样的消息处理
this
.
_emit
(
MessageTypes
.
CLASS_JOIN_SUCCESS
,
joinClassSuccessCallBackData
);
...
...
src/MessageTypes.js
查看文件 @
6b91264
...
...
@@ -89,6 +89,10 @@ MessageTypes.DOC_BROADCAST = "doc_broadcast"; //
MessageTypes
.
MEDIA_SHARED_DELETE
=
"media_shared_delete"
;
//删除媒体文件
MessageTypes
.
MEDIA_SHARED_UPDATE
=
"media_shared_update"
;
//更新媒体文件(添加、变更)
//音频共享
MessageTypes
.
MUSIC_SHARED_DELETE
=
"music_shared_delete"
;
//删除音频文件
MessageTypes
.
MUSIC_SHARED_UPDATE
=
"music_shared_update"
;
//更新音频文件(添加、变更)
//答题卡和点名共用
MessageTypes
.
START_ANSWER_QUESTION
=
"start_answer_question"
;
//开始答题
MessageTypes
.
UPDATE_ANSWER_QUESTION
=
"update_answer_question"
;
//更新答题数据
...
...
@@ -151,6 +155,10 @@ MessageTypes.ERR_SDK_FAILED = 700; // sdk还没初始化
MessageTypes
.
ERR_INTERFACE_NONE
=
701
;
//调用的接口不存在
MessageTypes
.
ERR_INTERFACE_PARAMS_ERROR
=
702
;
//调用的接口,传递的参数不正确
//音频共享
MessageTypes
.
ERR_MUSICSHARE_DELETE_FAILED
=
720
;
//删除媒体共享文件失败
MessageTypes
.
ERR_MUSICSHARE_DELETE_FAILED_PARAM
=
721
;
//删除媒体共享文件,参数错误
MessageTypes
.
ERR_INIT_RECORD_PLAY_BACK_FAILED
=
910
;
//初始化录制回放失败
MessageTypes
.
ERR_GET_RECORD_PLAY_BACK_DATA_FAILED
=
911
;
//获取录制回放数据失败
...
...
src/Sass.js
查看文件 @
6b91264
...
...
@@ -13,757 +13,797 @@ const loger = Loger.getLoger('Sass');
let
confInfo
=
{};
class
Sass
extends
Emiter
{
constructor
()
{
super
();
}
///////////////////////////////////////Sass 接口///////////////////////////////////////////////////
//Sass init初始化获取课堂校验信息-----------------------------------------------------------------
getJoinParams
(
_initInfo
)
{
/* 获取用于加入课堂的参数
/3m/api/meeting/joinParams.do
参数 (application/x-www-form-urlencoded):
名称 类型 可选 默认值 说明
meetingNumber String 否 null 课堂号
userID String 是 0 用户id
返回 (application/json):
code int 0 正常
1 课堂号必填
2 无效的课堂号
3 没有对应的站点
4 站点已过期
siteId String 站点号
passwordRequired Boolean 是否需要输入密码
md5 String 用于后续加入课堂验证
msType int 媒体服务器类型
classType 课堂类型
*/
let
url
=
`
http
:
//${_initInfo.portal}/3m/api/meeting/joinParams.do?meetingNumber=${_initInfo.classId}&userID=${_initInfo.userId}`;
loger
.
log
(
'1.初始化init获取课堂校验信息.'
);
loger
.
log
(
url
);
loger
.
log
(
_initInfo
);
fetch
(
url
,
{
timeout
:
5000
})
.
then
(
ret
=>
{
if
(
ret
.
ok
)
{
return
ret
.
json
();
}
else
{
loger
.
error
(
`初始化
init
获取课堂校验信息
-
网络异常
.
状态码
:
$
{
ret
.
status
}
`
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_CLASS_INIT_NETWORK
);
throw
''
;
}
})
.
then
(
ret
=>
{
// code int 0 正常
// 1 课堂号必填
//2 无效的课堂号
//3 没有对应的站点
//4 站点已过期
if
(
ret
.
code
===
0
)
{
loger
.
log
(
'初始化init获取课堂校验信息-完成'
);
this
.
_emit
(
Sass
.
CLASS_INIT_SUCCESS
,
ret
);
}
else
if
(
ret
.
code
===
1
)
{
//loger.warn('Sass获取课堂校验信息失败.');
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_CLASS_INIT_FAILED_1
);
}
else
if
(
ret
.
code
===
2
)
{
//loger.warn('Sass获取课堂校验信息失败.');
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_CLASS_INIT_FAILED_2
);
}
else
if
(
ret
.
code
===
3
)
{
//loger.warn('Sass获取课堂校验信息失败.');
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_CLASS_INIT_FAILED_3
);
}
else
if
(
ret
.
code
===
4
)
{
//loger.warn('Sass获取课堂校验信息失败.');
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_CLASS_INIT_FAILED_4
);
}
else
{
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_CLASS_INIT_FAILED
,
ret
);
}
})
.
catch
(
err
=>
{
loger
.
error
(
`初始化
init
获取课堂校验信息
-
异常
.
状态码
:
$
{
err
}
`
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_CLASS_INIT_PROTOCOL
,
err
);
});
}
// Sass校验开始-->密码校验(如果需要密码)--->MD5校验----------------------------------------------------
passwordAndMd5Checking
(
_param
)
{
loger
.
log
(
'2.开始Sass校验'
);
loger
.
log
(
_param
);
confInfo
=
_param
;
// 密码校验
if
(
confInfo
.
passwordRequired
===
'true'
||
confInfo
.
passwordRequired
===
true
)
{
this
.
sendPWDChecking
();
return
;
constructor
()
{
super
();
}
///////////////////////////////////////Sass 接口///////////////////////////////////////////////////
//Sass init初始化获取课堂校验信息-----------------------------------------------------------------
getJoinParams
(
_initInfo
)
{
/* 获取用于加入课堂的参数
/3m/api/meeting/joinParams.do
参数 (application/x-www-form-urlencoded):
名称 类型 可选 默认值 说明
meetingNumber String 否 null 课堂号
userID String 是 0 用户id
返回 (application/json):
code int 0 正常
1 课堂号必填
2 无效的课堂号
3 没有对应的站点
4 站点已过期
siteId String 站点号
passwordRequired Boolean 是否需要输入密码
md5 String 用于后续加入课堂验证
msType int 媒体服务器类型
classType 课堂类型
*/
let
url
=
`
http
:
//${_initInfo.portal}/3m/api/meeting/joinParams.do?meetingNumber=${_initInfo.classId}&userID=${_initInfo.userId}`;
loger
.
log
(
'1.初始化init获取课堂校验信息.'
);
loger
.
log
(
url
);
loger
.
log
(
_initInfo
);
fetch
(
url
,
{
timeout
:
5000
})
.
then
(
ret
=>
{
if
(
ret
.
ok
)
{
return
ret
.
json
();
}
else
{
loger
.
error
(
`初始化
init
获取课堂校验信息
-
网络异常
.
状态码
:
$
{
ret
.
status
}
`
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_CLASS_INIT_NETWORK
);
throw
''
;
}
// MD5校验
this
.
sendMD5Checking
();
}
// 入会密码校验---------------------------------------------------------------------------------------
sendPWDChecking
()
{
//let url = `http://${classInfo.portal}/3m/getCheckMeetinig.do?siteId=${classInfo.siteId}&classId=${classInfo.classId}&password=${classInfo.password}`;
/*
/3m/api/meeting/signIn.do
siteId 站点号
classId 课堂号(meetingNumber)
isTeacher 是否是老师:1 是 0 否
password 输入的密码
// 请求格式 http://112.126.80.182/3m/api/meeting/signIn.do?siteId=h5test&classId=526661904&password=111111&isTeacher=0
*/
//判断是否是老师
let
isTeacher
=
0
;
if
(
confInfo
.
userRole
==
ApeConsts
.
host
)
{
isTeacher
=
1
})
.
then
(
ret
=>
{
// code int 0 正常
// 1 课堂号必填
//2 无效的课堂号
//3 没有对应的站点
//4 站点已过期
if
(
ret
.
code
===
0
)
{
loger
.
log
(
'初始化init获取课堂校验信息-完成'
);
this
.
_emit
(
Sass
.
CLASS_INIT_SUCCESS
,
ret
);
}
else
if
(
ret
.
code
===
1
)
{
//loger.warn('Sass获取课堂校验信息失败.');
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_CLASS_INIT_FAILED_1
);
}
else
if
(
ret
.
code
===
2
)
{
//loger.warn('Sass获取课堂校验信息失败.');
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_CLASS_INIT_FAILED_2
);
}
else
if
(
ret
.
code
===
3
)
{
//loger.warn('Sass获取课堂校验信息失败.');
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_CLASS_INIT_FAILED_3
);
}
else
if
(
ret
.
code
===
4
)
{
//loger.warn('Sass获取课堂校验信息失败.');
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_CLASS_INIT_FAILED_4
);
}
else
{
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_CLASS_INIT_FAILED
,
ret
);
}
let
url
=
`
http
:
//${confInfo.portal}/3m/api/meeting/signIn.do?siteId=${confInfo.siteId}&classId=${confInfo.classId}&isTeacher=${isTeacher}&password=${confInfo.password}`;
loger
.
log
(
'3.课堂密码校验'
,
url
);
fetch
(
url
,
{
timeout
:
5000
})
.
then
(
ret
=>
{
if
(
ret
.
status
===
200
)
{
return
ret
.
text
();
}
else
{
loger
.
error
(
`课堂密码校验
-
网络异常
.
状态码
:
$
{
ret
.
status
}
`
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_CLASS_JOIN_NETWORK
);
throw
''
;
}
})
.
then
(
ret
=>
{
let
rectObj
=
JSON
.
parse
(
ret
);
if
(
rectObj
.
flag
===
'false'
||
rectObj
.
flag
===
false
)
{
loger
.
error
(
`课堂密码校验
-
失败
.
`
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_CLASS_PASSWORD_WRONG
);
return
;
}
if
(
rectObj
.
flag
===
'true'
||
rectObj
.
flag
===
true
)
{
loger
.
log
(
`课堂密码校验
-
成功
.
`
);
this
.
sendMD5Checking
();
return
;
}
loger
.
error
(
`课堂密码校验
-
协议异常
.
`
,
rectObj
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_CLASS_JOIN_PROTOCOL
);
})
.
catch
(
err
=>
{
loger
.
error
(
`课堂密码校验
-
异常
.
状态码
:
$
{
err
}
`
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_CLASS_JOIN_FAILED
);
});
}
//MD5校验-----------------------------------------------------------------------------------------
sendMD5Checking
()
{
let
url
=
`
http
:
//${confInfo.portal}/3m/meeting/md5CheckMeeting.do?siteId=${confInfo.siteId}&meetingNumber=${confInfo.classId}&userId=${confInfo.userId}&userName=${confInfo.userName}&userType=${confInfo.userType}&nopassword=${confInfo.passwordRequired}&md5=${confInfo.md5}`;
loger
.
log
(
'4.MD5校验'
,
url
);
fetch
(
url
,
{
timeout
:
5000
})
.
then
(
ret
=>
{
if
(
ret
.
status
===
200
)
{
return
ret
.
json
();
}
else
{
loger
.
error
(
`
MD5
校验
-
网络异常
.
状态码
:
$
{
ret
.
status
}
`
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_CLASS_JOIN_NETWORK
);
throw
''
;
}
})
.
then
(
ret
=>
{
if
(
ret
.
flag
==
"true"
||
ret
.
flag
==
true
)
{
loger
.
log
(
'MD5校验完成'
);
loger
.
log
(
ret
);
this
.
_emit
(
Sass
.
SUCCESS
,
ret
);
}
else
{
loger
.
log
(
'MD5校验-失败.'
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_CLASS_MD5_WRONG
);
}
})
.
catch
(
err
=>
{
loger
.
error
(
`
MD5
校验
-
异常
.
状态码
:
$
{
err
}
`
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_CLASS_JOIN_FAILED
);
});
})
.
catch
(
err
=>
{
loger
.
error
(
`初始化
init
获取课堂校验信息
-
异常
.
状态码
:
$
{
err
}
`
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_CLASS_INIT_PROTOCOL
,
err
);
});
}
// Sass校验开始-->密码校验(如果需要密码)--->MD5校验----------------------------------------------------
passwordAndMd5Checking
(
_param
)
{
loger
.
log
(
'2.开始Sass校验'
);
loger
.
log
(
_param
);
confInfo
=
_param
;
// 密码校验
if
(
confInfo
.
passwordRequired
===
'true'
||
confInfo
.
passwordRequired
===
true
)
{
this
.
sendPWDChecking
();
return
;
}
// MD5校验
this
.
sendMD5Checking
();
}
// 获取课堂基本详情------------------------------------------------------------------------------------
getClassDetail
()
{
let
url
=
`
http
:
//${GlobalConfig.portal}/3m/meeting/getClassH5.do?classNumber=${GlobalConfig.classId}`;
loger
.
log
(
'获取Class详情.'
,
url
);
fetch
(
url
,
{
timeout
:
5000
})
.
then
(
ret
=>
{
if
(
ret
.
ok
)
{
return
ret
.
json
();
}
else
{
loger
.
error
(
`获取
Class
详情
-
网络异常
.
状态码
:
$
{
ret
.
status
}
`
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_GET_CLASS_DETAIL
);
throw
''
;
}
})
.
then
(
ret
=>
{
if
(
ret
.
errorCode
===
0
)
{
loger
.
log
(
'获取Class详情完成'
);
this
.
_emit
(
Sass
.
CLASS_GET_CLASS_DETAIL
,
ret
);
}
else
{
loger
.
warn
(
'获取Class详情失败.'
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_GET_CLASS_DETAIL
);
}
})
.
catch
(
err
=>
{
loger
.
error
(
`获取
Class
详情异常
.
状态码
:
$
{
err
}
`
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_GET_CLASS_DETAIL
);
});
// 入会密码校验---------------------------------------------------------------------------------------
sendPWDChecking
()
{
//let url = `http://${classInfo.portal}/3m/getCheckMeetinig.do?siteId=${classInfo.siteId}&classId=${classInfo.classId}&password=${classInfo.password}`;
/*
/3m/api/meeting/signIn.do
siteId 站点号
classId 课堂号(meetingNumber)
isTeacher 是否是老师:1 是 0 否
password 输入的密码
// 请求格式 http://112.126.80.182/3m/api/meeting/signIn.do?siteId=h5test&classId=526661904&password=111111&isTeacher=0
*/
//判断是否是老师
let
isTeacher
=
0
;
if
(
confInfo
.
userRole
==
ApeConsts
.
host
)
{
isTeacher
=
1
}
//获取课堂课堂的完整信息--------------------------------------------------------------------------------
getClassParam
()
{
/*
参数 (application/x-www-form-urlencoded):
名称 类型 可选 默认值 说明
meetingNumber String 否 null 课堂号
timestamp String 否 null 时间戳
authId String 否 null 验证信息 md5(meetingNumber + timestamp)
返回 (application/json):
名称 类型 说明
code int 0 正常
1 课堂号必填
2 无效的课堂号
3 没有对应的站点
4 站点已过期
siteId String 站点号
meetingNumber String 课堂号 对应的是classId
*/
var
timestamp
=
new
Date
().
getTime
();
var
authId
=
MD5
(
GlobalConfig
.
classId
+
""
+
timestamp
);
//课堂号+时间戳 的字符串,转成MD5
let
url
=
`
http
:
//${GlobalConfig.portal}/3m/api/meeting/detail.do?meetingNumber=${GlobalConfig.classId}×tamp=${timestamp}&authId=${authId}`;
loger
.
log
(
'5.获取课堂课堂的完整信息 '
);
loger
.
log
(
url
);
fetch
(
url
,
{
timeout
:
5000
})
.
then
(
ret
=>
{
if
(
ret
.
ok
)
{
return
ret
.
json
();
}
else
{
loger
.
error
(
`获取课堂课堂的完整信息
-
网络异常
.
状态码
:
$
{
ret
.
status
}
`
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_GET_CLASS_PARAML
);
throw
''
;
}
})
.
then
(
ret
=>
{
if
(
ret
.
code
===
0
)
{
loger
.
log
(
'获取课堂课堂的完整信息完成'
);
this
.
_emit
(
Sass
.
CLASS_GET_CLASS_PARAM
,
ret
);
}
else
{
loger
.
warn
(
'获取课堂课堂的完整信息 失败.'
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_GET_CLASS_PARAML
);
}
})
.
catch
(
err
=>
{
loger
.
error
(
`获取课堂课堂的完整信息异常
.
状态码
:
$
{
err
}
`
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_GET_CLASS_PARAML
);
});
}
let
url
=
`
http
:
//${confInfo.portal}/3m/api/meeting/signIn.do?siteId=${confInfo.siteId}&classId=${confInfo.classId}&isTeacher=${isTeacher}&password=${confInfo.password}`;
loger
.
log
(
'3.课堂密码校验'
,
url
);
fetch
(
url
,
{
timeout
:
5000
})
.
then
(
ret
=>
{
if
(
ret
.
status
===
200
)
{
return
ret
.
text
();
}
else
{
loger
.
error
(
`课堂密码校验
-
网络异常
.
状态码
:
$
{
ret
.
status
}
`
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_CLASS_JOIN_NETWORK
);
throw
''
;
}
})
.
then
(
ret
=>
{
let
rectObj
=
JSON
.
parse
(
ret
);
if
(
rectObj
.
flag
===
'false'
||
rectObj
.
flag
===
false
)
{
loger
.
error
(
`课堂密码校验
-
失败
.
`
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_CLASS_PASSWORD_WRONG
);
return
;
}
if
(
rectObj
.
flag
===
'true'
||
rectObj
.
flag
===
true
)
{
loger
.
log
(
`课堂密码校验
-
成功
.
`
);
this
.
sendMD5Checking
();
return
;
}
loger
.
error
(
`课堂密码校验
-
协议异常
.
`
,
rectObj
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_CLASS_JOIN_PROTOCOL
);
})
.
catch
(
err
=>
{
loger
.
error
(
`课堂密码校验
-
异常
.
状态码
:
$
{
err
}
`
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_CLASS_JOIN_FAILED
);
});
}
//MD5校验-----------------------------------------------------------------------------------------
sendMD5Checking
()
{
let
url
=
`
http
:
//${confInfo.portal}/3m/meeting/md5CheckMeeting.do?siteId=${confInfo.siteId}&meetingNumber=${confInfo.classId}&userId=${confInfo.userId}&userName=${confInfo.userName}&userType=${confInfo.userType}&nopassword=${confInfo.passwordRequired}&md5=${confInfo.md5}`;
loger
.
log
(
'4.MD5校验'
,
url
);
fetch
(
url
,
{
timeout
:
5000
})
.
then
(
ret
=>
{
if
(
ret
.
status
===
200
)
{
return
ret
.
json
();
}
else
{
loger
.
error
(
`
MD5
校验
-
网络异常
.
状态码
:
$
{
ret
.
status
}
`
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_CLASS_JOIN_NETWORK
);
throw
''
;
}
})
.
then
(
ret
=>
{
if
(
ret
.
flag
==
"true"
||
ret
.
flag
==
true
)
{
loger
.
log
(
'MD5校验完成'
);
loger
.
log
(
ret
);
this
.
_emit
(
Sass
.
SUCCESS
,
ret
);
}
else
{
loger
.
log
(
'MD5校验-失败.'
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_CLASS_MD5_WRONG
);
//删除文档-----------------------------------------------------------------------------------------------------
}
})
.
catch
(
err
=>
{
loger
.
error
(
`
MD5
校验
-
异常
.
状态码
:
$
{
err
}
`
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_CLASS_JOIN_FAILED
);
});
}
// 获取课堂基本详情------------------------------------------------------------------------------------
getClassDetail
()
{
let
url
=
`
http
:
//${GlobalConfig.portal}/3m/meeting/getClassH5.do?classNumber=${GlobalConfig.classId}`;
loger
.
log
(
'获取Class详情.'
,
url
);
fetch
(
url
,
{
timeout
:
5000
})
.
then
(
ret
=>
{
if
(
ret
.
ok
)
{
return
ret
.
json
();
}
else
{
loger
.
error
(
`获取
Class
详情
-
网络异常
.
状态码
:
$
{
ret
.
status
}
`
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_GET_CLASS_DETAIL
);
throw
''
;
}
})
.
then
(
ret
=>
{
if
(
ret
.
errorCode
===
0
)
{
loger
.
log
(
'获取Class详情完成'
);
this
.
_emit
(
Sass
.
CLASS_GET_CLASS_DETAIL
,
ret
);
}
else
{
loger
.
warn
(
'获取Class详情失败.'
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_GET_CLASS_DETAIL
);
}
})
.
catch
(
err
=>
{
loger
.
error
(
`获取
Class
详情异常
.
状态码
:
$
{
err
}
`
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_GET_CLASS_DETAIL
);
});
}
//获取课堂课堂的完整信息--------------------------------------------------------------------------------
getClassParam
()
{
/*
删除课堂中的文档,即删除课堂与文档的关联
/api/document/deleteRelation.do
参数
docId 文档的唯一id
classId 课堂号
timestamp 时间戳
authId md5(docId+classId+timestamp)
参数 (application/x-www-form-urlencoded):
名称 类型 可选 默认值 说明
meetingNumber String 否 null 课堂号
timestamp String 否 null 时间戳
authId String 否 null 验证信息 md5(meetingNumber + timestamp)
返回 (application/json):
0 成功, 1 验证信息错误
名称 类型 说明
code int 0 正常
1 课堂号必填
2 无效的课堂号
3 没有对应的站点
4 站点已过期
siteId String 站点号
meetingNumber String 课堂号 对应的是classId
*/
sassDeleteDocument
(
_param
)
{
if
(
GlobalConfig
.
isRecordPlayBack
){
loger
.
log
(
'录制回放中,能删除文档'
);
return
;
var
timestamp
=
new
Date
().
getTime
();
var
authId
=
MD5
(
GlobalConfig
.
classId
+
""
+
timestamp
);
//课堂号+时间戳 的字符串,转成MD5
let
url
=
`
http
:
//${GlobalConfig.portal}/3m/api/meeting/detail.do?meetingNumber=${GlobalConfig.classId}×tamp=${timestamp}&authId=${authId}`;
loger
.
log
(
'5.获取课堂课堂的完整信息 '
);
loger
.
log
(
url
);
fetch
(
url
,
{
timeout
:
5000
})
.
then
(
ret
=>
{
if
(
ret
.
ok
)
{
return
ret
.
json
();
}
else
{
loger
.
error
(
`获取课堂课堂的完整信息
-
网络异常
.
状态码
:
$
{
ret
.
status
}
`
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_GET_CLASS_PARAML
);
throw
''
;
}
var
timestamp
=
new
Date
().
getTime
();
var
authId
=
MD5
(
_param
.
docId
+
""
+
_param
.
classId
+
""
+
timestamp
);
// docId+classId+timestamp的字符串,转成MD5
let
url
=
`
http
:
//${GlobalConfig.portal}/3m/api/document/deleteRelation.do?docId=${_param.docId}&classId=${GlobalConfig.classId}×tamp=${timestamp}&authId=${authId}`;
loger
.
log
(
'sassDeleteDocument'
,
url
);
fetch
(
url
,
{
timeout
:
5000
})
.
then
(
ret
=>
{
if
(
ret
.
ok
)
{
return
ret
.
json
();
}
else
{
loger
.
error
(
`删除文档
-
网络异常
.
状态码
:
$
{
ret
.
status
}
`
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_DOC_DELETE_FAILED
);
throw
''
;
}
})
.
then
(
ret
=>
{
if
(
ret
.
code
===
0
)
{
loger
.
log
(
'删除文档-完成'
);
this
.
_emit
(
Sass
.
DELETE_DOCUMENT_SUCCESS
,
_param
);
}
else
{
loger
.
warn
(
'删除文档-失败.'
)
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_DOC_DELETE_FAILED
);
}
})
.
catch
(
err
=>
{
loger
.
error
(
`删除文档
-
异常
.
状态码
:
$
{
err
}
`
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_DOC_DELETE_FAILED
);
});
})
.
then
(
ret
=>
{
if
(
ret
.
code
===
0
)
{
loger
.
log
(
'获取课堂课堂的完整信息完成'
);
this
.
_emit
(
Sass
.
CLASS_GET_CLASS_PARAM
,
ret
);
}
else
{
loger
.
warn
(
'获取课堂课堂的完整信息 失败.'
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_GET_CLASS_PARAML
);
}
})
.
catch
(
err
=>
{
loger
.
error
(
`获取课堂课堂的完整信息异常
.
状态码
:
$
{
err
}
`
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_GET_CLASS_PARAML
);
});
}
//删除文档-----------------------------------------------------------------------------------------------------
/*
删除课堂中的文档,即删除课堂与文档的关联
/api/document/deleteRelation.do
参数
docId 文档的唯一id
classId 课堂号
timestamp 时间戳
authId md5(docId+classId+timestamp)
返回 (application/json):
0 成功, 1 验证信息错误
*/
sassDeleteDocument
(
_param
)
{
if
(
GlobalConfig
.
isRecordPlayBack
)
{
loger
.
log
(
'录制回放中,能删除文档'
);
return
;
}
//删除媒体共享文件
sassDeletMediaShare
(
_param
)
{
if
(
GlobalConfig
.
isRecordPlayBack
){
loger
.
log
(
'录制回放中,能删除文件'
);
return
;
var
timestamp
=
new
Date
().
getTime
();
var
authId
=
MD5
(
_param
.
docId
+
""
+
_param
.
classId
+
""
+
timestamp
);
// docId+classId+timestamp的字符串,转成MD5
let
url
=
`
http
:
//${GlobalConfig.portal}/3m/api/document/deleteRelation.do?docId=${_param.docId}&classId=${GlobalConfig.classId}×tamp=${timestamp}&authId=${authId}`;
loger
.
log
(
'sassDeleteDocument'
,
url
);
fetch
(
url
,
{
timeout
:
5000
})
.
then
(
ret
=>
{
if
(
ret
.
ok
)
{
return
ret
.
json
();
}
else
{
loger
.
error
(
`删除文档
-
网络异常
.
状态码
:
$
{
ret
.
status
}
`
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_DOC_DELETE_FAILED
);
throw
''
;
}
var
timestamp
=
new
Date
().
getTime
();
var
authId
=
MD5
(
_param
.
fileId
+
""
+
_param
.
classId
+
""
+
timestamp
);
// docId+classId+timestamp的字符串,转成MD5
let
url
=
`
http
:
//${GlobalConfig.portal}/3m/api/sharedMedia/deleteRelation.do?fileId=${_param.fileId}&classId=${GlobalConfig.classId}×tamp=${timestamp}&authId=${authId}`;
loger
.
log
(
'删除媒体共享文件'
,
url
);
fetch
(
url
,
{
timeout
:
5000
})
.
then
(
ret
=>
{
if
(
ret
.
ok
)
{
return
ret
.
json
();
}
else
{
loger
.
error
(
`删除媒体共享文件
-
网络异常
.
状态码
:
$
{
ret
.
status
}
`
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_MEDIASHARE_DELETE_FAILED
);
throw
''
;
}
})
.
then
(
ret
=>
{
//code 0 成功, 1 验证信息错误
if
(
ret
.
code
===
0
)
{
loger
.
log
(
'删除媒体共享文件 完成'
);
this
.
_emit
(
Sass
.
DELETE_MEDIASHARE_SUCCESS
,
_param
);
}
else
{
loger
.
warn
(
'删除媒体共享文件 失败.'
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_MEDIASHARE_DELETE_FAILED
);
}
})
.
catch
(
err
=>
{
loger
.
error
(
`删除媒体共享文件
-
异常
.
状态码
:
$
{
err
}
`
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_MEDIASHARE_DELETE_FAILED
);
});
})
.
then
(
ret
=>
{
if
(
ret
.
code
===
0
)
{
loger
.
log
(
'删除文档-完成'
);
this
.
_emit
(
Sass
.
DELETE_DOCUMENT_SUCCESS
,
_param
);
}
else
{
loger
.
warn
(
'删除文档-失败.'
)
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_DOC_DELETE_FAILED
);
}
})
.
catch
(
err
=>
{
loger
.
error
(
`删除文档
-
异常
.
状态码
:
$
{
err
}
`
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_DOC_DELETE_FAILED
);
});
}
//删除Music共享文件
sassDeletMusicShare
(
_param
)
{
if
(
GlobalConfig
.
isRecordPlayBack
)
{
loger
.
log
(
'录制回放中,能删除文件'
);
return
;
}
//保存课堂的当前信息-----------------------------------------------------
/*保存课堂的当前信息,首次是插入,后面是更新
/api/meeting/saveInfo.do
参数(application/x-www-form-urlencoded):
info Json字符串课堂信息,由前端自己维护
classId 课堂号
timestamp 时间戳
authId 做基本验证,md5(classId+timestamp)
返回 (application/json):
code 0 成功 1 课堂号为空 2 无效的课堂号 3 验证信息错误*/
saveClassStatusInfo
(
_param
)
{
if
(
GlobalConfig
.
isRecordPlayBack
){
loger
.
log
(
'录制回放中,不需要保存课堂信息'
);
return
;
console
.
warn
(
'删除Music共享实现...'
);
var
timestamp
=
new
Date
().
getTime
();
var
authId
=
MD5
(
_param
.
fileId
+
""
+
_param
.
classId
+
""
+
timestamp
);
// docId+classId+timestamp的字符串,转成MD5
let
url
=
`
http
:
//${GlobalConfig.portal}/3m/api/media/deleteRelation.do?mediaId=${_param.fileId}&classId=${GlobalConfig.classId}×tamp=${timestamp}&authId=${authId}`;
loger
.
log
(
'删除媒体共享文件'
,
url
);
fetch
(
url
,
{
timeout
:
5000
})
.
then
(
ret
=>
{
if
(
ret
.
ok
)
{
return
ret
.
json
();
}
else
{
loger
.
error
(
`删除媒体共享文件
-
网络异常
.
状态码
:
$
{
ret
.
status
}
`
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_MUSICSHARE_DELETE_FAILED
);
throw
''
;
}
//{"classStatusInfo":classStatusInfo}
var
timestamp
=
new
Date
().
getTime
();
var
authId
=
MD5
(
GlobalConfig
.
classId
+
""
+
timestamp
);
// (classId+timestamp)的字符串,转成MD5
let
classStatusInfo
=
JSON
.
stringify
(
_param
.
classStatusInfo
);
let
url
=
`
http
:
//${GlobalConfig.portal}/3m/api/meeting/saveInfo.do`;
loger
.
log
(
'saveClassStatusInfo'
,
url
);
fetch
(
url
,
{
method
:
'POST'
,
headers
:
{
"Content-Type"
:
"application/x-www-form-urlencoded"
},
body
:
`
classId
=
$
{
GlobalConfig
.
classId
}
&
info
=
$
{
classStatusInfo
}
&
timestamp
=
$
{
timestamp
}
&
authId
=
$
{
authId
}
`
,
timeout
:
5000
})
.
then
(
ret
=>
{
if
(
ret
.
ok
)
{
return
ret
.
json
();
}
else
{
loger
.
error
(
`
saveClassStatusInfo
-
网络异常
.
状态码
:
$
{
ret
.
status
}
`
);
//this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_DOC_DELETE_FAILED);
throw
''
;
}
})
.
then
(
ret
=>
{
if
(
ret
.
code
===
0
)
{
loger
.
log
(
'saveClassStatusInfo 完成'
);
this
.
_emit
(
Sass
.
CLASS_SAVE_STATUS_INFO_SUCCESS
,
_param
);
}
else
if
(
ret
.
code
===
1
)
{
loger
.
log
(
'saveClassStatusInfo 失败 课堂号为空'
);
}
else
if
(
ret
.
code
===
2
)
{
loger
.
log
(
'saveClassStatusInfo 失败 无效的课堂号'
);
}
else
if
(
ret
.
code
===
3
)
{
loger
.
log
(
'saveClassStatusInfo 失败 验证信息错误'
);
}
else
{
loger
.
warn
(
'saveClassStatusInfo 失败.'
,
ret
);
//this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_DOC_DELETE_FAILED);
}
})
.
catch
(
err
=>
{
loger
.
error
(
`
saveClassStatusInfo
.
状态码
:
$
{
err
}
`
);
//this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_DOC_DELETE_FAILED);
});
})
.
then
(
ret
=>
{
//code 0 成功, 1 验证信息错误
if
(
ret
.
code
===
0
)
{
loger
.
log
(
'删除媒体共享文件 完成'
);
this
.
_emit
(
Sass
.
DELETE_MUSICSHARE_SUCCESS
,
_param
);
}
else
{
loger
.
warn
(
'删除媒体共享文件 失败.'
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_MUSICSHARE_DELETE_FAILED
);
}
})
.
catch
(
err
=>
{
loger
.
error
(
`删除媒体共享文件
-
异常
.
状态码
:
$
{
err
}
`
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_MUSICSHARE_DELETE_FAILED
);
});
}
//删除媒体共享文件
sassDeletMediaShare
(
_param
)
{
if
(
GlobalConfig
.
isRecordPlayBack
)
{
loger
.
log
(
'录制回放中,能删除文件'
);
return
;
}
//保存录制的信息,主要是录制文件的名称,必须和MCU录制的文件名相同
saveClassRecordContrlInfo
(
_param
)
{
if
(
GlobalConfig
.
isRecordPlayBack
){
loger
.
log
(
'录制回放中,不需要保存'
);
return
;
var
timestamp
=
new
Date
().
getTime
();
var
authId
=
MD5
(
_param
.
fileId
+
""
+
_param
.
classId
+
""
+
timestamp
);
// docId+classId+timestamp的字符串,转成MD5
let
url
=
`
http
:
//${GlobalConfig.portal}/3m/api/sharedMedia/deleteRelation.do?fileId=${_param.fileId}&classId=${GlobalConfig.classId}×tamp=${timestamp}&authId=${authId}`;
loger
.
log
(
'删除媒体共享文件'
,
url
);
fetch
(
url
,
{
timeout
:
5000
})
.
then
(
ret
=>
{
if
(
ret
.
ok
)
{
return
ret
.
json
();
}
else
{
loger
.
error
(
`删除媒体共享文件
-
网络异常
.
状态码
:
$
{
ret
.
status
}
`
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_MEDIASHARE_DELETE_FAILED
);
throw
''
;
}
loger
.
log
(
'保存开始录制信息'
);
let
key
=
"3mang123A"
;
let
siteID
=
GlobalConfig
.
siteId
;
let
meetingID
=
GlobalConfig
.
classId
;
let
userID
=
GlobalConfig
.
userId
;
let
userName
=
GlobalConfig
.
userName
;
let
meetingName
=
GlobalConfig
.
className
;
let
startTime
=
GlobalConfig
.
classBeginTime
;
let
endTime
=
GlobalConfig
.
classEndTime
;
let
playUrl
=
""
;
let
streamName
=
GlobalConfig
.
recordFileName
;
let
confRecordFileName
=
GlobalConfig
.
recordFileName
;
let
downloadUrl
=
""
;
let
recordStatus
=
GlobalConfig
.
classStatus
;
let
recordTimestamp
=
GlobalConfig
.
classTimestamp
;
let
timestamp
=
new
Date
().
getTime
();
let
authId
=
MD5
(
key
+
siteID
+
meetingID
+
timestamp
);
let
url
=
`
http
:
//${GlobalConfig.portal}/3m/recordingMeeting/insertRecordingMeeting.do`;
loger
.
log
(
'saveClassRecordContrlInfo'
,
url
);
fetch
(
encodeURI
(
url
),
{
method
:
'POST'
,
headers
:
{
"Content-Type"
:
"application/x-www-form-urlencoded"
},
body
:
`
siteID
=
$
{
siteID
}
&
meetingID
=
$
{
meetingID
}
&
userID
=
$
{
userID
}
&
userName
=
$
{
userName
}
&
meetingName
=
$
{
meetingName
}
&
startTime
=
$
{
startTime
}
&
endTime
=
$
{
endTime
}
&
playUrl
=
$
{
playUrl
}
&
streamName
=
$
{
streamName
}
&
downloadUrl
=
$
{
downloadUrl
}
&
configFile
=
$
{
confRecordFileName
}
&
timestamp
=
$
{
timestamp
}
&
recordTimestamp
=
$
{
recordTimestamp
}
&
authId
=
$
{
authId
}
`
,
timeout
:
5000
})
.
then
(
ret
=>
{
if
(
ret
.
ok
)
{
return
ret
.
json
();
}
else
{
loger
.
error
(
`保存开始录制信息
-
网络异常
.
状态码
:
$
{
ret
.
status
}
`
);
throw
''
;
}
})
.
then
(
ret
=>
{
if
(
ret
.
errorCode
===
0
)
{
loger
.
log
(
'保存开始录制信息 完成'
);
this
.
_emit
(
Sass
.
CLASS_SAVE_RECORD_INFO_SUCCESS
,
_param
);
}
else
{
loger
.
warn
(
'保存开始录制信息 失败.'
,
ret
);
}
})
.
catch
(
err
=>
{
loger
.
error
(
`保存开始录制信息异常
.
状态码
:
$
{
err
}
`
);
});
})
.
then
(
ret
=>
{
//code 0 成功, 1 验证信息错误
if
(
ret
.
code
===
0
)
{
loger
.
log
(
'删除媒体共享文件 完成'
);
this
.
_emit
(
Sass
.
DELETE_MEDIASHARE_SUCCESS
,
_param
);
}
else
{
loger
.
warn
(
'删除媒体共享文件 失败.'
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_MEDIASHARE_DELETE_FAILED
);
}
})
.
catch
(
err
=>
{
loger
.
error
(
`删除媒体共享文件
-
异常
.
状态码
:
$
{
err
}
`
);
this
.
_emit
(
MessageTypes
.
MCU_ERROR
,
MessageTypes
.
ERR_MEDIASHARE_DELETE_FAILED
);
});
}
//保存课堂的当前信息-----------------------------------------------------
/*保存课堂的当前信息,首次是插入,后面是更新
/api/meeting/saveInfo.do
参数(application/x-www-form-urlencoded):
info Json字符串课堂信息,由前端自己维护
classId 课堂号
timestamp 时间戳
authId 做基本验证,md5(classId+timestamp)
返回 (application/json):
code 0 成功 1 课堂号为空 2 无效的课堂号 3 验证信息错误*/
saveClassStatusInfo
(
_param
)
{
if
(
GlobalConfig
.
isRecordPlayBack
)
{
loger
.
log
(
'录制回放中,不需要保存课堂信息'
);
return
;
}
//答题卡-------------------------------------------------------
//创建答题数据
creatQuestion
(
_param
){
if
(
GlobalConfig
.
isRecordPlayBack
){
loger
.
log
(
'录制回放中->创建答题数据->不做操作'
);
return
;
//{"classStatusInfo":classStatusInfo}
var
timestamp
=
new
Date
().
getTime
();
var
authId
=
MD5
(
GlobalConfig
.
classId
+
""
+
timestamp
);
// (classId+timestamp)的字符串,转成MD5
let
classStatusInfo
=
JSON
.
stringify
(
_param
.
classStatusInfo
);
let
url
=
`
http
:
//${GlobalConfig.portal}/3m/api/meeting/saveInfo.do`;
loger
.
log
(
'saveClassStatusInfo'
,
url
);
fetch
(
url
,
{
method
:
'POST'
,
headers
:
{
"Content-Type"
:
"application/x-www-form-urlencoded"
},
body
:
`
classId
=
$
{
GlobalConfig
.
classId
}
&
info
=
$
{
classStatusInfo
}
&
timestamp
=
$
{
timestamp
}
&
authId
=
$
{
authId
}
`
,
timeout
:
5000
})
.
then
(
ret
=>
{
if
(
ret
.
ok
)
{
return
ret
.
json
();
}
else
{
loger
.
error
(
`
saveClassStatusInfo
-
网络异常
.
状态码
:
$
{
ret
.
status
}
`
);
//this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_DOC_DELETE_FAILED);
throw
''
;
}
/* {
"type": 1,//1单选,2多选,3判断,4点名
"content": "题目",//没有就传""
"timeLimit": 88,//有效时间(秒)
"correct": "[]",//正确答案,没有就传[]
"options": {},//选项数组,没有就传[]
"option": []//学生选择的答案,没有就传[]
}*/
if
(
!
_param
){
loger
.
warn
(
'创建答题数据->参数错误->param:'
,
_param
);
this
.
_emit
(
Sass
.
SASS_CREAT_QUESTION_FAILED
);
return
;
})
.
then
(
ret
=>
{
if
(
ret
.
code
===
0
)
{
loger
.
log
(
'saveClassStatusInfo 完成'
);
this
.
_emit
(
Sass
.
CLASS_SAVE_STATUS_INFO_SUCCESS
,
_param
);
}
else
if
(
ret
.
code
===
1
)
{
loger
.
log
(
'saveClassStatusInfo 失败 课堂号为空'
);
}
else
if
(
ret
.
code
===
2
)
{
loger
.
log
(
'saveClassStatusInfo 失败 无效的课堂号'
);
}
else
if
(
ret
.
code
===
3
)
{
loger
.
log
(
'saveClassStatusInfo 失败 验证信息错误'
);
}
else
{
loger
.
warn
(
'saveClassStatusInfo 失败.'
,
ret
);
//this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_DOC_DELETE_FAILED);
}
})
.
catch
(
err
=>
{
loger
.
error
(
`
saveClassStatusInfo
.
状态码
:
$
{
err
}
`
);
//this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_DOC_DELETE_FAILED);
});
}
//保存录制的信息,主要是录制文件的名称,必须和MCU录制的文件名相同
saveClassRecordContrlInfo
(
_param
)
{
if
(
GlobalConfig
.
isRecordPlayBack
)
{
loger
.
log
(
'录制回放中,不需要保存'
);
return
;
}
loger
.
log
(
'保存开始录制信息'
);
let
key
=
"3mang123A"
;
let
siteID
=
GlobalConfig
.
siteId
;
let
meetingID
=
GlobalConfig
.
classId
;
let
userID
=
GlobalConfig
.
userId
;
let
userName
=
GlobalConfig
.
userName
;
let
meetingName
=
GlobalConfig
.
className
;
let
startTime
=
GlobalConfig
.
classBeginTime
;
let
endTime
=
GlobalConfig
.
classEndTime
;
let
playUrl
=
""
;
let
streamName
=
GlobalConfig
.
recordFileName
;
let
confRecordFileName
=
GlobalConfig
.
recordFileName
;
let
downloadUrl
=
""
;
let
recordStatus
=
GlobalConfig
.
classStatus
;
let
recordTimestamp
=
GlobalConfig
.
classTimestamp
;
let
timestamp
=
new
Date
().
getTime
();
let
authId
=
MD5
(
key
+
siteID
+
meetingID
+
timestamp
);
let
url
=
`
http
:
//${GlobalConfig.portal}/3m/recordingMeeting/insertRecordingMeeting.do`;
loger
.
log
(
'saveClassRecordContrlInfo'
,
url
);
fetch
(
encodeURI
(
url
),
{
method
:
'POST'
,
headers
:
{
"Content-Type"
:
"application/x-www-form-urlencoded"
},
body
:
`
siteID
=
$
{
siteID
}
&
meetingID
=
$
{
meetingID
}
&
userID
=
$
{
userID
}
&
userName
=
$
{
userName
}
&
meetingName
=
$
{
meetingName
}
&
startTime
=
$
{
startTime
}
&
endTime
=
$
{
endTime
}
&
playUrl
=
$
{
playUrl
}
&
streamName
=
$
{
streamName
}
&
downloadUrl
=
$
{
downloadUrl
}
&
configFile
=
$
{
confRecordFileName
}
&
timestamp
=
$
{
timestamp
}
&
recordTimestamp
=
$
{
recordTimestamp
}
&
authId
=
$
{
authId
}
`
,
timeout
:
5000
})
.
then
(
ret
=>
{
if
(
ret
.
ok
)
{
return
ret
.
json
();
}
else
{
loger
.
error
(
`保存开始录制信息
-
网络异常
.
状态码
:
$
{
ret
.
status
}
`
);
throw
''
;
}
let
classId
=
GlobalConfig
.
classId
;
//课堂号
var
timestamp
=
new
Date
().
getTime
();
let
authId
=
MD5
(
classId
+
""
+
timestamp
);
let
type
=
parseInt
(
_param
.
type
);
//1单选,2多选,3判断,4点名
let
content
=
_param
.
content
||
""
;
let
timeLimit
=
parseInt
(
_param
.
timeLimit
);
let
correct
=
_param
.
correct
.
toString
();
let
options
=
JSON
.
stringify
(
_param
.
options
);
let
url
=
`
http
:
//${GlobalConfig.portal}/3m/api/question/add.do`;
loger
.
log
(
'创建答题数据'
,
url
);
fetch
(
encodeURI
(
url
),
{
method
:
'POST'
,
headers
:
{
"Content-Type"
:
"application/x-www-form-urlencoded; charset=utf-8"
},
//classId=1×tamp=2&authId=3&content=&options=["A","B","C","D"]&type=1&correct=0&timeLimit=60
body
:
`
classId
=
$
{
classId
}
&
timestamp
=
$
{
timestamp
}
&
authId
=
$
{
authId
}
&
content
=
$
{
content
}
&
options
=
$
{
options
}
&
type
=
$
{
type
}
&
correct
=
$
{
correct
}
&
timeLimit
=
$
{
timeLimit
}
`
,
timeout
:
5000
})
.
then
(
ret
=>
{
if
(
ret
.
errorCode
===
0
)
{
loger
.
log
(
'保存开始录制信息 完成'
);
this
.
_emit
(
Sass
.
CLASS_SAVE_RECORD_INFO_SUCCESS
,
_param
);
}
else
{
loger
.
warn
(
'保存开始录制信息 失败.'
,
ret
);
}
})
.
catch
(
err
=>
{
loger
.
error
(
`保存开始录制信息异常
.
状态码
:
$
{
err
}
`
);
});
}
//答题卡-------------------------------------------------------
//创建答题数据
creatQuestion
(
_param
)
{
if
(
GlobalConfig
.
isRecordPlayBack
)
{
loger
.
log
(
'录制回放中->创建答题数据->不做操作'
);
return
;
}
/* {
"type": 1,//1单选,2多选,3判断,4点名
"content": "题目",//没有就传""
"timeLimit": 88,//有效时间(秒)
"correct": "[]",//正确答案,没有就传[]
"options": {},//选项数组,没有就传[]
"option": []//学生选择的答案,没有就传[]
}*/
if
(
!
_param
)
{
loger
.
warn
(
'创建答题数据->参数错误->param:'
,
_param
);
this
.
_emit
(
Sass
.
SASS_CREAT_QUESTION_FAILED
);
return
;
}
let
classId
=
GlobalConfig
.
classId
;
//课堂号
var
timestamp
=
new
Date
().
getTime
();
let
authId
=
MD5
(
classId
+
""
+
timestamp
);
let
type
=
parseInt
(
_param
.
type
);
//1单选,2多选,3判断,4点名
let
content
=
_param
.
content
||
""
;
let
timeLimit
=
parseInt
(
_param
.
timeLimit
);
let
correct
=
_param
.
correct
.
toString
();
let
options
=
JSON
.
stringify
(
_param
.
options
);
let
url
=
`
http
:
//${GlobalConfig.portal}/3m/api/question/add.do`;
loger
.
log
(
'创建答题数据'
,
url
);
fetch
(
encodeURI
(
url
),
{
method
:
'POST'
,
headers
:
{
"Content-Type"
:
"application/x-www-form-urlencoded; charset=utf-8"
},
//classId=1×tamp=2&authId=3&content=&options=["A","B","C","D"]&type=1&correct=0&timeLimit=60
body
:
`
classId
=
$
{
classId
}
&
timestamp
=
$
{
timestamp
}
&
authId
=
$
{
authId
}
&
content
=
$
{
content
}
&
options
=
$
{
options
}
&
type
=
$
{
type
}
&
correct
=
$
{
correct
}
&
timeLimit
=
$
{
timeLimit
}
`
,
timeout
:
5000
})
.
then
(
ret
=>
{
if
(
ret
.
ok
)
{
return
ret
.
json
();
}
else
{
loger
.
error
(
`创建答题数据
-
网络异常
.
状态码
:
$
{
ret
.
status
}
`
);
this
.
_emit
(
Sass
.
SASS_CREAT_QUESTION_FAILED
);
throw
''
;
}
})
.
then
(
ret
=>
{
if
(
ret
.
ok
)
{
return
ret
.
json
();
}
else
{
loger
.
error
(
`创建答题数据
-
网络异常
.
状态码
:
$
{
ret
.
status
}
`
);
this
.
_emit
(
Sass
.
SASS_CREAT_QUESTION_FAILED
);
throw
''
;
}
})
.
then
(
ret
=>
{
if
(
ret
.
code
==
0
)
{
//errorCode int 0 正常 1 没有指定的课堂 4 验证信息错误(authId)
// {"code":0,"id":1}
let
question
=
{};
question
.
questionId
=
ret
.
id
;
question
.
type
=
type
;
question
.
content
=
_param
.
content
||
[];
question
.
timeLimit
=
timeLimit
;
question
.
correct
=
_param
.
correct
||
[];
question
.
options
=
_param
.
options
||
[];
loger
.
log
(
'创建答题数据->完成->'
,
question
);
this
.
_emit
(
Sass
.
SASS_CREAT_QUESTION_SUCCESS
,
question
);
}
else
{
loger
.
warn
(
'创建答题数据->失败.'
,
ret
);
this
.
_emit
(
Sass
.
SASS_CREAT_QUESTION_FAILED
);
}
})
.
catch
(
err
=>
{
loger
.
error
(
`创建答题数据
->
状态码
:
$
{
err
}
`
);
this
.
_emit
(
Sass
.
SASS_CREAT_QUESTION_FAILED
);
});
.
then
(
ret
=>
{
if
(
ret
.
code
==
0
)
{
//errorCode int 0 正常 1 没有指定的课堂 4 验证信息错误(authId)
// {"code":0,"id":1}
let
question
=
{};
question
.
questionId
=
ret
.
id
;
question
.
type
=
type
;
question
.
content
=
_param
.
content
||
[];
question
.
timeLimit
=
timeLimit
;
question
.
correct
=
_param
.
correct
||
[];
question
.
options
=
_param
.
options
||
[];
loger
.
log
(
'创建答题数据->完成->'
,
question
);
this
.
_emit
(
Sass
.
SASS_CREAT_QUESTION_SUCCESS
,
question
);
}
else
{
loger
.
warn
(
'创建答题数据->失败.'
,
ret
);
this
.
_emit
(
Sass
.
SASS_CREAT_QUESTION_FAILED
);
}
})
.
catch
(
err
=>
{
loger
.
error
(
`创建答题数据
->
状态码
:
$
{
err
}
`
);
this
.
_emit
(
Sass
.
SASS_CREAT_QUESTION_FAILED
);
});
}
//保存答题数据
sendAnswer
(
_param
){
if
(
GlobalConfig
.
isRecordPlayBack
){
loger
.
log
(
'录制回放中->保存答题数据->不做操作'
);
return
;
}
if
(
!
_param
){
loger
.
warn
(
'保存答题数据->参数错误->param:'
,
_param
);
sendAnswer
(
_param
)
{
if
(
GlobalConfig
.
isRecordPlayBack
)
{
loger
.
log
(
'录制回放中->保存答题数据->不做操作'
);
return
;
}
if
(
!
_param
)
{
loger
.
warn
(
'保存答题数据->参数错误->param:'
,
_param
);
this
.
_emit
(
Sass
.
SASS_SEND_ANSWER_FAILED
);
return
;
}
/*classId String课堂号
timestamp 时间戳
authId String验证信息md5(classId+timestamp)
questionId long 题目id
answer String 选择的选项的索引,如果是多选,用英文逗号分隔。例如:'0,3'
userId String 用户id
userName String 用户名字*/
let
classId
=
GlobalConfig
.
classId
;
//课堂号
var
timestamp
=
new
Date
().
getTime
();
let
authId
=
MD5
(
classId
+
""
+
timestamp
);
let
type
=
parseInt
(
_param
.
type
);
//1单选,2多选,3判断,4点名
let
questionId
=
parseInt
(
_param
.
questionId
);
//题目id
let
answer
=
_param
.
answer
.
toString
();
let
userId
=
_param
.
userId
;
let
userName
=
_param
.
userName
;
let
url
=
`
http
:
//${GlobalConfig.portal}/3m/api/question/answer.do`;
loger
.
log
(
'保存答题数据'
,
url
);
fetch
(
encodeURI
(
url
),
{
method
:
'POST'
,
headers
:
{
"Content-Type"
:
"application/x-www-form-urlencoded; charset=utf-8"
},
//classId=1×tamp=2&authId=3&questionId=1&answer=0&userId=111&userName=zhang3
body
:
`
classId
=
$
{
classId
}
&
timestamp
=
$
{
timestamp
}
&
authId
=
$
{
authId
}
&
questionId
=
$
{
questionId
}
&
answer
=
$
{
answer
}
&
userId
=
$
{
userId
}
&
userName
=
$
{
userName
}
`
,
timeout
:
5000
})
.
then
(
ret
=>
{
if
(
ret
.
ok
)
{
return
ret
.
json
();
}
else
{
loger
.
error
(
`保存答题数据
-
网络异常
.
状态码
:
$
{
ret
.
status
}
`
);
this
.
_emit
(
Sass
.
SASS_SEND_ANSWER_FAILED
);
return
;
}
/*classId String课堂号
timestamp 时间戳
authId String验证信息md5(classId+timestamp)
questionId long 题目id
answer String 选择的选项的索引,如果是多选,用英文逗号分隔。例如:'0,3'
userId String 用户id
userName String 用户名字*/
let
classId
=
GlobalConfig
.
classId
;
//课堂号
var
timestamp
=
new
Date
().
getTime
();
let
authId
=
MD5
(
classId
+
""
+
timestamp
);
let
type
=
parseInt
(
_param
.
type
);
//1单选,2多选,3判断,4点名
let
questionId
=
parseInt
(
_param
.
questionId
);
//题目id
let
answer
=
_param
.
answer
.
toString
();
let
userId
=
_param
.
userId
;
let
userName
=
_param
.
userName
;
let
url
=
`
http
:
//${GlobalConfig.portal}/3m/api/question/answer.do`;
loger
.
log
(
'保存答题数据'
,
url
);
fetch
(
encodeURI
(
url
),
{
method
:
'POST'
,
headers
:
{
"Content-Type"
:
"application/x-www-form-urlencoded; charset=utf-8"
},
//classId=1×tamp=2&authId=3&questionId=1&answer=0&userId=111&userName=zhang3
body
:
`
classId
=
$
{
classId
}
&
timestamp
=
$
{
timestamp
}
&
authId
=
$
{
authId
}
&
questionId
=
$
{
questionId
}
&
answer
=
$
{
answer
}
&
userId
=
$
{
userId
}
&
userName
=
$
{
userName
}
`
,
timeout
:
5000
throw
''
;
}
})
.
then
(
ret
=>
{
if
(
ret
.
ok
)
{
return
ret
.
json
();
}
else
{
loger
.
error
(
`保存答题数据
-
网络异常
.
状态码
:
$
{
ret
.
status
}
`
);
this
.
_emit
(
Sass
.
SASS_SEND_ANSWER_FAILED
);
throw
''
;
}
})
.
then
(
ret
=>
{
if
(
ret
.
code
==
0
)
{
// 0 正常 1 没有指定的课堂 4 验证信息错误(authId) 5 没有指定的题目 6 题目不属于该课堂
//{"code":0}
let
question
=
_param
;
loger
.
log
(
'保存答题数据->完成'
);
this
.
_emit
(
Sass
.
SASS_SEND_ANSWER_SUCCESS
,
question
);
}
else
{
loger
.
warn
(
'保存答题数据->失败.'
,
ret
);
this
.
_emit
(
Sass
.
SASS_SEND_ANSWER_FAILED
);
}
})
.
catch
(
err
=>
{
loger
.
error
(
`保存答题数据
->
状态码
:
$
{
err
}
`
);
this
.
_emit
(
Sass
.
SASS_SEND_ANSWER_FAILED
);
});
.
then
(
ret
=>
{
if
(
ret
.
code
==
0
)
{
// 0 正常 1 没有指定的课堂 4 验证信息错误(authId) 5 没有指定的题目 6 题目不属于该课堂
//{"code":0}
let
question
=
_param
;
loger
.
log
(
'保存答题数据->完成'
);
this
.
_emit
(
Sass
.
SASS_SEND_ANSWER_SUCCESS
,
question
);
}
else
{
loger
.
warn
(
'保存答题数据->失败.'
,
ret
);
this
.
_emit
(
Sass
.
SASS_SEND_ANSWER_FAILED
);
}
})
.
catch
(
err
=>
{
loger
.
error
(
`保存答题数据
->
状态码
:
$
{
err
}
`
);
this
.
_emit
(
Sass
.
SASS_SEND_ANSWER_FAILED
);
});
}
//查询题目数据
getQuestion
(
_param
){
if
(
GlobalConfig
.
isRecordPlayBack
){
loger
.
log
(
'录制回放中->查询题目数据->不做操作'
);
return
;
}
if
(
!
_param
){
loger
.
warn
(
'查询题目数据->参数错误->param:'
,
_param
);
getQuestion
(
_param
)
{
if
(
GlobalConfig
.
isRecordPlayBack
)
{
loger
.
log
(
'录制回放中->查询题目数据->不做操作'
);
return
;
}
if
(
!
_param
)
{
loger
.
warn
(
'查询题目数据->参数错误->param:'
,
_param
);
this
.
_emit
(
Sass
.
SASS_GET_QUESTION_FAILED
);
return
;
}
//questionId long 题目id
let
questionId
=
parseInt
(
_param
.
questionId
);
//题目id
let
url
=
`
http
:
//${GlobalConfig.portal}/3m/api/question/get.do`;
loger
.
log
(
'查询题目数据'
,
url
);
//接口中用的是GET
fetch
(
encodeURI
(
url
),
{
method
:
'POST'
,
headers
:
{
"Content-Type"
:
"application/x-www-form-urlencoded; charset=utf-8"
},
body
:
`
questionId
=
$
{
questionId
}
`
,
timeout
:
5000
})
.
then
(
ret
=>
{
if
(
ret
.
ok
)
{
return
ret
.
json
();
}
else
{
loger
.
error
(
`查询题目数据
-
网络异常
.
状态码
:
$
{
ret
.
status
}
`
);
this
.
_emit
(
Sass
.
SASS_GET_QUESTION_FAILED
);
return
;
}
//questionId long 题目id
let
questionId
=
parseInt
(
_param
.
questionId
);
//题目id
let
url
=
`
http
:
//${GlobalConfig.portal}/3m/api/question/get.do`;
loger
.
log
(
'查询题目数据'
,
url
);
//接口中用的是GET
fetch
(
encodeURI
(
url
),
{
method
:
'POST'
,
headers
:
{
"Content-Type"
:
"application/x-www-form-urlencoded; charset=utf-8"
},
body
:
`
questionId
=
$
{
questionId
}
`
,
timeout
:
5000
throw
''
;
}
})
.
then
(
ret
=>
{
if
(
ret
.
ok
)
{
return
ret
.
json
();
}
else
{
loger
.
error
(
`查询题目数据
-
网络异常
.
状态码
:
$
{
ret
.
status
}
`
);
this
.
_emit
(
Sass
.
SASS_GET_QUESTION_FAILED
);
throw
''
;
}
})
.
then
(
ret
=>
{
if
(
ret
.
code
==
0
)
{
//0 正常 5 没有指定的题目
//{"timeLimit":90,"code":0,"options":"[\"A\",\"B\",\"C\"]","id":22,"type":2,"content":"题目"}
loger
.
log
(
'查询题目数据->完成'
);
let
question
=
{};
question
.
questionId
=
ret
.
id
||
questionId
;
question
.
type
=
ret
.
type
;
question
.
timeLimit
=
ret
.
timeLimit
;
question
.
options
=
ret
.
options
;
question
.
content
=
ret
.
content
;
this
.
_emit
(
Sass
.
SASS_GET_QUESTION_SUCCESS
,
question
);
}
else
{
loger
.
warn
(
'查询题目数据->失败.'
,
ret
);
this
.
_emit
(
Sass
.
SASS_GET_QUESTION_FAILED
);
}
})
.
catch
(
err
=>
{
loger
.
error
(
`查询题目数据
->
状态码
:
$
{
err
}
`
);
this
.
_emit
(
Sass
.
SASS_GET_QUESTION_FAILED
);
});
.
then
(
ret
=>
{
if
(
ret
.
code
==
0
)
{
//0 正常 5 没有指定的题目
//{"timeLimit":90,"code":0,"options":"[\"A\",\"B\",\"C\"]","id":22,"type":2,"content":"题目"}
loger
.
log
(
'查询题目数据->完成'
);
let
question
=
{};
question
.
questionId
=
ret
.
id
||
questionId
;
question
.
type
=
ret
.
type
;
question
.
timeLimit
=
ret
.
timeLimit
;
question
.
options
=
ret
.
options
;
question
.
content
=
ret
.
content
;
this
.
_emit
(
Sass
.
SASS_GET_QUESTION_SUCCESS
,
question
);
}
else
{
loger
.
warn
(
'查询题目数据->失败.'
,
ret
);
this
.
_emit
(
Sass
.
SASS_GET_QUESTION_FAILED
);
}
})
.
catch
(
err
=>
{
loger
.
error
(
`查询题目数据
->
状态码
:
$
{
err
}
`
);
this
.
_emit
(
Sass
.
SASS_GET_QUESTION_FAILED
);
});
}
//查询答题结果数据
getQuestionResult
(
_param
){
if
(
GlobalConfig
.
isRecordPlayBack
){
loger
.
log
(
'录制回放中->查询答题结果数据->不做操作'
);
return
;
getQuestionResult
(
_param
)
{
if
(
GlobalConfig
.
isRecordPlayBack
)
{
loger
.
log
(
'录制回放中->查询答题结果数据->不做操作'
);
return
;
}
if
(
!
_param
)
{
loger
.
warn
(
'查询答题结果数据->参数错误->param:'
,
_param
);
this
.
_emit
(
Sass
.
SASS_GET_QUESTION_RESULT_FAILED
);
return
;
}
//questionId long 题目id
let
questionId
=
parseInt
(
_param
.
questionId
);
//题目id
let
url
=
`
http
:
//${GlobalConfig.portal}/3m/api/question/results.do`;
loger
.
log
(
'查询答题结果数据'
,
url
);
fetch
(
encodeURI
(
url
),
{
method
:
'POST'
,
headers
:
{
"Content-Type"
:
"application/x-www-form-urlencoded; charset=utf-8"
},
body
:
`
questionId
=
$
{
questionId
}
`
,
timeout
:
5000
})
.
then
(
ret
=>
{
if
(
ret
.
ok
)
{
return
ret
.
json
();
}
else
{
loger
.
error
(
`查询答题结果数据
-
网络异常
.
状态码
:
$
{
ret
.
status
}
`
);
this
.
_emit
(
Sass
.
SASS_GET_QUESTION_RESULT_FAILED
);
throw
''
;
}
if
(
!
_param
){
loger
.
warn
(
'查询答题结果数据->参数错误->param:'
,
_param
);
this
.
_emit
(
Sass
.
SASS_GET_QUESTION_RESULT_FAILED
);
return
;
})
.
then
(
ret
=>
{
if
(
ret
.
code
==
0
)
{
//int 0 正常5 没有指定的题目
/* list array 数组
userId string 用户id
userName string 用户姓名
answer string 答案。选项的索引,多个时用逗号分隔
{"timeLimit":0,"content":"test question","id":11,"code":0,"type":3,"options":"["True", "False"]"}*/
loger
.
log
(
'查询答题结果数据->完成'
);
let
result
=
_param
||
{};
result
.
questionId
=
questionId
;
result
.
list
=
ret
.
list
;
this
.
_emit
(
Sass
.
SASS_GET_QUESTION_RESULT_SUCCESS
,
result
);
}
else
{
loger
.
warn
(
'查询答题结果数据->失败.'
,
ret
);
this
.
_emit
(
Sass
.
SASS_GET_QUESTION_RESULT_FAILED
);
}
//questionId long 题目id
let
questionId
=
parseInt
(
_param
.
questionId
);
//题目id
let
url
=
`
http
:
//${GlobalConfig.portal}/3m/api/question/results.do`;
loger
.
log
(
'查询答题结果数据'
,
url
);
fetch
(
encodeURI
(
url
),
{
method
:
'POST'
,
headers
:
{
"Content-Type"
:
"application/x-www-form-urlencoded; charset=utf-8"
},
body
:
`
questionId
=
$
{
questionId
}
`
,
timeout
:
5000
})
.
then
(
ret
=>
{
if
(
ret
.
ok
)
{
return
ret
.
json
();
}
else
{
loger
.
error
(
`查询答题结果数据
-
网络异常
.
状态码
:
$
{
ret
.
status
}
`
);
this
.
_emit
(
Sass
.
SASS_GET_QUESTION_RESULT_FAILED
);
throw
''
;
}
})
.
then
(
ret
=>
{
if
(
ret
.
code
==
0
)
{
//int 0 正常5 没有指定的题目
/* list array 数组
userId string 用户id
userName string 用户姓名
answer string 答案。选项的索引,多个时用逗号分隔
{"timeLimit":0,"content":"test question","id":11,"code":0,"type":3,"options":"["True", "False"]"}*/
loger
.
log
(
'查询答题结果数据->完成'
);
let
result
=
_param
||
{};
result
.
questionId
=
questionId
;
result
.
list
=
ret
.
list
;
this
.
_emit
(
Sass
.
SASS_GET_QUESTION_RESULT_SUCCESS
,
result
);
}
else
{
loger
.
warn
(
'查询答题结果数据->失败.'
,
ret
);
this
.
_emit
(
Sass
.
SASS_GET_QUESTION_RESULT_FAILED
);
}
})
.
catch
(
err
=>
{
loger
.
error
(
`查询答题结果数据
->
状态码
:
$
{
err
}
`
);
this
.
_emit
(
Sass
.
SASS_GET_QUESTION_RESULT_FAILED
);
});
}
//点名---------------------------------------------------------
})
.
catch
(
err
=>
{
loger
.
error
(
`查询答题结果数据
->
状态码
:
$
{
err
}
`
);
this
.
_emit
(
Sass
.
SASS_GET_QUESTION_RESULT_FAILED
);
});
}
//点名---------------------------------------------------------
}
Sass
.
prototype
.
SUCCESS
=
Sass
.
SUCCESS
=
'Sass_success'
;
Sass
.
prototype
.
CLASS_INIT_SUCCESS
=
Sass
.
CLASS_INIT_SUCCESS
=
'sass_class_init_success'
;
Sass
.
prototype
.
CLASS_GET_CLASS_PARAM
=
Sass
.
CLASS_GET_CLASS_PARAM
=
'sass_class_getClassParam.message'
;
Sass
.
prototype
.
CLASS_GET_CLASS_DETAIL
=
Sass
.
CLASS_GET_CLASS_DETAIL
=
'sass_class_getClassDetail_message'
;
Sass
.
prototype
.
DELETE_DOCUMENT_SUCCESS
=
Sass
.
DELETE_DOCUMENT_SUCCESS
=
'sass_class_deleteDocumentSuccess_message'
;
//删除文档成功
Sass
.
prototype
.
DELETE_MEDIASHARE_SUCCESS
=
Sass
.
DELETE_MEDIASHARE_SUCCESS
=
'sass_class_deleteMediaShareSuccess_message'
;
//删除文档成功
Sass
.
prototype
.
DELETE_DOCUMENT_SUCCESS
=
Sass
.
DELETE_DOCUMENT_SUCCESS
=
'sass_class_deleteDocumentSuccess_message'
;
//删除文档成功
Sass
.
prototype
.
DELETE_MEDIASHARE_SUCCESS
=
Sass
.
DELETE_MEDIASHARE_SUCCESS
=
'sass_class_deleteMediaShareSuccess_message'
;
//删除文档成功
Sass
.
prototype
.
DELETE_MUSICSHARE_SUCCESS
=
Sass
.
DELETE_MUSICSHARE_SUCCESS
=
'sass_class_deleteMusicShareSuccess_message'
;
//删除文档成功
Sass
.
prototype
.
CLASS_SAVE_STATUS_INFO_SUCCESS
=
Sass
.
CLASS_SAVE_STATUS_INFO_SUCCESS
=
'sass_class_saveClassStatusInfoSuccess_message'
;
//保存课堂状态信息
Sass
.
prototype
.
CLASS_SAVE_RECORD_INFO_SUCCESS
=
Sass
.
CLASS_SAVE_RECORD_INFO_SUCCESS
=
'sass_class_saveClassRecordInfoSuccess_message'
;
//保存录制课堂信息
Sass
.
prototype
.
CLASS_SAVE_STATUS_INFO_SUCCESS
=
Sass
.
CLASS_SAVE_STATUS_INFO_SUCCESS
=
'sass_class_saveClassStatusInfoSuccess_message'
;
//保存课堂状态信息
Sass
.
prototype
.
CLASS_SAVE_RECORD_INFO_SUCCESS
=
Sass
.
CLASS_SAVE_RECORD_INFO_SUCCESS
=
'sass_class_saveClassRecordInfoSuccess_message'
;
//保存录制课堂信息
//答题卡和点名
Sass
.
prototype
.
SASS_CREAT_QUESTION_SUCCESS
=
Sass
.
SASS_CREAT_QUESTION_SUCCESS
=
'sass_creat_question_success'
;
//创建答题卡问题成功
Sass
.
prototype
.
SASS_CREAT_QUESTION_FAILED
=
Sass
.
SASS_CREAT_QUESTION_FAILED
=
'sass_creat_question_failed'
;
//创建答题卡失败
Sass
.
prototype
.
SASS_CREAT_QUESTION_SUCCESS
=
Sass
.
SASS_CREAT_QUESTION_SUCCESS
=
'sass_creat_question_success'
;
//创建答题卡问题成功
Sass
.
prototype
.
SASS_CREAT_QUESTION_FAILED
=
Sass
.
SASS_CREAT_QUESTION_FAILED
=
'sass_creat_question_failed'
;
//创建答题卡失败
Sass
.
prototype
.
SASS_GET_QUESTION_SUCCESS
=
Sass
.
SASS_GET_QUESTION_SUCCESS
=
'sass_get_question_success'
;
//获取问题成功
Sass
.
prototype
.
SASS_GET_QUESTION_FAILED
=
Sass
.
SASS_GET_QUESTION_FAILED
=
'sass_get_question_failed'
;
//获取问题失败
Sass
.
prototype
.
SASS_GET_QUESTION_SUCCESS
=
Sass
.
SASS_GET_QUESTION_SUCCESS
=
'sass_get_question_success'
;
//获取问题成功
Sass
.
prototype
.
SASS_GET_QUESTION_FAILED
=
Sass
.
SASS_GET_QUESTION_FAILED
=
'sass_get_question_failed'
;
//获取问题失败
Sass
.
prototype
.
SASS_GET_QUESTION_RESULT_SUCCESS
=
Sass
.
SASS_GET_QUESTION_RESULT_SUCCESS
=
'sass_get_question_result_success'
;
//获取问题结果成功
Sass
.
prototype
.
SASS_GET_QUESTION_RESULT_FAILED
=
Sass
.
SASS_GET_QUESTION_RESULT_FAILED
=
'sass_get_question_result_failed'
;
//获取问题结果失败
Sass
.
prototype
.
SASS_GET_QUESTION_RESULT_SUCCESS
=
Sass
.
SASS_GET_QUESTION_RESULT_SUCCESS
=
'sass_get_question_result_success'
;
//获取问题结果成功
Sass
.
prototype
.
SASS_GET_QUESTION_RESULT_FAILED
=
Sass
.
SASS_GET_QUESTION_RESULT_FAILED
=
'sass_get_question_result_failed'
;
//获取问题结果失败
Sass
.
prototype
.
SASS_SEND_ANSWER_SUCCESS
=
Sass
.
SASS_SEND_ANSWER_SUCCESS
=
'sass_send_answer_success'
;
//保存答案成功
Sass
.
prototype
.
SASS_SEND_ANSWER_FAILED
=
Sass
.
SASS_SEND_ANSWER_FAILED
=
'sass_send_answer_failed'
;
//保存答案失败
Sass
.
prototype
.
SASS_SEND_ANSWER_SUCCESS
=
Sass
.
SASS_SEND_ANSWER_SUCCESS
=
'sass_send_answer_success'
;
//保存答案成功
Sass
.
prototype
.
SASS_SEND_ANSWER_FAILED
=
Sass
.
SASS_SEND_ANSWER_FAILED
=
'sass_send_answer_failed'
;
//保存答案失败
export
default
new
Sass
;
...
...
src/apes/ConferApe.js
查看文件 @
6b91264
...
...
@@ -95,7 +95,7 @@ class ConferApe extends Ape {
getNodeInfo
()
{
let
nodeInfoRecordPdu
=
new
pdu
[
'RCNodeInfoRecordPdu'
];
nodeInfoRecordPdu
.
nodeId
=
GlobalConfig
.
nodeId
;
nodeInfoRecordPdu
.
selfSilence
=
JSON
.
stringify
(
GlobalConfig
.
selfSilence
)
||
""
;
nodeInfoRecordPdu
.
selfSilence
=
JSON
.
stringify
(
GlobalConfig
.
selfSilence
)
||
""
;
nodeInfoRecordPdu
.
name
=
GlobalConfig
.
userName
;
nodeInfoRecordPdu
.
role
=
ApeConsts
.
userTypesToId
[
GlobalConfig
.
userRole
]
||
1
;
//NR_NORMAL用户的身份,根据用户登录时的身份设置;
nodeInfoRecordPdu
.
level
=
GlobalConfig
.
level
;
...
...
@@ -333,11 +333,11 @@ class ConferApe extends Ape {
// 全局禁言
silenceClass
(
params
)
{
if
(
GlobalConfig
.
isHost
)
{
if
(
!
GlobalConfig
.
isNormal
)
{
//同步禁言状态
this
.
sendUpdaterClassStatusInfo
(
params
);
}
else
{
loger
.
warn
(
'
没有开始课堂的
权限'
);
loger
.
warn
(
'
老师/监客拥有改
权限'
);
}
}
...
...
@@ -415,13 +415,13 @@ class ConferApe extends Ape {
}
let
msgObj
=
{};
msgObj
.
nodeId
=
_param
.
nodeId
;
msgObj
.
silence
=
_param
.
silence
||
{};
msgObj
.
silence
=
_param
.
silence
||
{};
this
.
sendConferMsg
({
"to"
:
_param
.
nodeId
,
"message"
:
JSON
.
stringify
(
msgObj
),
"actionType"
:
ApeConsts
.
USER_ACTION_SILENCE_STATUS_CHANGE
});
}
changeSilenceStatus
(
_param
)
{
loger
.
log
(
'切换禁言状态->'
,
_param
);
GlobalConfig
.
selfSilence
=
_param
.
silence
||
{};
GlobalConfig
.
selfSilence
=
_param
.
silence
||
{};
this
.
updateUserInfo
();
}
...
...
src/apes/CursorApe.js
查看文件 @
6b91264
...
...
@@ -8,7 +8,7 @@
// Author: AlexWang
// Date: 2016-08-26 17:36:20
// QQ Email: 1669499355@qq.com
// Last Modified time: 2017-06-2
7 18:13:39
// Last Modified time: 2017-06-2
9 14:09:25
// Description: LiveClass-CursorApe
//
// //////////////////////////////////////////////////////////////////////////////
...
...
@@ -54,7 +54,7 @@ class CursorApe extends Ape {
return
;
}
let
itemIdx
=
EngineUtils
.
creatSoleNumberFromTimestamp
();
//创建时间戳,保证每条数据的唯一
let
itemIdx
=
ApeConsts
.
CURSOR_OBJ_TABLE_ID
;
let
cursorModelPdu
=
this
.
packPdu
(
_param
,
itemIdx
);
if
(
cursorModelPdu
==
null
)
{
loger
.
warn
(
'添加标注失败-->参数错误->'
,
_param
);
...
...
@@ -68,13 +68,14 @@ class CursorApe extends Ape {
tableItemPdu
.
owner
=
0
;
//收到flash的是这个值,不清楚先写固定
tableItemPdu
.
itemData
=
cursorModelPdu
.
toArrayBuffer
();
//insert
let
tableInsertItemPdu
=
new
pdu
[
'RCRegistryTableInsertItemPdu'
];
tableInsertItemPdu
.
type
=
pdu
.
RCPDU_REG_TABLE_INSERT_PDU
;
//
let
tableInsertItemPdu
=
new
pdu
[
'RCRegistryTableUpdateItemPdu'
];
//optional RCPduType_E type = 1 [default = RCPDU_REG_TABLE_UPDATE_PDU];
//repeated RCRegistryTableItemPdu items = 2;
tableInsertItemPdu
.
type
=
pdu
.
RCPDU_REG_TABLE_UPDATE_PDU
;
//
tableInsertItemPdu
.
items
.
push
(
tableItemPdu
);
let
updateObjPdu
=
new
pdu
[
'RCRegistryUpdateObjPdu'
];
updateObjPdu
.
objId
=
ApeConsts
.
CURSOR_OBJ_TABLE_ID
;
updateObjPdu
.
objId
=
ApeConsts
.
DOCSHARING_OBJ_TABLE_ID
;
// updateObjPdu.objId = ApeConsts.DOCSHARING_OBJ_TABLE_ID_H5
;
updateObjPdu
.
subType
=
tableInsertItemPdu
.
type
;
updateObjPdu
.
userData
=
tableInsertItemPdu
.
toArrayBuffer
();
...
...
@@ -87,14 +88,14 @@ class CursorApe extends Ape {
adapterPdu
.
type
=
pdu
.
RCPDU_REG_ADAPTER
;
adapterPdu
.
item
.
push
(
adapterItemPdu
);
loger
.
log
(
"
添加标注->
itemIdx="
+
tableItemPdu
.
itemIdx
);
loger
.
log
(
"
发送更新.
itemIdx="
+
tableItemPdu
.
itemIdx
);
this
.
sendUniform
(
adapterPdu
,
true
);
}
/////鼠标数据接受/////////////////////////////////////////////////////////////////////////////////
table
Insert
Handler
(
owner
,
itemIdx
,
itemData
)
{
table
Update
Handler
(
owner
,
itemIdx
,
itemData
)
{
let
cursorModel
=
this
.
unPackPdu
(
owner
,
itemIdx
,
itemData
);
loger
.
log
(
'table
Insert
Handler'
,
"activeDocId->"
,
GlobalConfig
.
activeDocId
,
"parentId->"
,
cursorModel
.
parentId
);
loger
.
log
(
'table
Update
Handler'
,
"activeDocId->"
,
GlobalConfig
.
activeDocId
,
"parentId->"
,
cursorModel
.
parentId
);
loger
.
log
(
cursorModel
);
if
(
cursorModel
)
{
this
.
_emit
(
MessageTypes
.
CURSOR_UPDATE
,
cursorModel
);
...
...
@@ -131,8 +132,8 @@ class CursorApe extends Ape {
unPackPdu
(
owner
,
itemIdx
,
itemData
)
{
try
{
loger
.
log
(
"鼠标标注数据->unPackPdu"
);
let
cursorModelPdu
=
pdu
[
'RCCursorDataModelPdu'
].
decode
(
itemData
);
let
_pointGroup
=
EngineUtils
.
arrayFromJsonString
(
cursorModelPdu
.
pointGroup
);
const
cursorModelPdu
=
pdu
[
'RCCursorDataModelPdu'
].
decode
(
itemData
);
const
_pointGroup
=
EngineUtils
.
arrayFromJsonString
(
cursorModelPdu
.
pointGroup
);
cursorModelPdu
.
pointGroup
=
_pointGroup
;
return
cursorModelPdu
;
}
catch
(
err
)
{
...
...
src/apes/MusicSharedApe.js
查看文件 @
6b91264
...
...
@@ -102,7 +102,7 @@ class MusicSharedApe extends Ape {
adapterPdu
.
type
=
pdu
.
RCPDU_REG_ADAPTER
;
adapterPdu
.
item
.
push
(
adapterItemPdu
);
loger
.
log
(
"
媒体
文件发送删除数据=============>"
+
tableDeleteItemPdu
.
itemIdx
);
loger
.
log
(
"
MUSIC
文件发送删除数据=============>"
+
tableDeleteItemPdu
.
itemIdx
);
this
.
sendUniform
(
adapterPdu
,
true
);
}
...
...
@@ -347,7 +347,7 @@ class MusicSharedApe extends Ape {
loger
.
log
(
'添加媒体文件->设置当前激活的媒体文件id'
);
}
let
getMusicPackFullInfo
=
this
.
_musicSharedPackFullInfo
(
itemDataInfo
);
this
.
_emit
(
MessageTypes
.
M
EDIA
_SHARED_UPDATE
,
getMusicPackFullInfo
);
this
.
_emit
(
MessageTypes
.
M
USIC
_SHARED_UPDATE
,
getMusicPackFullInfo
);
}
}
//媒体文件数据更新完毕,如果当前没有显示的媒体文件,默认选择一个显示
...
...
@@ -367,7 +367,7 @@ class MusicSharedApe extends Ape {
GlobalConfig
.
activeMusicSeek
=
1
;
//当前激活的媒体文件的当前页
loger
.
log
(
'删除媒体文件数据->清除当前显示的媒体文件'
);
}
this
.
_emit
(
MessageTypes
.
M
EDIA
_SHARED_DELETE
,
{
"itemIdx"
:
itemIdxs
[
i
]
});
this
.
_emit
(
MessageTypes
.
M
USIC
_SHARED_DELETE
,
{
"itemIdx"
:
itemIdxs
[
i
]
});
delete
this
.
musicSharedList
[
itemIdxs
[
i
]];
}
}
...
...
@@ -393,7 +393,7 @@ class MusicSharedApe extends Ape {
loger
.
log
(
'更新媒体文件->设置当前激活的媒体文件id->'
,
GlobalConfig
.
activeMusicId
,
"curPageNum->"
,
GlobalConfig
.
activeMusicSeek
);
}
let
getMusicPackFullInfo
=
this
.
_musicSharedPackFullInfo
(
itemDataInfo
);
this
.
_emit
(
MessageTypes
.
M
EDIA
_SHARED_UPDATE
,
getMusicPackFullInfo
);
this
.
_emit
(
MessageTypes
.
M
USIC
_SHARED_UPDATE
,
getMusicPackFullInfo
);
}
else
{
loger
.
log
(
'更新媒体文件-> 数据无效--> itemIdx'
,
itemIdx
);
}
...
...
请
注册
或
登录
后发表评论