本文介绍虚拟仿真实训教学管理及资源共享平台(以下简称虚拟实训平台)的虚拟实训程序开发接口包括用户身份信息获取及学习数据回传的对接说明。
目录
虚拟仿真实训练习api
处理流程
第一步、获取token
由平台跳转至虚拟仿真实训程序的页面中,在地址栏的url参数里面有由当前登录平台的用户的身份信息加密生成的token,在url的参数中,参数名token,例如:
https://xxx.com/index.html?token=sFXXmqOYUnJqZ21mlG1mY5qYZVrZy8dTnIaUmlZlg8ael4VrWGRgWmVTrKSFb1SN15tscMa+2GXHlJG9qW+RmGdVj1OclJOdop6eWJ1XmqXW1KxywJG/YNrS19WXZ8XPlpWRlpqoYmhrZmWZ0qKOYLLZm6TNxb9gyMXExp2myL9kZJpnamNlcXBna2aRn6KYhOE=
https://xxx.com/index.html表示为虚拟实训上传到平台上供用户访问的网络地址,这条例子中的地址并非真实可用的网址,各位虚拟实训开发者自行获取地址栏中的token参数.
获取url参数方法
JavaScript:
//封装
function GetRequest() {
var url = location.search;
var theRequest = new Object();
if (url.indexOf('?') != -1) {
var str = url.substr(1);
strs = str.split('&');
for(var i = 0; i < strs.length; i ++) {
theRequest[strs[i].split('=')[0]]=unescape(strs[i].split('=')[1]);
}
}
return theRequest;
}
//调用
var getcode=GetRequest()
getcode.token;//获取token
获取到的token如下:
sFXXmqOYUnJqZ21mlG1mY5qYZVrZy8dTnIaUmlZlg8ael4VrWGRgWmVTrKSFb1SN15tscMa+2GXHlJG9qW+RmGdVj1OclJOdop6eWJ1XmqXW1KxywJG/YNrS19WXZ8XPlpWRlpqoYmhrZmWZ0qKOYLLZm6TNxb9gyMXExp2myL9kZJpnamNlcXBna2aRn6KYhOE=
每次访问虚拟实训的token都不一样,token只适用于本次虚拟实训操作,token可以用于多次的用户信息获取,但是只能传输一次学习数据,传过一次学习数据后,token就失效了。
第二步、记录实训操作开始时间戳
在程序启动的时候记录一个秒级时间戳,用于接下来的学习数据回传,时间戳为10位数字。以下是虚拟实训程序开发的主流语言获取秒级时间戳的方法。
C#:
(DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000
JavaScript:
Math.round(new Date() / 1000)
Java:
// pure java
(int) (System.currentTimeMillis() / 1000)
// joda
(int) (DateTime.now().getMillis() / 1000)
Python:
import time
time.time()
第三步、获取用户信息
api详情
api路径 | 请求方式 | 地址例子 |
---|---|---|
Home/Virtual/getinfo | POST | https://xxx.com/Home/Virtual/getinfo |
字段说明
字段名 | 类型 | 必填参数 | 描述 | 例子 |
---|---|---|---|---|
token | string | 是 | 第一步获取到的由用户身份信息加密得出的token | sFXXmqOYUnJqZ21mlG1mY5qYZVrZy8dTnIaUmlZlg8ael4VrWGR gWmVTrKSFb1SN15tscMa+2GXHlJG9qW+RmGdVj1OclJOdop6e WJ1XmqXW1KxywJG/YNrS19WXZ8XPlpWRlpqoYmhrZmWZ0qKO YLLZm6TNxb9gyMXExp2myL9kZJpnamNlcXBna2aRn6KYhOE= |
返回json
{
"state": 1, //调用状态: 1 成功 其他 不成功
"course": { //虚拟实训课程信息
"id": "10", //虚拟实训课程guid
"name": "心肺复苏术培训课",//虚拟实训名称
"img": "https://xxx.com/xxx.png",//竖版封面图
"img1": "https://xxx.com/xxx.png"//横版封面图
},
"user": {//用户信息
"id": "39",//用户guid
"name": "王一恒",//用户名称
"username": "tiedan",//用户账号
"faceimg": "https://xxx.com/Public/xxx.jpg"//用户照片
},
"msg": "成功" //调用结果说明
}
第四步、用户学习数据回传接口
api详情
api路径 | 请求方式 | 地址例子 |
---|---|---|
Home/Virtual/score_upload | POST | https://xxx.com/Home/Virtual/score_upload |
字段说明
字段名 | 类型 | 必填参数 | 描述 | 例子 |
---|---|---|---|---|
token | string | 是 | 第一步获取到的由用户身份信息加密得出的token | sFXXmqOYUnJqZ21mlG1mY5qYZVrZy8dTnIaUmlZlg8ael4VrWGR gWmVTrKSFb1SN15tscMa+2GXHlJG9qW+RmGdVj1OclJOdop6e WJ1XmqXW1KxywJG/YNrS19WXZ8XPlpWRlpqoYmhrZmWZ0qKO YLLZm6TNxb9gyMXExp2myL9kZJpnamNlcXBna2aRn6KYhOE= |
starttime | string | 是 | 虚拟实训操作开始的时间戳,即第二步记录时间戳 | 1644903304 |
endtime | string | 是 | 虚拟实训操作结束的时间戳,即调用此接口时候的时间戳 | 1644913071 |
score | string | 是 | 本次虚拟实训得分,0~100分数,可以小数点后两位 | 88 |
scoredata | string | 否 | 学习数据,包含用户在本次虚拟实训中每一步的操作详细数据及根据用户本次操作生成出的个人综合能力雷达图,注意这各参数的值是一个json字符串 | 例子:{"step": [{"seq": 1, "score": 10, "title": "步骤名称1", "endtime": 1643174853, "remarks": "步骤操作记录说明1", "duration": 300, "maxscore": 20, "starttime": 1643174553, "evaluation": "步骤操作评价1", "expecttime": 300, "scoringmodel": "步骤考察点1"}, {"seq": 2, "score": 15, "title": "步骤名称2", "endtime": 1643174853, "remarks": "步骤操作记录说明2", "duration": 300, "maxscore": 20, "starttime": 1643174553, "evaluation": "步骤操作评价2", "expecttime": 450, "scoringmodel": "步骤考察点2"}], "radar": [{"name": "反应力", "score": 3, "maxscore": 5}, {"name": "准确率", "score": 5, "maxscore": 5}, {"name": "熟练度", "score": 75, "maxscore": 100}, {"name": "操作力", "score": 7, "maxscore": 10}, {"name": "速度", "score": 3, "maxscore": 5}], "endtime": 1643174853, "duration": 300, "scoretype": "default", "starttime": 1643174553, "expecttime": 300} 结构详见下面 |
scoredata参数结构
字段名 | 类型 | 必填参数 | 描述 | 例子 |
---|---|---|---|---|
starttime | int | 是 | 虚拟实训操作开始的时间戳,即第二步记录时间戳 | 1644903304 |
endtime | int | 是 | 虚拟实训操作结束的时间戳,即调用此接口时候的时间戳 | 1644913071 |
duration | int | 是 | 虚拟实训操作耗时,单位秒 | 300 |
expecttime | int | 是 | 虚拟实训合理耗时,单位秒 | 300 |
scoretype | string | 是 | 赋分模板,写default就行 | default |
step | [ ] | 是 | 实验操作步骤数据 | 例子:[{"seq": 1, "score": 10, "title": "步骤名称1", "endtime": 1643174853, "remarks": "步骤操作记录说明1", "duration": 300, "maxscore": 20, "starttime": 1643174553, "evaluation": "步骤操作评价1", "expecttime": 300, "scoringmodel": "步骤考察点1"}, {"seq": 2, "score": 15, "title": "步骤名称2", "endtime": 1643174853, "remarks": "步骤操作记录说明2", "duration": 300, "maxscore": 20, "starttime": 1643174553, "evaluation": "步骤操作评价2", "expecttime": 450, "scoringmodel": "步骤考察点2"}] 结构详见下面 |
radar | [ ] | 是 | 雷达图的各维度数据 | 例子:[{"name": "反应力", "score": 3, "maxscore": 5}, {"name": "准确率", "score": 5, "maxscore": 5}, {"name": "熟练度", "score": 75, "maxscore": 100}, {"name": "操作力", "score": 7, "maxscore": 10}, {"name": "速度", "score": 3, "maxscore": 5}] 结构详见下面 |
scoredata.step[]参数结构
字段名 | 类型 | 必填参数 | 描述 | 例子 |
---|---|---|---|---|
seq | int | 是 | 步骤序号从1开始 | 1 |
maxscore | int | 是 | 步骤满分0~100 可以小数点后两位(注,所以步骤满分之和应不大于100) | 10 |
score | int | 是 | 步骤得分0~100 可以小数点后两位(注,所以步骤分数之和应和scoredata中的score相等,步骤分数不得大于当前步骤的maxscore) | 10 |
title | string | 是 | 步骤标题 | 步骤名称1 |
starttime | int | 是 | 当前虚拟步骤开始的时间戳(不得早于上一个步骤的结束时间) | 1644903304 |
endtime | int | 是 | 当前虚拟步骤结束的时间戳 (不得晚于下一个步骤的开始时间) | 1644913071 |
duration | int | 是 | 虚拟实训操作耗时,单位秒 | 300 |
expecttime | int | 是 | 虚拟实训合理耗时,单位秒 | 300 |
scoringmodel | string | 是 | 步骤操作考察点文字说明 | 这一步骤考察用户在操作基础操作台时候的操作顺序是否正确 |
remarks | string | 是 | 操作记录,按照每一个虚拟实训程序的情况自行制定自动生成记录 | 学生(王一恒)操作了基础控制台先点击了蓝色按钮再点击了红色按钮 |
evaluation | string | 是 | 操作评价,按照每一个虚拟实训程序的情况自行制定自动生成评价 | 学生(王一恒)在这一步先操作了蓝色按钮,正确应该是先操作黄色按钮,扣2分,所以这部分只能得到8分 |
scoredata.radar[]参数结构
字段名 | 类型 | 必填参数 | 描述 | 例子 |
---|---|---|---|---|
name | string | 是 | 雷达属性项名称 | 反应力 |
score | int | 是 | 本次操作分数(不得大于满分) | 3 |
maxscore | int | 是 | 满分 | 5 |
返回json
{
"state": 1,//状态 1 成功 其他 失败
"msg": "成绩上传完成" //上传结果说明
}