diff --git a/playedu-api/src/main/java/xyz/playedu/api/controller/backend/CourseController.java b/playedu-api/src/main/java/xyz/playedu/api/controller/backend/CourseController.java index 9b92bea..ee855ec 100644 --- a/playedu-api/src/main/java/xyz/playedu/api/controller/backend/CourseController.java +++ b/playedu-api/src/main/java/xyz/playedu/api/controller/backend/CourseController.java @@ -15,6 +15,7 @@ */ package xyz.playedu.api.controller.backend; +import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.MapUtils; @@ -28,9 +29,11 @@ import xyz.playedu.api.event.CourseDestroyEvent; import xyz.playedu.api.request.backend.CourseRequest; import xyz.playedu.common.annotation.BackendPermission; import xyz.playedu.common.annotation.Log; +import xyz.playedu.common.bus.BackendBus; import xyz.playedu.common.constant.BPermissionConstant; import xyz.playedu.common.constant.BusinessTypeConstant; import xyz.playedu.common.context.BCtx; +import xyz.playedu.common.domain.AdminUser; import xyz.playedu.common.exception.NotFoundException; import xyz.playedu.common.service.*; import xyz.playedu.common.types.JsonResponse; @@ -71,8 +74,12 @@ public class CourseController { @Autowired private DepartmentService departmentService; + @Autowired private AdminUserService adminUserService; + @Autowired private ApplicationContext ctx; + @Autowired private BackendBus backendBus; + @BackendPermission(slug = BPermissionConstant.COURSE) @GetMapping("/index") @Log(title = "线上课-列表", businessType = BusinessTypeConstant.GET) @@ -95,6 +102,10 @@ public class CourseController { filter.setDepIds(depIds); filter.setIsRequired(isRequired); + if (!backendBus.isSuperAdmin()) { + filter.setAdminId(BCtx.getId()); + } + PaginationResult result = courseService.paginate(page, size, filter); HashMap data = new HashMap<>(); @@ -107,6 +118,17 @@ public class CourseController { data.put("categories", categoryService.id2name()); data.put("departments", departmentService.id2name()); + // 操作人 + data.put("admin_users", new HashMap<>()); + if (!result.getData().isEmpty()) { + Map adminUsers = + adminUserService + .chunks(result.getData().stream().map(Course::getAdminId).toList()) + .stream() + .collect(Collectors.toMap(AdminUser::getId, AdminUser::getName)); + data.put("admin_users", adminUsers); + } + return JsonResponse.data(data); } @@ -134,7 +156,8 @@ public class CourseController { req.getIsRequired(), req.getIsShow(), req.getCategoryIds(), - req.getDepIds()); + req.getDepIds(), + BCtx.getId()); Date now = new Date(); int classHourCount = 0; @@ -240,6 +263,10 @@ public class CourseController { @Log(title = "线上课-编辑", businessType = BusinessTypeConstant.GET) public JsonResponse edit(@PathVariable(name = "id") Integer id) throws NotFoundException { Course course = courseService.findOrFail(id); + if (!backendBus.isSuperAdmin() && !course.getAdminId().equals(BCtx.getId())) { + return JsonResponse.error("无权限操作"); + } + List depIds = courseService.getDepIdsByCourseId(course.getId()); List categoryIds = courseService.getCategoryIdsByCourseId(course.getId()); List chapters = chapterService.getChaptersByCourseId(course.getId()); @@ -280,6 +307,10 @@ public class CourseController { @PathVariable(name = "id") Integer id, @RequestBody @Validated CourseRequest req) throws NotFoundException { Course course = courseService.findOrFail(id); + if (!backendBus.isSuperAdmin() && !course.getAdminId().equals(BCtx.getId())) { + return JsonResponse.error("无权限操作"); + } + courseService.updateWithCategoryIdsAndDepIds( course, req.getTitle(), @@ -290,15 +321,24 @@ public class CourseController { req.getPublishedAt(), req.getCategoryIds(), req.getDepIds()); + return JsonResponse.success(); } @BackendPermission(slug = BPermissionConstant.COURSE) @DeleteMapping("/{id}") @Log(title = "线上课-删除", businessType = BusinessTypeConstant.DELETE) + @SneakyThrows public JsonResponse destroy(@PathVariable(name = "id") Integer id) { + Course course = courseService.findOrFail(id); + if (!backendBus.isSuperAdmin() && !course.getAdminId().equals(BCtx.getId())) { + return JsonResponse.error("无权限操作"); + } + courseService.removeById(id); + ctx.publishEvent(new CourseDestroyEvent(this, BCtx.getId(), id)); + return JsonResponse.success(); } } diff --git a/playedu-common/src/main/java/xyz/playedu/common/types/paginate/CoursePaginateFiler.java b/playedu-common/src/main/java/xyz/playedu/common/types/paginate/CoursePaginateFiler.java index d6db3f9..0fa879a 100644 --- a/playedu-common/src/main/java/xyz/playedu/common/types/paginate/CoursePaginateFiler.java +++ b/playedu-common/src/main/java/xyz/playedu/common/types/paginate/CoursePaginateFiler.java @@ -42,4 +42,6 @@ public class CoursePaginateFiler { private Integer pageStart; private Integer pageSize; + + private Integer adminId; } diff --git a/playedu-course/src/main/java/xyz/playedu/course/domain/Course.java b/playedu-course/src/main/java/xyz/playedu/course/domain/Course.java index 0a1f3bc..b37bfc3 100644 --- a/playedu-course/src/main/java/xyz/playedu/course/domain/Course.java +++ b/playedu-course/src/main/java/xyz/playedu/course/domain/Course.java @@ -69,6 +69,9 @@ public class Course implements Serializable { @JsonProperty("created_at") private Date createdAt; + @JsonProperty("admin_id") + private Integer adminId; + @JsonIgnore private Date updatedAt; @JsonIgnore private Date deletedAt; diff --git a/playedu-course/src/main/java/xyz/playedu/course/service/CourseService.java b/playedu-course/src/main/java/xyz/playedu/course/service/CourseService.java index f456489..d71f224 100644 --- a/playedu-course/src/main/java/xyz/playedu/course/service/CourseService.java +++ b/playedu-course/src/main/java/xyz/playedu/course/service/CourseService.java @@ -42,7 +42,8 @@ public interface CourseService extends IService { Integer isRequired, Integer isShow, Integer[] categoryIds, - Integer[] depIds); + Integer[] depIds, + Integer adminId); void updateWithCategoryIdsAndDepIds( Course course, diff --git a/playedu-course/src/main/java/xyz/playedu/course/service/impl/CourseServiceImpl.java b/playedu-course/src/main/java/xyz/playedu/course/service/impl/CourseServiceImpl.java index b61ac9b..4dc6519 100644 --- a/playedu-course/src/main/java/xyz/playedu/course/service/impl/CourseServiceImpl.java +++ b/playedu-course/src/main/java/xyz/playedu/course/service/impl/CourseServiceImpl.java @@ -68,7 +68,8 @@ public class CourseServiceImpl extends ServiceImpl impleme Integer isRequired, Integer isShow, Integer[] categoryIds, - Integer[] depIds) { + Integer[] depIds, + Integer adminId) { // 创建课程 Course course = new Course(); course.setTitle(title); @@ -79,6 +80,7 @@ public class CourseServiceImpl extends ServiceImpl impleme course.setPublishedAt(new Date()); course.setCreatedAt(new Date()); course.setUpdatedAt(new Date()); + course.setAdminId(adminId); save(course); // 关联分类 relateCategories(course, categoryIds); diff --git a/playedu-course/src/main/resources/mapper/CourseMapper.xml b/playedu-course/src/main/resources/mapper/CourseMapper.xml index 779ebd5..046acad 100644 --- a/playedu-course/src/main/resources/mapper/CourseMapper.xml +++ b/playedu-course/src/main/resources/mapper/CourseMapper.xml @@ -75,6 +75,9 @@ AND `courses`.`title` LIKE concat('%',#{title},'%') + + AND `courses`.`admin_id` = #{adminId} + AND `courses`.`is_required` = #{isRequired} @@ -164,6 +167,9 @@ AND `courses`.`title` LIKE concat('%',#{title},'%') + + AND `courses`.`admin_id` = #{adminId} + AND `courses`.`is_required` = #{isRequired} diff --git a/playedu-system/src/main/java/xyz/playedu/system/checks/MigrationCheck.java b/playedu-system/src/main/java/xyz/playedu/system/checks/MigrationCheck.java index 2465bcf..e1b42ae 100644 --- a/playedu-system/src/main/java/xyz/playedu/system/checks/MigrationCheck.java +++ b/playedu-system/src/main/java/xyz/playedu/system/checks/MigrationCheck.java @@ -701,6 +701,18 @@ public class MigrationCheck implements CommandLineRunner { """); } }); + add( + new HashMap<>() { + { + put("table", ""); + put("name", "20231113_10_00_add_admin_id_for_courses"); + put( + "sql", + """ + ALTER TABLE `courses` add `admin_id` int(10) NOT NULL DEFAULT 0 COMMENT '管理员id'; + """); + } + }); } };