李勇

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

2.会议状态数据结构的调整
此 diff 太大无法显示。
... ... @@ -16,6 +16,9 @@ import WhiteBoardApe from 'apes/WhiteBoardApe';
import EngineUtils from "EngineUtils";
import GlobalConfig from 'GlobalConfig';
import ApeConsts from 'apes/ApeConsts';
import Base64 from 'base64-js';
import ArrayBufferUtil from 'libs/ArrayBufferUtil';
import UTF8 from 'utf-8';
let loger = Loger.getLoger('MessageEntrance');
let _sdkInfo={"version":"v.1.0.1","author":"www.3mang.com"};
... ... @@ -61,6 +64,7 @@ export default class MessageEntrance extends Emiter {
_sass.on(_sass.CLASS_INIT_SUCCESS, this._sassInitSuccessHandler.bind(this));
_sass.on(_sass.CLASS_GET_CLASS_DETAIL, this._sassGetClassDetailSuccessHandler.bind(this));
_sass.on(_sass.CLASS_GET_CLASS_PARAM,this._sassGetClassParaSuccessHandler.bind(this));
_sass.on(_sass.CLASS_SAVE_STATUS_INFO_SUCCESS,this._sassSaveClassStatusInfoSuccessHandler.bind(this));
_sass.on(_sass.DELETE_DOCUMENT_SUCCESS,this._sassDeleteDocumentSuccess.bind(this));
// 底层MCU消息层
... ... @@ -72,7 +76,8 @@ export default class MessageEntrance extends Emiter {
// 注册所有应用Ape
_confer_ape = new ConferApe();
_confer_ape.on('*', (type, data) => this._emit(type, data));
//_confer_ape.on(MessageTypes.DOC_SWITCH, this.docSwitchHandler.bind(this));
_confer_ape.on(MessageTypes.CLASS_CLOSE, this._doClassClose.bind(this));//会议关闭,所有人都退出
_confer_ape.on(MessageTypes.CLASS_STATUS_INFO_CHANGE, this._onClassStatusInfoChange.bind(this));//当前会议状态信息发生改变
_chat_ape = new ChatApe();
_chat_ape.on('*', (type, data) => this._emit(type, data));
... ... @@ -149,6 +154,15 @@ export default class MessageEntrance extends Emiter {
return GlobalConfig.getClassDetail();
}
//关闭会议,所有人都退出
_doClassClose(_param){
this._leaveClass();
}
//当前的会议状态信息发生改变
_onClassStatusInfoChange(_param){
this._sassSaveClassStatusInfo();
}
//Sass
//初始化
_init(_param,_onSuccess,_mcuErrorCallBack){
... ... @@ -270,38 +284,16 @@ export default class MessageEntrance extends Emiter {
}
}
//获取会议所有参数
//获取会议所有参数 getClassH5
_sassGetClassDetailSuccessHandler(_data){
loger.log('获取getClassDetail完成.');
/* {
"cycle": 0,
"repeatmonthweekweek": 0,
"status": 1,
"repeatmonthday": 0,
"repeatmode": 0,
"beginTime": "2017-02-03 09:00:00",
"frequency": 1,
"endmode": 0,
"meetingContent": "",
"endTime": "2017-03-31 11:00:00",
"repeatweek": "",
"category": "",
"finalenddate": "",
"repeatday": 0,
"meetingName": "mcu1",
"errorCode": 0,
"monthType": 0,
"repeatmonthweekday": 0,
"endcount": 1
}*/
GlobalConfig.setClassDetail=_data;
}
//获取会议所有参数 api/meeting/detail.do? flash中的接口文件是 getClassParam.do
_sassGetClassParaSuccessHandler(_data){
loger.log('获取api/meeting/detail.do完成.');
// console.log(_data);
//包含整个会议最全的信息,储存数据
if(_data){
GlobalConfig.setDocListPrepare(_data.docListPrepare); //提前上传的文档列表
... ... @@ -314,6 +306,45 @@ export default class MessageEntrance extends Emiter {
GlobalConfig.setRsList(_data.rsList);//
}
if(_data.currentInfo){
//根据从Sass获取的数据信息,同步最后一次保存的会议状态信息
loger.log("同步最后一次保存过的会议状态信息");
/*//解析BASE64的数据
loger.log("11111111111111111111111111111111");
console.log(GlobalConfig.classStatusInfo);
//已经保存过会议状态信息,读取之前的数据
let _classStatusInfo=EngineUtils.objectFromBase64(_data.currentInfo);
loger.log("classStatusInfo",_classStatusInfo);
GlobalConfig.classStatusInfo=_classStatusInfo;
loger.log("2222222222222222222222222");
console.log(GlobalConfig.classStatusInfo);*/
console.log(_data.currentInfo);
GlobalConfig.classStatusInfo=_data.currentInfo;
}else {
loger.log("还没有保存过会议状态信息");
}
}
//保存会议状态信息
_sassSaveClassStatusInfo(){
if(GlobalConfig.isHost){
//用get保存数据,数据内容需要转为BASE64
//let _classStatusInfo=EngineUtils.objectToBase64(GlobalConfig.classStatusInfo);
//loger.log("保存会议状态信息",_classStatusInfo);
//_sass.saveClassStatusInfo({"classStatusInfo":_classStatusInfo});//保存会议状态信息
//POST 保存数据
_sass.saveClassStatusInfo({"classStatusInfo":GlobalConfig.classStatusInfo});//保存会议状态信息
}else {
loger.log("没有保存会议状态信息的权限 isHost",GlobalConfig.isHost);
}
}
//保存会态信息成功
_sassSaveClassStatusInfoSuccessHandler(_data){
loger.log('保存会议状态信息成功.',_data);
}
// MCU 会议成功
... ... @@ -326,7 +357,6 @@ export default class MessageEntrance extends Emiter {
}
//储存数据
GlobalConfig.MCUServerIP=_data.MCUServerIP;
GlobalConfig.MCUServerPort=_data.MCUServerPort;
GlobalConfig.classId=_data.classId;
... ...
/**
* Created by hoopoe8 on 2017/1/8.
*/
import Base64 from 'base64-js';
import UTF8 from 'utf-8';
class EngineUtils{
static isEmptyObject(O){
... ... @@ -43,5 +45,32 @@ class EngineUtils{
timeStr+=curTime.getSeconds();
return timeStr;
}
static objectToBase64(_object){
try{
let _objectStr=JSON.stringify(_object);
//console.log("objectToBase64------1----------")
let byte=UTF8.setBytesFromString(_objectStr);
//console.log("objectToBase64------2----------")
let _objectBase64=Base64.fromByteArray(byte);
return _objectBase64
}catch (err){
console.log("objectToBase64 err:"+err.message);
return "";
}
return ""
}
static objectFromBase64(_objectBase64){
try{
let byte=Base64.toByteArray(_objectBase64);
let _objectStr=UTF8.getStringFromBytes(byte);
let _object=JSON.parse(_objectStr);
return _object
}catch (err){
console.log("objectFromBase64 err:"+err.message);
return null;
}
return null
}
}
export default EngineUtils;
\ No newline at end of file
... ...
... ... @@ -35,99 +35,115 @@ class GlobalConfig {
this.className=_data.meetingName||"";
this.classBeginTime=_data.beginTime||"";
this.classEndTime=_data.endTime||"";
//
//"cycle": 0,
// "repeatmonthweekweek": 0,
// "status": 1,
// "repeatmonthday": 0,
// "repeatmode": 0,
// "beginTime": "2017-02-03 09:00:00",
// "frequency": 1,
// "endmode": 0,
// "meetingContent": "",
// "endTime": "2017-03-31 11:00:00",
// "repeatweek": "",
// "category": "",
// "finalenddate": "",
// "repeatday": 0,
// "meetingName": "mcu1",
// "errorCode": 0,
// "monthType": 0,
// "repeatmonthweekday": 0,
// "endcount": 1
/* {
"cycle": 0,
"repeatmonthweekweek": 0,
"status": 1,
"repeatmonthday": 0,
"repeatmode": 0,
"beginTime": "2017-02-03 09:00:00",
"frequency": 1,
"endmode": 0,
"meetingContent": "",
"endTime": "2017-03-31 11:00:00",
"repeatweek": "",
"category": "",
"finalenddate": "",
"repeatday": 0,
"meetingName": "mcu1",
"errorCode": 0,
"monthType": 0,
"repeatmonthweekday": 0,
"endcount": 1
}*/
}
static getClassInfo (){
if(this.isDebug){
//这几个属性是sass验证完成之后返回的,启动MCU的时候需要
this .deBugData.MCUServerIP=this.MCUServerIP;
this .deBugData.MCUServerPort=this.MCUServerPort;
this .deBugData.maxVideoChannels=this.maxVideoChannels;
this .deBugData.maxAudioChannels=this.maxAudioChannels;
this .deBugData.maxMediaChannels=this.maxMediaChannels;
return this .deBugData;
}else {
return{
"siteId": this.siteId,
"classId": this.classId,
"className": this.className,
"h5Module": this.h5Module,
"nodeId": this.nodeId,
"topNodeID":this.topNodeID,
"userRole": this.userRole,
"role": this.role,
"isHost": this.isHost,
"userId": this.userId,
"userName": this.userName,
"password": this.password,
"userType": this.userType,
"passwordRequired": this.passwordRequired,
"md5": this.md5,
"msType": this.msType,
"portal": this.portal,
"mcuDelay":this.mcuDelay,
"MCUServerIP": this.MCUServerIP,
"MCUServerPort":this.MCUServerPort,
"maxVideoChannels": this.maxVideoChannels,
"maxAudioChannels": this.maxAudioChannels,
"maxMediaChannels": this.maxMediaChannels
}
}
}
//当前的课堂状态的信息
let classInfo={};
classInfo.siteId= this.siteId;
classInfo.classId= this.classId;
classInfo.className=this.className;
classInfo.h5Module= this.h5Module;
classInfo.nodeId=this.nodeId;
classInfo.topNodeID=this.topNodeID;
classInfo.userRole=this.userRole;
classInfo.role= this.role;
classInfo.isHost= this.isHost;
classInfo.userId= this.userId;
classInfo.userName= this.userName;
classInfo.password= this.password;
classInfo.userType= this.userType;
classInfo.passwordRequired= this.passwordRequired;
classInfo.md5=this.md5;
classInfo.msType= this.msType;
classInfo.portal= this.portal;
classInfo.mcuDelay=this.mcuDelay;
classInfo.MCUServerIP=this.MCUServerIP;
classInfo.MCUServerPort=this.MCUServerPort;
classInfo.maxVideoChannels= this.maxVideoChannels;
classInfo.maxAudioChannels=this.maxAudioChannels;
classInfo.maxMediaChannels= this.maxMediaChannels;
return classInfo;
}
//获取当前的课堂状态的信息
static get classStatusInfo(){
return {
"classStatusInfo":{
"nodeId":this.nodeId,//mcu中的唯一ID
"userId":this.userId,//
"userName":this.userName,
let classStatusInfo={};
"siteId":this.siteId,//站点号
classStatusInfo.siteId=this.siteId;//站点号
"classId":this.classId,
"className":this.className,
"classType":this.classType,//课堂类型
"classStatus":this.classStatus,//课堂的状态
"classStartTime":this.classStartTime,//课堂点击开始时间
"classStopTime":this.classStopTime,//最后一次停止的时间(点暂停或结束),每次发送数据都获取当前时间戳
"classTimestamp":this.classTimestamp,//相对于点开始课堂的时间戳
classStatusInfo.classId=this.classId;
classStatusInfo.className=this.className;
classStatusInfo.classType=this.classType;//课堂类型
classStatusInfo.classStatus=this.classStatus;//课堂的状态
classStatusInfo.classStartTime=this.classStartTime;//课堂点击开始时间
classStatusInfo.classStopTime=this.classStopTime;//最后一次停止的时间(点暂停或结束),每次发送数据都获取当前时间戳
classStatusInfo.classTimestamp=this.classTimestamp;//相对于点开始课堂的时间戳
"classBeginTime":this.classBeginTime,//课堂创建的时间,这个是Sass返回的
"classEndTime":this.classEndTime,//课堂结束的时间,这个是Sass返回的
classStatusInfo.classBeginTime=this.classBeginTime;//课堂创建的时间,这个是Sass返回的
classStatusInfo.classEndTime=this.classEndTime;//课堂结束的时间,这个是Sass返回的
"recordStatus":this.recordStatus,//当前录制状态
"recordTimestamp":this.recordTimestamp,//相对于首次开始录制的时间戳
"recordFileName":this.recordFileName,//录制的文件名
"recordDownloadUrl":this.recordDownloadUrl,//下载地址
classStatusInfo.recordStatus=this.recordStatus;//当前录制状态
classStatusInfo.recordTimestamp=this.recordTimestamp;//相对于首次开始录制的时间戳
classStatusInfo.recordFileName=this.recordFileName;//录制的文件名
classStatusInfo.recordDownloadUrl=this.recordDownloadUrl;//下载地址
"serverTimestamp":this.serverTimestamp,//当前的系统时间戳
"activeDocId":this.activeDocId ,//当前激活的文档ID
"activeDocCurPage":this.activeDocCurPage//当前激活的文档的当前页
classStatusInfo.serverTimestamp=this.serverTimestamp;//当前的系统时间戳
classStatusInfo.activeDocId=this.activeDocId;//当前激活的文档ID
classStatusInfo.activeDocCurPage=this.activeDocCurPage;//当前激活的文档的当前页
return classStatusInfo;
}
//设置当前的课堂状态的信息
static set classStatusInfo(_data){
if(_data==null){
loger.warn("classStatusInfo error,_data:",_data);
return;
}
let data=_data;
this.siteId=data.siteId||this.siteId;//站点号
this.classId=data.classId||this.classId;
this.className=data.className||this.className;
this.classType=data.classType||this.classType;//课堂类型
this.classStatus=data.classStatus||this.classStatus;//课堂的状态
this.classStartTime=data.classStartTime||this.classStartTime;//课堂点击开始时间
this.classStopTime=data.classStopTime||this.classStopTime;//最后一次停止的时间(点暂停或结束),每次发送数据都获取当前时间戳
this.classTimestamp=data.classTimestamp||this.classTimestamp;//相对于点开始课堂的时间戳
this.classBeginTime=data.classBeginTime||this.classBeginTime;//课堂创建的时间,这个是Sass返回的
this.classEndTime=data.classEndTime||this.classEndTime;//课堂结束的时间,这个是Sass返回的
this.recordStatus=data.recordStatus||this.recordStatus;//当前录制状态
this.recordTimestamp=data.recordTimestamp||this.recordTimestamp;//相对于首次开始录制的时间戳
this.recordFileName=data.recordFileName||this.recordFileName;//录制的文件名
this.recordDownloadUrl=data.recordDownloadUrl||this.recordDownloadUrl;//下载地址
this.activeDocId=data.activeDocId||this.activeDocId;//当前激活的文档ID
this.activeDocCurPage=data.activeDocCurPage||this.activeDocCurPage;//当前激活的文档的当前页
}
// 判断自己是否主持人角色
... ... @@ -269,7 +285,7 @@ GlobalConfig.isDebug=false;
GlobalConfig.deBugData={};
GlobalConfig.deviceType=-1; //设备类型 0:电脑 1:安卓 2:ios -1未知
GlobalConfig.deviceType=0; //设备类型 0:电脑 1:安卓 2:ios
GlobalConfig.userIP="";//用户当前IP
GlobalConfig.userId=0;
GlobalConfig.userName="";
... ... @@ -298,7 +314,7 @@ GlobalConfig.classTimestamp=0;//从课堂开始到现在的时
GlobalConfig.recordStatus=false;//当前录制状态
GlobalConfig.recordTimestamp=0;//相对于首次开始录制的进行时间
GlobalConfig.recordFileName="";//录制的文件名
GlobalConfig.recordDownloadUrl="";//下载地址
GlobalConfig.recordDownloadUrl="xxxxxxxxxxxxxxxxxxxxx";//下载地址
GlobalConfig.recordReplaytickValues={}; // 滚动条关键点,用于快进快退
//GlobalConfig.serverTimestamp=0;//当前的系统时间戳 用get set 获取
... ...
// //////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2016-present All Rights Reserved.
// Licensed under the Apache License, Version 2.0 (the "License");
// http://www.apache.org/licenses/LICENSE-2.0
//
// Github Home: https://github.com/AlexWang1987
// Author: AlexWang
// Date: 2016-08-27 23:04:56
// QQ Email: 1669499355@qq.com
// Last Modified time: 2016-09-07 15:58:29
// Description: LiveClass-MessageTypes
//
// //////////////////////////////////////////////////////////////////////////////
/**
*事件定义和错误码定义
*/
function MessageTypes() {}
... ... @@ -29,7 +18,9 @@ MessageTypes.CLASS_JOIN_SUCCESS = 'join.class.success';
MessageTypes.CLASS_SHOW_ROSTER_NUM = 'roster_num.message';
MessageTypes.CLASS_INSERT_ROSTER = 'roster_insert.message';
MessageTypes.CLASS_DELETE_ROSTER = 'roster_delete.message';
MessageTypes.CLASS_EXIT = 'class.exit';
MessageTypes.CLASS_EXIT = 'class.exit';//退出
MessageTypes.CLASS_CLOSE = 'class.close';//关闭会议,所有人都要退出(host操作)
MessageTypes.CLASS_STATUS_INFO_CHANGE= 'class.status.info.change';//会议状态信息发生改变,需要保存数据到sass和同步MCU
//聊天模块事件定义
MessageTypes.CHAT_RECEIVE = 'chat.receive';
... ... @@ -39,13 +30,16 @@ MessageTypes.VIDEO_RECEIVE = 'video.receive';
//文档模块事件定义
MessageTypes.DOC_SHOW = 'document.show';
MessageTypes.DOC_UPLOAD='document.upload';//上传文档
MessageTypes.DOC_COMMAND='document.command';//操作文档
MessageTypes.DOC_SWITCH = 'document.switch';//切换文档
MessageTypes.DOC_UPDATE = 'document.update';//更新文档
MessageTypes.DOC_DELETE='document.delete';//删除文档
MessageTypes.DOC_ANNOTATION = 'document.annotation';//笔记
MessageTypes.DOC_UPDATE = 'document.update';//更新文档(添加、变更)
//MessageTypes.DOC_SHOW = 'document.show';
//MessageTypes.DOC_UPLOAD='document.upload';//上传文档
//MessageTypes.DOC_COMMAND='document.command';//操作文档
//MessageTypes.DOC_SWITCH = 'document.switch';//切换文档
//MessageTypes.DOC_DELETE='document.delete';//删除文档
//MessageTypes.DOC_ANNOTATION = 'document.annotation';//笔记
//白板笔记事件定义
MessageTypes.WHITEBOARD_ANNOTATION_UPDATE = 'whiteboard.annotation.update';
... ... @@ -58,8 +52,6 @@ MessageTypes.WHITEBOARD_ANNOTATION_UPDATE = 'whiteboard.annotation.update';
MessageTypes.AUDIO_RECEIVE='audio.receive';
//错误事件定义
MessageTypes.MCU_ERROR ="mcuError";//MCU错误
... ...
... ... @@ -12,20 +12,8 @@ class Sass extends Emiter {
super();
}
//Sass 接口
//----1.校验之前的接口-----
//getJoinParams 获取课堂校验信息 let url = `http://${_initInfo.portal}/3m/api/meeting/joinParams.do?meetingNumber=${_initInfo.classId}&userID=${_initInfo.userId}`;
//-----2.开始校验,如果有密码先校验密码,否则直接开始MD5验证-----
//sendPWDChecking入会密码校验 let url = `http://${classInfo.portal}/3m/getCheckMeetinig.do?siteId=${classInfo.siteId}&classId=${classInfo.classId}&password=${classInfo.password}`;
//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}`;
//----3.验证完成后获取------
//getClassDetail 获取会议详情 let url = `http://${classInfo.portal}/3m/meeting/getClassH5.do?classNumber=${classInfo.classId}`;
//getClassParam 获取会议最全参数集合 let url = `http://${classInfo.portal}/3m/api/meeting/detail.do?meetingNumber=${classInfo.classId}&timestamp=${timestamp}&authId=${authId}`;
//Sass获取课堂校验信息
///////////////////////////////////////Sass 接口///////////////////////////////////////////////////
//Sass init初始化获取课堂校验信息-----------------------------------------------------------------
getJoinParams(_initInfo) {
loger.log('初始化init获取课堂校验信息', _initInfo);
/* 获取用于加入课堂的参数
... ... @@ -35,8 +23,6 @@ class Sass extends Emiter {
meetingNumber String 否 null 课堂号
userID String 是 0 用户id
返回 (application/json):
名称 类型 说明
code int 0 正常
1 课堂号必填
2 无效的课堂号
... ... @@ -46,6 +32,7 @@ class Sass extends Emiter {
passwordRequired Boolean 是否需要输入密码
md5 String 用于后续加入课堂验证
msType int 媒体服务器类型
classType 课堂类型
*/
let url = `http://${_initInfo.portal}/3m/api/meeting/joinParams.do?meetingNumber=${_initInfo.classId}&userID=${_initInfo.userId}`;
loger.log('初始化init获取课堂校验信息.', url);
... ... @@ -92,7 +79,7 @@ class Sass extends Emiter {
});
}
// Sass校验开始
// Sass校验开始-->密码校验(如果需要密码)--->MD5校验----------------------------------------------------
passwordAndMd5Checking(_param) {
loger.log('开始Sass校验', _param);
confInfo = _param;
... ... @@ -105,10 +92,9 @@ class Sass extends Emiter {
this.sendMD5Checking();
}
// 入会密码校验
// 入会密码校验---------------------------------------------------------------------------------------
sendPWDChecking() {
//let url = `http://${classInfo.portal}/3m/getCheckMeetinig.do?siteId=${classInfo.siteId}&classId=${classInfo.classId}&password=${classInfo.password}`;
/*
/3m/api/meeting/signIn.do
siteId 站点号
... ... @@ -158,7 +144,7 @@ class Sass extends Emiter {
});
}
// 发起入会
//MD5校验-----------------------------------------------------------------------------------------
sendMD5Checking() {
let url = `http://${confInfo.portal}/3m/meeting/md5CheckMeeting.do?siteId=${confInfo.siteId}&meetingNumber=${confInfo.classId}&userId=${confInfo.userId}&userName=${confInfo.userName}&userType=${confInfo.userType}&nopassword=${confInfo.passwordRequired}&md5=${confInfo.md5}`;
loger.log('MD5校验', url);
... ... @@ -205,7 +191,7 @@ class Sass extends Emiter {
});
}
// 获取会议详情
// 获取会议基本详情------------------------------------------------------------------------------------
getClassDetail() {
let url = `http://${confInfo.portal}/3m/meeting/getClassH5.do?classNumber=${confInfo.classId}`;
loger.log('获取Class详情.', url);
... ... @@ -236,6 +222,7 @@ class Sass extends Emiter {
});
}
//获取课堂会议的完整信息--------------------------------------------------------------------------------
getClassParam(){
/*
参数 (application/x-www-form-urlencoded):
... ... @@ -243,7 +230,6 @@ class Sass extends Emiter {
meetingNumber String 否 null 课堂号
timestamp String 否 null 时间戳
authId String 否 null 验证信息 md5(meetingNumber + timestamp)
返回 (application/json):
名称 类型 说明
code int 0 正常
... ... @@ -286,7 +272,7 @@ class Sass extends Emiter {
});
}
//删除文档
//删除文档-----------------------------------------------------------------------------------------------------
/*
删除课堂中的文档,即删除课堂与文档的关联
/api/document/deleteRelation.do
... ... @@ -295,12 +281,9 @@ class Sass extends Emiter {
classId 课堂号
timestamp 时间戳
authId md5(docId+classId+timestamp)
返回 (application/json):
0 成功, 1 验证信息错误
*/
sassDeleteDocument(_param){
var timestamp=new Date().getTime();
var authId=MD5(_param.docId+""+_param.classId+""+timestamp);// docId+classId+timestamp的字符串,转成MD5
... ... @@ -325,7 +308,7 @@ class Sass extends Emiter {
loger.log('sassDeleteDocument 完成');
this._emit(Sass.DELETE_DOCUMENT_SUCCESS, _param);
} else {
loger.warn('sassDeleteDocument 失败.');
loger.warn('sassDeleteDocumnt 失败.');
this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_DOC_DELETE_FAILED);
}
})
... ... @@ -335,6 +318,105 @@ class Sass extends Emiter {
});
}
//保存课堂的当前信息-------------------------------------------------------------------------------------------------
/*保存课堂的当前信息,首次是插入,后面是更新
/api/meeting/saveInfo.do
参数(application/x-www-form-urlencoded):
info Json字符串课堂信息,由前端自己维护
classId 课堂号
timestamp 时间戳
authId 做基本验证,md5(classId+timestamp)
返回 (application/json):
code 0 成功 1 课堂号为空 2 无效的课堂号 3 验证信息错误*/
saveClassStatusInfo(_param){
//{"classStatusInfo":classStatusInfo}
var timestamp=new Date().getTime();
var authId=MD5(confInfo.classId+""+timestamp);// (classId+timestamp)的字符串,转成MD5
let classStatusInfo=JSON.stringify(_param.classStatusInfo);
let url = `http://${confInfo.portal}/3m/api/meeting/saveInfo.do`;
loger.log('saveClassStatusInfo', url);
fetch(url, {
method: 'POST',
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
body:`classId=${confInfo.classId}&info=${classStatusInfo}&timestamp=${timestamp}&authId=${authId}`,
timeout: 5000
})
.then(ret => {
if (ret.ok) {
return ret.json();
} else {
loger.error(`saveClassStatusInfo-网络异常.状态码:${ret.status}`);
//this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_DOC_DELETE_FAILED);
throw '';
}
})
.then(ret => {
if (ret.code === 0) {
loger.log('saveClassStatusInfo 完成');
this._emit(Sass.CLASS_SAVE_STATUS_INFO_SUCCESS, _param);
} else if (ret.code ===1) {
loger.log('saveClassStatusInfo 失败 课堂号为空');
}else if (ret.code === 2) {
loger.log('saveClassStatusInfo 失败 无效的课堂号');
}else if (ret.code === 3) {
loger.log('saveClassStatusInfo 失败 验证信息错误');
}else {
loger.warn('saveClassStatusInfo 失败.',ret);
//this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_DOC_DELETE_FAILED);
}
})
.catch(err => {
loger.error(`saveClassStatusInfo.状态码:${err}`);
//this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_DOC_DELETE_FAILED);
});
}
/*
//用get的方式保存数据
saveClassStatusInfo(_param){
//{"classStatusInfo":"JSON数据的字符串"}
var timestamp=new Date().getTime();
var authId=MD5(confInfo.classId+""+timestamp);// (classId+timestamp)的字符串,转成MD5
let url = `http://${confInfo.portal}/3m/api/meeting/saveInfo.do?classId=${confInfo.classId}&info=${_param.classStatusInfo}&timestamp=${timestamp}&authId=${authId}`;
loger.log('saveClassStatusInfo', url);
fetch(url, {
timeout: 5000
})
.then(ret => {
if (ret.ok) {
return ret.json();
} else {
loger.error(`saveClassStatusInfo-网络异常.状态码:${ret.status}`);
//this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_DOC_DELETE_FAILED);
throw '';
}
})
.then(ret => {
if (ret.code === 0) {
loger.log('saveClassStatusInfo 完成');
this._emit(Sass.CLASS_SAVE_STATUS_INFO_SUCCESS, _param);
} else if (ret.code ===1) {
loger.log('saveClassStatusInfo 失败 课堂号为空');
}else if (ret.code === 2) {
loger.log('saveClassStatusInfo 失败 无效的课堂号');
}else if (ret.code === 3) {
loger.log('saveClassStatusInfo 失败 验证信息错误');
}else {
loger.warn('saveClassStatusInfo 失败.',ret);
//this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_DOC_DELETE_FAILED);
}
})
.catch(err => {
loger.error(`saveClassStatusInfo.状态码:${err}`);
//this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_DOC_DELETE_FAILED);
});
}*/
}
... ... @@ -343,5 +425,7 @@ Sass.prototype.CLASS_INIT_SUCCESS = Sass.CLASS_INIT_SUCCESS = 'sass.class.init.s
Sass.prototype.CLASS_GET_CLASS_PARAM= Sass.CLASS_GET_CLASS_PARAM = 'class.getClassParam.message';
Sass.prototype.CLASS_GET_CLASS_DETAIL= Sass.CLASS_GET_CLASS_DETAIL = 'class.getClassDetail.message';
Sass.prototype.DELETE_DOCUMENT_SUCCESS= Sass.DELETE_DOCUMENT_SUCCESS = 'class.deleteDocumentSuccess.message';//删除文档成功
Sass.prototype.CLASS_SAVE_STATUS_INFO_SUCCESS= Sass.CLASS_SAVE_STATUS_INFO_SUCCESS = 'class.saveClassStatusInfoSuccess.message';//保存会议状态信息
export default new Sass;
... ...
... ... @@ -160,7 +160,7 @@ export default class Ape extends Emiter {
let tableInsertItemsLen = tableInsertItems.length;
for (let i = 0; i < tableInsertItemsLen; ++i) {
let insertItem = tableInsertItems[i];
loger.log("insertItem",insertItem);
//loger.log("insertItem",insertItem);
this.tableInsertHandler(insertItem.owner, insertItem.itemIdx, insertItem.itemData);
}
break;
... ...
// //////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2016-present All Rights Reserved.
// Licensed under the Apache License, Version 2.0 (the "License");
// http://www.apache.org/licenses/LICENSE-2.0
//
// Github Home: https://github.com/AlexWang1987
// Author: AlexWang
// Date: 2016-08-22 09:57:12
// QQ Email: 1669499355@qq.com
// Last Modified time: 2016-09-07 16:16:35
// Description: LiveClass-ConferApe
//
//会议控制APE
// //////////////////////////////////////////////////////////////////////////////
import Ape from './Ape';
... ... @@ -50,8 +39,6 @@ class ConferApe extends Ape {
// 默认值: normal
this.hostUserId = '';//主持人的 第三方userId
this.rosters = {};//用户列表
//this.activeDocId =0;//当前激活的文档ID
//this.activeDocCurPage=1;//当前激活的文档的当前页
// Ape Models
this.registerKey(this._session_id, this._session_name, this._session_tag, new ArrayBuffer);
... ... @@ -72,6 +59,7 @@ class ConferApe extends Ape {
}
//加入会议
_joinSessionHandler(_data) {
let nodeInfoRecordPdu = this.mcu.mcuClassInfo.self;
loger.log("_joinSessionHandler nodeInfoRecordPdu=",nodeInfoRecordPdu);
... ... @@ -81,7 +69,7 @@ class ConferApe extends Ape {
userDataPdu.mobile = '';
nodeInfoRecordPdu.userData = userDataPdu.toArrayBuffer();
nodeInfoRecordPdu.deviceType = 3;//设备类型
nodeInfoRecordPdu.deviceType =GlobalConfig.deviceType;//设备类型
let item = new pdu['RCRegistryRosterItemPdu'];
item.nodeId = nodeInfoRecordPdu.nodeId;
... ... @@ -104,9 +92,7 @@ class ConferApe extends Ape {
let adapterPdu = new pdu['RCAdapterPdu'];
adapterPdu.type = pdu.RCPDU_REG_ADAPTER;
adapterPdu.item.push(adapterItemPdu);
this.sendUniform(adapterPdu, true);
}
//主动离开会议,发送通知到服务器
... ... @@ -118,7 +104,7 @@ class ConferApe extends Ape {
userDataPdu.mobile = '';
nodeInfoRecordPdu.userData = userDataPdu.toArrayBuffer();
nodeInfoRecordPdu.deviceType = 3;
nodeInfoRecordPdu.deviceType = GlobalConfig.deviceType;
let item = new pdu['RCRegistryRosterItemPdu'];
item.nodeId = nodeInfoRecordPdu.nodeId;
... ... @@ -143,13 +129,21 @@ class ConferApe extends Ape {
this.sendUniform(adapterPdu, true);
}
//开始上课
startClass(_param){
if(GlobalConfig.classStatus==ApeConsts.CLASS_STATUS_WAIT){
GlobalConfig.classStartTime=EngineUtils.creatTimestampStr();
GlobalConfig.classStopTime=GlobalConfig.classStartTime;
}else{
GlobalConfig.classStopTime=GlobalConfig.creatTimestampStr;
}
GlobalConfig.classStatus=ApeConsts.CLASS_STATUS_STARTED;
_param.actionType=ACTION_TYPE_1;
this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE);
this.sendUpdaterClassStatusInfo(_param);
}
//暂停上课
... ... @@ -157,6 +151,7 @@ class ConferApe extends Ape {
GlobalConfig.classStatus=ApeConsts.CLASS_STATUS_PAUSE;
GlobalConfig.classStopTime=EngineUtils.creatTimestampStr();
_param.actionType=ACTION_TYPE_2;
this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE);
this.sendUpdaterClassStatusInfo(_param);
}
//关闭课堂
... ... @@ -165,13 +160,16 @@ class ConferApe extends Ape {
GlobalConfig.classStatus=ApeConsts.CLASS_STATUS_WAIT;//
GlobalConfig.classStopTime=EngineUtils.creatTimestampStr();
_param.actionType=ACTION_TYPE_3;
this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE);
this.sendUpdaterClassStatusInfo(_param);
}
//更新课堂状态
updateClassStatus(_param){
GlobalConfig.classStatus=ApeConsts.CLASS_STATUS_UPTATE;
_param.actionType=ACTION_TYPE_4;
this.sendUpdaterClassStatusInfo(_param);
//GlobalConfig.classStatus=ApeConsts.CLASS_STATUS_UPTATE;
//_param.actionType=ACTION_TYPE_4;
//this.sendUpdaterClassStatusInfo(_param);
}
//更新会议信息
... ... @@ -329,6 +327,8 @@ class ConferApe extends Ape {
classStatusInfo.activeDocCurPage=GlobalConfig.activeDocCurPage;//当前激活的文档的当前页
console.log("classStatusInfo-------------");
console.log(classStatusInfo);
/*
optional uint32 item_idx=1;
optional uint32 from=2;
... ...
... ... @@ -292,8 +292,8 @@ class WhiteBoardApe extends Ape {
var updateObj={
"isFresh":false,
"annotaionItems":annotaionItems
}
loger.log("WHITEBOARD_ANNOTATION_UPDATE",updateObj.length);
};
loger.log("WHITEBOARD_ANNOTATION_UPDATE",annotaionItems.length);
this._emit(MessageTypes.WHITEBOARD_ANNOTATION_UPDATE,updateObj);
}
//整体更新并且显示标注
... ... @@ -305,14 +305,14 @@ class WhiteBoardApe extends Ape {
annotaionItems.push(item);
loger.log("显示和文档对应的白板数据docUpdateHandler itemIdx:",item.itemIdx,"doc itemIdx:",GlobalConfig.activeDocId,"curPageNo:",GlobalConfig.activeDocCurPage);
}else{
loger.log("不显示白板数据docUpdateHandler",item);
//loger.log("不显示白板数据docUpdateHandler",item);
}
}
var updateObj={
"isFresh":true,
"annotaionItems":annotaionItems
}
loger.log("WHITEBOARD_ANNOTATION_UPDATE",updateObj.length);
};
loger.log("WHITEBOARD_ANNOTATION_UPDATE",annotaionItems.length);
this._emit(MessageTypes.WHITEBOARD_ANNOTATION_UPDATE,updateObj);
}
... ... @@ -364,7 +364,7 @@ class WhiteBoardApe extends Ape {
/* whiteBoardModelPdu.parentId=_param.parentId||0;
whiteBoardModelPdu.curPage=_param.curPage||1;*/
whiteBoardModelPdu.parentId=GlobalCoig.activeDocId;//当前激活的文档id
whiteBoardModelPdu.parentId=GlobalConfig.activeDocId;//当前激活的文档id
whiteBoardModelPdu.curPageNo=GlobalConfig.activeDocCurPage;//当前激活的文档页码
whiteBoardModelPdu.pointGroup =EngineUtils.arrayToJsonString(_param.pointGroup);
... ...
... ... @@ -68,7 +68,7 @@ class MCU extends Emiter {
pduMsg.set("userId", this.classInfo.userId);
pduMsg.set("userName", Base64.fromByteArray(ArrayBufferUtil.strToUint8Array(this.classInfo.userName)));
pduMsg.set("userRole", this.classInfo.userRole);
pduMsg.set("deviceType", "");
pduMsg.set("deviceType",""+GlobalConfig.deviceType);
pduMsg.set("data", joinRequestPdu.toArrayBuffer());
this._everSocket.send(pduMsg.toArrayBuffer());
... ...