跳转至

概念

ZJUI-Learn 极其灵活且功能强大,但这种灵活性一开始可能显得不透明。本文档概述了 ZJUI-Learn 中的关键概念以及它们如何组合在一起。

高级概述

ZJUI-Learn 中的课程课程实例问题组成。每个课程实例 都是特定学期/学期的一门课程。例如,课程“CS 225”可能具有实例“Spring 2022”和“Fall 2022”。

课程本身包含:

  • 问题列表(即问题库)
  • 课程实例列表

每个课程实例包含:

  • 该学期的所有评估,例如家庭作业 1、家庭作业 2 和考试 1

每个评估包含:

  • 该评估中使用的问题列表(取自课程)

概念图

ZJUI-Learn 101 (Course)Fall 2024 (Course Instance)Custom PL Diagram ElementMidterm (Exam)HW 1 (Homework)PL Question 1PL Question 2Numeric InputMultiple ChoicePL Diagram

问题

问题 都是独立的,给定的问题可以用于许多不同课程实例的许多不同评估。它们用 HTML 编写(作为 Mustache 模板)并使用 元素 接受学生输入。 Python 代码可用于生成随机参数和评分问题。每次向学生展示带有随机生成参数的问题时,这称为问题的变体

作业示例

示例 question.html

question.html
<pl-question-panel>
  If $x = {{params.x}}$ and $y$ is {{params.operation}} $x$, what is $y$?
</pl-question-panel>

<pl-number-input answers-name="y" label="$y =$"></pl-number-input>

示例 server.py

server.py
def generate(data):
    data["params"]["x"] = random.randint(5, 10)
    data["params"]["operation"] = random.choice(["double", "triple"])

    if data["params"]["operation"] == "double":
        data["correct_answers"]["y"] = 2 * data["params"]["x"]
    else:
        data["correct_answers"]["y"] = 3 * data["params"]["x"]

???示例“带有自定义部分信用和反馈的问题”

This is the same question that now gives intermediate student feedback and partial credit. This question is more complex and flexible, but this complexity is completely opt-in if you don't need it.

=== "Example `question.html`"

    ```html title="question.html"
    <pl-question-panel>
        If $x = {{params.x}}$ and $y$ is {{params.operation}} $x$, what is $y$?
    </pl-question-panel>

    <pl-number-input answers-name="y" label="$y =$"></pl-number-input>
    <pl-submission-panel> {{feedback.y}} </pl-submission-panel>
    ```

=== "Example `server.py`"

    ```python title="server.py"
    def generate(data):
        data["params"]["x"] = random.randint(5, 10)
        data["params"]["operation"] = random.choice(["double", "triple"])

        if data["params"]["operation"] == "double":
            data["correct_answers"]["y"] = 2 * data["params"]["x"]
        else:
            data["correct_answers"]["y"] = 3 * data["params"]["x"]

    def parse(data):
        if "y" not in data["format_errors"] and data["submitted_answers"]["y"] < 0:
            data["format_errors"]["y"] = "Negative numbers are not allowed"

    def grade(data):
        if math.isclose(data["score"], 0.0) and data["submitted_answers"]["y"] > data["params"]["x"]:
            data["partial_scores"]["y"]["score"] = 0.5
            data["score"] = 0.5
            data["feedback"]["y"] = "Your value for $y$ is larger than $x$, but incorrect."
    ```

外部评分员

对于编码问题,您可以使用 外部评分者 对提交的内容进行评分,而不是使用 server.py 文件。这使您可以在沙盒环境中对学生提交的代码进行评分。目前有 C、C++、Java、Python 等的外部评分器。您还可以为任何语言制作自定义外部评分器。

工作空间

您可以使用 workspaces 提供浏览器内开发环境。工作区确保所有学生都使用一致的环境,并可以提供具有语法突出显示、自动完成和其他功能的代码编辑器。与外部自动评分器一起使用时,工作区可为学生提供无缝编码体验。工作区使用 Docker 映像来确保一致的环境,并为流行语言(例如 Python、C++)预制工作区。还支持基于自定义 Docker 映像的工作区。

JupyterLab 工作区的屏幕截图 这两个功能都可以通过修改问题的 info.json 文件来设置。

元素

问题可以使用 elements 接受学生输入、显示图表、控制问题的显示方式等。您可以使用常见问题类型的内置元素,包括数字输入、多项选择等。如果您需要更大的灵活性,您可以创建可重用的自定义元素,这些元素可以根据您的课程进行定制,以创建更复杂的问题。

===“整数输入元素”

![Integer input element](../elements/pl-integer-input.png)

===“元素的 HTML”

```html title="question.html"
<pl-integer-input answers-name="int_value" label="$y =$"></pl-integer-input>
```

您可以在元素文档 中查看所有可用元素的列表。

评估

课程的问题组合在一起,以在课程实例中创建作业和考试 评估。家庭作业是为掌握学习而设计的形成性评估:它们提供不同变体的无限次重试,并激励重复的正确答案。考试是旨在衡量学习情况的总结性评估:它们对相同的变体进行有限的尝试,并激励在第一次尝试时获得正确的答案。

作业考核

根据评估类型​​(例如 HomeworkQuizExam),评估被组织成评估集。或者,每个评估都可以是模块的一部分(例如 IntroductionReviewLinked Lists)。然后,您的评估可以显示给按模块或评估集分组的学生。

===“评估(设置分组)”

![Assessments grouped by set](./set-grouping.png)

===“评估(模块分组)”

![Assessments grouped by module](./module-grouping.png)

JSON 配置文件

ZJUI-Learn 中的每个项目(问题、评估等)都有描述该项目的关联元数据。此元数据存储在 JSON 文件中,描述项目之间的关系、项目的属性和其他信息。这些元数据文件用于生成用于编辑和查看项目的用户界面,以及供学生完成项目的界面。

项目 配置文件
课程 infoCourse.json
课程实例 infoCourseInstance.json
评估 infoAssessment.json
问题 info.json

后续步骤

现在您已经了解了 ZJUI-Learn 中的关键概念,您可以详细了解如何⭐ 开始 ⭐ 创建课程。

您还可以: