ClassController.java 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. package com.njuzr.eaibackend.controller;
  2. import com.njuzr.eaibackend.dto.ClassDTO;
  3. import com.njuzr.eaibackend.exception.MyException;
  4. import com.njuzr.eaibackend.po.Class;
  5. import com.njuzr.eaibackend.service.ClassService;
  6. import com.njuzr.eaibackend.vo.ClassVO;
  7. import com.njuzr.eaibackend.vo.StudentInfoVO;
  8. import lombok.Data;
  9. import lombok.extern.slf4j.Slf4j;
  10. import org.apache.ibatis.annotations.Delete;
  11. import org.springframework.security.access.prepost.PreAuthorize;
  12. import org.springframework.web.bind.annotation.*;
  13. import org.springframework.web.multipart.MultipartFile;
  14. import java.util.List;
  15. @Slf4j
  16. @RestController
  17. @RequestMapping("/api/class")
  18. public class ClassController {
  19. private final ClassService classService;
  20. public ClassController(ClassService classService) {
  21. this.classService = classService;
  22. }
  23. /**
  24. * 原来的创建班级接口,已注释
  25. */
  26. /*
  27. @PostMapping("/create")
  28. public MyResponse createClass(@RequestBody ClassDTO classDTO){
  29. Class aClass = classService.createClass(classDTO);
  30. return MyResponse.success(aClass);
  31. }
  32. */
  33. /**
  34. * 新的创建班级接口,生成班级码
  35. */
  36. @PostMapping("/create")
  37. public MyResponse createClassWithCode(@RequestBody ClassDTO classDTO) {
  38. try {
  39. ClassVO result = classService.createClass(classDTO);
  40. return MyResponse.success(result);
  41. } catch (MyException e) {
  42. return MyResponse.error(e.getErrCode(), e.getMessage());
  43. } catch (Exception e) {
  44. log.error("创建班级失败", e);
  45. return MyResponse.error(500, "服务器内部错误");
  46. }
  47. }
  48. @PutMapping("/update")
  49. public MyResponse updateClass(@RequestBody ClassDTO classDTO){
  50. return MyResponse.success(classService.updateClass(classDTO));
  51. }
  52. @GetMapping("/select")
  53. public MyResponse selectClass(@RequestParam Long courseId){
  54. List<Class> li= classService.select(courseId);
  55. return MyResponse.success(li);
  56. }
  57. @DeleteMapping("/delete")
  58. public MyResponse deleteClass(@RequestParam Long classId){
  59. String result = classService.deleteClassWithCheck(classId);
  60. switch (result) {
  61. case "删除成功":
  62. return MyResponse.success(result);
  63. case "班级不存在":
  64. return MyResponse.error(404, result);
  65. default: // 包括 "班级中还有学生" 和 "删除失败"
  66. return MyResponse.error(400, result);
  67. }
  68. }
  69. /**
  70. * 批量添加学生到班级
  71. * @param classId 班级ID
  72. * @param file 学生数据文件
  73. * @return 操作结果
  74. */
  75. @PostMapping("/{classId}/students/batch")
  76. @PreAuthorize("hasRole('ADMIN') or hasRole('TEACHER')")
  77. public MyResponse batchAddStudents(
  78. @PathVariable Long classId,
  79. @RequestParam("file") MultipartFile file) {
  80. try {
  81. String result = classService.batchAddStudents(classId, file);
  82. return MyResponse.success(result);
  83. } catch (MyException e) {
  84. return MyResponse.error(e.getErrCode(), e.getMessage());
  85. } catch (Exception e) {
  86. log.error("批量添加学生失败", e);
  87. return MyResponse.error(500, "服务器内部错误");
  88. }
  89. }
  90. /**
  91. * 通过学号添加学生到班级
  92. * @param classId 班级ID
  93. * @param officialNumber 学号
  94. * @return 操作结果
  95. */
  96. @PostMapping("/{classId}/students")
  97. @PreAuthorize("hasRole('ROLE_TEACHER')")
  98. public MyResponse addStudentByNumber(
  99. @PathVariable Long classId,
  100. @RequestParam String officialNumber) {
  101. try {
  102. String result = classService.addStudentByOfficialNumber(classId, officialNumber);
  103. return MyResponse.success(result);
  104. } catch (MyException e) {
  105. return MyResponse.error(e.getErrCode(), e.getMessage());
  106. } catch (Exception e) {
  107. log.error("添加学生失败", e);
  108. return MyResponse.error(500, "服务器内部错误");
  109. }
  110. }
  111. /**
  112. * 根据学生ID和课程ID查询班级
  113. * @param studentId 学生ID
  114. * @param courseId 课程ID
  115. * @return 班级信息
  116. */
  117. @GetMapping("/student/{studentId}/course/{courseId}")
  118. public MyResponse getClassByStudentIdAndCourseId(
  119. @PathVariable Long studentId,
  120. @PathVariable Long courseId) {
  121. try {
  122. Class aClass = classService.getClassByStudentIdAndCourseId(studentId, courseId);
  123. if (aClass == null) {
  124. return MyResponse.error(404, "未找到对应的班级");
  125. }
  126. return MyResponse.success(aClass);
  127. } catch (Exception e) {
  128. log.error("查询班级失败", e);
  129. return MyResponse.error(500, "服务器内部错误");
  130. }
  131. }
  132. /**
  133. * 批量删除班级中的学生
  134. * @param classId 班级ID
  135. * @param request 包含学号列表的请求体
  136. * @return 操作结果
  137. */
  138. @DeleteMapping("/{classId}/students/batch")
  139. @PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_TEACHER')")
  140. public MyResponse batchDeleteStudents(
  141. @PathVariable Long classId,
  142. @RequestBody List<String> request) {
  143. try {
  144. String result = classService.batchDeleteStudents(classId, request);
  145. return MyResponse.success(result);
  146. } catch (MyException e) {
  147. return MyResponse.error(e.getErrCode(), e.getMessage());
  148. } catch (Exception e) {
  149. log.error("批量删除学生失败", e);
  150. return MyResponse.error(500, "服务器内部错误");
  151. }
  152. }
  153. @GetMapping("/{classId}")
  154. public MyResponse getClassStudents(@PathVariable Long classId) {
  155. try {
  156. List<StudentInfoVO> students = classService.getStudentsByClassId(classId);
  157. return MyResponse.success(students);
  158. } catch (Exception e) {
  159. // 记录日志
  160. log.error("查询班级学生失败", e);
  161. // 返回错误响应
  162. return MyResponse.error(500, "查询班级学生失败: " + e.getMessage());
  163. }
  164. }
  165. @GetMapping("/find/{classId}")
  166. public MyResponse getClassById(@PathVariable Long classId) {
  167. try {
  168. Class courseClass = classService.getClassById(classId);
  169. return MyResponse.success(courseClass);
  170. } catch (IllegalArgumentException e) {
  171. return MyResponse.error(400, e.getMessage());
  172. } catch (Exception e) {
  173. log.error("获取班级信息失败: {}", e.getMessage(), e);
  174. return MyResponse.error(500, "服务器内部错误");
  175. }
  176. }
  177. }