From b67cf238c21105d7b92c4b853a997495d356dddc Mon Sep 17 00:00:00 2001 From: cat_shark <1716967236@qq.com> Date: Fri, 3 Jul 2026 23:38:52 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E9=A2=84=E6=9C=9F)=EF=BC=9A=E5=AD=A6?= =?UTF-8?q?=E4=B9=A0=E9=A2=84=E6=9C=9F=E5=90=8E=E7=AB=AF=E9=97=AD=E7=8E=AF?= =?UTF-8?q?=E2=80=94=E2=80=94=E5=AE=9E=E4=BD=93/=E6=9C=8D=E5=8A=A1/?= =?UTF-8?q?=E7=AB=AF=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 迁移:study_expectations.session_num 改为 varchar 对齐会话编码 - StudyExpectationsEntity / Mapper / Service:每会话一条预期,重复创建覆盖 - StudySessionController:PUT/GET /{sessionNum}/expectation - 移除空的 studySessionList 占位方法 --- .../controller/StudySessionController.java | 23 +++++++- .../dto/request/UpsertExpectationRequest.java | 14 +++++ .../entity/StudyExpectationsEntity.java | 32 ++++++++++++ .../mapper/StudyExpectationsMapper.java | 9 ++++ .../service/StudyExpectationsService.java | 20 +++++++ .../impl/StudyExpectationsServiceImpl.java | 52 +++++++++++++++++++ ...__alter_study_expectations_session_num.sql | 2 + 7 files changed, 150 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/guo/learningprogresstracker/dto/request/UpsertExpectationRequest.java create mode 100644 src/main/java/com/guo/learningprogresstracker/entity/StudyExpectationsEntity.java create mode 100644 src/main/java/com/guo/learningprogresstracker/mapper/StudyExpectationsMapper.java create mode 100644 src/main/java/com/guo/learningprogresstracker/service/StudyExpectationsService.java create mode 100644 src/main/java/com/guo/learningprogresstracker/service/impl/StudyExpectationsServiceImpl.java create mode 100644 src/main/resources/db/migration/V20260703_1__alter_study_expectations_session_num.sql diff --git a/src/main/java/com/guo/learningprogresstracker/controller/StudySessionController.java b/src/main/java/com/guo/learningprogresstracker/controller/StudySessionController.java index 9174800..0de2e1c 100644 --- a/src/main/java/com/guo/learningprogresstracker/controller/StudySessionController.java +++ b/src/main/java/com/guo/learningprogresstracker/controller/StudySessionController.java @@ -2,9 +2,12 @@ package com.guo.learningprogresstracker.controller; import com.google.protobuf.ServiceException; import com.guo.learningprogresstracker.dto.request.EndedStudySessionRequest; +import com.guo.learningprogresstracker.dto.request.UpsertExpectationRequest; import com.guo.learningprogresstracker.dto.response.StudySessionResponse; import com.guo.learningprogresstracker.entity.CommonResult; +import com.guo.learningprogresstracker.entity.StudyExpectationsEntity; import com.guo.learningprogresstracker.exception.ErrorParameterException; +import com.guo.learningprogresstracker.service.StudyExpectationsService; import com.guo.learningprogresstracker.service.impl.StudySessionsServiceImpl; import jakarta.validation.Valid; import jakarta.validation.constraints.NotEmpty; @@ -26,9 +29,25 @@ public class StudySessionController { private final StudySessionsServiceImpl studySessionsServiceImpl; - @PostMapping - public void studySessionList() { + private final StudyExpectationsService studyExpectationsService; + /** + * 创建/更新学习会话的学习预期 + */ + @PutMapping("/{sessionNum}/expectation") + public CommonResult upsertExpectation( + @PathVariable("sessionNum") String sessionNum, + @Valid @RequestBody UpsertExpectationRequest request) throws ErrorParameterException { + return CommonResult.success(studyExpectationsService.upsertExpectation(sessionNum, request.getDescription())); + } + + /** + * 获取学习会话的学习预期 + */ + @GetMapping("/{sessionNum}/expectation") + public CommonResult getExpectation( + @PathVariable("sessionNum") String sessionNum) { + return CommonResult.success(studyExpectationsService.getBySessionNum(sessionNum)); } /** diff --git a/src/main/java/com/guo/learningprogresstracker/dto/request/UpsertExpectationRequest.java b/src/main/java/com/guo/learningprogresstracker/dto/request/UpsertExpectationRequest.java new file mode 100644 index 0000000..f70cc3e --- /dev/null +++ b/src/main/java/com/guo/learningprogresstracker/dto/request/UpsertExpectationRequest.java @@ -0,0 +1,14 @@ +package com.guo.learningprogresstracker.dto.request; + +import jakarta.validation.constraints.NotBlank; +import lombok.Data; + +/** + * 创建/更新学习预期请求 + */ +@Data +public class UpsertExpectationRequest { + + @NotBlank(message = "学习预期不可为空") + private String description; +} diff --git a/src/main/java/com/guo/learningprogresstracker/entity/StudyExpectationsEntity.java b/src/main/java/com/guo/learningprogresstracker/entity/StudyExpectationsEntity.java new file mode 100644 index 0000000..7299575 --- /dev/null +++ b/src/main/java/com/guo/learningprogresstracker/entity/StudyExpectationsEntity.java @@ -0,0 +1,32 @@ +package com.guo.learningprogresstracker.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; + +/** + * 存储每次学习开始前的预期 + */ +@TableName(value = "study_expectations") +@Data +public class StudyExpectationsEntity extends BaseEntity implements Serializable { + + @TableId(value = "expectation_id", type = IdType.AUTO) + private Integer expectationId; + + @TableField(value = "session_num") + private String sessionNum; + + /** + * 学习预期的详细描述 + */ + @TableField(value = "description") + private String description; + + @TableField(exist = false) + private static final long serialVersionUID = 1L; +} diff --git a/src/main/java/com/guo/learningprogresstracker/mapper/StudyExpectationsMapper.java b/src/main/java/com/guo/learningprogresstracker/mapper/StudyExpectationsMapper.java new file mode 100644 index 0000000..d47a3ec --- /dev/null +++ b/src/main/java/com/guo/learningprogresstracker/mapper/StudyExpectationsMapper.java @@ -0,0 +1,9 @@ +package com.guo.learningprogresstracker.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.guo.learningprogresstracker.entity.StudyExpectationsEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface StudyExpectationsMapper extends BaseMapper { +} diff --git a/src/main/java/com/guo/learningprogresstracker/service/StudyExpectationsService.java b/src/main/java/com/guo/learningprogresstracker/service/StudyExpectationsService.java new file mode 100644 index 0000000..04a8de8 --- /dev/null +++ b/src/main/java/com/guo/learningprogresstracker/service/StudyExpectationsService.java @@ -0,0 +1,20 @@ +package com.guo.learningprogresstracker.service; + +import com.guo.learningprogresstracker.entity.StudyExpectationsEntity; +import com.guo.learningprogresstracker.exception.ErrorParameterException; + +/** + * 学习预期服务 + */ +public interface StudyExpectationsService { + + /** + * 为学习会话创建学习预期(每个会话最多一条,重复创建则覆盖) + */ + StudyExpectationsEntity upsertExpectation(String sessionNum, String description) throws ErrorParameterException; + + /** + * 查询学习会话的学习预期,不存在时返回 null + */ + StudyExpectationsEntity getBySessionNum(String sessionNum); +} diff --git a/src/main/java/com/guo/learningprogresstracker/service/impl/StudyExpectationsServiceImpl.java b/src/main/java/com/guo/learningprogresstracker/service/impl/StudyExpectationsServiceImpl.java new file mode 100644 index 0000000..b77b8b4 --- /dev/null +++ b/src/main/java/com/guo/learningprogresstracker/service/impl/StudyExpectationsServiceImpl.java @@ -0,0 +1,52 @@ +package com.guo.learningprogresstracker.service.impl; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.guo.learningprogresstracker.entity.StudyExpectationsEntity; +import com.guo.learningprogresstracker.entity.StudySessionsEntity; +import com.guo.learningprogresstracker.exception.ErrorParameterException; +import com.guo.learningprogresstracker.mapper.StudyExpectationsMapper; +import com.guo.learningprogresstracker.mapper.StudySessionsMapper; +import com.guo.learningprogresstracker.service.StudyExpectationsService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +/** + * 学习预期服务实现 + */ +@Service +@RequiredArgsConstructor +public class StudyExpectationsServiceImpl implements StudyExpectationsService { + + private final StudyExpectationsMapper studyExpectationsMapper; + private final StudySessionsMapper studySessionsMapper; + + @Override + public StudyExpectationsEntity upsertExpectation(String sessionNum, String description) throws ErrorParameterException { + boolean sessionExists = studySessionsMapper.exists( + Wrappers.lambdaQuery() + .eq(StudySessionsEntity::getSessionNum, sessionNum)); + if (!sessionExists) { + throw new ErrorParameterException("学习会话[" + sessionNum + "]不存在"); + } + + StudyExpectationsEntity existing = getBySessionNum(sessionNum); + if (existing == null) { + StudyExpectationsEntity entity = new StudyExpectationsEntity(); + entity.setSessionNum(sessionNum); + entity.setDescription(description); + studyExpectationsMapper.insert(entity); + return entity; + } + existing.setDescription(description); + studyExpectationsMapper.updateById(existing); + return existing; + } + + @Override + public StudyExpectationsEntity getBySessionNum(String sessionNum) { + return studyExpectationsMapper.selectOne( + Wrappers.lambdaQuery() + .eq(StudyExpectationsEntity::getSessionNum, sessionNum) + .last("LIMIT 1")); + } +} diff --git a/src/main/resources/db/migration/V20260703_1__alter_study_expectations_session_num.sql b/src/main/resources/db/migration/V20260703_1__alter_study_expectations_session_num.sql new file mode 100644 index 0000000..003df0a --- /dev/null +++ b/src/main/resources/db/migration/V20260703_1__alter_study_expectations_session_num.sql @@ -0,0 +1,2 @@ +alter table study_expectations + modify session_num varchar(255) not null comment '会话编码';