概念¶
ZJUI-Learn 极其灵活且功能强大,但这种灵活性一开始可能显得不透明。本文档概述了 ZJUI-Learn 中的关键概念以及它们如何组合在一起。
高级概述¶
ZJUI-Learn 中的课程 由课程实例和问题组成。每个课程实例 都是特定学期/学期的一门课程。例如,课程“CS 225”可能具有实例“Spring 2022”和“Fall 2022”。
课程本身包含:
- 问题列表(即问题库)
- 课程实例列表
每个课程实例包含:
- 该学期的所有评估,例如家庭作业 1、家庭作业 2 和考试 1
每个评估包含:
- 该评估中使用的问题列表(取自课程)
概念图¶
问题¶
问题 都是独立的,给定的问题可以用于许多不同课程实例的许多不同评估。它们用 HTML 编写(作为 Mustache 模板)并使用 元素 接受学生输入。 Python 代码可用于生成随机参数和评分问题。每次向学生展示带有随机生成参数的问题时,这称为问题的变体。

示例 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¶
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 映像的工作区。
这两个功能都可以通过修改问题的 info.json 文件来设置。
元素¶
问题可以使用 elements 接受学生输入、显示图表、控制问题的显示方式等。您可以使用常见问题类型的内置元素,包括数字输入、多项选择等。如果您需要更大的灵活性,您可以创建可重用的自定义元素,这些元素可以根据您的课程进行定制,以创建更复杂的问题。
===“整数输入元素”

===“元素的 HTML”
```html title="question.html"
<pl-integer-input answers-name="int_value" label="$y =$"></pl-integer-input>
```
您可以在元素文档 中查看所有可用元素的列表。
评估¶
课程的问题组合在一起,以在课程实例中创建作业和考试 评估。家庭作业是为掌握学习而设计的形成性评估:它们提供不同变体的无限次重试,并激励重复的正确答案。考试是旨在衡量学习情况的总结性评估:它们对相同的变体进行有限的尝试,并激励在第一次尝试时获得正确的答案。

根据评估类型(例如 Homework、Quiz、Exam),评估被组织成评估集。或者,每个评估都可以是模块的一部分(例如 Introduction、Review、Linked Lists)。然后,您的评估可以显示给按模块或评估集分组的学生。
===“评估(设置分组)”

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

JSON 配置文件¶
ZJUI-Learn 中的每个项目(问题、评估等)都有描述该项目的关联元数据。此元数据存储在 JSON 文件中,描述项目之间的关系、项目的属性和其他信息。这些元数据文件用于生成用于编辑和查看项目的用户界面,以及供学生完成项目的界面。
| 项目 | 配置文件 |
|---|---|
| 课程 | infoCourse.json |
| 课程实例 | infoCourseInstance.json |
| 评估 | infoAssessment.json |
| 问题 | info.json |
后续步骤¶
现在您已经了解了 ZJUI-Learn 中的关键概念,您可以详细了解如何 开始
创建课程。
您还可以: