From 802327f075402599b63ec3e1a75618e504fcd155 Mon Sep 17 00:00:00 2001 From: zhonghua Date: Fri, 20 Mar 2026 13:49:15 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BB=BB=E5=8A=A1=E6=A8=A1=E6=9D=BF=20A?= =?UTF-8?q?PI=20=E4=BF=AE=E5=A4=8D=E4=B8=8E=E5=AD=A6=E6=A0=A1=E7=AB=AF?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - TaskTemplateCreateRequest: isDefault/isPublic 改为 Boolean 类型 - SchoolTaskTemplateController: 接入 TaskTemplateService 实现完整 CRUD - getTemplates: 支持 publicOnly、keyword、taskType 参数 - 学校端列表显示全部模板(含 isPublic=0) - 前端 getTaskTemplates: 分页字段 Number 转换 Made-with: Cursor --- reading-platform-frontend/src/api/school.ts | 8 +-- .../school/SchoolTaskTemplateController.java | 64 ++++++++++++------- .../TeacherTaskTemplateController.java | 5 +- .../request/TaskTemplateCreateRequest.java | 4 +- .../platform/service/TaskTemplateService.java | 2 +- .../service/impl/TaskTemplateServiceImpl.java | 23 ++++--- 6 files changed, 66 insertions(+), 40 deletions(-) diff --git a/reading-platform-frontend/src/api/school.ts b/reading-platform-frontend/src/api/school.ts index 8e50f8c..83b67a1 100644 --- a/reading-platform-frontend/src/api/school.ts +++ b/reading-platform-frontend/src/api/school.ts @@ -890,10 +890,10 @@ export const getTaskTemplates = (params?: { }) => http.get<{ list: TaskTemplate[]; total: number; pageNum: number; pageSize: number; pages: number }>('/v1/school/task-templates', { params }) .then(res => ({ list: res.list || res.records || [], - total: res.total || 0, - pageNum: res.pageNum || 1, - pageSize: res.pageSize || 10, - pages: res.pages || 0, + total: Number(res.total) || 0, + pageNum: Number(res.pageNum) || 1, + pageSize: Number(res.pageSize) || 10, + pages: Number(res.pages) || 0, })); export const getTaskTemplate = (id: number) => diff --git a/reading-platform-java/src/main/java/com/reading/platform/controller/school/SchoolTaskTemplateController.java b/reading-platform-java/src/main/java/com/reading/platform/controller/school/SchoolTaskTemplateController.java index 9714f14..5635eeb 100644 --- a/reading-platform-java/src/main/java/com/reading/platform/controller/school/SchoolTaskTemplateController.java +++ b/reading-platform-java/src/main/java/com/reading/platform/controller/school/SchoolTaskTemplateController.java @@ -1,15 +1,21 @@ package com.reading.platform.controller.school; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.reading.platform.common.annotation.RequireRole; import com.reading.platform.common.enums.UserRole; +import com.reading.platform.common.mapper.TaskTemplateMapper; import com.reading.platform.common.response.PageResult; import com.reading.platform.common.response.Result; import com.reading.platform.common.security.SecurityUtils; import com.reading.platform.dto.request.TaskTemplateCreateRequest; import com.reading.platform.dto.response.TaskTemplateResponse; +import com.reading.platform.entity.TaskTemplate; +import com.reading.platform.service.TaskTemplateService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; +import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -24,45 +30,51 @@ import java.util.List; @RequireRole(UserRole.SCHOOL) public class SchoolTaskTemplateController { + private final TaskTemplateService taskTemplateService; + private final TaskTemplateMapper taskTemplateMapper; + @GetMapping @Operation(summary = "获取模板列表") public Result> getTemplates( @RequestParam(required = false, defaultValue = "1") Integer pageNum, @RequestParam(required = false, defaultValue = "10") Integer pageSize, - @RequestParam(required = false) String type) { - // TODO: 实现模板列表查询 + @RequestParam(required = false) String type, + @RequestParam(required = false) String taskType, + @RequestParam(required = false) String keyword) { Long tenantId = SecurityUtils.getCurrentTenantId(); - return Result.success(PageResult.of(List.of(), 0L, pageNum.longValue(), pageSize.longValue())); + String typeFilter = StringUtils.hasText(taskType) ? taskType : type; + Page page = taskTemplateService.getTemplates(tenantId, pageNum, pageSize, typeFilter, keyword, false); + List voList = taskTemplateMapper.toVO(page.getRecords()); + return Result.success(PageResult.of(voList, page.getTotal(), page.getCurrent(), page.getSize())); } @GetMapping("/default/{type}") @Operation(summary = "获取默认模板") public Result getDefaultTemplate(@PathVariable String type) { - // TODO: 实现默认模板查询,需要根据 tenantId 和 type 查询 Long tenantId = SecurityUtils.getCurrentTenantId(); - return Result.success(TaskTemplateResponse.builder() - .type(type) - .build()); + TaskTemplate template = taskTemplateService.getDefaultTemplate(tenantId, type); + return template != null ? Result.success(taskTemplateMapper.toVO(template)) : Result.success(null); } @GetMapping("/{id}") @Operation(summary = "获取模板详情") public Result getTemplate(@PathVariable Long id) { - // TODO: 实现模板详情查询,需要验证模板属于当前租户 Long tenantId = SecurityUtils.getCurrentTenantId(); - return Result.success(TaskTemplateResponse.builder() - .id(id) - .build()); + TaskTemplate template = taskTemplateService.getTemplateById(id); + if (!template.getTenantId().equals(tenantId)) { + throw new com.reading.platform.common.exception.BusinessException( + com.reading.platform.common.enums.ErrorCode.FORBIDDEN, "无权访问该模板"); + } + return Result.success(taskTemplateMapper.toVO(template)); } @PostMapping @Operation(summary = "创建模板") - public Result createTemplate(@RequestBody TaskTemplateCreateRequest request) { - // TODO: 实现创建模板 + public Result createTemplate(@Valid @RequestBody TaskTemplateCreateRequest request) { Long tenantId = SecurityUtils.getCurrentTenantId(); - return Result.success(TaskTemplateResponse.builder() - .tenantId(tenantId) - .build()); + Long userId = SecurityUtils.getCurrentUserId(); + TaskTemplate template = taskTemplateService.createTemplate(tenantId, userId, request); + return Result.success(taskTemplateMapper.toVO(template)); } @PutMapping("/{id}") @@ -70,18 +82,26 @@ public class SchoolTaskTemplateController { public Result updateTemplate( @PathVariable Long id, @RequestBody TaskTemplateCreateRequest request) { - // TODO: 实现更新模板,需要验证模板属于当前租户 Long tenantId = SecurityUtils.getCurrentTenantId(); - return Result.success(TaskTemplateResponse.builder() - .id(id) - .build()); + TaskTemplate existing = taskTemplateService.getTemplateById(id); + if (!existing.getTenantId().equals(tenantId)) { + throw new com.reading.platform.common.exception.BusinessException( + com.reading.platform.common.enums.ErrorCode.FORBIDDEN, "无权修改该模板"); + } + TaskTemplate template = taskTemplateService.updateTemplate(id, request); + return Result.success(taskTemplateMapper.toVO(template)); } @DeleteMapping("/{id}") @Operation(summary = "删除模板") public Result deleteTemplate(@PathVariable Long id) { - // TODO: 实现删除模板,需要验证模板属于当前租户 Long tenantId = SecurityUtils.getCurrentTenantId(); + TaskTemplate template = taskTemplateService.getTemplateById(id); + if (!template.getTenantId().equals(tenantId)) { + throw new com.reading.platform.common.exception.BusinessException( + com.reading.platform.common.enums.ErrorCode.FORBIDDEN, "无权删除该模板"); + } + taskTemplateService.deleteTemplate(id); return Result.success(); } -} \ No newline at end of file +} diff --git a/reading-platform-java/src/main/java/com/reading/platform/controller/teacher/TeacherTaskTemplateController.java b/reading-platform-java/src/main/java/com/reading/platform/controller/teacher/TeacherTaskTemplateController.java index af9c024..0735697 100644 --- a/reading-platform-java/src/main/java/com/reading/platform/controller/teacher/TeacherTaskTemplateController.java +++ b/reading-platform-java/src/main/java/com/reading/platform/controller/teacher/TeacherTaskTemplateController.java @@ -39,9 +39,10 @@ public class TeacherTaskTemplateController { public Result> getTemplates( @RequestParam(required = false, defaultValue = "1") Integer pageNum, @RequestParam(required = false, defaultValue = "10") Integer pageSize, - @RequestParam(required = false) String type) { + @RequestParam(required = false) String type, + @RequestParam(required = false) String keyword) { Long tenantId = SecurityUtils.getCurrentTenantId(); - Page page = taskTemplateService.getTemplates(tenantId, pageNum, pageSize, type); + Page page = taskTemplateService.getTemplates(tenantId, pageNum, pageSize, type, keyword, true); List voList = taskTemplateMapper.toVO(page.getRecords()); return Result.success(PageResult.of(voList, page.getTotal(), page.getCurrent(), page.getSize())); } diff --git a/reading-platform-java/src/main/java/com/reading/platform/dto/request/TaskTemplateCreateRequest.java b/reading-platform-java/src/main/java/com/reading/platform/dto/request/TaskTemplateCreateRequest.java index 6bb5508..dc2a8b7 100644 --- a/reading-platform-java/src/main/java/com/reading/platform/dto/request/TaskTemplateCreateRequest.java +++ b/reading-platform-java/src/main/java/com/reading/platform/dto/request/TaskTemplateCreateRequest.java @@ -31,12 +31,12 @@ public class TaskTemplateCreateRequest { private Integer defaultDuration; @Schema(description = "是否默认模板") - private Integer isDefault; + private Boolean isDefault; @Schema(description = "模板内容") private String content; @Schema(description = "是否公开") - private Integer isPublic; + private Boolean isPublic; } diff --git a/reading-platform-java/src/main/java/com/reading/platform/service/TaskTemplateService.java b/reading-platform-java/src/main/java/com/reading/platform/service/TaskTemplateService.java index 364527a..e939381 100644 --- a/reading-platform-java/src/main/java/com/reading/platform/service/TaskTemplateService.java +++ b/reading-platform-java/src/main/java/com/reading/platform/service/TaskTemplateService.java @@ -16,7 +16,7 @@ public interface TaskTemplateService extends com.baomidou.mybatisplus.extension. /** * 获取模板列表 */ - Page getTemplates(Long tenantId, Integer pageNum, Integer pageSize, String type); + Page getTemplates(Long tenantId, Integer pageNum, Integer pageSize, String type, String keyword, Boolean publicOnly); /** * 获取默认模板 diff --git a/reading-platform-java/src/main/java/com/reading/platform/service/impl/TaskTemplateServiceImpl.java b/reading-platform-java/src/main/java/com/reading/platform/service/impl/TaskTemplateServiceImpl.java index df5f9f2..2f51c6a 100644 --- a/reading-platform-java/src/main/java/com/reading/platform/service/impl/TaskTemplateServiceImpl.java +++ b/reading-platform-java/src/main/java/com/reading/platform/service/impl/TaskTemplateServiceImpl.java @@ -37,18 +37,23 @@ public class TaskTemplateServiceImpl extends ServiceImpl getTemplates(Long tenantId, Integer pageNum, Integer pageSize, String type) { - log.debug("获取模板列表,租户 ID: {}, 页码:{}, 类型:{}", tenantId, pageNum, type); + public Page getTemplates(Long tenantId, Integer pageNum, Integer pageSize, String type, String keyword, Boolean publicOnly) { + log.debug("获取模板列表,租户 ID: {}, 页码:{}, 类型:{}, 关键词:{}", tenantId, pageNum, type, keyword); Page page = new Page<>(pageNum, pageSize); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(TaskTemplate::getTenantId, tenantId); - wrapper.eq(TaskTemplate::getIsPublic, 1); + if (Boolean.TRUE.equals(publicOnly)) { + wrapper.eq(TaskTemplate::getIsPublic, 1); + } wrapper.eq(TaskTemplate::getStatus, "ACTIVE"); if (StringUtils.hasText(type)) { - wrapper.eq(TaskTemplate::getType, type); + wrapper.and(w -> w.eq(TaskTemplate::getType, type).or().eq(TaskTemplate::getTaskType, type)); + } + if (StringUtils.hasText(keyword)) { + wrapper.like(TaskTemplate::getName, keyword); } wrapper.orderByDesc(TaskTemplate::getCreatedAt); @@ -87,15 +92,15 @@ public class TaskTemplateServiceImpl extends ServiceImpl