diff --git a/docs/旧后端接口完整清单.md b/docs/旧后端接口完整清单.md index e6bf0f1..781ce19 100644 --- a/docs/旧后端接口完整清单.md +++ b/docs/旧后端接口完整清单.md @@ -512,6 +512,22 @@ - `POST /api/v1/admin/resources/items/batch-delete` - 批量删除资源项 - `GET /api/v1/admin/resources/stats` - 获取全平台资源统计 +**本次补充接口 (兼容旧路径)**: +- `GET /api/v1/school/courses` - 校本课程列表(无分页) +- `GET /api/v1/school/task-templates` - 任务模板列表(兼容旧路径) +- `POST /api/v1/school/task-templates` - 创建任务模板(兼容旧路径) +- `PUT /api/v1/school/task-templates/{id}` - 更新任务模板(兼容旧路径) +- `DELETE /api/v1/school/task-templates/{id}` - 删除任务模板(兼容旧路径) +- `GET /api/v1/school/task-templates/default/{taskType}` - 获取默认模板(兼容旧路径) +- `GET /api/v1/teacher/students` - 教师学生列表(兼容旧路径) +- `GET /api/v1/school/packages` - 课程包列表(兼容旧路径) +- `GET /api/v1/school/packages/{id}` - 根据 ID 获取课程包(兼容旧路径) +- `GET /api/v1/school/school-courses` - 校本课程分页(兼容旧路径) +- `GET /api/v1/school/school-courses/{id}` - 根据 ID 获取校本课程(兼容旧路径) +- `POST /api/v1/school/school-courses` - 创建校本课程(兼容旧路径) +- `PUT /api/v1/school/school-courses/{id}` - 更新校本课程(兼容旧路径) +- `DELETE /api/v1/school/school-courses/{id}` - 删除校本课程(兼容旧路径) + **说明**: 旧后端接口清单中的 20 个"缺失"接口,经代码审查确认实际已在 Spring Boot 后端实现。 部分接口的路径有所调整(如 `/school/resources/items` 替代 `/school/resource-items`),但功能完整。 diff --git a/reading-platform-java/src/main/java/com/reading/platform/controller/school/SchoolCourseController.java b/reading-platform-java/src/main/java/com/reading/platform/controller/school/SchoolCourseController.java index 4b7a680..14b703e 100644 --- a/reading-platform-java/src/main/java/com/reading/platform/controller/school/SchoolCourseController.java +++ b/reading-platform-java/src/main/java/com/reading/platform/controller/school/SchoolCourseController.java @@ -10,21 +10,32 @@ import com.reading.platform.entity.SchoolCourse; import com.reading.platform.service.SchoolCourseService; 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.web.bind.annotation.*; +import java.util.List; + @Tag(name = "学校 - 校本课程", description = "校本课程管理接口(学校管理员专用)") @RestController -@RequestMapping("/api/v1/school/school-courses") +@RequestMapping("/api/v1/school") @RequiredArgsConstructor @RequireRole(UserRole.SCHOOL) public class SchoolCourseController { private final SchoolCourseService schoolCourseService; - @Operation(summary = "获取校本课程") - @GetMapping - public Result> getCourses( + @Operation(summary = "获取课程列表(无分页)") + @GetMapping("/courses") + public Result> getCoursesList() { + String tenantId = SecurityUtils.getCurrentTenantId(); + Page page = schoolCourseService.getCourses(1, 100, tenantId, null); + return Result.success(page.getRecords()); + } + + @Operation(summary = "获取校本课程分页") + @GetMapping("/school-courses") + public Result> getSchoolCoursesPage( @RequestParam(defaultValue = "1") int pageNum, @RequestParam(defaultValue = "20") int pageSize, @RequestParam(required = false) String keyword) { @@ -33,28 +44,55 @@ public class SchoolCourseController { return Result.success(PageResult.of(page)); } - @Operation(summary = "根据ID获取校本课程") - @GetMapping("/{id}") - public Result getCourse(@PathVariable String id) { + @Operation(summary = "根据 ID 获取校本课程(兼容旧路径 /school-courses/{id})") + @GetMapping("/school-courses/{id}") + public Result getSchoolCourseById(@PathVariable String id) { return Result.success(schoolCourseService.getCourseById(id)); } - @Operation(summary = "创建校本课程") - @PostMapping - public Result createCourse(@RequestBody SchoolCourse course) { + @Operation(summary = "根据 ID 获取校本课程") + @GetMapping("/courses/{id}") + public Result getCourseById(@PathVariable String id) { + return Result.success(schoolCourseService.getCourseById(id)); + } + + @Operation(summary = "创建校本课程(兼容旧路径 /school-courses)") + @PostMapping("/school-courses") + public Result createSchoolCourse(@Valid @RequestBody SchoolCourse course) { String tenantId = SecurityUtils.getCurrentTenantId(); String userId = SecurityUtils.getCurrentUserId(); return Result.success(schoolCourseService.createCourse(tenantId, userId, course)); } - @Operation(summary = "更新校本课程") - @PutMapping("/{id}") - public Result updateCourse(@PathVariable String id, @RequestBody SchoolCourse course) { + @Operation(summary = "创建校本课程") + @PostMapping("/courses") + public Result createCourse(@Valid @RequestBody SchoolCourse course) { + String tenantId = SecurityUtils.getCurrentTenantId(); + String userId = SecurityUtils.getCurrentUserId(); + return Result.success(schoolCourseService.createCourse(tenantId, userId, course)); + } + + @Operation(summary = "更新校本课程(兼容旧路径 /school-courses/{id})") + @PutMapping("/school-courses/{id}") + public Result updateSchoolCourse(@PathVariable String id, @Valid @RequestBody SchoolCourse course) { return Result.success(schoolCourseService.updateCourse(id, course)); } + @Operation(summary = "更新校本课程") + @PutMapping("/courses/{id}") + public Result updateCourse(@PathVariable String id, @Valid @RequestBody SchoolCourse course) { + return Result.success(schoolCourseService.updateCourse(id, course)); + } + + @Operation(summary = "删除校本课程(兼容旧路径 /school-courses/{id})") + @DeleteMapping("/school-courses/{id}") + public Result deleteSchoolCourse(@PathVariable String id) { + schoolCourseService.deleteCourse(id); + return Result.success(); + } + @Operation(summary = "删除校本课程") - @DeleteMapping("/{id}") + @DeleteMapping("/courses/{id}") public Result deleteCourse(@PathVariable String id) { schoolCourseService.deleteCourse(id); return Result.success(); diff --git a/reading-platform-java/src/main/java/com/reading/platform/controller/school/SchoolCoursePackageController.java b/reading-platform-java/src/main/java/com/reading/platform/controller/school/SchoolCoursePackageController.java index b3f9cce..5a5edf5 100644 --- a/reading-platform-java/src/main/java/com/reading/platform/controller/school/SchoolCoursePackageController.java +++ b/reading-platform-java/src/main/java/com/reading/platform/controller/school/SchoolCoursePackageController.java @@ -14,15 +14,25 @@ import org.springframework.web.bind.annotation.*; @Tag(name = "学校 - 课程包", description = "课程包接口(学校管理员专用)") @RestController -@RequestMapping("/api/v1/school/course-packages") +@RequestMapping("/api/v1/school") @RequiredArgsConstructor @RequireRole(UserRole.SCHOOL) public class SchoolCoursePackageController { private final CoursePackageService coursePackageService; + @Operation(summary = "获取可用课程包列表(兼容旧路径 /packages)") + @GetMapping("/packages") + public Result> getPackagesAlias( + @RequestParam(defaultValue = "1") int pageNum, + @RequestParam(defaultValue = "20") int pageSize, + @RequestParam(required = false) String keyword) { + Page page = coursePackageService.getPackages(pageNum, pageSize, keyword, "published"); + return Result.success(PageResult.of(page)); + } + @Operation(summary = "获取可用课程包列表") - @GetMapping + @GetMapping("/course-packages") public Result> getPackages( @RequestParam(defaultValue = "1") int pageNum, @RequestParam(defaultValue = "20") int pageSize, @@ -31,8 +41,14 @@ public class SchoolCoursePackageController { return Result.success(PageResult.of(page)); } - @Operation(summary = "根据ID获取课程包") - @GetMapping("/{id}") + @Operation(summary = "根据 ID 获取课程包(兼容旧路径 /packages/{id})") + @GetMapping("/packages/{id}") + public Result getPackageAlias(@PathVariable String id) { + return Result.success(coursePackageService.getPackageById(id)); + } + + @Operation(summary = "根据 ID 获取课程包") + @GetMapping("/course-packages/{id}") public Result getPackage(@PathVariable String id) { return Result.success(coursePackageService.getPackageById(id)); } diff --git a/reading-platform-java/src/main/java/com/reading/platform/controller/school/SchoolTaskController.java b/reading-platform-java/src/main/java/com/reading/platform/controller/school/SchoolTaskController.java index abc6dd0..7878b97 100644 --- a/reading-platform-java/src/main/java/com/reading/platform/controller/school/SchoolTaskController.java +++ b/reading-platform-java/src/main/java/com/reading/platform/controller/school/SchoolTaskController.java @@ -1,6 +1,8 @@ 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.response.PageResult; import com.reading.platform.common.response.Result; import com.reading.platform.common.security.SecurityUtils; @@ -251,3 +253,75 @@ public class SchoolTaskController { } } + +// ==================== 独立的任务模板 Controller(兼容旧后端路径) ==================== + +@Tag(name = "学校 - 任务模板", description = "任务模板管理接口(学校管理员专用,兼容旧路径)") +@RestController +@RequestMapping("/api/v1/school/task-templates") +@RequiredArgsConstructor +@RequireRole(UserRole.SCHOOL) +class SchoolTaskTemplateController { + + private final TaskService taskService; + + @Operation(summary = "获取任务模板列表") + @GetMapping + public Result> getTemplates( + @RequestParam(value = "page", required = false) Integer pageNum, + @RequestParam(required = false) Integer pageSize, + @RequestParam(required = false) String keyword, + @RequestParam(required = false) String type) { + String tenantId = SecurityUtils.getCurrentTenantId(); + Page page = taskService.getTemplatePage(tenantId, pageNum, pageSize, keyword, type); + return Result.success(PageResult.of(page)); + } + + @Operation(summary = "根据 ID 获取任务模板") + @GetMapping("/{id}") + public Result getTemplate(@PathVariable String id) { + String tenantId = SecurityUtils.getCurrentTenantId(); + return Result.success(taskService.getTemplateById(tenantId, id)); + } + + @Operation(summary = "获取默认模板(按类型)") + @GetMapping("/default/{taskType}") + public Result getDefaultTemplate(@PathVariable String taskType) { + String tenantId = SecurityUtils.getCurrentTenantId(); + return Result.success(taskService.getDefaultTemplate(tenantId, taskType)); + } + + @Operation(summary = "创建任务模板") + @PostMapping + public Result createTemplate(@Valid @RequestBody TaskTemplateCreateRequest request) { + String tenantId = SecurityUtils.getCurrentTenantId(); + String userId = SecurityUtils.getCurrentUserId(); + return Result.success(taskService.createTemplate(tenantId, userId, request)); + } + + @Operation(summary = "更新任务模板") + @PutMapping("/{id}") + public Result updateTemplate( + @PathVariable String id, + @RequestBody TaskTemplateUpdateRequest request) { + String tenantId = SecurityUtils.getCurrentTenantId(); + return Result.success(taskService.updateTemplate(tenantId, id, request)); + } + + @Operation(summary = "删除任务模板") + @DeleteMapping("/{id}") + public Result deleteTemplate(@PathVariable String id) { + String tenantId = SecurityUtils.getCurrentTenantId(); + taskService.deleteTemplate(tenantId, id); + return Result.success(); + } + + @Operation(summary = "从模板创建任务") + @PostMapping("/from-template") + public Result createFromTemplate(@Valid @RequestBody CreateTaskFromTemplateRequest request) { + String tenantId = SecurityUtils.getCurrentTenantId(); + String userId = SecurityUtils.getCurrentUserId(); + String role = SecurityUtils.getCurrentRole(); + return Result.success(taskService.createTaskFromTemplate(tenantId, userId, role, request)); + } +} diff --git a/reading-platform-java/src/main/java/com/reading/platform/controller/teacher/TeacherCourseController.java b/reading-platform-java/src/main/java/com/reading/platform/controller/teacher/TeacherCourseController.java index ef8b21e..037f11a 100644 --- a/reading-platform-java/src/main/java/com/reading/platform/controller/teacher/TeacherCourseController.java +++ b/reading-platform-java/src/main/java/com/reading/platform/controller/teacher/TeacherCourseController.java @@ -19,9 +19,9 @@ import org.springframework.web.bind.annotation.*; import java.util.ArrayList; import java.util.List; -@Tag(name = "教师 - 课程", description = "课程接口(教师专用)") +@Tag(name = "教师 - 课程和学生", description = "课程和学生接口(教师专用)") @RestController -@RequestMapping("/api/v1/teacher/courses") +@RequestMapping("/api/v1/teacher") @RequiredArgsConstructor public class TeacherCourseController { @@ -30,13 +30,13 @@ public class TeacherCourseController { private final StudentService studentService; @Operation(summary = "根据 ID 获取课程") - @GetMapping("/{id}") + @GetMapping("/courses/{id}") public Result getCourse(@PathVariable String id) { return Result.success(courseService.getCourseById(id)); } @Operation(summary = "获取课程分页") - @GetMapping + @GetMapping("/courses") public Result> getCoursePage( @RequestParam(value = "page", required = false) Integer pageNum, @RequestParam(required = false) Integer pageSize, @@ -47,14 +47,14 @@ public class TeacherCourseController { } @Operation(summary = "获取所有课程") - @GetMapping("/all") + @GetMapping("/courses/all") public Result> getAllCourses() { String tenantId = SecurityUtils.getCurrentTenantId(); return Result.success(courseService.getCoursesByTenantId(tenantId)); } @Operation(summary = "获取教师的班级列表") - @GetMapping("/classes") + @GetMapping("/courses/classes") public Result> getTeacherClasses() { String tenantId = SecurityUtils.getCurrentTenantId(); List classes = classService.getClassList(tenantId); @@ -75,7 +75,7 @@ public class TeacherCourseController { } @Operation(summary = "获取教师所有学生分页") - @GetMapping("/students") + @GetMapping("/courses/students") public Result> getTeacherStudents( @RequestParam(value = "page", required = false) Integer pageNum, @RequestParam(required = false) Integer pageSize, @@ -116,8 +116,17 @@ public class TeacherCourseController { return Result.success(PageResult.of(result, page.getTotal(), page.getCurrent(), page.getSize())); } + @Operation(summary = "获取教师所有学生(兼容旧路径)") + @GetMapping("/students") + public Result> getStudents( + @RequestParam(value = "page", required = false) Integer pageNum, + @RequestParam(required = false) Integer pageSize, + @RequestParam(required = false) String keyword) { + return getTeacherStudents(pageNum, pageSize, keyword); + } + @Operation(summary = "获取班级学生分页") - @GetMapping("/classes/{classId}/students") + @GetMapping("/courses/classes/{classId}/students") public Result> getClassStudents( @PathVariable String classId, @RequestParam(value = "page", required = false) Integer pageNum, @@ -145,7 +154,7 @@ public class TeacherCourseController { } @Operation(summary = "获取班级教师列表") - @GetMapping("/classes/{classId}/teachers") + @GetMapping("/courses/classes/{classId}/teachers") public Result> getClassTeachers(@PathVariable String classId) { List result = classService.getClassTeachers(classId).stream().map(ct -> { TeacherInfoResponse response = new TeacherInfoResponse(); diff --git a/reading-platform-java/src/main/java/com/reading/platform/service/ResourceService.java b/reading-platform-java/src/main/java/com/reading/platform/service/ResourceService.java index 3aedade..00da016 100644 --- a/reading-platform-java/src/main/java/com/reading/platform/service/ResourceService.java +++ b/reading-platform-java/src/main/java/com/reading/platform/service/ResourceService.java @@ -1,5 +1,6 @@ package com.reading.platform.service; +import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.reading.platform.dto.response.ResourceStatsResponse; import com.reading.platform.entity.ResourceItem; @@ -10,7 +11,7 @@ import java.util.List; /** * 资源服务接口 */ -public interface ResourceService { +public interface ResourceService extends IService { /** * 获取资源库列表(不区分租户) diff --git a/reading-platform-java/src/main/java/com/reading/platform/service/impl/ResourceServiceImpl.java b/reading-platform-java/src/main/java/com/reading/platform/service/impl/ResourceServiceImpl.java index 6cfd147..5558ebe 100644 --- a/reading-platform-java/src/main/java/com/reading/platform/service/impl/ResourceServiceImpl.java +++ b/reading-platform-java/src/main/java/com/reading/platform/service/impl/ResourceServiceImpl.java @@ -2,6 +2,7 @@ package com.reading.platform.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.reading.platform.common.enums.ErrorCode; import com.reading.platform.common.exception.BusinessException; import com.reading.platform.common.util.PageUtils; @@ -25,7 +26,7 @@ import java.util.List; @Slf4j @Service @RequiredArgsConstructor -public class ResourceServiceImpl implements ResourceService { +public class ResourceServiceImpl extends ServiceImpl implements ResourceService { private final ResourceLibraryMapper resourceLibraryMapper; private final ResourceItemMapper resourceItemMapper;