From 71fcb008ed63ceb5bc69e293a008f7e5701c312d Mon Sep 17 00:00:00 2001 From: none Date: Mon, 20 Mar 2023 15:33:20 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=A7=86=E9=A2=91=E6=92=AD?= =?UTF-8?q?=E6=94=BE=E5=9C=B0=E5=9D=80api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/xyz/playedu/api/bus/UserBus.java | 40 ++++++++++++ .../api/caches/UserCanSeeCourseCache.java | 47 ++++++++++++++ .../controller/frontend/CourseController.java | 17 +++-- .../controller/frontend/HourController.java | 62 +++++++++++++++++++ .../controller/frontend/UserController.java | 5 ++ .../playedu/api/service/ResourceService.java | 2 + .../api/service/impl/ResourceServiceImpl.java | 10 +++ 7 files changed, 179 insertions(+), 4 deletions(-) create mode 100644 src/main/java/xyz/playedu/api/bus/UserBus.java create mode 100644 src/main/java/xyz/playedu/api/caches/UserCanSeeCourseCache.java create mode 100644 src/main/java/xyz/playedu/api/controller/frontend/HourController.java diff --git a/src/main/java/xyz/playedu/api/bus/UserBus.java b/src/main/java/xyz/playedu/api/bus/UserBus.java new file mode 100644 index 0000000..e1be817 --- /dev/null +++ b/src/main/java/xyz/playedu/api/bus/UserBus.java @@ -0,0 +1,40 @@ +package xyz.playedu.api.bus; + +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import xyz.playedu.api.domain.Course; +import xyz.playedu.api.domain.CourseHour; +import xyz.playedu.api.domain.User; +import xyz.playedu.api.service.CourseService; +import xyz.playedu.api.service.UserService; + +import java.util.List; + +/** + * @Author 杭州白书科技有限公司 + * @create 2023/3/20 14:56 + */ +@Component +public class UserBus { + + @Autowired + private CourseService courseService; + + @Autowired + private UserService userService; + + public boolean canSeeCourse(User user, Course course) { + List courseDepIds = courseService.getDepIdsByCourseId(course.getId()); + if (courseDepIds == null || courseDepIds.size() == 0) { + //线上课无所属部门=>公开课=>任何学员都可以学习 + return true; + } + List userDepIds = userService.getDepIdsByUserId(user.getId()); + if (userDepIds == null || userDepIds.size() == 0) { + return false; + } + return CollectionUtils.intersection(courseDepIds, userDepIds).size() > 0; + } + +} diff --git a/src/main/java/xyz/playedu/api/caches/UserCanSeeCourseCache.java b/src/main/java/xyz/playedu/api/caches/UserCanSeeCourseCache.java new file mode 100644 index 0000000..7ff4429 --- /dev/null +++ b/src/main/java/xyz/playedu/api/caches/UserCanSeeCourseCache.java @@ -0,0 +1,47 @@ +package xyz.playedu.api.caches; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import xyz.playedu.api.bus.UserBus; +import xyz.playedu.api.domain.Course; +import xyz.playedu.api.domain.User; +import xyz.playedu.api.exception.ServiceException; +import xyz.playedu.api.util.RedisUtil; + +/** + * @Author 杭州白书科技有限公司 + * @create 2023/3/20 15:20 + */ +@Component +public class UserCanSeeCourseCache { + + @Autowired + private UserBus userBus; + + private final static String keyTemplate = "c:%d-u:%d"; + + private final static int expire = 3600;//s + + public boolean check(User user, Course course, boolean isThrow) throws ServiceException { + boolean result; + if (RedisUtil.exists(key(user, course))) { + result = "1".equals(RedisUtil.get(key(user, course))); + } else { + result = userBus.canSeeCourse(user, course); + put(user, course, result); + } + if (isThrow) { + throw new ServiceException("无权限观看"); + } + return result; + } + + public void put(User user, Course course, boolean result) { + RedisUtil.set(key(user, course), result ? "1" : "0", expire); + } + + private String key(User user, Course course) { + return String.format(keyTemplate, course.getId(), user.getId()); + } + +} diff --git a/src/main/java/xyz/playedu/api/controller/frontend/CourseController.java b/src/main/java/xyz/playedu/api/controller/frontend/CourseController.java index 09c0ae6..54fef9b 100644 --- a/src/main/java/xyz/playedu/api/controller/frontend/CourseController.java +++ b/src/main/java/xyz/playedu/api/controller/frontend/CourseController.java @@ -4,13 +4,17 @@ import org.apache.commons.collections4.MapUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import xyz.playedu.api.domain.Course; +import xyz.playedu.api.domain.CourseHour; import xyz.playedu.api.exception.NotFoundException; +import xyz.playedu.api.service.CourseChapterService; +import xyz.playedu.api.service.CourseHourService; import xyz.playedu.api.service.CourseService; import xyz.playedu.api.types.JsonResponse; import xyz.playedu.api.types.paginate.CoursePaginateFiler; import xyz.playedu.api.types.paginate.PaginationResult; import java.util.HashMap; +import java.util.stream.Collectors; /** * @Author 杭州白书科技有限公司 @@ -23,6 +27,12 @@ public class CourseController { @Autowired private CourseService courseService; + @Autowired + private CourseChapterService chapterService; + + @Autowired + private CourseHourService hourService; + @GetMapping("/index") public JsonResponse index(@RequestParam HashMap params) { Integer page = MapUtils.getInteger(params, "page", 1); @@ -41,12 +51,11 @@ public class CourseController { @GetMapping("/{id}") public JsonResponse detail(@PathVariable(name = "id") Integer id) throws NotFoundException { Course course = courseService.findOrFail(id); - if (course.getIsShow().equals(0)) { - throw new NotFoundException("课程不存在"); - } HashMap data = new HashMap<>(); - data.put("course", course); + data.put("course", course);//线上课 + data.put("chapters", chapterService.getChaptersByCourseId(course.getId()));//章节 + data.put("hours", hourService.getHoursByCourseId(course.getId()).stream().collect(Collectors.groupingBy(CourseHour::getChapterId)));//课时 return JsonResponse.data(data); } diff --git a/src/main/java/xyz/playedu/api/controller/frontend/HourController.java b/src/main/java/xyz/playedu/api/controller/frontend/HourController.java new file mode 100644 index 0000000..1bd7abb --- /dev/null +++ b/src/main/java/xyz/playedu/api/controller/frontend/HourController.java @@ -0,0 +1,62 @@ +package xyz.playedu.api.controller.frontend; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import xyz.playedu.api.PlayEduFCtx; +import xyz.playedu.api.caches.UserCanSeeCourseCache; +import xyz.playedu.api.domain.Course; +import xyz.playedu.api.domain.CourseHour; +import xyz.playedu.api.domain.Resource; +import xyz.playedu.api.exception.NotFoundException; +import xyz.playedu.api.exception.ServiceException; +import xyz.playedu.api.service.CourseHourService; +import xyz.playedu.api.service.CourseService; +import xyz.playedu.api.service.ResourceService; +import xyz.playedu.api.types.JsonResponse; + +import java.util.HashMap; + +/** + * @Author 杭州白书科技有限公司 + * @create 2023/3/20 14:59 + */ +@RestController +@RequestMapping("/api/v1/course/{courseId}/hour") +public class HourController { + + @Autowired + private CourseService courseService; + + @Autowired + private CourseHourService hourService; + + @Autowired + private UserCanSeeCourseCache userCanSeeCourseCache; + + @Autowired + private ResourceService resourceService; + + @GetMapping("/{id}/play") + public JsonResponse play(@PathVariable(name = "courseId") Integer courseId, @PathVariable(name = "id") Integer id) throws NotFoundException, ServiceException { + Course course = courseService.findOrFail(courseId); + userCanSeeCourseCache.check(PlayEduFCtx.getUser(), course, true); + CourseHour hour = hourService.findOrFail(id, courseId); + Resource resource = resourceService.findOrFail(hour.getRid()); + + HashMap data = new HashMap<>(); + data.put("url", resource.getUrl());//视频播放地址 + data.put("extension", resource.getExtension());//视频格式 + data.put("duration", resourceService.duration(resource.getId()));//视频时长 + + return JsonResponse.data(data); + } + + @PostMapping("/{id}/record") + public JsonResponse record(@PathVariable(name = "courseId") Integer courseId, @PathVariable(name = "id") Integer id) throws NotFoundException, ServiceException { + Course course = courseService.findOrFail(courseId); + userCanSeeCourseCache.check(PlayEduFCtx.getUser(), course, true); + CourseHour hour = hourService.findOrFail(id, courseId); + return JsonResponse.success(); + } + +} diff --git a/src/main/java/xyz/playedu/api/controller/frontend/UserController.java b/src/main/java/xyz/playedu/api/controller/frontend/UserController.java index f1e3dc2..67df0dc 100644 --- a/src/main/java/xyz/playedu/api/controller/frontend/UserController.java +++ b/src/main/java/xyz/playedu/api/controller/frontend/UserController.java @@ -49,6 +49,11 @@ public class UserController { return JsonResponse.data(data); } + @PutMapping("/avatar") + public JsonResponse changeAvatar() { + return JsonResponse.success(); + } + @PutMapping("/password") public JsonResponse changePassword(@RequestBody @Validated ChangePasswordRequest req) throws ServiceException { userService.passwordChange(PlayEduFCtx.getUser(), req.getOldPassword(), req.getNewPassword()); diff --git a/src/main/java/xyz/playedu/api/service/ResourceService.java b/src/main/java/xyz/playedu/api/service/ResourceService.java index 7d2f824..9f1252c 100644 --- a/src/main/java/xyz/playedu/api/service/ResourceService.java +++ b/src/main/java/xyz/playedu/api/service/ResourceService.java @@ -33,4 +33,6 @@ public interface ResourceService extends IService { Map getCategoryCount(String type); Integer total(String type); + + Integer duration(Integer id); } diff --git a/src/main/java/xyz/playedu/api/service/impl/ResourceServiceImpl.java b/src/main/java/xyz/playedu/api/service/impl/ResourceServiceImpl.java index ec2c53e..39a1d8f 100644 --- a/src/main/java/xyz/playedu/api/service/impl/ResourceServiceImpl.java +++ b/src/main/java/xyz/playedu/api/service/impl/ResourceServiceImpl.java @@ -5,6 +5,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import xyz.playedu.api.domain.Resource; import xyz.playedu.api.domain.ResourceCategoryRelation; +import xyz.playedu.api.domain.ResourceVideo; import xyz.playedu.api.exception.NotFoundException; import xyz.playedu.api.service.ResourceService; import xyz.playedu.api.mapper.ResourceMapper; @@ -122,6 +123,15 @@ public class ResourceServiceImpl extends ServiceImpl i public Integer total(String type) { return Math.toIntExact(count(query().getWrapper().eq("type", type).eq("is_hidden", 0))); } + + @Override + public Integer duration(Integer id) { + ResourceVideo resourceVideo = resourceVideoService.getOne(resourceVideoService.query().getWrapper().eq("rid", id)); + if (resourceVideo == null) { + return null; + } + return resourceVideo.getDuration(); + } }