AlexWang

增加音频共享接口

... ... @@ -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);
... ...
... ... @@ -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; //获取录制回放数据失败
... ...
... ... @@ -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}&timestamp=${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}&timestamp=${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}&timestamp=${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}&timestamp=${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}&timestamp=${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}&timestamp=${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}&timestamp=${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&timestamp=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&timestamp=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&timestamp=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&timestamp=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;
... ...
... ... @@ -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();
}
... ...
... ... @@ -8,7 +8,7 @@
// Author: AlexWang
// Date: 2016-08-26 17:36:20
// QQ Email: 1669499355@qq.com
// Last Modified time: 2017-06-27 18:13:39
// Last Modified time: 2017-06-29 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);
}
/////鼠标数据接受/////////////////////////////////////////////////////////////////////////////////
tableInsertHandler(owner, itemIdx, itemData) {
tableUpdateHandler(owner, itemIdx, itemData) {
let cursorModel = this.unPackPdu(owner, itemIdx, itemData);
loger.log('tableInsertHandler', "activeDocId->", GlobalConfig.activeDocId, "parentId->", cursorModel.parentId);
loger.log('tableUpdateHandler', "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) {
... ...
... ... @@ -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.MEDIA_SHARED_UPDATE, getMusicPackFullInfo);
this._emit(MessageTypes.MUSIC_SHARED_UPDATE, getMusicPackFullInfo);
}
}
//媒体文件数据更新完毕,如果当前没有显示的媒体文件,默认选择一个显示
... ... @@ -367,7 +367,7 @@ class MusicSharedApe extends Ape {
GlobalConfig.activeMusicSeek = 1; //当前激活的媒体文件的当前页
loger.log('删除媒体文件数据->清除当前显示的媒体文件');
}
this._emit(MessageTypes.MEDIA_SHARED_DELETE, { "itemIdx": itemIdxs[i] });
this._emit(MessageTypes.MUSIC_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.MEDIA_SHARED_UPDATE, getMusicPackFullInfo);
this._emit(MessageTypes.MUSIC_SHARED_UPDATE, getMusicPackFullInfo);
} else {
loger.log('更新媒体文件-> 数据无效--> itemIdx', itemIdx);
}
... ...