李勇

1.Sass增加答题卡4个接口(创建,查询题目,查询结果,保存答案);2.会议模块增加对外控制的接口(5个接口)

此 diff 太大无法显示。
... ... @@ -31,7 +31,7 @@ import MediaSharedApe from 'apes/MediaSharedApe';
import UTF8 from 'utf-8';
let loger = Loger.getLoger('McuClient');
let _sdkInfo = {"version": "v1.31.0.20170607", "author": "www.3mang.com"};
let _sdkInfo = {"version": "v1.31.3.20170609", "author": "www.3mang.com"};
//APE
let _sass;
... ... @@ -77,6 +77,9 @@ export default class MessageEntrance extends Emiter {
_sass.on(_sass.DELETE_DOCUMENT_SUCCESS, this._sassDeleteDocumentSuccess.bind(this));//sass删除文档成功
_sass.on(_sass.DELETE_MEDIASHARE_SUCCESS, this._sassDeleteMediaShareSuccess.bind(this));//sass删除媒体文件成功
//选点模块
_ipManager = new IpManager();
... ... @@ -208,6 +211,12 @@ export default class MessageEntrance extends Emiter {
this.mediaSharedStop = this._sendMediaSharedStop.bind(this);//停止
this.mediaSharedUpdate=this._sendMediaSharedUpdate.bind(this); //更新媒体的状态
//答题卡
this.creatQuestion=this._creatQuestion.bind(this);
this.getQuestion=this._getQuestion.bind(this);
this.getQuestionResult=this._getQuestionResult.bind(this);
this.sendAnswer=this._sendAnswer.bind(this);
this.setDeviceInfo = this._setDeviceInfo.bind(this);//设置设备信息(麦克风,摄像头等等.....)
this.setMessageDelay = this._setMessageDelay.bind(this);//设置是否延迟消息
this.switchServer = this._switchMcuIpHandler.bind(this);//切换mcu服务器
... ... @@ -1726,4 +1735,51 @@ export default class MessageEntrance extends Emiter {
this._emit(MessageTypes.CLASS_JOIN_SUCCESS, joinClassSuccessCallBackData);
}
// //答题卡
_creatQuestion(_param){
if (!_mcu.connected) {
loger.warn(GlobalConfig.getCurrentStatus());
return;
}
if (_confer_ape) {
_confer_ape.creatQuestion(_param);
}
}
_getQuestion(_param){
if (!_mcu.connected) {
loger.warn(GlobalConfig.getCurrentStatus());
return;
}
if (_confer_ape) {
_confer_ape.getQuestion(_param);
}
}
_getQuestionResult(_param){
if (!_mcu.connected) {
loger.warn(GlobalConfig.getCurrentStatus());
return;
}
if (_confer_ape) {
_confer_ape.getQuestionResult(_param);
}
}
_stopQuestion(){
if (!_mcu.connected) {
loger.warn(GlobalConfig.getCurrentStatus());
return;
}
if (_confer_ape) {
_confer_ape.stopQuestion(_param);
}
}
_sendAnswer(_param){
if (!_mcu.connected) {
loger.warn(GlobalConfig.getCurrentStatus());
return;
}
if (_confer_ape) {
_confer_ape.sendAnswer(_param);
}
}
}
... ...
... ... @@ -357,7 +357,7 @@ class Sass extends Emiter {
}
//保存课堂的当前信息-------------------------------------------------------------------------------------------------
//保存课堂的当前信息-----------------------------------------------------
/*保存课堂的当前信息,首次是插入,后面是更新
/api/meeting/saveInfo.do
参数(application/x-www-form-urlencoded):
... ... @@ -474,6 +474,254 @@ class Sass extends Emiter {
loger.error(`保存开始录制信息异常.状态码:${err}`);
});
}
//答题卡-------------------------------------------------------
//创建答题数据
creatQuestion(_param){
if(GlobalConfig.isRecordPlayBack){
loger.log('录制回放中->创建答题数据->不做操作');
return;
}
/* {
"type": 1,//1单选,2多选,3判断,4点名
"content": "题目",//没有就传""
"timeLimit": 88,//有效时间(秒)
"correct": "[]",//正确答案,没有就传[]
"options": {},//选项数组,没有就传[]
"option": []//学生选择的答案,没有就传[]
}*/
if(!_param){
loger.warn('创建答题数据->参数错误->param:',_param);
this._emit(Sass.SASS_CREAT_QUESTION_FAILED);
return;
}
let classId=GlobalConfig.classId;//课堂号
var timestamp = new Date().getTime();
let authId = MD5(classId+""+timestamp);
let type = parseInt(_param.type);//1单选,2多选,3判断,4点名
let content =_param.content||"";
let timeLimit = parseInt(_param.timeLimit);
let correct = _param.correct.toString();
let options = JSON.stringify(_param.options);
let url = `http://${GlobalConfig.portal}/3m/api/question/add.do`;
loger.log('创建答题数据', url);
fetch( encodeURI(url), {
method: 'POST',
headers: {
"Content-Type": "application/x-www-form-urlencoded; charset=utf-8"
},
//classId=1&timestamp=2&authId=3&content=&options=["A","B","C","D"]&type=1&correct=0&timeLimit=60
body: `classId=${classId}&timestamp=${timestamp}&authId=${authId}&content=${content}&options=${options}&type=${type}&correct=${correct}&timeLimit=${timeLimit}`,
timeout: 5000
})
.then(ret => {
if (ret.ok) {
return ret.json();
} else {
loger.error(`创建答题数据-网络异常.状态码:${ret.status}`);
this._emit(Sass.SASS_CREAT_QUESTION_FAILED);
throw '';
}
})
.then(ret => {
if (ret.code== 0) {
//errorCode int 0 正常 1 没有指定的课堂 4 验证信息错误(authId)
// {"code":0,"id":1}
loger.log('创建答题数据->完成');
this._emit(Sass.SASS_CREAT_QUESTION_SUCCESS, ret);
} else {
loger.warn('创建答题数据->失败.', ret);
this._emit(Sass.SASS_CREAT_QUESTION_FAILED);
}
})
.catch(err => {
loger.error(`创建答题数据->状态码:${err}`);
this._emit(Sass.SASS_CREAT_QUESTION_FAILED);
});
}
//保存答题数据
sendAnswer(_param){
if(GlobalConfig.isRecordPlayBack){
loger.log('录制回放中->保存答题数据->不做操作');
return;
}
if(!_param){
loger.warn('保存答题数据->参数错误->param:',_param);
this._emit(Sass.SASS_SEND_ANSWER_FAILED);
return;
}
/*classId String课堂号
timestamp 时间戳
authId String验证信息md5(classId+timestamp)
questionId long 题目id
answer String 选择的选项的索引,如果是多选,用英文逗号分隔。例如:'0,3'
userId String 用户id
userName String 用户名字*/
let classId=GlobalConfig.classId;//课堂号
var timestamp = new Date().getTime();
let authId = MD5(classId+""+timestamp);
let type = parseInt(_param.type);//1单选,2多选,3判断,4点名
let questionId = parseInt(_param.questionId);//题目id
let answer = _param.answer.toString();
let userId = _param.userId;
let userName = _param.userName;
let url = `http://${GlobalConfig.portal}/3m/api/question/answer.do`;
loger.log('保存答题数据', url);
fetch( encodeURI(url), {
method: 'POST',
headers: {
"Content-Type": "application/x-www-form-urlencoded; charset=utf-8"
},
//classId=1&timestamp=2&authId=3&questionId=1&answer=0&userId=111&userName=zhang3
body: `classId=${classId}&timestamp=${timestamp}&authId=${authId}&questionId=${questionId}&answer=${answer}&userId=${userId}&userName=${userName}`,
timeout: 5000
})
.then(ret => {
if (ret.ok) {
return ret.json();
} else {
loger.error(`保存答题数据-网络异常.状态码:${ret.status}`);
this._emit(Sass.SASS_SEND_ANSWER_FAILED);
throw '';
}
})
.then(ret => {
if (ret.code== 0) {
// 0 正常 1 没有指定的课堂 4 验证信息错误(authId) 5 没有指定的题目 6 题目不属于该课堂
//{"code":0}
loger.log('保存答题数据->完成');
this._emit(Sass.SASS_SEND_ANSWER_SUCCESS, ret);
} else {
loger.warn('保存答题数据->失败.', ret);
this._emit(Sass.SASS_SEND_ANSWER_FAILED);
}
})
.catch(err => {
loger.error(`保存答题数据->状态码:${err}`);
this._emit(Sass.SASS_SEND_ANSWER_FAILED);
});
}
//查询题目数据
getQuestion(_param){
if(GlobalConfig.isRecordPlayBack){
loger.log('录制回放中->查询题目数据->不做操作');
return;
}
if(!_param){
loger.warn('查询题目数据->参数错误->param:',_param);
this._emit(Sass.SASS_GET_QUESTION_FAILED);
return;
}
//questionId long 题目id
let questionId = parseInt(_param.questionId);//题目id
let url = `http://${GlobalConfig.portal}/3m/api/question/get.do`;
loger.log('查询题目数据', url);
//接口中用的是GET
fetch( encodeURI(url), {
method: 'POST',
headers: {
"Content-Type": "application/x-www-form-urlencoded; charset=utf-8"
},
body: `questionId=${questionId}`,
timeout: 5000
})
.then(ret => {
if (ret.ok) {
return ret.json();
} else {
loger.error(`查询题目数据-网络异常.状态码:${ret.status}`);
this._emit(Sass.SASS_GET_QUESTION_FAILED);
throw '';
}
})
.then(ret => {
if (ret.code== 0) {
//0 正常 5 没有指定的题目
//{"timeLimit":0,"content":"test question","id":11,"code":0,"type":3,"options":"["True", "False"]"}
loger.log('查询题目数据->完成');
this._emit(Sass.SASS_GET_QUESTION_SUCCESS, ret);
} else {
loger.warn('查询题目数据->失败.', ret);
this._emit(Sass.SASS_GET_QUESTION_FAILED);
}
})
.catch(err => {
loger.error(`查询题目数据->状态码:${err}`);
this._emit(Sass.SASS_GET_QUESTION_FAILED);
});
}
//查询答题结果数据
getQuestionResult(_param){
if(GlobalConfig.isRecordPlayBack){
loger.log('录制回放中->查询答题结果数据->不做操作');
return;
}
if(!_param){
loger.warn('查询答题结果数据->参数错误->param:',_param);
this._emit(Sass.SASS_GET_QUESTION_RESULT_FAILED);
return;
}
//questionId long 题目id
let questionId = parseInt(_param.questionId);//题目id
let url = `http://${GlobalConfig.portal}/3m/api/question/results.do`;
loger.log('查询答题结果数据', url);
fetch( encodeURI(url), {
method: 'POST',
headers: {
"Content-Type": "application/x-www-form-urlencoded; charset=utf-8"
},
body: `questionId=${questionId}`,
timeout: 5000
})
.then(ret => {
if (ret.ok) {
return ret.json();
} else {
loger.error(`查询答题结果数据-网络异常.状态码:${ret.status}`);
this._emit(Sass.SASS_GET_QUESTION_RESULT_FAILED);
throw '';
}
})
.then(ret => {
if (ret.code== 0) {
//int 0 正常5 没有指定的题目
/* list array 数组
userId string 用户id
userName string 用户姓名
answer string 答案。选项的索引,多个时用逗号分隔
{"timeLimit":0,"content":"test question","id":11,"code":0,"type":3,"options":"["True", "False"]"}*/
loger.log('查询答题结果数据->完成');
this._emit(Sass.SASS_GET_QUESTION_RESULT_SUCCESS, ret);
} else {
loger.warn('查询答题结果数据->失败.', ret);
this._emit(Sass.SASS_GET_QUESTION_RESULT_FAILED);
}
})
.catch(err => {
loger.error(`查询答题结果数据->状态码:${err}`);
this._emit(Sass.SASS_GET_QUESTION_RESULT_FAILED);
});
}
//点名---------------------------------------------------------
}
Sass.prototype.SUCCESS = Sass.SUCCESS = 'Sass_success';
... ... @@ -486,6 +734,18 @@ Sass.prototype.DELETE_MEDIASHARE_SUCCESS = Sass.DELETE_MEDIASHARE_SUCCESS = 'sas
Sass.prototype.CLASS_SAVE_STATUS_INFO_SUCCESS = Sass.CLASS_SAVE_STATUS_INFO_SUCCESS = 'sass_class_saveClassStatusInfoSuccess_message';//保存课堂状态信息
Sass.prototype.CLASS_SAVE_RECORD_INFO_SUCCESS = Sass.CLASS_SAVE_RECORD_INFO_SUCCESS = 'sass_class_saveClassRecordInfoSuccess_message';//保存录制课堂信息
//答题卡和点名
Sass.prototype.SASS_CREAT_QUESTION_SUCCESS = Sass.SASS_CREAT_QUESTION_SUCCESS = 'sass_creat_question_success';//创建答题卡问题成功
Sass.prototype.SASS_CREAT_QUESTION_FAILED = Sass.SASS_CREAT_QUESTION_FAILED = 'sass_creat_question_failed';//创建答题卡失败
Sass.prototype.SASS_GET_QUESTION_SUCCESS = Sass.SASS_GET_QUESTION_SUCCESS = 'sass_get_question_success';//获取问题成功
Sass.prototype.SASS_GET_QUESTION_FAILED = Sass.SASS_GET_QUESTION_FAILED = 'sass_get_question_failed';//获取问题失败
Sass.prototype.SASS_GET_QUESTION_RESULT_SUCCESS = Sass.SASS_GET_QUESTION_RESULT_SUCCESS = 'sass_get_question_result_success';//获取问题结果成功
Sass.prototype.SASS_GET_QUESTION_RESULT_FAILED = Sass.SASS_GET_QUESTION_RESULT_FAILED = 'sass_get_question_result_failed';//获取问题结果失败
Sass.prototype.SASS_SEND_ANSWER_SUCCESS = Sass.SASS_SEND_ANSWER_SUCCESS = 'sass_send_answer_success';//保存答案成功
Sass.prototype.SASS_SEND_ANSWER_FAILED = Sass.SASS_SEND_ANSWER_FAILED = 'sass_send_answer_failed';//保存答案失败
export default new Sass;
... ...
... ... @@ -199,6 +199,12 @@ ApeConsts.CONFERENCE_OBJ_COUNTER_ID = ((ApeConsts.CONFERENCE_SESSION_ID << 16) +
ApeConsts.CONFERENCE_OBJ_COUNTER_NAME = "id list";
ApeConsts.CONFERENCE_OBJ_COUNTER_TAG = "id list tag";
//答题卡
ApeConsts.CONFERENCE_OBJ_QUESTION_ID = ((ApeConsts.CONFERENCE_SESSION_ID << 16) + 5);
ApeConsts.CONFERENCE_OBJ_QUESTION_NAME = "question list";
ApeConsts.CONFERENCE_OBJ_QUESTION_TAG = "question list tag";
// web sharing objects
ApeConsts.WEBSHARING_OBJ_TABLE_ID = ((ApeConsts.WEBSHARING_SESSION_ID << 16) + 1);
ApeConsts.WEBSHARING_OBJ_TABLE_NAME = "web list";
... ...
... ... @@ -7,12 +7,13 @@ import ApeConsts from './ApeConsts';
import ThirdMessage from './ThirdMessage';
import MessageTypes from 'MessageTypes';
import pdu from 'pdus';
import { Zlib } from 'zlibjs/bin/zlib.min';
//import { Zlib } from 'zlibjs/bin/zlib.min';
import UTF8 from 'utf-8';
import Loger from 'Loger';
import GlobalConfig from 'GlobalConfig';
import EngineUtils from 'EngineUtils';
import TimerCounter from "TimerCounter";
import Sass from 'Sass';
let loger = Loger.getLoger('ConferApe');
let itemIdx = 0;//table插入新数据的计数id,目前用时间戳
... ... @@ -24,6 +25,7 @@ class ConferApe extends Ape {
ApeConsts.CONFERENCE_SESSION_NAME,
ApeConsts.CONFERENCE_SESSION_TAG
);
this.rosters = {};//用户列表
this.timerCounter = new TimerCounter();//计时器
... ... @@ -31,6 +33,21 @@ class ConferApe extends Ape {
this.thirdMessage=new ThirdMessage();
this.thirdMessage.on(ThirdMessage.RECIVE_MESSAGE,this.onThirdReciveParentMessage.bind(this));
//监听Sass事件
this._sass=Sass;
//创建答题卡
this._sass.on(Sass.SASS_CREAT_QUESTION_SUCCESS,this._sassCreatQuestionSuccessHandler.bind(this));
this._sass.on(Sass.SASS_CREAT_QUESTION_FAILED,this._sassCreatQuestionFailedHandler.bind(this));
//获取题目数据
this._sass.on(Sass.SASS_GET_QUESTION_SUCCESS,this._sassGetQuestionSuccessHandler.bind(this));
this._sass.on(Sass.SASS_GET_QUESTION_FAILED,this._sassGetQuestionFailedHandler.bind(this));
//获取答题结果
this._sass.on(Sass.SASS_GET_QUESTION_RESULT_SUCCESS,this._sassGetQuestionResultSuccessHandler.bind(this));
this._sass.on(Sass.SASS_GET_QUESTION_RESULT_FAILED,this._sassGetQuestionResultFailedHandler.bind(this));
//保存答题数据
this._sass.on(Sass.SASS_SEND_ANSWER_SUCCESS,this._sassSendAnswerSuccessHandler.bind(this));
this._sass.on(Sass.SASS_SEND_ANSWER_FAILED,this._sassSendAnswerFailedHandler.bind(this));
// Ape Models
this.registerKey(this._session_id, this._session_name, this._session_tag, new ArrayBuffer);
... ... @@ -433,7 +450,7 @@ class ConferApe extends Ape {
this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
return;
}
itemIdx = ApeConsts.CONFERENCE_OBJ_TABLE_ID;// itemIdx=_param.itemIdx;
let itemIdx = ApeConsts.CONFERENCE_OBJ_TABLE_ID;// itemIdx=_param.itemIdx;
let modelPdu = this.packPdu(_param, itemIdx);
loger.log(modelPdu);
if (modelPdu == null) {
... ... @@ -949,6 +966,95 @@ class ConferApe extends Ape {
}
return null;
}
//答题卡接口-------------------------------------------------------------------
creatQuestion(_param){
if(!_param){
loger.warn("创建答题卡->参数错误",_param);
return;
}
loger.log("创建答题卡->",_param);
if(this._sass){
/*{
"type": 1,//1单选,2多选,3判断,4点名
"content": "题目",//没有就传""
"timeLimit": 88,//有效时间(秒)
"correct": "[]",//正确答案,没有就传[]
"options": [],//选项数组,没有就传[]
"answer": []//学生选择的答案,没有就传[]
}*/
let paramObj=_param;
paramObj.classId=GlobalConfig.classId;
this._sass.creatQuestion(paramObj);
}
}
getQuestion(_param){
if(!_param){
loger.warn("获取答题卡数据->参数错误",_param);
return;
}
loger.log("获取答题卡数据->.",_param);
if(this._sass){
this._sass.getQuestion(_param);
}
}
getQuestionResult(_param){
if(!_param){
loger.warn("获取答题卡结果->参数错误",_param);
return;
}
loger.log("获取答题卡结果->",_param);
if(this._sass){
this._sass.getQuestionResult(_param);
}
}
stopQuestion(_param){
if(!_param){
loger.warn("停止答题->参数错误",_param);
return;
}
loger.log("停止答题->",_param);
}
sendAnswer(_param){
if(!_param){
loger.warn("保存答题答案->参数错误",_param);
return;
}
loger.log("保存答题答案->",_param);
if(this._sass){
let paramObj=_param;
paramObj.classId=GlobalConfig.classId;
paramObj.userId = GlobalConfig.userId;
paramObj.userName = GlobalConfig.userName;
this._sass.sendAnswer(_param);
}
}
//Sass 事件监听
_sassCreatQuestionSuccessHandler(_data){
loger.log("创建答题卡成功",_data);
}
_sassCreatQuestionFailedHandler(_data){
loger.log("创建答题卡失败",_data);
}
_sassGetQuestionSuccessHandler(_data){
loger.log("获取答题卡数据成功",_data);
}
_sassGetQuestionFailedHandler(_data){
loger.log("获取答题卡数据失败",_data);
}
_sassGetQuestionResultSuccessHandler(_data){
loger.log("获取答题卡结果成功",_data);
}
_sassGetQuestionResultFailedHandler(_data){
loger.log("获取答题卡结果失败",_data);
}
_sassSendAnswerSuccessHandler(_data){
loger.log("保存答案成功",_data);
}
_sassSendAnswerFailedHandler(_data){
loger.log("保存答案失败",_data);
}
}
... ...
... ... @@ -18,7 +18,7 @@ import ApeConsts from './ApeConsts';
import pdu from 'pdus';
import Loger from 'Loger';
import MessageTypes from 'MessageTypes';
import { Zlib } from 'zlibjs/bin/zlib.min';
//import { Zlib } from 'zlibjs/bin/zlib.min';
import UTF8 from 'utf-8';
import GlobalConfig from 'GlobalConfig';
import EngineUtils from 'EngineUtils';
... ...