CourseController.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. package com.njuzr.eaibackend.controller;
  2. import com.baomidou.mybatisplus.core.metadata.IPage;
  3. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  4. import com.njuzr.eaibackend.dto.course.CourseDTO;
  5. import com.njuzr.eaibackend.dto.course.CourseQueryDTO;
  6. import com.njuzr.eaibackend.dto.course.CourseUpdateDTO;
  7. import com.njuzr.eaibackend.dto.course.EnrollDTO;
  8. import com.njuzr.eaibackend.exception.MyException;
  9. import com.njuzr.eaibackend.po.Course;
  10. import com.njuzr.eaibackend.po.MyUserDetails;
  11. import com.njuzr.eaibackend.po.User;
  12. import com.njuzr.eaibackend.service.CourseService;
  13. import com.njuzr.eaibackend.service.UserService;
  14. import com.njuzr.eaibackend.vo.CourseVO;
  15. import com.njuzr.eaibackend.vo.StudentCourseHomeworkVO;
  16. import org.slf4j.Logger;
  17. import org.slf4j.LoggerFactory;
  18. import org.springframework.beans.factory.annotation.Autowired;
  19. import org.springframework.security.access.prepost.PreAuthorize;
  20. import org.springframework.security.core.annotation.AuthenticationPrincipal;
  21. import org.springframework.validation.annotation.Validated;
  22. import org.springframework.web.bind.annotation.*;
  23. /**
  24. * @author: Leonezhurui
  25. * @Date: 2024/3/5 - 16:34
  26. * @Package: EAI-Backend
  27. */
  28. @RestController
  29. @RequestMapping("/api/course")
  30. public class CourseController {
  31. private static final Logger log = LoggerFactory.getLogger(CourseController.class);
  32. private final CourseService courseService;
  33. @Autowired
  34. UserService userService;
  35. @Autowired
  36. public CourseController(CourseService courseService) {
  37. this.courseService = courseService;
  38. }
  39. /**
  40. * 创建课程
  41. * @param courseDTO
  42. * @return
  43. */
  44. @PreAuthorize("hasRole('TEACHER') or hasRole('ADMIN')")
  45. @PostMapping
  46. public MyResponse createCourse(@Validated @RequestBody CourseDTO courseDTO) {
  47. CourseVO courseVO = courseService.createCourse(courseDTO);
  48. return MyResponse.success(courseVO);
  49. }
  50. /**
  51. * 管理查询课程,内容查询
  52. * @param currentPage
  53. * @param pageSize
  54. * @param courseQueryDTO
  55. * @return
  56. */
  57. // TODO:权限修改
  58. // @PreAuthorize("hasRole('ADMIN')")
  59. // TODO: Get改为Post,因为有@RequestBody
  60. @PostMapping("/query")
  61. public MyResponse findCoursePage(
  62. @RequestParam(value = "page", defaultValue = "1") int currentPage,
  63. @RequestParam(value = "size", defaultValue = "10") int pageSize,
  64. @RequestBody CourseQueryDTO courseQueryDTO
  65. ) {
  66. log.info("查询课程控制器:{}, {}", currentPage, pageSize);
  67. Page<Course> page = new Page<>(currentPage, pageSize);
  68. IPage<CourseVO> courses = courseService.findCoursesPage(page, courseQueryDTO);
  69. return MyResponse.success(courses);
  70. }
  71. /**
  72. * 根据学生Id获取其所选的所有课程的信息
  73. * @param studentId
  74. * @return
  75. */
  76. @GetMapping("/byStudent")
  77. public MyResponse findCourseByStudentId(
  78. @AuthenticationPrincipal(expression = "id") Long studentId,
  79. @RequestParam(value = "page", defaultValue = "1") int currentPage,
  80. @RequestParam(value = "size", defaultValue = "10") int pageSize
  81. ) {
  82. Page<Course> page = new Page<>(currentPage, pageSize);
  83. CourseQueryDTO courseQueryDTO = new CourseQueryDTO();
  84. courseQueryDTO.setStudentId(studentId);
  85. return MyResponse.success(courseService.findCoursesPage(page, courseQueryDTO));
  86. }
  87. /**
  88. * 根据老师Id获取的其所创建的所有课程信息
  89. * @param teacherId
  90. * @return
  91. */
  92. @PreAuthorize("hasRole('TEACHER')")
  93. @GetMapping("/byTeacher")
  94. public MyResponse findByTeacherId(
  95. @AuthenticationPrincipal MyUserDetails user,
  96. @RequestParam(value = "page", defaultValue = "1") int currentPage,
  97. @RequestParam(value = "size", defaultValue = "10") int pageSize
  98. ) {
  99. Page<Course> page = new Page<>(currentPage, pageSize);
  100. CourseQueryDTO courseQueryDTO = new CourseQueryDTO();
  101. courseQueryDTO.setTeacherId(user.getId());
  102. if(user.getPid() != null) {
  103. courseQueryDTO.setTeacherPid(Long.parseLong(user.getPid()));
  104. }
  105. return MyResponse.success(courseService.findCoursesPage(page, courseQueryDTO));
  106. }
  107. /**
  108. * 根据课程Id,获取某个课程的详细信息
  109. * @param courseId
  110. * @param currentPage
  111. * @param pageSize
  112. * @return
  113. */
  114. @GetMapping("/{courseId}")
  115. public MyResponse findByCourseId(
  116. @PathVariable Long courseId,
  117. @RequestParam(value = "page", defaultValue = "1") int currentPage,
  118. @RequestParam(value = "size", defaultValue = "10") int pageSize
  119. ) {
  120. Page<Course> page = new Page<>(currentPage, pageSize);
  121. CourseQueryDTO courseQueryDTO = new CourseQueryDTO();
  122. courseQueryDTO.setCourseId(courseId);
  123. return MyResponse.success(courseService.findCoursesPage(page, courseQueryDTO));
  124. }
  125. @GetMapping("/byName")
  126. public MyResponse findByCourseName(
  127. @RequestParam String courseName,
  128. @RequestParam(value = "page", defaultValue = "1") int currentPage,
  129. @RequestParam(value = "size", defaultValue = "10") int pageSize
  130. ) {
  131. Page<Course> page = new Page<>(currentPage, pageSize);
  132. CourseQueryDTO courseQueryDTO = new CourseQueryDTO();
  133. courseQueryDTO.setCourseName(courseName);
  134. return MyResponse.success(courseService.findCoursesPage(page, courseQueryDTO));
  135. }
  136. @GetMapping("/byTime")
  137. public MyResponse findByCourseTime(
  138. @RequestParam String courseTime,
  139. @RequestParam(value = "page", defaultValue = "1") int currentPage,
  140. @RequestParam(value = "size", defaultValue = "10") int pageSize
  141. ) {
  142. Page<Course> page = new Page<>(currentPage, pageSize);
  143. CourseQueryDTO courseQueryDTO = new CourseQueryDTO();
  144. courseQueryDTO.setSemester(courseTime);
  145. return MyResponse.success(courseService.findCoursesPage(page, courseQueryDTO));
  146. }
  147. /**
  148. * 只有课程老师或管理员可以修改当前课程的信息
  149. * @param userId
  150. * @param courseId
  151. * @param updateDTO
  152. * @return
  153. */
  154. @PreAuthorize("hasRole('TEACHER') or hasRole('ADMIN')")
  155. @PutMapping
  156. public MyResponse updateCourse(
  157. @AuthenticationPrincipal(expression = "id") Long userId,
  158. @RequestParam Long courseId,
  159. @RequestBody CourseUpdateDTO updateDTO
  160. ) {
  161. return MyResponse.success(courseService.updateCourse(userId, courseId, updateDTO));
  162. }
  163. /**
  164. * 只有课程老师或管理员可以修改当前课程的信息
  165. * @param userPid
  166. * @param courseId
  167. * @param updateDTO
  168. * @return
  169. */
  170. @PreAuthorize("hasRole('TEACHER') or hasRole('ADMIN')")
  171. @PutMapping("/portal")
  172. public MyResponse updateCourseByPortal(
  173. @AuthenticationPrincipal(expression = "pid") Long userPid,
  174. @AuthenticationPrincipal(expression = "id") Long userId,
  175. @RequestParam Long courseId,
  176. @RequestBody CourseUpdateDTO updateDTO
  177. ) {
  178. return MyResponse.success(courseService.updateCourseByPortal(userId, userPid, courseId, updateDTO));
  179. }
  180. @PreAuthorize("hasRole('TEACHER') or hasRole('ADMIN')")
  181. @PutMapping("/enrollCode")
  182. public MyResponse updateEnrollCode(
  183. @AuthenticationPrincipal(expression = "id") Long userId,
  184. @RequestParam Long courseId,
  185. @RequestParam String enrollCode
  186. ) {
  187. CourseUpdateDTO updateDTO = new CourseUpdateDTO();
  188. updateDTO.setEnrollCode(enrollCode);
  189. return MyResponse.success(courseService.updateCourse(userId, courseId, updateDTO));
  190. }
  191. /**
  192. * 教师删除课程
  193. */
  194. @PreAuthorize("hasRole('TEACHER') or hasRole('ADMIN')")
  195. @DeleteMapping("/deleteCourse")
  196. public MyResponse deleteCourse(
  197. @AuthenticationPrincipal MyUserDetails user,
  198. @RequestParam Long courseId
  199. ) {
  200. courseService.deleteById(user, courseId);
  201. return MyResponse.success("删除课程成功");
  202. }
  203. /**
  204. * 教师删除课程
  205. */
  206. @PreAuthorize("hasRole('TEACHER') or hasRole('ADMIN')")
  207. @DeleteMapping("/deleteCourse/portal")
  208. public MyResponse deleteCourseByPortal(
  209. @AuthenticationPrincipal MyUserDetails user,
  210. @RequestParam Long courseId
  211. ) {
  212. courseService.deleteById(user, courseId);
  213. return MyResponse.success("删除课程成功");
  214. }
  215. /**
  216. * 选课,通过studentId和courseId,完成选课。其中studentId从Token中获取。
  217. * @param studentId
  218. * @param enrollDTO
  219. * @return
  220. */
  221. @PreAuthorize("hasRole('STUDENT')")
  222. @PostMapping("/enroll")
  223. public MyResponse enroll(
  224. @AuthenticationPrincipal(expression = "id") Long studentId,
  225. @RequestBody EnrollDTO enrollDTO
  226. ) {
  227. try {
  228. enrollDTO.setStudentId(studentId);
  229. courseService.enroll(enrollDTO);
  230. return MyResponse.success("选课成功");
  231. }
  232. catch (MyException e){
  233. return MyResponse.error(e.getErrCode(),e.getMessage());
  234. }
  235. }
  236. @GetMapping("/getEnrollments/byCourse")
  237. @PreAuthorize("hasRole('TEACHER')")
  238. public MyResponse getEnrollmentsByCourse(
  239. @RequestParam(value = "page", defaultValue = "1") int currentPage,
  240. @RequestParam(value = "size", defaultValue = "10") int pageSize,
  241. @AuthenticationPrincipal(expression = "id") Long teacherId,
  242. @RequestParam Long courseId
  243. ) {
  244. Page<User> page = new Page<>(currentPage, pageSize);
  245. return MyResponse.success(courseService.getEnrollmentsByCourse(page, teacherId, courseId));
  246. }
  247. @GetMapping("/getEnrollments/byStudent")
  248. public MyResponse getEnrollmentsByStudent(
  249. @RequestParam(value = "page", defaultValue = "1") int currentPage,
  250. @RequestParam(value = "size", defaultValue = "10") int pageSize,
  251. @RequestParam Long studentId
  252. ) {
  253. Page<Course> page = new Page<>(currentPage, pageSize);
  254. return MyResponse.success(courseService.getEnrollmentsByStudent(page, studentId));
  255. }
  256. @PreAuthorize("hasRole('TEACHER') or hasRole('ADMIN')")
  257. @GetMapping("/getEnrollCode")
  258. public MyResponse getEnrollCodeByCourseId(
  259. @AuthenticationPrincipal(expression = "id") Long userId,
  260. @RequestParam Long courseId) {
  261. return MyResponse.success(courseService.getEnrollCodeByCourseId(courseId));
  262. }
  263. /**
  264. * 学生退课
  265. */
  266. @PreAuthorize("hasRole('STUDENT')")
  267. @DeleteMapping("/dropCourse")
  268. public MyResponse dropCourse(
  269. @AuthenticationPrincipal(expression = "id") Long studentId,
  270. @RequestParam Long courseId
  271. ) {
  272. courseService.dropCourse(studentId, courseId);
  273. return MyResponse.success("退课成功");
  274. }
  275. @GetMapping("/student/assignments")
  276. public MyResponse getStudentCourseAssignments(
  277. @RequestParam Long studentId,
  278. @RequestParam Long courseId) {
  279. try {
  280. StudentCourseHomeworkVO result = courseService.getStudentCourseAssignments(studentId, courseId);
  281. return MyResponse.success(result);
  282. } catch (RuntimeException e) {
  283. return MyResponse.error(400, e.getMessage());
  284. } catch (Exception e) {
  285. log.error("查询学生课程作业失败", e);
  286. return MyResponse.error(500, "查询失败:" + e.getMessage());
  287. }
  288. }
  289. }