diff --git a/docs/sql/2026-07-02-training-task-class-config.sql b/docs/sql/2026-07-02-training-task-class-config.sql
new file mode 100644
index 0000000..cb4004b
--- /dev/null
+++ b/docs/sql/2026-07-02-training-task-class-config.sql
@@ -0,0 +1,23 @@
+CREATE TABLE IF NOT EXISTS training_task_class_config (
+ id varchar(64) NOT NULL,
+ teaching_class_id varchar(64) NOT NULL,
+ task_key varchar(128) NOT NULL,
+ project_name varchar(128) NOT NULL,
+ task_name varchar(128) NOT NULL,
+ knowledge text NULL,
+ background text NULL,
+ objectives text NULL,
+ requirements text NULL,
+ steps text NULL,
+ material_name varchar(255) NULL,
+ material_url varchar(500) NULL,
+ sort int DEFAULT 0,
+ enabled bit(1) DEFAULT b'1',
+ created_by varchar(64) NULL,
+ create_time datetime NULL,
+ update_time datetime NULL,
+ PRIMARY KEY (id),
+ UNIQUE KEY uk_training_task_class_key (teaching_class_id, task_key),
+ KEY idx_training_task_class_enabled_sort (teaching_class_id, enabled, sort),
+ KEY idx_training_task_class_created_by (created_by)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Class scoped training task config';
diff --git a/docs/superpowers/plans/2026-07-02-training-task-class-scope.md b/docs/superpowers/plans/2026-07-02-training-task-class-scope.md
index ff12bde..6662e81 100644
--- a/docs/superpowers/plans/2026-07-02-training-task-class-scope.md
+++ b/docs/superpowers/plans/2026-07-02-training-task-class-scope.md
@@ -64,6 +64,8 @@ public class TrainingTaskClassConfig {
private String projectName;
@ApiModelProperty("实训任务名称")
private String taskName;
+ @ApiModelProperty("Knowledge")
+ private String knowledge;
@ApiModelProperty("实训背景")
private String background;
@ApiModelProperty("实训目标JSON数组")
@@ -97,6 +99,8 @@ public class TrainingTaskClassConfig {
public void setProjectName(String projectName) { this.projectName = projectName == null ? null : projectName.trim(); }
public String getTaskName() { return taskName; }
public void setTaskName(String taskName) { this.taskName = taskName == null ? null : taskName.trim(); }
+ public String getKnowledge() { return knowledge; }
+ public void setKnowledge(String knowledge) { this.knowledge = knowledge == null ? null : knowledge.trim(); }
public String getBackground() { return background; }
public void setBackground(String background) { this.background = background == null ? null : background.trim(); }
public String getObjectives() { return objectives; }
@@ -165,6 +169,7 @@ Create `src/main/resources/mappers/TrainingTaskClassConfigMapper.xml` using the
+
@@ -179,7 +184,7 @@ Create `src/main/resources/mappers/TrainingTaskClassConfigMapper.xml` using the
- id, teaching_class_id, task_key, project_name, task_name, background, objectives, requirements,
+ id, teaching_class_id, task_key, project_name, task_name, knowledge, background, objectives, requirements,
steps, material_name, material_url, sort, enabled, created_by, create_time, update_time
@@ -215,6 +220,7 @@ Create `src/main/resources/mappers/TrainingTaskClassConfigMapper.xml` using the
task_key,
project_name,
task_name,
+ knowledge,
background,
objectives,
requirements,
@@ -233,6 +239,7 @@ Create `src/main/resources/mappers/TrainingTaskClassConfigMapper.xml` using the
#{taskKey,jdbcType=VARCHAR},
#{projectName,jdbcType=VARCHAR},
#{taskName,jdbcType=VARCHAR},
+ #{knowledge},
#{background},
#{objectives},
#{requirements},
@@ -252,6 +259,7 @@ Create `src/main/resources/mappers/TrainingTaskClassConfigMapper.xml` using the
project_name = #{projectName,jdbcType=VARCHAR},
task_name = #{taskName,jdbcType=VARCHAR},
+ knowledge = #{knowledge},
background = #{background},
objectives = #{objectives},
requirements = #{requirements},
@@ -278,6 +286,7 @@ CREATE TABLE IF NOT EXISTS training_task_class_config (
task_key varchar(128) NOT NULL,
project_name varchar(128) NOT NULL,
task_name varchar(128) NOT NULL,
+ knowledge text NULL,
background text NULL,
objectives text NULL,
requirements text NULL,
@@ -432,6 +441,7 @@ private TrainingTask toTask(TrainingTaskClassConfig config) {
task.setTaskKey(config.getTaskKey());
task.setProjectName(config.getProjectName());
task.setTaskName(config.getTaskName());
+ task.setKnowledge(config.getKnowledge());
task.setBackground(config.getBackground());
task.setObjectives(config.getObjectives());
task.setRequirements(config.getRequirements());
@@ -452,6 +462,7 @@ private TrainingTaskClassConfig toConfig(String teachingClassId, TrainingTask ta
config.setTaskKey(task.getTaskKey());
config.setProjectName(task.getProjectName());
config.setTaskName(task.getTaskName());
+ config.setKnowledge(task.getKnowledge());
config.setBackground(task.getBackground());
config.setObjectives(task.getObjectives());
config.setRequirements(task.getRequirements());
diff --git a/docs/superpowers/specs/2026-07-02-training-task-class-scope-design.md b/docs/superpowers/specs/2026-07-02-training-task-class-scope-design.md
index 8d0d352..887dd80 100644
--- a/docs/superpowers/specs/2026-07-02-training-task-class-scope-design.md
+++ b/docs/superpowers/specs/2026-07-02-training-task-class-scope-design.md
@@ -50,6 +50,7 @@ Suggested fields:
- `task_key`
- `project_name`
- `task_name`
+- `knowledge`
- `background`
- `objectives`
- `requirements`
@@ -62,6 +63,8 @@ Suggested fields:
- `create_time`
- `update_time`
+`knowledge` is retained for backend compatibility with the existing default task structure. The teacher and student UI do not need to expose it.
+
Unique rules:
- `training_task.task_key` remains unique for default tasks.
diff --git a/src/main/java/com/sztzjy/linkCommerce/entity/TrainingTaskClassConfig.java b/src/main/java/com/sztzjy/linkCommerce/entity/TrainingTaskClassConfig.java
new file mode 100644
index 0000000..d85e43e
--- /dev/null
+++ b/src/main/java/com/sztzjy/linkCommerce/entity/TrainingTaskClassConfig.java
@@ -0,0 +1,194 @@
+package com.sztzjy.linkCommerce.entity;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+
+public class TrainingTaskClassConfig {
+ @ApiModelProperty("ID")
+ private String id;
+
+ @ApiModelProperty("Teaching class ID")
+ private String teachingClassId;
+
+ @ApiModelProperty("Task key")
+ private String taskKey;
+
+ @ApiModelProperty("Project name")
+ private String projectName;
+
+ @ApiModelProperty("Task name")
+ private String taskName;
+
+ @ApiModelProperty("Knowledge")
+ private String knowledge;
+
+ @ApiModelProperty("Training background")
+ private String background;
+
+ @ApiModelProperty("Training objectives JSON array")
+ private String objectives;
+
+ @ApiModelProperty("Training requirements")
+ private String requirements;
+
+ @ApiModelProperty("Step names JSON array")
+ private String steps;
+
+ @ApiModelProperty("Material name")
+ private String materialName;
+
+ @ApiModelProperty("Material URL")
+ private String materialUrl;
+
+ @ApiModelProperty("Sort order")
+ private Integer sort;
+
+ @ApiModelProperty("Enabled")
+ private Boolean enabled;
+
+ @ApiModelProperty("Created by")
+ private String createdBy;
+
+ @ApiModelProperty("Create time")
+ private Date createTime;
+
+ @ApiModelProperty("Update time")
+ private Date updateTime;
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id == null ? null : id.trim();
+ }
+
+ public String getTeachingClassId() {
+ return teachingClassId;
+ }
+
+ public void setTeachingClassId(String teachingClassId) {
+ this.teachingClassId = teachingClassId == null ? null : teachingClassId.trim();
+ }
+
+ public String getTaskKey() {
+ return taskKey;
+ }
+
+ public void setTaskKey(String taskKey) {
+ this.taskKey = taskKey == null ? null : taskKey.trim();
+ }
+
+ public String getProjectName() {
+ return projectName;
+ }
+
+ public void setProjectName(String projectName) {
+ this.projectName = projectName == null ? null : projectName.trim();
+ }
+
+ public String getTaskName() {
+ return taskName;
+ }
+
+ public void setTaskName(String taskName) {
+ this.taskName = taskName == null ? null : taskName.trim();
+ }
+
+ public String getKnowledge() {
+ return knowledge;
+ }
+
+ public void setKnowledge(String knowledge) {
+ this.knowledge = knowledge == null ? null : knowledge.trim();
+ }
+
+ public String getBackground() {
+ return background;
+ }
+
+ public void setBackground(String background) {
+ this.background = background == null ? null : background.trim();
+ }
+
+ public String getObjectives() {
+ return objectives;
+ }
+
+ public void setObjectives(String objectives) {
+ this.objectives = objectives == null ? null : objectives.trim();
+ }
+
+ public String getRequirements() {
+ return requirements;
+ }
+
+ public void setRequirements(String requirements) {
+ this.requirements = requirements == null ? null : requirements.trim();
+ }
+
+ public String getSteps() {
+ return steps;
+ }
+
+ public void setSteps(String steps) {
+ this.steps = steps == null ? null : steps.trim();
+ }
+
+ public String getMaterialName() {
+ return materialName;
+ }
+
+ public void setMaterialName(String materialName) {
+ this.materialName = materialName == null ? null : materialName.trim();
+ }
+
+ public String getMaterialUrl() {
+ return materialUrl;
+ }
+
+ public void setMaterialUrl(String materialUrl) {
+ this.materialUrl = materialUrl == null ? null : materialUrl.trim();
+ }
+
+ public Integer getSort() {
+ return sort;
+ }
+
+ public void setSort(Integer sort) {
+ this.sort = sort;
+ }
+
+ public Boolean getEnabled() {
+ return enabled;
+ }
+
+ public void setEnabled(Boolean enabled) {
+ this.enabled = enabled;
+ }
+
+ public String getCreatedBy() {
+ return createdBy;
+ }
+
+ public void setCreatedBy(String createdBy) {
+ this.createdBy = createdBy == null ? null : createdBy.trim();
+ }
+
+ public Date getCreateTime() {
+ return createTime;
+ }
+
+ public void setCreateTime(Date createTime) {
+ this.createTime = createTime;
+ }
+
+ public Date getUpdateTime() {
+ return updateTime;
+ }
+
+ public void setUpdateTime(Date updateTime) {
+ this.updateTime = updateTime;
+ }
+}
diff --git a/src/main/java/com/sztzjy/linkCommerce/mapper/TrainingTaskClassConfigMapper.java b/src/main/java/com/sztzjy/linkCommerce/mapper/TrainingTaskClassConfigMapper.java
new file mode 100644
index 0000000..b6a5944
--- /dev/null
+++ b/src/main/java/com/sztzjy/linkCommerce/mapper/TrainingTaskClassConfigMapper.java
@@ -0,0 +1,22 @@
+package com.sztzjy.linkCommerce.mapper;
+
+import com.sztzjy.linkCommerce.entity.TrainingTaskClassConfig;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface TrainingTaskClassConfigMapper {
+ int insertSelective(TrainingTaskClassConfig record);
+
+ int updateByPrimaryKeySelective(TrainingTaskClassConfig record);
+
+ TrainingTaskClassConfig selectByPrimaryKey(String id);
+
+ TrainingTaskClassConfig selectByTeachingClassAndTaskKey(@Param("teachingClassId") String teachingClassId,
+ @Param("taskKey") String taskKey);
+
+ List selectListByTeachingClass(@Param("teachingClassId") String teachingClassId,
+ @Param("enabled") Boolean enabled);
+}
diff --git a/src/main/resources/mappers/TrainingTaskClassConfigMapper.xml b/src/main/resources/mappers/TrainingTaskClassConfigMapper.xml
new file mode 100644
index 0000000..3b4ede9
--- /dev/null
+++ b/src/main/resources/mappers/TrainingTaskClassConfigMapper.xml
@@ -0,0 +1,113 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ id, teaching_class_id, task_key, project_name, task_name, knowledge, background, objectives, requirements,
+ steps, material_name, material_url, sort, enabled, created_by, create_time, update_time
+
+
+
+
+
+
+
+
+
+ insert into training_task_class_config
+
+ id,
+ teaching_class_id,
+ task_key,
+ project_name,
+ task_name,
+ knowledge,
+ background,
+ objectives,
+ requirements,
+ steps,
+ material_name,
+ material_url,
+ sort,
+ enabled,
+ created_by,
+ create_time,
+ update_time,
+
+
+ #{id,jdbcType=VARCHAR},
+ #{teachingClassId,jdbcType=VARCHAR},
+ #{taskKey,jdbcType=VARCHAR},
+ #{projectName,jdbcType=VARCHAR},
+ #{taskName,jdbcType=VARCHAR},
+ #{knowledge},
+ #{background},
+ #{objectives},
+ #{requirements},
+ #{steps},
+ #{materialName,jdbcType=VARCHAR},
+ #{materialUrl,jdbcType=VARCHAR},
+ #{sort,jdbcType=INTEGER},
+ #{enabled,jdbcType=BIT},
+ #{createdBy,jdbcType=VARCHAR},
+ #{createTime,jdbcType=TIMESTAMP},
+ #{updateTime,jdbcType=TIMESTAMP},
+
+
+
+
+ update training_task_class_config
+
+ project_name = #{projectName,jdbcType=VARCHAR},
+ task_name = #{taskName,jdbcType=VARCHAR},
+ knowledge = #{knowledge},
+ background = #{background},
+ objectives = #{objectives},
+ requirements = #{requirements},
+ steps = #{steps},
+ material_name = #{materialName,jdbcType=VARCHAR},
+ material_url = #{materialUrl,jdbcType=VARCHAR},
+ sort = #{sort,jdbcType=INTEGER},
+ enabled = #{enabled,jdbcType=BIT},
+ update_time = #{updateTime,jdbcType=TIMESTAMP},
+
+ where id = #{id,jdbcType=VARCHAR}
+
+