From d2672d68490fd785728924c3e3af20894bbb7c2f Mon Sep 17 00:00:00 2001 From: chenyuan Date: Thu, 2 Jul 2026 17:41:49 +0800 Subject: [PATCH] feat: add class scoped training task storage --- .../2026-07-02-training-task-class-config.sql | 23 +++ .../2026-07-02-training-task-class-scope.md | 13 +- ...-07-02-training-task-class-scope-design.md | 3 + .../entity/TrainingTaskClassConfig.java | 194 ++++++++++++++++++ .../mapper/TrainingTaskClassConfigMapper.java | 22 ++ .../mappers/TrainingTaskClassConfigMapper.xml | 113 ++++++++++ 6 files changed, 367 insertions(+), 1 deletion(-) create mode 100644 docs/sql/2026-07-02-training-task-class-config.sql create mode 100644 src/main/java/com/sztzjy/linkCommerce/entity/TrainingTaskClassConfig.java create mode 100644 src/main/java/com/sztzjy/linkCommerce/mapper/TrainingTaskClassConfigMapper.java create mode 100644 src/main/resources/mappers/TrainingTaskClassConfigMapper.xml 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} + +