正在显示
10 个修改的文件
包含
358 行增加
和
207 行删除
dist/McuClient.js
已删除
100644 → 0
此 diff 太大无法显示。
| @@ -16,6 +16,9 @@ import WhiteBoardApe from 'apes/WhiteBoardApe'; | @@ -16,6 +16,9 @@ import WhiteBoardApe from 'apes/WhiteBoardApe'; | ||
| 16 | import EngineUtils from "EngineUtils"; | 16 | import EngineUtils from "EngineUtils"; |
| 17 | import GlobalConfig from 'GlobalConfig'; | 17 | import GlobalConfig from 'GlobalConfig'; |
| 18 | import ApeConsts from 'apes/ApeConsts'; | 18 | import ApeConsts from 'apes/ApeConsts'; |
| 19 | +import Base64 from 'base64-js'; | ||
| 20 | +import ArrayBufferUtil from 'libs/ArrayBufferUtil'; | ||
| 21 | +import UTF8 from 'utf-8'; | ||
| 19 | 22 | ||
| 20 | let loger = Loger.getLoger('MessageEntrance'); | 23 | let loger = Loger.getLoger('MessageEntrance'); |
| 21 | let _sdkInfo={"version":"v.1.0.1","author":"www.3mang.com"}; | 24 | let _sdkInfo={"version":"v.1.0.1","author":"www.3mang.com"}; |
| @@ -61,6 +64,7 @@ export default class MessageEntrance extends Emiter { | @@ -61,6 +64,7 @@ export default class MessageEntrance extends Emiter { | ||
| 61 | _sass.on(_sass.CLASS_INIT_SUCCESS, this._sassInitSuccessHandler.bind(this)); | 64 | _sass.on(_sass.CLASS_INIT_SUCCESS, this._sassInitSuccessHandler.bind(this)); |
| 62 | _sass.on(_sass.CLASS_GET_CLASS_DETAIL, this._sassGetClassDetailSuccessHandler.bind(this)); | 65 | _sass.on(_sass.CLASS_GET_CLASS_DETAIL, this._sassGetClassDetailSuccessHandler.bind(this)); |
| 63 | _sass.on(_sass.CLASS_GET_CLASS_PARAM,this._sassGetClassParaSuccessHandler.bind(this)); | 66 | _sass.on(_sass.CLASS_GET_CLASS_PARAM,this._sassGetClassParaSuccessHandler.bind(this)); |
| 67 | + _sass.on(_sass.CLASS_SAVE_STATUS_INFO_SUCCESS,this._sassSaveClassStatusInfoSuccessHandler.bind(this)); | ||
| 64 | _sass.on(_sass.DELETE_DOCUMENT_SUCCESS,this._sassDeleteDocumentSuccess.bind(this)); | 68 | _sass.on(_sass.DELETE_DOCUMENT_SUCCESS,this._sassDeleteDocumentSuccess.bind(this)); |
| 65 | 69 | ||
| 66 | // 底层MCU消息层 | 70 | // 底层MCU消息层 |
| @@ -72,7 +76,8 @@ export default class MessageEntrance extends Emiter { | @@ -72,7 +76,8 @@ export default class MessageEntrance extends Emiter { | ||
| 72 | // 注册所有应用Ape | 76 | // 注册所有应用Ape |
| 73 | _confer_ape = new ConferApe(); | 77 | _confer_ape = new ConferApe(); |
| 74 | _confer_ape.on('*', (type, data) => this._emit(type, data)); | 78 | _confer_ape.on('*', (type, data) => this._emit(type, data)); |
| 75 | - //_confer_ape.on(MessageTypes.DOC_SWITCH, this.docSwitchHandler.bind(this)); | 79 | + _confer_ape.on(MessageTypes.CLASS_CLOSE, this._doClassClose.bind(this));//会议关闭,所有人都退出 |
| 80 | + _confer_ape.on(MessageTypes.CLASS_STATUS_INFO_CHANGE, this._onClassStatusInfoChange.bind(this));//当前会议状态信息发生改变 | ||
| 76 | 81 | ||
| 77 | _chat_ape = new ChatApe(); | 82 | _chat_ape = new ChatApe(); |
| 78 | _chat_ape.on('*', (type, data) => this._emit(type, data)); | 83 | _chat_ape.on('*', (type, data) => this._emit(type, data)); |
| @@ -149,6 +154,15 @@ export default class MessageEntrance extends Emiter { | @@ -149,6 +154,15 @@ export default class MessageEntrance extends Emiter { | ||
| 149 | return GlobalConfig.getClassDetail(); | 154 | return GlobalConfig.getClassDetail(); |
| 150 | } | 155 | } |
| 151 | 156 | ||
| 157 | + //关闭会议,所有人都退出 | ||
| 158 | + _doClassClose(_param){ | ||
| 159 | + this._leaveClass(); | ||
| 160 | + } | ||
| 161 | + //当前的会议状态信息发生改变 | ||
| 162 | + _onClassStatusInfoChange(_param){ | ||
| 163 | + this._sassSaveClassStatusInfo(); | ||
| 164 | + } | ||
| 165 | + | ||
| 152 | //Sass | 166 | //Sass |
| 153 | //初始化 | 167 | //初始化 |
| 154 | _init(_param,_onSuccess,_mcuErrorCallBack){ | 168 | _init(_param,_onSuccess,_mcuErrorCallBack){ |
| @@ -270,38 +284,16 @@ export default class MessageEntrance extends Emiter { | @@ -270,38 +284,16 @@ export default class MessageEntrance extends Emiter { | ||
| 270 | } | 284 | } |
| 271 | } | 285 | } |
| 272 | 286 | ||
| 273 | - //获取会议所有参数 | 287 | + //获取会议所有参数 getClassH5 |
| 274 | _sassGetClassDetailSuccessHandler(_data){ | 288 | _sassGetClassDetailSuccessHandler(_data){ |
| 275 | loger.log('获取getClassDetail完成.'); | 289 | loger.log('获取getClassDetail完成.'); |
| 276 | - /* { | ||
| 277 | - "cycle": 0, | ||
| 278 | - "repeatmonthweekweek": 0, | ||
| 279 | - "status": 1, | ||
| 280 | - "repeatmonthday": 0, | ||
| 281 | - "repeatmode": 0, | ||
| 282 | - "beginTime": "2017-02-03 09:00:00", | ||
| 283 | - "frequency": 1, | ||
| 284 | - "endmode": 0, | ||
| 285 | - "meetingContent": "", | ||
| 286 | - "endTime": "2017-03-31 11:00:00", | ||
| 287 | - "repeatweek": "", | ||
| 288 | - "category": "", | ||
| 289 | - "finalenddate": "", | ||
| 290 | - "repeatday": 0, | ||
| 291 | - "meetingName": "mcu1", | ||
| 292 | - "errorCode": 0, | ||
| 293 | - "monthType": 0, | ||
| 294 | - "repeatmonthweekday": 0, | ||
| 295 | - "endcount": 1 | ||
| 296 | - }*/ | ||
| 297 | GlobalConfig.setClassDetail=_data; | 290 | GlobalConfig.setClassDetail=_data; |
| 298 | - | ||
| 299 | } | 291 | } |
| 300 | 292 | ||
| 301 | //获取会议所有参数 api/meeting/detail.do? flash中的接口文件是 getClassParam.do | 293 | //获取会议所有参数 api/meeting/detail.do? flash中的接口文件是 getClassParam.do |
| 302 | _sassGetClassParaSuccessHandler(_data){ | 294 | _sassGetClassParaSuccessHandler(_data){ |
| 303 | loger.log('获取api/meeting/detail.do完成.'); | 295 | loger.log('获取api/meeting/detail.do完成.'); |
| 304 | - | 296 | + // console.log(_data); |
| 305 | //包含整个会议最全的信息,储存数据 | 297 | //包含整个会议最全的信息,储存数据 |
| 306 | if(_data){ | 298 | if(_data){ |
| 307 | GlobalConfig.setDocListPrepare(_data.docListPrepare); //提前上传的文档列表 | 299 | GlobalConfig.setDocListPrepare(_data.docListPrepare); //提前上传的文档列表 |
| @@ -314,6 +306,45 @@ export default class MessageEntrance extends Emiter { | @@ -314,6 +306,45 @@ export default class MessageEntrance extends Emiter { | ||
| 314 | GlobalConfig.setRsList(_data.rsList);// | 306 | GlobalConfig.setRsList(_data.rsList);// |
| 315 | 307 | ||
| 316 | } | 308 | } |
| 309 | + | ||
| 310 | + if(_data.currentInfo){ | ||
| 311 | + //根据从Sass获取的数据信息,同步最后一次保存的会议状态信息 | ||
| 312 | + loger.log("同步最后一次保存过的会议状态信息"); | ||
| 313 | + | ||
| 314 | + /*//解析BASE64的数据 | ||
| 315 | + loger.log("11111111111111111111111111111111"); | ||
| 316 | + console.log(GlobalConfig.classStatusInfo); | ||
| 317 | + //已经保存过会议状态信息,读取之前的数据 | ||
| 318 | + let _classStatusInfo=EngineUtils.objectFromBase64(_data.currentInfo); | ||
| 319 | + loger.log("classStatusInfo",_classStatusInfo); | ||
| 320 | + GlobalConfig.classStatusInfo=_classStatusInfo; | ||
| 321 | + loger.log("2222222222222222222222222"); | ||
| 322 | + console.log(GlobalConfig.classStatusInfo);*/ | ||
| 323 | + | ||
| 324 | + console.log(_data.currentInfo); | ||
| 325 | + GlobalConfig.classStatusInfo=_data.currentInfo; | ||
| 326 | + }else { | ||
| 327 | + loger.log("还没有保存过会议状态信息"); | ||
| 328 | + } | ||
| 329 | + } | ||
| 330 | + | ||
| 331 | + //保存会议状态信息 | ||
| 332 | + _sassSaveClassStatusInfo(){ | ||
| 333 | + if(GlobalConfig.isHost){ | ||
| 334 | + //用get保存数据,数据内容需要转为BASE64 | ||
| 335 | + //let _classStatusInfo=EngineUtils.objectToBase64(GlobalConfig.classStatusInfo); | ||
| 336 | + //loger.log("保存会议状态信息",_classStatusInfo); | ||
| 337 | + //_sass.saveClassStatusInfo({"classStatusInfo":_classStatusInfo});//保存会议状态信息 | ||
| 338 | + | ||
| 339 | + //POST 保存数据 | ||
| 340 | + _sass.saveClassStatusInfo({"classStatusInfo":GlobalConfig.classStatusInfo});//保存会议状态信息 | ||
| 341 | + }else { | ||
| 342 | + loger.log("没有保存会议状态信息的权限 isHost",GlobalConfig.isHost); | ||
| 343 | + } | ||
| 344 | + } | ||
| 345 | + //保存会态信息成功 | ||
| 346 | + _sassSaveClassStatusInfoSuccessHandler(_data){ | ||
| 347 | + loger.log('保存会议状态信息成功.',_data); | ||
| 317 | } | 348 | } |
| 318 | 349 | ||
| 319 | // MCU 会议成功 | 350 | // MCU 会议成功 |
| @@ -326,7 +357,6 @@ export default class MessageEntrance extends Emiter { | @@ -326,7 +357,6 @@ export default class MessageEntrance extends Emiter { | ||
| 326 | } | 357 | } |
| 327 | 358 | ||
| 328 | //储存数据 | 359 | //储存数据 |
| 329 | - | ||
| 330 | GlobalConfig.MCUServerIP=_data.MCUServerIP; | 360 | GlobalConfig.MCUServerIP=_data.MCUServerIP; |
| 331 | GlobalConfig.MCUServerPort=_data.MCUServerPort; | 361 | GlobalConfig.MCUServerPort=_data.MCUServerPort; |
| 332 | GlobalConfig.classId=_data.classId; | 362 | GlobalConfig.classId=_data.classId; |
| 1 | /** | 1 | /** |
| 2 | * Created by hoopoe8 on 2017/1/8. | 2 | * Created by hoopoe8 on 2017/1/8. |
| 3 | */ | 3 | */ |
| 4 | +import Base64 from 'base64-js'; | ||
| 5 | +import UTF8 from 'utf-8'; | ||
| 4 | 6 | ||
| 5 | class EngineUtils{ | 7 | class EngineUtils{ |
| 6 | static isEmptyObject(O){ | 8 | static isEmptyObject(O){ |
| @@ -43,5 +45,32 @@ class EngineUtils{ | @@ -43,5 +45,32 @@ class EngineUtils{ | ||
| 43 | timeStr+=curTime.getSeconds(); | 45 | timeStr+=curTime.getSeconds(); |
| 44 | return timeStr; | 46 | return timeStr; |
| 45 | } | 47 | } |
| 48 | + | ||
| 49 | + static objectToBase64(_object){ | ||
| 50 | + try{ | ||
| 51 | + let _objectStr=JSON.stringify(_object); | ||
| 52 | + //console.log("objectToBase64------1----------") | ||
| 53 | + let byte=UTF8.setBytesFromString(_objectStr); | ||
| 54 | + //console.log("objectToBase64------2----------") | ||
| 55 | + let _objectBase64=Base64.fromByteArray(byte); | ||
| 56 | + return _objectBase64 | ||
| 57 | + }catch (err){ | ||
| 58 | + console.log("objectToBase64 err:"+err.message); | ||
| 59 | + return ""; | ||
| 60 | + } | ||
| 61 | + return "" | ||
| 62 | + } | ||
| 63 | + static objectFromBase64(_objectBase64){ | ||
| 64 | + try{ | ||
| 65 | + let byte=Base64.toByteArray(_objectBase64); | ||
| 66 | + let _objectStr=UTF8.getStringFromBytes(byte); | ||
| 67 | + let _object=JSON.parse(_objectStr); | ||
| 68 | + return _object | ||
| 69 | + }catch (err){ | ||
| 70 | + console.log("objectFromBase64 err:"+err.message); | ||
| 71 | + return null; | ||
| 72 | + } | ||
| 73 | + return null | ||
| 74 | + } | ||
| 46 | } | 75 | } |
| 47 | export default EngineUtils; | 76 | export default EngineUtils; |
| @@ -35,99 +35,115 @@ class GlobalConfig { | @@ -35,99 +35,115 @@ class GlobalConfig { | ||
| 35 | this.className=_data.meetingName||""; | 35 | this.className=_data.meetingName||""; |
| 36 | this.classBeginTime=_data.beginTime||""; | 36 | this.classBeginTime=_data.beginTime||""; |
| 37 | this.classEndTime=_data.endTime||""; | 37 | this.classEndTime=_data.endTime||""; |
| 38 | - // | ||
| 39 | - //"cycle": 0, | ||
| 40 | - // "repeatmonthweekweek": 0, | ||
| 41 | - // "status": 1, | ||
| 42 | - // "repeatmonthday": 0, | ||
| 43 | - // "repeatmode": 0, | ||
| 44 | - // "beginTime": "2017-02-03 09:00:00", | ||
| 45 | - // "frequency": 1, | ||
| 46 | - // "endmode": 0, | ||
| 47 | - // "meetingContent": "", | ||
| 48 | - // "endTime": "2017-03-31 11:00:00", | ||
| 49 | - // "repeatweek": "", | ||
| 50 | - // "category": "", | ||
| 51 | - // "finalenddate": "", | ||
| 52 | - // "repeatday": 0, | ||
| 53 | - // "meetingName": "mcu1", | ||
| 54 | - // "errorCode": 0, | ||
| 55 | - // "monthType": 0, | ||
| 56 | - // "repeatmonthweekday": 0, | ||
| 57 | - // "endcount": 1 | 38 | + /* { |
| 39 | + "cycle": 0, | ||
| 40 | + "repeatmonthweekweek": 0, | ||
| 41 | + "status": 1, | ||
| 42 | + "repeatmonthday": 0, | ||
| 43 | + "repeatmode": 0, | ||
| 44 | + "beginTime": "2017-02-03 09:00:00", | ||
| 45 | + "frequency": 1, | ||
| 46 | + "endmode": 0, | ||
| 47 | + "meetingContent": "", | ||
| 48 | + "endTime": "2017-03-31 11:00:00", | ||
| 49 | + "repeatweek": "", | ||
| 50 | + "category": "", | ||
| 51 | + "finalenddate": "", | ||
| 52 | + "repeatday": 0, | ||
| 53 | + "meetingName": "mcu1", | ||
| 54 | + "errorCode": 0, | ||
| 55 | + "monthType": 0, | ||
| 56 | + "repeatmonthweekday": 0, | ||
| 57 | + "endcount": 1 | ||
| 58 | + }*/ | ||
| 58 | } | 59 | } |
| 59 | 60 | ||
| 60 | static getClassInfo (){ | 61 | static getClassInfo (){ |
| 61 | - if(this.isDebug){ | ||
| 62 | - | ||
| 63 | - //这几个属性是sass验证完成之后返回的,启动MCU的时候需要 | ||
| 64 | - this .deBugData.MCUServerIP=this.MCUServerIP; | ||
| 65 | - this .deBugData.MCUServerPort=this.MCUServerPort; | ||
| 66 | - this .deBugData.maxVideoChannels=this.maxVideoChannels; | ||
| 67 | - this .deBugData.maxAudioChannels=this.maxAudioChannels; | ||
| 68 | - this .deBugData.maxMediaChannels=this.maxMediaChannels; | ||
| 69 | - | ||
| 70 | - return this .deBugData; | ||
| 71 | - }else { | ||
| 72 | - return{ | ||
| 73 | - "siteId": this.siteId, | ||
| 74 | - "classId": this.classId, | ||
| 75 | - "className": this.className, | ||
| 76 | - "h5Module": this.h5Module, | ||
| 77 | - "nodeId": this.nodeId, | ||
| 78 | - "topNodeID":this.topNodeID, | ||
| 79 | - "userRole": this.userRole, | ||
| 80 | - "role": this.role, | ||
| 81 | - "isHost": this.isHost, | ||
| 82 | - "userId": this.userId, | ||
| 83 | - "userName": this.userName, | ||
| 84 | - "password": this.password, | ||
| 85 | - "userType": this.userType, | ||
| 86 | - "passwordRequired": this.passwordRequired, | ||
| 87 | - "md5": this.md5, | ||
| 88 | - "msType": this.msType, | ||
| 89 | - "portal": this.portal, | ||
| 90 | - "mcuDelay":this.mcuDelay, | ||
| 91 | - "MCUServerIP": this.MCUServerIP, | ||
| 92 | - "MCUServerPort":this.MCUServerPort, | ||
| 93 | - "maxVideoChannels": this.maxVideoChannels, | ||
| 94 | - "maxAudioChannels": this.maxAudioChannels, | ||
| 95 | - "maxMediaChannels": this.maxMediaChannels | ||
| 96 | - } | ||
| 97 | - } | 62 | + let classInfo={}; |
| 63 | + classInfo.siteId= this.siteId; | ||
| 64 | + classInfo.classId= this.classId; | ||
| 65 | + classInfo.className=this.className; | ||
| 66 | + classInfo.h5Module= this.h5Module; | ||
| 67 | + classInfo.nodeId=this.nodeId; | ||
| 68 | + classInfo.topNodeID=this.topNodeID; | ||
| 69 | + classInfo.userRole=this.userRole; | ||
| 70 | + classInfo.role= this.role; | ||
| 71 | + classInfo.isHost= this.isHost; | ||
| 72 | + classInfo.userId= this.userId; | ||
| 73 | + classInfo.userName= this.userName; | ||
| 74 | + classInfo.password= this.password; | ||
| 75 | + classInfo.userType= this.userType; | ||
| 76 | + classInfo.passwordRequired= this.passwordRequired; | ||
| 77 | + classInfo.md5=this.md5; | ||
| 78 | + classInfo.msType= this.msType; | ||
| 79 | + classInfo.portal= this.portal; | ||
| 80 | + classInfo.mcuDelay=this.mcuDelay; | ||
| 81 | + classInfo.MCUServerIP=this.MCUServerIP; | ||
| 82 | + classInfo.MCUServerPort=this.MCUServerPort; | ||
| 83 | + classInfo.maxVideoChannels= this.maxVideoChannels; | ||
| 84 | + classInfo.maxAudioChannels=this.maxAudioChannels; | ||
| 85 | + classInfo.maxMediaChannels= this.maxMediaChannels; | ||
| 86 | + | ||
| 87 | + return classInfo; | ||
| 88 | + | ||
| 98 | } | 89 | } |
| 99 | 90 | ||
| 100 | - //当前的课堂状态的信息 | 91 | + //获取当前的课堂状态的信息 |
| 101 | static get classStatusInfo(){ | 92 | static get classStatusInfo(){ |
| 102 | - return { | ||
| 103 | - "classStatusInfo":{ | ||
| 104 | - "nodeId":this.nodeId,//mcu中的唯一ID | ||
| 105 | - "userId":this.userId,// | ||
| 106 | - "userName":this.userName, | ||
| 107 | - | ||
| 108 | - "siteId":this.siteId,//站点号 | ||
| 109 | - | ||
| 110 | - "classId":this.classId, | ||
| 111 | - "className":this.className, | ||
| 112 | - "classType":this.classType,//课堂类型 | ||
| 113 | - "classStatus":this.classStatus,//课堂的状态 | ||
| 114 | - "classStartTime":this.classStartTime,//课堂点击开始时间 | ||
| 115 | - "classStopTime":this.classStopTime,//最后一次停止的时间(点暂停或结束),每次发送数据都获取当前时间戳 | ||
| 116 | - "classTimestamp":this.classTimestamp,//相对于点开始课堂的时间戳 | ||
| 117 | - | ||
| 118 | - "classBeginTime":this.classBeginTime,//课堂创建的时间,这个是Sass返回的 | ||
| 119 | - "classEndTime":this.classEndTime,//课堂结束的时间,这个是Sass返回的 | ||
| 120 | - | ||
| 121 | - "recordStatus":this.recordStatus,//当前录制状态 | ||
| 122 | - "recordTimestamp":this.recordTimestamp,//相对于首次开始录制的时间戳 | ||
| 123 | - "recordFileName":this.recordFileName,//录制的文件名 | ||
| 124 | - "recordDownloadUrl":this.recordDownloadUrl,//下载地址 | ||
| 125 | - | ||
| 126 | - "serverTimestamp":this.serverTimestamp,//当前的系统时间戳 | ||
| 127 | - "activeDocId":this.activeDocId ,//当前激活的文档ID | ||
| 128 | - "activeDocCurPage":this.activeDocCurPage//当前激活的文档的当前页 | ||
| 129 | - } | 93 | + let classStatusInfo={}; |
| 94 | + | ||
| 95 | + classStatusInfo.siteId=this.siteId;//站点号 | ||
| 96 | + | ||
| 97 | + classStatusInfo.classId=this.classId; | ||
| 98 | + classStatusInfo.className=this.className; | ||
| 99 | + classStatusInfo.classType=this.classType;//课堂类型 | ||
| 100 | + classStatusInfo.classStatus=this.classStatus;//课堂的状态 | ||
| 101 | + classStatusInfo.classStartTime=this.classStartTime;//课堂点击开始时间 | ||
| 102 | + classStatusInfo.classStopTime=this.classStopTime;//最后一次停止的时间(点暂停或结束),每次发送数据都获取当前时间戳 | ||
| 103 | + classStatusInfo.classTimestamp=this.classTimestamp;//相对于点开始课堂的时间戳 | ||
| 104 | + | ||
| 105 | + classStatusInfo.classBeginTime=this.classBeginTime;//课堂创建的时间,这个是Sass返回的 | ||
| 106 | + classStatusInfo.classEndTime=this.classEndTime;//课堂结束的时间,这个是Sass返回的 | ||
| 107 | + | ||
| 108 | + classStatusInfo.recordStatus=this.recordStatus;//当前录制状态 | ||
| 109 | + classStatusInfo.recordTimestamp=this.recordTimestamp;//相对于首次开始录制的时间戳 | ||
| 110 | + classStatusInfo.recordFileName=this.recordFileName;//录制的文件名 | ||
| 111 | + classStatusInfo.recordDownloadUrl=this.recordDownloadUrl;//下载地址 | ||
| 112 | + | ||
| 113 | + classStatusInfo.serverTimestamp=this.serverTimestamp;//当前的系统时间戳 | ||
| 114 | + classStatusInfo.activeDocId=this.activeDocId;//当前激活的文档ID | ||
| 115 | + classStatusInfo.activeDocCurPage=this.activeDocCurPage;//当前激活的文档的当前页 | ||
| 116 | + return classStatusInfo; | ||
| 117 | + } | ||
| 118 | + //设置当前的课堂状态的信息 | ||
| 119 | + static set classStatusInfo(_data){ | ||
| 120 | + if(_data==null){ | ||
| 121 | + loger.warn("classStatusInfo error,_data:",_data); | ||
| 122 | + return; | ||
| 130 | } | 123 | } |
| 124 | + let data=_data; | ||
| 125 | + | ||
| 126 | + this.siteId=data.siteId||this.siteId;//站点号 | ||
| 127 | + | ||
| 128 | + this.classId=data.classId||this.classId; | ||
| 129 | + this.className=data.className||this.className; | ||
| 130 | + this.classType=data.classType||this.classType;//课堂类型 | ||
| 131 | + this.classStatus=data.classStatus||this.classStatus;//课堂的状态 | ||
| 132 | + this.classStartTime=data.classStartTime||this.classStartTime;//课堂点击开始时间 | ||
| 133 | + this.classStopTime=data.classStopTime||this.classStopTime;//最后一次停止的时间(点暂停或结束),每次发送数据都获取当前时间戳 | ||
| 134 | + this.classTimestamp=data.classTimestamp||this.classTimestamp;//相对于点开始课堂的时间戳 | ||
| 135 | + | ||
| 136 | + this.classBeginTime=data.classBeginTime||this.classBeginTime;//课堂创建的时间,这个是Sass返回的 | ||
| 137 | + this.classEndTime=data.classEndTime||this.classEndTime;//课堂结束的时间,这个是Sass返回的 | ||
| 138 | + | ||
| 139 | + this.recordStatus=data.recordStatus||this.recordStatus;//当前录制状态 | ||
| 140 | + this.recordTimestamp=data.recordTimestamp||this.recordTimestamp;//相对于首次开始录制的时间戳 | ||
| 141 | + this.recordFileName=data.recordFileName||this.recordFileName;//录制的文件名 | ||
| 142 | + this.recordDownloadUrl=data.recordDownloadUrl||this.recordDownloadUrl;//下载地址 | ||
| 143 | + | ||
| 144 | + this.activeDocId=data.activeDocId||this.activeDocId;//当前激活的文档ID | ||
| 145 | + this.activeDocCurPage=data.activeDocCurPage||this.activeDocCurPage;//当前激活的文档的当前页 | ||
| 146 | + | ||
| 131 | } | 147 | } |
| 132 | 148 | ||
| 133 | // 判断自己是否主持人角色 | 149 | // 判断自己是否主持人角色 |
| @@ -269,7 +285,7 @@ GlobalConfig.isDebug=false; | @@ -269,7 +285,7 @@ GlobalConfig.isDebug=false; | ||
| 269 | GlobalConfig.deBugData={}; | 285 | GlobalConfig.deBugData={}; |
| 270 | 286 | ||
| 271 | 287 | ||
| 272 | -GlobalConfig.deviceType=-1; //设备类型 0:电脑 1:安卓 2:ios -1未知 | 288 | +GlobalConfig.deviceType=0; //设备类型 0:电脑 1:安卓 2:ios |
| 273 | GlobalConfig.userIP="";//用户当前IP | 289 | GlobalConfig.userIP="";//用户当前IP |
| 274 | GlobalConfig.userId=0; | 290 | GlobalConfig.userId=0; |
| 275 | GlobalConfig.userName=""; | 291 | GlobalConfig.userName=""; |
| @@ -298,7 +314,7 @@ GlobalConfig.classTimestamp=0;//从课堂开始到现在的时 | @@ -298,7 +314,7 @@ GlobalConfig.classTimestamp=0;//从课堂开始到现在的时 | ||
| 298 | GlobalConfig.recordStatus=false;//当前录制状态 | 314 | GlobalConfig.recordStatus=false;//当前录制状态 |
| 299 | GlobalConfig.recordTimestamp=0;//相对于首次开始录制的进行时间 | 315 | GlobalConfig.recordTimestamp=0;//相对于首次开始录制的进行时间 |
| 300 | GlobalConfig.recordFileName="";//录制的文件名 | 316 | GlobalConfig.recordFileName="";//录制的文件名 |
| 301 | -GlobalConfig.recordDownloadUrl="";//下载地址 | 317 | +GlobalConfig.recordDownloadUrl="xxxxxxxxxxxxxxxxxxxxx";//下载地址 |
| 302 | GlobalConfig.recordReplaytickValues={}; // 滚动条关键点,用于快进快退 | 318 | GlobalConfig.recordReplaytickValues={}; // 滚动条关键点,用于快进快退 |
| 303 | 319 | ||
| 304 | //GlobalConfig.serverTimestamp=0;//当前的系统时间戳 用get set 获取 | 320 | //GlobalConfig.serverTimestamp=0;//当前的系统时间戳 用get set 获取 |
| 1 | -// ////////////////////////////////////////////////////////////////////////////// | ||
| 2 | -// | ||
| 3 | -// Copyright (C) 2016-present All Rights Reserved. | ||
| 4 | -// Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | -// http://www.apache.org/licenses/LICENSE-2.0 | ||
| 6 | -// | ||
| 7 | -// Github Home: https://github.com/AlexWang1987 | ||
| 8 | -// Author: AlexWang | ||
| 9 | -// Date: 2016-08-27 23:04:56 | ||
| 10 | -// QQ Email: 1669499355@qq.com | ||
| 11 | -// Last Modified time: 2016-09-07 15:58:29 | ||
| 12 | -// Description: LiveClass-MessageTypes | ||
| 13 | -// | ||
| 14 | -// ////////////////////////////////////////////////////////////////////////////// | 1 | +/** |
| 2 | + *事件定义和错误码定义 | ||
| 3 | + */ | ||
| 15 | 4 | ||
| 16 | function MessageTypes() {} | 5 | function MessageTypes() {} |
| 17 | 6 | ||
| @@ -29,7 +18,9 @@ MessageTypes.CLASS_JOIN_SUCCESS = 'join.class.success'; | @@ -29,7 +18,9 @@ MessageTypes.CLASS_JOIN_SUCCESS = 'join.class.success'; | ||
| 29 | MessageTypes.CLASS_SHOW_ROSTER_NUM = 'roster_num.message'; | 18 | MessageTypes.CLASS_SHOW_ROSTER_NUM = 'roster_num.message'; |
| 30 | MessageTypes.CLASS_INSERT_ROSTER = 'roster_insert.message'; | 19 | MessageTypes.CLASS_INSERT_ROSTER = 'roster_insert.message'; |
| 31 | MessageTypes.CLASS_DELETE_ROSTER = 'roster_delete.message'; | 20 | MessageTypes.CLASS_DELETE_ROSTER = 'roster_delete.message'; |
| 32 | -MessageTypes.CLASS_EXIT = 'class.exit'; | 21 | +MessageTypes.CLASS_EXIT = 'class.exit';//退出 |
| 22 | +MessageTypes.CLASS_CLOSE = 'class.close';//关闭会议,所有人都要退出(host操作) | ||
| 23 | +MessageTypes.CLASS_STATUS_INFO_CHANGE= 'class.status.info.change';//会议状态信息发生改变,需要保存数据到sass和同步MCU | ||
| 33 | 24 | ||
| 34 | //聊天模块事件定义 | 25 | //聊天模块事件定义 |
| 35 | MessageTypes.CHAT_RECEIVE = 'chat.receive'; | 26 | MessageTypes.CHAT_RECEIVE = 'chat.receive'; |
| @@ -39,13 +30,16 @@ MessageTypes.VIDEO_RECEIVE = 'video.receive'; | @@ -39,13 +30,16 @@ MessageTypes.VIDEO_RECEIVE = 'video.receive'; | ||
| 39 | 30 | ||
| 40 | 31 | ||
| 41 | //文档模块事件定义 | 32 | //文档模块事件定义 |
| 42 | -MessageTypes.DOC_SHOW = 'document.show'; | ||
| 43 | -MessageTypes.DOC_UPLOAD='document.upload';//上传文档 | ||
| 44 | -MessageTypes.DOC_COMMAND='document.command';//操作文档 | ||
| 45 | -MessageTypes.DOC_SWITCH = 'document.switch';//切换文档 | ||
| 46 | -MessageTypes.DOC_UPDATE = 'document.update';//更新文档 | ||
| 47 | MessageTypes.DOC_DELETE='document.delete';//删除文档 | 33 | MessageTypes.DOC_DELETE='document.delete';//删除文档 |
| 48 | -MessageTypes.DOC_ANNOTATION = 'document.annotation';//笔记 | 34 | +MessageTypes.DOC_UPDATE = 'document.update';//更新文档(添加、变更) |
| 35 | +//MessageTypes.DOC_SHOW = 'document.show'; | ||
| 36 | +//MessageTypes.DOC_UPLOAD='document.upload';//上传文档 | ||
| 37 | +//MessageTypes.DOC_COMMAND='document.command';//操作文档 | ||
| 38 | +//MessageTypes.DOC_SWITCH = 'document.switch';//切换文档 | ||
| 39 | +//MessageTypes.DOC_DELETE='document.delete';//删除文档 | ||
| 40 | +//MessageTypes.DOC_ANNOTATION = 'document.annotation';//笔记 | ||
| 41 | + | ||
| 42 | + | ||
| 49 | 43 | ||
| 50 | //白板笔记事件定义 | 44 | //白板笔记事件定义 |
| 51 | MessageTypes.WHITEBOARD_ANNOTATION_UPDATE = 'whiteboard.annotation.update'; | 45 | MessageTypes.WHITEBOARD_ANNOTATION_UPDATE = 'whiteboard.annotation.update'; |
| @@ -58,8 +52,6 @@ MessageTypes.WHITEBOARD_ANNOTATION_UPDATE = 'whiteboard.annotation.update'; | @@ -58,8 +52,6 @@ MessageTypes.WHITEBOARD_ANNOTATION_UPDATE = 'whiteboard.annotation.update'; | ||
| 58 | MessageTypes.AUDIO_RECEIVE='audio.receive'; | 52 | MessageTypes.AUDIO_RECEIVE='audio.receive'; |
| 59 | 53 | ||
| 60 | 54 | ||
| 61 | - | ||
| 62 | - | ||
| 63 | //错误事件定义 | 55 | //错误事件定义 |
| 64 | MessageTypes.MCU_ERROR ="mcuError";//MCU错误 | 56 | MessageTypes.MCU_ERROR ="mcuError";//MCU错误 |
| 65 | 57 |
| @@ -12,31 +12,17 @@ class Sass extends Emiter { | @@ -12,31 +12,17 @@ class Sass extends Emiter { | ||
| 12 | super(); | 12 | super(); |
| 13 | } | 13 | } |
| 14 | 14 | ||
| 15 | - //Sass 接口 | ||
| 16 | - //----1.校验之前的接口----- | ||
| 17 | - //getJoinParams 获取课堂校验信息 let url = `http://${_initInfo.portal}/3m/api/meeting/joinParams.do?meetingNumber=${_initInfo.classId}&userID=${_initInfo.userId}`; | ||
| 18 | - | ||
| 19 | - //-----2.开始校验,如果有密码先校验密码,否则直接开始MD5验证----- | ||
| 20 | - //sendPWDChecking入会密码校验 let url = `http://${classInfo.portal}/3m/getCheckMeetinig.do?siteId=${classInfo.siteId}&classId=${classInfo.classId}&password=${classInfo.password}`; | ||
| 21 | - //sendMD5Checking MD5校验(发起入会) let url = `http://${classInfo.portal}/3m/meeting/md5CheckMeeting.do?siteId=${classInfo.siteId}&meetingNumber=${classInfo.classId}&userId=${classInfo.userId}&userName=${classInfo.userName}&userType=${classInfo.userType}&passwordRequired=${classInfo.passwordRequired}&md5=${classInfo.md5}`; | ||
| 22 | - | ||
| 23 | - //----3.验证完成后获取------ | ||
| 24 | - //getClassDetail 获取会议详情 let url = `http://${classInfo.portal}/3m/meeting/getClassH5.do?classNumber=${classInfo.classId}`; | ||
| 25 | - //getClassParam 获取会议最全参数集合 let url = `http://${classInfo.portal}/3m/api/meeting/detail.do?meetingNumber=${classInfo.classId}×tamp=${timestamp}&authId=${authId}`; | ||
| 26 | - | ||
| 27 | - | ||
| 28 | - //Sass获取课堂校验信息 | 15 | + ///////////////////////////////////////Sass 接口/////////////////////////////////////////////////// |
| 16 | + //Sass init初始化获取课堂校验信息----------------------------------------------------------------- | ||
| 29 | getJoinParams(_initInfo) { | 17 | getJoinParams(_initInfo) { |
| 30 | loger.log('初始化init获取课堂校验信息', _initInfo); | 18 | loger.log('初始化init获取课堂校验信息', _initInfo); |
| 31 | /* 获取用于加入课堂的参数 | 19 | /* 获取用于加入课堂的参数 |
| 32 | /3m/api/meeting/joinParams.do | 20 | /3m/api/meeting/joinParams.do |
| 33 | 参数 (application/x-www-form-urlencoded): | 21 | 参数 (application/x-www-form-urlencoded): |
| 34 | - 名称 类型 可选 默认值 说明 | ||
| 35 | - meetingNumber String 否 null 课堂号 | ||
| 36 | - userID String 是 0 用户id | 22 | + 名称 类型 可选 默认值 说明 |
| 23 | + meetingNumber String 否 null 课堂号 | ||
| 24 | + userID String 是 0 用户id | ||
| 37 | 返回 (application/json): | 25 | 返回 (application/json): |
| 38 | - | ||
| 39 | - 名称 类型 说明 | ||
| 40 | code int 0 正常 | 26 | code int 0 正常 |
| 41 | 1 课堂号必填 | 27 | 1 课堂号必填 |
| 42 | 2 无效的课堂号 | 28 | 2 无效的课堂号 |
| @@ -46,6 +32,7 @@ class Sass extends Emiter { | @@ -46,6 +32,7 @@ class Sass extends Emiter { | ||
| 46 | passwordRequired Boolean 是否需要输入密码 | 32 | passwordRequired Boolean 是否需要输入密码 |
| 47 | md5 String 用于后续加入课堂验证 | 33 | md5 String 用于后续加入课堂验证 |
| 48 | msType int 媒体服务器类型 | 34 | msType int 媒体服务器类型 |
| 35 | + classType 课堂类型 | ||
| 49 | */ | 36 | */ |
| 50 | let url = `http://${_initInfo.portal}/3m/api/meeting/joinParams.do?meetingNumber=${_initInfo.classId}&userID=${_initInfo.userId}`; | 37 | let url = `http://${_initInfo.portal}/3m/api/meeting/joinParams.do?meetingNumber=${_initInfo.classId}&userID=${_initInfo.userId}`; |
| 51 | loger.log('初始化init获取课堂校验信息.', url); | 38 | loger.log('初始化init获取课堂校验信息.', url); |
| @@ -92,7 +79,7 @@ class Sass extends Emiter { | @@ -92,7 +79,7 @@ class Sass extends Emiter { | ||
| 92 | }); | 79 | }); |
| 93 | } | 80 | } |
| 94 | 81 | ||
| 95 | - // Sass校验开始 | 82 | + // Sass校验开始-->密码校验(如果需要密码)--->MD5校验---------------------------------------------------- |
| 96 | passwordAndMd5Checking(_param) { | 83 | passwordAndMd5Checking(_param) { |
| 97 | loger.log('开始Sass校验', _param); | 84 | loger.log('开始Sass校验', _param); |
| 98 | confInfo = _param; | 85 | confInfo = _param; |
| @@ -105,10 +92,9 @@ class Sass extends Emiter { | @@ -105,10 +92,9 @@ class Sass extends Emiter { | ||
| 105 | this.sendMD5Checking(); | 92 | this.sendMD5Checking(); |
| 106 | } | 93 | } |
| 107 | 94 | ||
| 108 | - // 入会密码校验 | 95 | + // 入会密码校验--------------------------------------------------------------------------------------- |
| 109 | sendPWDChecking() { | 96 | sendPWDChecking() { |
| 110 | //let url = `http://${classInfo.portal}/3m/getCheckMeetinig.do?siteId=${classInfo.siteId}&classId=${classInfo.classId}&password=${classInfo.password}`; | 97 | //let url = `http://${classInfo.portal}/3m/getCheckMeetinig.do?siteId=${classInfo.siteId}&classId=${classInfo.classId}&password=${classInfo.password}`; |
| 111 | - | ||
| 112 | /* | 98 | /* |
| 113 | /3m/api/meeting/signIn.do | 99 | /3m/api/meeting/signIn.do |
| 114 | siteId 站点号 | 100 | siteId 站点号 |
| @@ -158,7 +144,7 @@ class Sass extends Emiter { | @@ -158,7 +144,7 @@ class Sass extends Emiter { | ||
| 158 | }); | 144 | }); |
| 159 | } | 145 | } |
| 160 | 146 | ||
| 161 | - // 发起入会 | 147 | + //MD5校验----------------------------------------------------------------------------------------- |
| 162 | sendMD5Checking() { | 148 | sendMD5Checking() { |
| 163 | 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}`; | 149 | 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}`; |
| 164 | loger.log('MD5校验', url); | 150 | loger.log('MD5校验', url); |
| @@ -205,7 +191,7 @@ class Sass extends Emiter { | @@ -205,7 +191,7 @@ class Sass extends Emiter { | ||
| 205 | }); | 191 | }); |
| 206 | } | 192 | } |
| 207 | 193 | ||
| 208 | - // 获取会议详情 | 194 | + // 获取会议基本详情------------------------------------------------------------------------------------ |
| 209 | getClassDetail() { | 195 | getClassDetail() { |
| 210 | let url = `http://${confInfo.portal}/3m/meeting/getClassH5.do?classNumber=${confInfo.classId}`; | 196 | let url = `http://${confInfo.portal}/3m/meeting/getClassH5.do?classNumber=${confInfo.classId}`; |
| 211 | loger.log('获取Class详情.', url); | 197 | loger.log('获取Class详情.', url); |
| @@ -236,6 +222,7 @@ class Sass extends Emiter { | @@ -236,6 +222,7 @@ class Sass extends Emiter { | ||
| 236 | }); | 222 | }); |
| 237 | } | 223 | } |
| 238 | 224 | ||
| 225 | + //获取课堂会议的完整信息-------------------------------------------------------------------------------- | ||
| 239 | getClassParam(){ | 226 | getClassParam(){ |
| 240 | /* | 227 | /* |
| 241 | 参数 (application/x-www-form-urlencoded): | 228 | 参数 (application/x-www-form-urlencoded): |
| @@ -243,7 +230,6 @@ class Sass extends Emiter { | @@ -243,7 +230,6 @@ class Sass extends Emiter { | ||
| 243 | meetingNumber String 否 null 课堂号 | 230 | meetingNumber String 否 null 课堂号 |
| 244 | timestamp String 否 null 时间戳 | 231 | timestamp String 否 null 时间戳 |
| 245 | authId String 否 null 验证信息 md5(meetingNumber + timestamp) | 232 | authId String 否 null 验证信息 md5(meetingNumber + timestamp) |
| 246 | - | ||
| 247 | 返回 (application/json): | 233 | 返回 (application/json): |
| 248 | 名称 类型 说明 | 234 | 名称 类型 说明 |
| 249 | code int 0 正常 | 235 | code int 0 正常 |
| @@ -286,21 +272,18 @@ class Sass extends Emiter { | @@ -286,21 +272,18 @@ class Sass extends Emiter { | ||
| 286 | }); | 272 | }); |
| 287 | } | 273 | } |
| 288 | 274 | ||
| 289 | - //删除文档 | ||
| 290 | - /* | ||
| 291 | - 删除课堂中的文档,即删除课堂与文档的关联 | ||
| 292 | - /api/document/deleteRelation.do | ||
| 293 | - 参数 | ||
| 294 | - docId 文档的唯一id | ||
| 295 | - classId 课堂号 | ||
| 296 | - timestamp 时间戳 | ||
| 297 | - authId md5(docId+classId+timestamp) | ||
| 298 | - | ||
| 299 | - 返回 (application/json): | ||
| 300 | - 0 成功, 1 验证信息错误 | ||
| 301 | - | ||
| 302 | - */ | ||
| 303 | - | 275 | + //删除文档----------------------------------------------------------------------------------------------------- |
| 276 | + /* | ||
| 277 | + 删除课堂中的文档,即删除课堂与文档的关联 | ||
| 278 | + /api/document/deleteRelation.do | ||
| 279 | + 参数 | ||
| 280 | + docId 文档的唯一id | ||
| 281 | + classId 课堂号 | ||
| 282 | + timestamp 时间戳 | ||
| 283 | + authId md5(docId+classId+timestamp) | ||
| 284 | + 返回 (application/json): | ||
| 285 | + 0 成功, 1 验证信息错误 | ||
| 286 | + */ | ||
| 304 | sassDeleteDocument(_param){ | 287 | sassDeleteDocument(_param){ |
| 305 | var timestamp=new Date().getTime(); | 288 | var timestamp=new Date().getTime(); |
| 306 | var authId=MD5(_param.docId+""+_param.classId+""+timestamp);// docId+classId+timestamp的字符串,转成MD5 | 289 | var authId=MD5(_param.docId+""+_param.classId+""+timestamp);// docId+classId+timestamp的字符串,转成MD5 |
| @@ -325,7 +308,7 @@ class Sass extends Emiter { | @@ -325,7 +308,7 @@ class Sass extends Emiter { | ||
| 325 | loger.log('sassDeleteDocument 完成'); | 308 | loger.log('sassDeleteDocument 完成'); |
| 326 | this._emit(Sass.DELETE_DOCUMENT_SUCCESS, _param); | 309 | this._emit(Sass.DELETE_DOCUMENT_SUCCESS, _param); |
| 327 | } else { | 310 | } else { |
| 328 | - loger.warn('sassDeleteDocument 失败.'); | 311 | + loger.warn('sassDeleteDocumnt 失败.'); |
| 329 | this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_DOC_DELETE_FAILED); | 312 | this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_DOC_DELETE_FAILED); |
| 330 | } | 313 | } |
| 331 | }) | 314 | }) |
| @@ -335,6 +318,105 @@ class Sass extends Emiter { | @@ -335,6 +318,105 @@ class Sass extends Emiter { | ||
| 335 | }); | 318 | }); |
| 336 | } | 319 | } |
| 337 | 320 | ||
| 321 | + //保存课堂的当前信息------------------------------------------------------------------------------------------------- | ||
| 322 | + /*保存课堂的当前信息,首次是插入,后面是更新 | ||
| 323 | + /api/meeting/saveInfo.do | ||
| 324 | + 参数(application/x-www-form-urlencoded): | ||
| 325 | + info Json字符串课堂信息,由前端自己维护 | ||
| 326 | + classId 课堂号 | ||
| 327 | + timestamp 时间戳 | ||
| 328 | + authId 做基本验证,md5(classId+timestamp) | ||
| 329 | + | ||
| 330 | + 返回 (application/json): | ||
| 331 | + code 0 成功 1 课堂号为空 2 无效的课堂号 3 验证信息错误*/ | ||
| 332 | + | ||
| 333 | + saveClassStatusInfo(_param){ | ||
| 334 | + //{"classStatusInfo":classStatusInfo} | ||
| 335 | + var timestamp=new Date().getTime(); | ||
| 336 | + var authId=MD5(confInfo.classId+""+timestamp);// (classId+timestamp)的字符串,转成MD5 | ||
| 337 | + let classStatusInfo=JSON.stringify(_param.classStatusInfo); | ||
| 338 | + let url = `http://${confInfo.portal}/3m/api/meeting/saveInfo.do`; | ||
| 339 | + loger.log('saveClassStatusInfo', url); | ||
| 340 | + fetch(url, { | ||
| 341 | + method: 'POST', | ||
| 342 | + headers: { | ||
| 343 | + "Content-Type": "application/x-www-form-urlencoded" | ||
| 344 | + }, | ||
| 345 | + body:`classId=${confInfo.classId}&info=${classStatusInfo}×tamp=${timestamp}&authId=${authId}`, | ||
| 346 | + timeout: 5000 | ||
| 347 | + }) | ||
| 348 | + .then(ret => { | ||
| 349 | + if (ret.ok) { | ||
| 350 | + return ret.json(); | ||
| 351 | + } else { | ||
| 352 | + loger.error(`saveClassStatusInfo-网络异常.状态码:${ret.status}`); | ||
| 353 | + //this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_DOC_DELETE_FAILED); | ||
| 354 | + throw ''; | ||
| 355 | + } | ||
| 356 | + }) | ||
| 357 | + .then(ret => { | ||
| 358 | + if (ret.code === 0) { | ||
| 359 | + loger.log('saveClassStatusInfo 完成'); | ||
| 360 | + this._emit(Sass.CLASS_SAVE_STATUS_INFO_SUCCESS, _param); | ||
| 361 | + } else if (ret.code ===1) { | ||
| 362 | + loger.log('saveClassStatusInfo 失败 课堂号为空'); | ||
| 363 | + }else if (ret.code === 2) { | ||
| 364 | + loger.log('saveClassStatusInfo 失败 无效的课堂号'); | ||
| 365 | + }else if (ret.code === 3) { | ||
| 366 | + loger.log('saveClassStatusInfo 失败 验证信息错误'); | ||
| 367 | + }else { | ||
| 368 | + loger.warn('saveClassStatusInfo 失败.',ret); | ||
| 369 | + //this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_DOC_DELETE_FAILED); | ||
| 370 | + } | ||
| 371 | + }) | ||
| 372 | + .catch(err => { | ||
| 373 | + loger.error(`saveClassStatusInfo.状态码:${err}`); | ||
| 374 | + //this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_DOC_DELETE_FAILED); | ||
| 375 | + }); | ||
| 376 | + } | ||
| 377 | + | ||
| 378 | + /* | ||
| 379 | + //用get的方式保存数据 | ||
| 380 | + saveClassStatusInfo(_param){ | ||
| 381 | + //{"classStatusInfo":"JSON数据的字符串"} | ||
| 382 | + var timestamp=new Date().getTime(); | ||
| 383 | + var authId=MD5(confInfo.classId+""+timestamp);// (classId+timestamp)的字符串,转成MD5 | ||
| 384 | + let url = `http://${confInfo.portal}/3m/api/meeting/saveInfo.do?classId=${confInfo.classId}&info=${_param.classStatusInfo}×tamp=${timestamp}&authId=${authId}`; | ||
| 385 | + loger.log('saveClassStatusInfo', url); | ||
| 386 | + | ||
| 387 | + fetch(url, { | ||
| 388 | + timeout: 5000 | ||
| 389 | + }) | ||
| 390 | + .then(ret => { | ||
| 391 | + if (ret.ok) { | ||
| 392 | + return ret.json(); | ||
| 393 | + } else { | ||
| 394 | + loger.error(`saveClassStatusInfo-网络异常.状态码:${ret.status}`); | ||
| 395 | + //this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_DOC_DELETE_FAILED); | ||
| 396 | + throw ''; | ||
| 397 | + } | ||
| 398 | + }) | ||
| 399 | + .then(ret => { | ||
| 400 | + if (ret.code === 0) { | ||
| 401 | + loger.log('saveClassStatusInfo 完成'); | ||
| 402 | + this._emit(Sass.CLASS_SAVE_STATUS_INFO_SUCCESS, _param); | ||
| 403 | + } else if (ret.code ===1) { | ||
| 404 | + loger.log('saveClassStatusInfo 失败 课堂号为空'); | ||
| 405 | + }else if (ret.code === 2) { | ||
| 406 | + loger.log('saveClassStatusInfo 失败 无效的课堂号'); | ||
| 407 | + }else if (ret.code === 3) { | ||
| 408 | + loger.log('saveClassStatusInfo 失败 验证信息错误'); | ||
| 409 | + }else { | ||
| 410 | + loger.warn('saveClassStatusInfo 失败.',ret); | ||
| 411 | + //this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_DOC_DELETE_FAILED); | ||
| 412 | + } | ||
| 413 | + }) | ||
| 414 | + .catch(err => { | ||
| 415 | + loger.error(`saveClassStatusInfo.状态码:${err}`); | ||
| 416 | + //this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_DOC_DELETE_FAILED); | ||
| 417 | + }); | ||
| 418 | + }*/ | ||
| 419 | + | ||
| 338 | 420 | ||
| 339 | } | 421 | } |
| 340 | 422 | ||
| @@ -343,5 +425,7 @@ Sass.prototype.CLASS_INIT_SUCCESS = Sass.CLASS_INIT_SUCCESS = 'sass.class.init.s | @@ -343,5 +425,7 @@ Sass.prototype.CLASS_INIT_SUCCESS = Sass.CLASS_INIT_SUCCESS = 'sass.class.init.s | ||
| 343 | Sass.prototype.CLASS_GET_CLASS_PARAM= Sass.CLASS_GET_CLASS_PARAM = 'class.getClassParam.message'; | 425 | Sass.prototype.CLASS_GET_CLASS_PARAM= Sass.CLASS_GET_CLASS_PARAM = 'class.getClassParam.message'; |
| 344 | Sass.prototype.CLASS_GET_CLASS_DETAIL= Sass.CLASS_GET_CLASS_DETAIL = 'class.getClassDetail.message'; | 426 | Sass.prototype.CLASS_GET_CLASS_DETAIL= Sass.CLASS_GET_CLASS_DETAIL = 'class.getClassDetail.message'; |
| 345 | Sass.prototype.DELETE_DOCUMENT_SUCCESS= Sass.DELETE_DOCUMENT_SUCCESS = 'class.deleteDocumentSuccess.message';//删除文档成功 | 427 | Sass.prototype.DELETE_DOCUMENT_SUCCESS= Sass.DELETE_DOCUMENT_SUCCESS = 'class.deleteDocumentSuccess.message';//删除文档成功 |
| 428 | + | ||
| 429 | +Sass.prototype.CLASS_SAVE_STATUS_INFO_SUCCESS= Sass.CLASS_SAVE_STATUS_INFO_SUCCESS = 'class.saveClassStatusInfoSuccess.message';//保存会议状态信息 | ||
| 346 | export default new Sass; | 430 | export default new Sass; |
| 347 | 431 |
| @@ -160,7 +160,7 @@ export default class Ape extends Emiter { | @@ -160,7 +160,7 @@ export default class Ape extends Emiter { | ||
| 160 | let tableInsertItemsLen = tableInsertItems.length; | 160 | let tableInsertItemsLen = tableInsertItems.length; |
| 161 | for (let i = 0; i < tableInsertItemsLen; ++i) { | 161 | for (let i = 0; i < tableInsertItemsLen; ++i) { |
| 162 | let insertItem = tableInsertItems[i]; | 162 | let insertItem = tableInsertItems[i]; |
| 163 | - loger.log("insertItem",insertItem); | 163 | + //loger.log("insertItem",insertItem); |
| 164 | this.tableInsertHandler(insertItem.owner, insertItem.itemIdx, insertItem.itemData); | 164 | this.tableInsertHandler(insertItem.owner, insertItem.itemIdx, insertItem.itemData); |
| 165 | } | 165 | } |
| 166 | break; | 166 | break; |
| 1 | // ////////////////////////////////////////////////////////////////////////////// | 1 | // ////////////////////////////////////////////////////////////////////////////// |
| 2 | -// | ||
| 3 | -// Copyright (C) 2016-present All Rights Reserved. | ||
| 4 | -// Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | -// http://www.apache.org/licenses/LICENSE-2.0 | ||
| 6 | -// | ||
| 7 | -// Github Home: https://github.com/AlexWang1987 | ||
| 8 | -// Author: AlexWang | ||
| 9 | -// Date: 2016-08-22 09:57:12 | ||
| 10 | -// QQ Email: 1669499355@qq.com | ||
| 11 | -// Last Modified time: 2016-09-07 16:16:35 | ||
| 12 | -// Description: LiveClass-ConferApe | ||
| 13 | -// | 2 | +//会议控制APE |
| 14 | // ////////////////////////////////////////////////////////////////////////////// | 3 | // ////////////////////////////////////////////////////////////////////////////// |
| 15 | 4 | ||
| 16 | import Ape from './Ape'; | 5 | import Ape from './Ape'; |
| @@ -50,8 +39,6 @@ class ConferApe extends Ape { | @@ -50,8 +39,6 @@ class ConferApe extends Ape { | ||
| 50 | // 默认值: normal | 39 | // 默认值: normal |
| 51 | this.hostUserId = '';//主持人的 第三方userId | 40 | this.hostUserId = '';//主持人的 第三方userId |
| 52 | this.rosters = {};//用户列表 | 41 | this.rosters = {};//用户列表 |
| 53 | - //this.activeDocId =0;//当前激活的文档ID | ||
| 54 | - //this.activeDocCurPage=1;//当前激活的文档的当前页 | ||
| 55 | 42 | ||
| 56 | // Ape Models | 43 | // Ape Models |
| 57 | this.registerKey(this._session_id, this._session_name, this._session_tag, new ArrayBuffer); | 44 | this.registerKey(this._session_id, this._session_name, this._session_tag, new ArrayBuffer); |
| @@ -72,6 +59,7 @@ class ConferApe extends Ape { | @@ -72,6 +59,7 @@ class ConferApe extends Ape { | ||
| 72 | 59 | ||
| 73 | } | 60 | } |
| 74 | 61 | ||
| 62 | + //加入会议 | ||
| 75 | _joinSessionHandler(_data) { | 63 | _joinSessionHandler(_data) { |
| 76 | let nodeInfoRecordPdu = this.mcu.mcuClassInfo.self; | 64 | let nodeInfoRecordPdu = this.mcu.mcuClassInfo.self; |
| 77 | loger.log("_joinSessionHandler nodeInfoRecordPdu=",nodeInfoRecordPdu); | 65 | loger.log("_joinSessionHandler nodeInfoRecordPdu=",nodeInfoRecordPdu); |
| @@ -81,7 +69,7 @@ class ConferApe extends Ape { | @@ -81,7 +69,7 @@ class ConferApe extends Ape { | ||
| 81 | userDataPdu.mobile = ''; | 69 | userDataPdu.mobile = ''; |
| 82 | 70 | ||
| 83 | nodeInfoRecordPdu.userData = userDataPdu.toArrayBuffer(); | 71 | nodeInfoRecordPdu.userData = userDataPdu.toArrayBuffer(); |
| 84 | - nodeInfoRecordPdu.deviceType = 3;//设备类型 | 72 | + nodeInfoRecordPdu.deviceType =GlobalConfig.deviceType;//设备类型 |
| 85 | 73 | ||
| 86 | let item = new pdu['RCRegistryRosterItemPdu']; | 74 | let item = new pdu['RCRegistryRosterItemPdu']; |
| 87 | item.nodeId = nodeInfoRecordPdu.nodeId; | 75 | item.nodeId = nodeInfoRecordPdu.nodeId; |
| @@ -104,9 +92,7 @@ class ConferApe extends Ape { | @@ -104,9 +92,7 @@ class ConferApe extends Ape { | ||
| 104 | let adapterPdu = new pdu['RCAdapterPdu']; | 92 | let adapterPdu = new pdu['RCAdapterPdu']; |
| 105 | adapterPdu.type = pdu.RCPDU_REG_ADAPTER; | 93 | adapterPdu.type = pdu.RCPDU_REG_ADAPTER; |
| 106 | adapterPdu.item.push(adapterItemPdu); | 94 | adapterPdu.item.push(adapterItemPdu); |
| 107 | - | ||
| 108 | this.sendUniform(adapterPdu, true); | 95 | this.sendUniform(adapterPdu, true); |
| 109 | - | ||
| 110 | } | 96 | } |
| 111 | 97 | ||
| 112 | //主动离开会议,发送通知到服务器 | 98 | //主动离开会议,发送通知到服务器 |
| @@ -118,7 +104,7 @@ class ConferApe extends Ape { | @@ -118,7 +104,7 @@ class ConferApe extends Ape { | ||
| 118 | userDataPdu.mobile = ''; | 104 | userDataPdu.mobile = ''; |
| 119 | 105 | ||
| 120 | nodeInfoRecordPdu.userData = userDataPdu.toArrayBuffer(); | 106 | nodeInfoRecordPdu.userData = userDataPdu.toArrayBuffer(); |
| 121 | - nodeInfoRecordPdu.deviceType = 3; | 107 | + nodeInfoRecordPdu.deviceType = GlobalConfig.deviceType; |
| 122 | 108 | ||
| 123 | let item = new pdu['RCRegistryRosterItemPdu']; | 109 | let item = new pdu['RCRegistryRosterItemPdu']; |
| 124 | item.nodeId = nodeInfoRecordPdu.nodeId; | 110 | item.nodeId = nodeInfoRecordPdu.nodeId; |
| @@ -143,13 +129,21 @@ class ConferApe extends Ape { | @@ -143,13 +129,21 @@ class ConferApe extends Ape { | ||
| 143 | 129 | ||
| 144 | this.sendUniform(adapterPdu, true); | 130 | this.sendUniform(adapterPdu, true); |
| 145 | } | 131 | } |
| 132 | + | ||
| 133 | + | ||
| 134 | + | ||
| 146 | //开始上课 | 135 | //开始上课 |
| 147 | startClass(_param){ | 136 | startClass(_param){ |
| 148 | if(GlobalConfig.classStatus==ApeConsts.CLASS_STATUS_WAIT){ | 137 | if(GlobalConfig.classStatus==ApeConsts.CLASS_STATUS_WAIT){ |
| 149 | GlobalConfig.classStartTime=EngineUtils.creatTimestampStr(); | 138 | GlobalConfig.classStartTime=EngineUtils.creatTimestampStr(); |
| 139 | + GlobalConfig.classStopTime=GlobalConfig.classStartTime; | ||
| 140 | + }else{ | ||
| 141 | + GlobalConfig.classStopTime=GlobalConfig.creatTimestampStr; | ||
| 150 | } | 142 | } |
| 143 | + | ||
| 151 | GlobalConfig.classStatus=ApeConsts.CLASS_STATUS_STARTED; | 144 | GlobalConfig.classStatus=ApeConsts.CLASS_STATUS_STARTED; |
| 152 | _param.actionType=ACTION_TYPE_1; | 145 | _param.actionType=ACTION_TYPE_1; |
| 146 | + this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE); | ||
| 153 | this.sendUpdaterClassStatusInfo(_param); | 147 | this.sendUpdaterClassStatusInfo(_param); |
| 154 | } | 148 | } |
| 155 | //暂停上课 | 149 | //暂停上课 |
| @@ -157,6 +151,7 @@ class ConferApe extends Ape { | @@ -157,6 +151,7 @@ class ConferApe extends Ape { | ||
| 157 | GlobalConfig.classStatus=ApeConsts.CLASS_STATUS_PAUSE; | 151 | GlobalConfig.classStatus=ApeConsts.CLASS_STATUS_PAUSE; |
| 158 | GlobalConfig.classStopTime=EngineUtils.creatTimestampStr(); | 152 | GlobalConfig.classStopTime=EngineUtils.creatTimestampStr(); |
| 159 | _param.actionType=ACTION_TYPE_2; | 153 | _param.actionType=ACTION_TYPE_2; |
| 154 | + this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE); | ||
| 160 | this.sendUpdaterClassStatusInfo(_param); | 155 | this.sendUpdaterClassStatusInfo(_param); |
| 161 | } | 156 | } |
| 162 | //关闭课堂 | 157 | //关闭课堂 |
| @@ -165,13 +160,16 @@ class ConferApe extends Ape { | @@ -165,13 +160,16 @@ class ConferApe extends Ape { | ||
| 165 | GlobalConfig.classStatus=ApeConsts.CLASS_STATUS_WAIT;// | 160 | GlobalConfig.classStatus=ApeConsts.CLASS_STATUS_WAIT;// |
| 166 | GlobalConfig.classStopTime=EngineUtils.creatTimestampStr(); | 161 | GlobalConfig.classStopTime=EngineUtils.creatTimestampStr(); |
| 167 | _param.actionType=ACTION_TYPE_3; | 162 | _param.actionType=ACTION_TYPE_3; |
| 163 | + this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE); | ||
| 168 | this.sendUpdaterClassStatusInfo(_param); | 164 | this.sendUpdaterClassStatusInfo(_param); |
| 165 | + | ||
| 169 | } | 166 | } |
| 167 | + | ||
| 170 | //更新课堂状态 | 168 | //更新课堂状态 |
| 171 | updateClassStatus(_param){ | 169 | updateClassStatus(_param){ |
| 172 | - GlobalConfig.classStatus=ApeConsts.CLASS_STATUS_UPTATE; | ||
| 173 | - _param.actionType=ACTION_TYPE_4; | ||
| 174 | - this.sendUpdaterClassStatusInfo(_param); | 170 | + //GlobalConfig.classStatus=ApeConsts.CLASS_STATUS_UPTATE; |
| 171 | + //_param.actionType=ACTION_TYPE_4; | ||
| 172 | + //this.sendUpdaterClassStatusInfo(_param); | ||
| 175 | } | 173 | } |
| 176 | 174 | ||
| 177 | //更新会议信息 | 175 | //更新会议信息 |
| @@ -329,6 +327,8 @@ class ConferApe extends Ape { | @@ -329,6 +327,8 @@ class ConferApe extends Ape { | ||
| 329 | classStatusInfo.activeDocCurPage=GlobalConfig.activeDocCurPage;//当前激活的文档的当前页 | 327 | classStatusInfo.activeDocCurPage=GlobalConfig.activeDocCurPage;//当前激活的文档的当前页 |
| 330 | 328 | ||
| 331 | 329 | ||
| 330 | + console.log("classStatusInfo-------------"); | ||
| 331 | + console.log(classStatusInfo); | ||
| 332 | /* | 332 | /* |
| 333 | optional uint32 item_idx=1; | 333 | optional uint32 item_idx=1; |
| 334 | optional uint32 from=2; | 334 | optional uint32 from=2; |
| @@ -292,8 +292,8 @@ class WhiteBoardApe extends Ape { | @@ -292,8 +292,8 @@ class WhiteBoardApe extends Ape { | ||
| 292 | var updateObj={ | 292 | var updateObj={ |
| 293 | "isFresh":false, | 293 | "isFresh":false, |
| 294 | "annotaionItems":annotaionItems | 294 | "annotaionItems":annotaionItems |
| 295 | - } | ||
| 296 | - loger.log("WHITEBOARD_ANNOTATION_UPDATE",updateObj.length); | 295 | + }; |
| 296 | + loger.log("WHITEBOARD_ANNOTATION_UPDATE",annotaionItems.length); | ||
| 297 | this._emit(MessageTypes.WHITEBOARD_ANNOTATION_UPDATE,updateObj); | 297 | this._emit(MessageTypes.WHITEBOARD_ANNOTATION_UPDATE,updateObj); |
| 298 | } | 298 | } |
| 299 | //整体更新并且显示标注 | 299 | //整体更新并且显示标注 |
| @@ -305,14 +305,14 @@ class WhiteBoardApe extends Ape { | @@ -305,14 +305,14 @@ class WhiteBoardApe extends Ape { | ||
| 305 | annotaionItems.push(item); | 305 | annotaionItems.push(item); |
| 306 | loger.log("显示和文档对应的白板数据docUpdateHandler itemIdx:",item.itemIdx,"doc itemIdx:",GlobalConfig.activeDocId,"curPageNo:",GlobalConfig.activeDocCurPage); | 306 | loger.log("显示和文档对应的白板数据docUpdateHandler itemIdx:",item.itemIdx,"doc itemIdx:",GlobalConfig.activeDocId,"curPageNo:",GlobalConfig.activeDocCurPage); |
| 307 | }else{ | 307 | }else{ |
| 308 | - loger.log("不显示白板数据docUpdateHandler",item); | 308 | + //loger.log("不显示白板数据docUpdateHandler",item); |
| 309 | } | 309 | } |
| 310 | } | 310 | } |
| 311 | var updateObj={ | 311 | var updateObj={ |
| 312 | "isFresh":true, | 312 | "isFresh":true, |
| 313 | "annotaionItems":annotaionItems | 313 | "annotaionItems":annotaionItems |
| 314 | - } | ||
| 315 | - loger.log("WHITEBOARD_ANNOTATION_UPDATE",updateObj.length); | 314 | + }; |
| 315 | + loger.log("WHITEBOARD_ANNOTATION_UPDATE",annotaionItems.length); | ||
| 316 | this._emit(MessageTypes.WHITEBOARD_ANNOTATION_UPDATE,updateObj); | 316 | this._emit(MessageTypes.WHITEBOARD_ANNOTATION_UPDATE,updateObj); |
| 317 | } | 317 | } |
| 318 | 318 | ||
| @@ -364,7 +364,7 @@ class WhiteBoardApe extends Ape { | @@ -364,7 +364,7 @@ class WhiteBoardApe extends Ape { | ||
| 364 | /* whiteBoardModelPdu.parentId=_param.parentId||0; | 364 | /* whiteBoardModelPdu.parentId=_param.parentId||0; |
| 365 | whiteBoardModelPdu.curPage=_param.curPage||1;*/ | 365 | whiteBoardModelPdu.curPage=_param.curPage||1;*/ |
| 366 | 366 | ||
| 367 | - whiteBoardModelPdu.parentId=GlobalCoig.activeDocId;//当前激活的文档id | 367 | + whiteBoardModelPdu.parentId=GlobalConfig.activeDocId;//当前激活的文档id |
| 368 | whiteBoardModelPdu.curPageNo=GlobalConfig.activeDocCurPage;//当前激活的文档页码 | 368 | whiteBoardModelPdu.curPageNo=GlobalConfig.activeDocCurPage;//当前激活的文档页码 |
| 369 | 369 | ||
| 370 | whiteBoardModelPdu.pointGroup =EngineUtils.arrayToJsonString(_param.pointGroup); | 370 | whiteBoardModelPdu.pointGroup =EngineUtils.arrayToJsonString(_param.pointGroup); |
| @@ -68,7 +68,7 @@ class MCU extends Emiter { | @@ -68,7 +68,7 @@ class MCU extends Emiter { | ||
| 68 | pduMsg.set("userId", this.classInfo.userId); | 68 | pduMsg.set("userId", this.classInfo.userId); |
| 69 | pduMsg.set("userName", Base64.fromByteArray(ArrayBufferUtil.strToUint8Array(this.classInfo.userName))); | 69 | pduMsg.set("userName", Base64.fromByteArray(ArrayBufferUtil.strToUint8Array(this.classInfo.userName))); |
| 70 | pduMsg.set("userRole", this.classInfo.userRole); | 70 | pduMsg.set("userRole", this.classInfo.userRole); |
| 71 | - pduMsg.set("deviceType", ""); | 71 | + pduMsg.set("deviceType",""+GlobalConfig.deviceType); |
| 72 | pduMsg.set("data", joinRequestPdu.toArrayBuffer()); | 72 | pduMsg.set("data", joinRequestPdu.toArrayBuffer()); |
| 73 | 73 | ||
| 74 | this._everSocket.send(pduMsg.toArrayBuffer()); | 74 | this._everSocket.send(pduMsg.toArrayBuffer()); |
-
请 注册 或 登录 后发表评论