李勇

1.修改SASS保存会议状态数据的接口,保存数据用post

2.会议状态数据结构的调整
此 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}&timestamp=${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}&timestamp=${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}&timestamp=${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());