You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于Pipwerks SCORM API记录学员测验答案至SabaCloud

针对SCORM 1.2 + SabaCloud记录测验答案的实现方案

你用的SCORM 1.2版本没有专门的测验答案存储字段,官方推荐用cmi.core.suspend_data字段来存储自定义结构化数据(比如测验答案),SabaCloud完全支持这个字段的读写。结合你现有的Pipwerks代码,按以下步骤实现:

1. 收集并序列化测验答案

在Vue组件里先写一个函数,把用户的测验答案转成JSON字符串(方便存储和后续解析):

// 假设你的测验答案存在Vue的data中,比如quizAnswers是键为题目ID、值为用户选项的对象
function getQuizAnswersJson() {
  const quizAnswers = this.quizAnswers; // 替换成你实际的答案存储变量
  return JSON.stringify(quizAnswers);
}

2. 修改现有SCORM代码,添加存储逻辑

方式一:在现有函数中扩展

如果你的现有函数是统一处理SCORM参数设置的,可以直接扩展逻辑,处理suspend_data的存储:

var API = scorm.API.getHandle(),
    errorCode = 0;

if (API) {

    switch (scorm.version) {
        case "1.2": success = makeBoolean(API.LMSSetValue(parameter, value)); break;
        case "2004": success = makeBoolean(API.SetValue(parameter, value)); break;
    }

    if (success) {

        if (parameter === "cmi.core.lesson_status" || parameter === "cmi.completion_status") {
            scorm.data.completionStatus = value;
        }

        // 新增:处理测验答案存储
        if (parameter === "cmi.core.suspend_data") {
            scorm.data.suspendData = value; // 把答案存在本地缓存,方便后续读取
            // 手动触发LMS提交,确保数据写入SabaCloud
            if (scorm.version === "1.2") {
                API.LMSCommit("");
            }
        }

    } else {
        errorCode = debug.getCode();
        trace(traceMsgPrefix + "failed. \nError code: " + errorCode + ". \nError info: " + debug.getInfo(errorCode));
    }

} else {
    trace(traceMsgPrefix + "failed: API is null.");
}

方式二:单独封装存储函数

更清晰的做法是单独写一个函数存储测验答案,避免和原有逻辑耦合:

function saveQuizAnswers(answers) {
    const API = scorm.API.getHandle();
    if (!API) {
        trace("SCORM API not found, can't save quiz answers");
        return false;
    }

    const answersJson = JSON.stringify(answers);
    let success = false;

    if (scorm.version === "1.2") {
        success = makeBoolean(API.LMSSetValue("cmi.core.suspend_data", answersJson));
    }

    if (success) {
        scorm.data.suspendData = answersJson;
        API.LMSCommit(""); // 强制提交到LMS
        trace("Quiz answers saved successfully");
        return true;
    } else {
        const errorCode = debug.getCode();
        trace(`Failed to save quiz answers. Error code: ${errorCode}, Info: ${debug.getInfo(errorCode)}`);
        return false;
    }
}

// 在Vue提交测验时调用:
// this.saveQuizAnswers(this.quizAnswers);

3. 读取已保存的测验答案(可选)

如果需要用户重新进入课程时加载之前的答案,写一个读取函数:

function loadSavedQuizAnswers() {
    const API = scorm.API.getHandle();
    if (!API) {
        trace("SCORM API not found, can't load quiz answers");
        return null;
    }

    let answersJson = API.LMSGetValue("cmi.core.suspend_data");

    // 处理空值或无效JSON的情况
    if (!answersJson || answersJson === "undefined") {
        return null;
    }

    try {
        const answers = JSON.parse(answersJson);
        scorm.data.suspendData = answersJson;
        return answers;
    } catch (e) {
        trace(`Failed to parse saved quiz answers: ${e.message}`);
        return null;
    }
}

// 在Vue组件初始化时调用:
// const savedAnswers = this.loadSavedQuizAnswers();
// if (savedAnswers) {
//   this.quizAnswers = savedAnswers;
// }

注意事项

  • 长度限制:SCORM 1.2的suspend_data最大长度为4096字符,若测验答案较多,建议优化数据结构(比如用短键名)避免超出限制。
  • 提交时机:用户提交测验后立即调用保存函数,并通过LMSCommit触发数据写入,部分LMS不会自动保存,需手动触发。
  • SabaCloud兼容性:SabaCloud对SCORM 1.2的suspend_data支持良好,无需额外配置,按标准API调用即可。

内容的提问来源于stack exchange,提问作者SlayerCat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 19:50:17