فهرست منبع

Merge remote-tracking branch 'origin/refactor' into refactor-evaluation

白白 1 سال پیش
والد
کامیت
58ee4586e2

+ 1 - 0
application.yaml

@@ -75,3 +75,4 @@ proxy:
   port: 8090
 
 
+

+ 19 - 1
src/main/java/com/njuzr/eaibackend/controller/CourseController.java

@@ -189,8 +189,11 @@ public class CourseController {
         return MyResponse.success(courseService.updateCourse(userId, courseId, updateDTO));
     }
 
+    /**
+     * 教师删除课程
+     */
     @PreAuthorize("hasRole('TEACHER') or hasRole('ADMIN')")
-    @DeleteMapping
+    @DeleteMapping("/deleteCourse")
     public MyResponse deleteCourse(
             @AuthenticationPrincipal MyUserDetails user,
             @RequestParam Long courseId
@@ -246,5 +249,20 @@ public class CourseController {
         return MyResponse.success(courseService.getEnrollCodeByCourseId(courseId));
     }
 
+    /**
+     * 学生退课
+     */
+    @PreAuthorize("hasRole('STUDENT')")
+    @DeleteMapping("/dropCourse")
+    public MyResponse dropCourse(
+            @AuthenticationPrincipal(expression = "id") Long studentId,
+            @RequestParam Long courseId
+    ) {
+        courseService.dropCourse(studentId, courseId);
+        return MyResponse.success("退课成功");
+    }
+
+
+
 
 }

+ 6 - 0
src/main/java/com/njuzr/eaibackend/mapper/CourseStudentMapper.java

@@ -7,6 +7,8 @@ import com.njuzr.eaibackend.po.Enrollment;
 import com.njuzr.eaibackend.po.User;
 import org.apache.ibatis.annotations.Mapper;
 
+import java.util.List;
+
 /**
  * @author: Leonezhurui
  * @Date: 2024/3/11 - 21:09
@@ -17,5 +19,9 @@ import org.apache.ibatis.annotations.Mapper;
 public interface CourseStudentMapper extends BaseMapper<Enrollment> {
     Page<User> selectStudentsByCourseId(Page<User> page, Long courseId);
 
+    List<User> selectStudentsByCourseId(Long courseId);
+
     Page<Course> selectCoursesByStudentId(Page<Course> page, Long studentId);
+
+    int dropCourse(Long studentId, Long courseId);
 }

+ 5 - 0
src/main/java/com/njuzr/eaibackend/mapper/StudentAssignmentMapper.java

@@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.njuzr.eaibackend.po.Engagement;
 import org.apache.ibatis.annotations.Mapper;
 
+import java.util.List;
+
 /**
  * @author: Leonezhurui
  * @Date: 2024/3/15 - 00:46
@@ -17,4 +19,7 @@ public interface StudentAssignmentMapper extends BaseMapper<Engagement> {
 
     // TODO:(柏琪)
     Page<Engagement> findEngagementByAssignmentId(Page<Engagement> page, Long assignmentId);
+
+    List<Engagement> findEngagementByAssignmentId(Long assignmentId);
+    void delete(Long studentId, Long assignmentId);
 }

+ 5 - 0
src/main/java/com/njuzr/eaibackend/service/CourseService.java

@@ -2,6 +2,7 @@ package com.njuzr.eaibackend.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.njuzr.eaibackend.controller.MyResponse;
 import com.njuzr.eaibackend.dto.course.CourseDTO;
 import com.njuzr.eaibackend.dto.course.CourseQueryDTO;
 import com.njuzr.eaibackend.dto.course.CourseUpdateDTO;
@@ -11,6 +12,7 @@ import com.njuzr.eaibackend.po.MyUserDetails;
 import com.njuzr.eaibackend.po.User;
 import com.njuzr.eaibackend.vo.CourseVO;
 import com.njuzr.eaibackend.vo.UserVO;
+import org.springframework.web.bind.annotation.RequestParam;
 
 /**
  * @author: Leonezhurui
@@ -34,4 +36,7 @@ public interface CourseService {
     IPage<CourseVO> getEnrollmentsByStudent(Page<Course> page, Long studentId);
 
     String getEnrollCodeByCourseId(Long courseId);
+
+    void dropCourse(Long studentId, Long courseId);
+
 }

+ 12 - 1
src/main/java/com/njuzr/eaibackend/service/impl/AssignmentServiceImpl.java

@@ -24,9 +24,11 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.http.HttpStatus;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.time.LocalDateTime;
 import java.util.Date;
+import java.util.List;
 import java.util.Objects;
 
 /**
@@ -159,16 +161,25 @@ public class AssignmentServiceImpl implements AssignmentService {
     }
 
 
+    /**
+     * 教师删除作业
+     */
     @Override
+    @Transactional
     public void deleteById(Long teacherId, Long assignmentId) {
         Assignment target = assignmentMapper.selectById(assignmentId);
         if (!Objects.equals(target.getTeacherId(), teacherId))
             throw MyException.create(HttpStatus.INTERNAL_SERVER_ERROR, "无权限删除");
 
         try {
+            List<Engagement> engagements = studentAssignmentMapper.findEngagementByAssignmentId(assignmentId);
+            for(Engagement engagement : engagements) {
+                studentAssignmentMapper.delete(engagement.getStudentId(), assignmentId);
+            }
             int code = assignmentMapper.deleteById(assignmentId);
-            if (code == 0)
+            if (code == 0) {
                 throw MyException.create(HttpStatus.INTERNAL_SERVER_ERROR, "删除作业错误");
+            }
         } catch (Exception e) {
             log.error(e.getMessage());
             throw MyException.create(HttpStatus.INTERNAL_SERVER_ERROR, "删除作业错误");

+ 54 - 11
src/main/java/com/njuzr/eaibackend/service/impl/CourseServiceImpl.java

@@ -9,13 +9,8 @@ import com.njuzr.eaibackend.dto.course.CourseUpdateDTO;
 import com.njuzr.eaibackend.dto.course.EnrollDTO;
 import com.njuzr.eaibackend.enums.Role;
 import com.njuzr.eaibackend.exception.MyException;
-import com.njuzr.eaibackend.mapper.CourseMapper;
-import com.njuzr.eaibackend.mapper.CourseStudentMapper;
-import com.njuzr.eaibackend.mapper.UserMapper;
-import com.njuzr.eaibackend.po.Course;
-import com.njuzr.eaibackend.po.Enrollment;
-import com.njuzr.eaibackend.po.MyUserDetails;
-import com.njuzr.eaibackend.po.User;
+import com.njuzr.eaibackend.mapper.*;
+import com.njuzr.eaibackend.po.*;
 import com.njuzr.eaibackend.service.CourseService;
 import com.njuzr.eaibackend.utils.ConvertUtil;
 import com.njuzr.eaibackend.utils.ModelMapperUtil;
@@ -27,6 +22,7 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
@@ -50,11 +46,17 @@ public class CourseServiceImpl implements CourseService {
 
     private final CourseStudentMapper courseStudentMapper;
 
+    private final AssignmentMapper assignmentMapper;
+
+    private final StudentAssignmentMapper studentAssignmentMapper;
+
     @Autowired
-    public CourseServiceImpl(CourseMapper courseMapper, UserMapper userMapper, CourseStudentMapper courseStudentMapper) {
+    public CourseServiceImpl(CourseMapper courseMapper, UserMapper userMapper, CourseStudentMapper courseStudentMapper, AssignmentMapper assignmentMapper, StudentAssignmentMapper studentAssignmentMapper) {
         this.courseMapper = courseMapper;
         this.userMapper = userMapper;
         this.courseStudentMapper = courseStudentMapper;
+        this.assignmentMapper = assignmentMapper;
+        this.studentAssignmentMapper = studentAssignmentMapper;
     }
 
 
@@ -180,18 +182,36 @@ public class CourseServiceImpl implements CourseService {
      * @param courseId
      */
     @Override
+    @Transactional
     public void deleteById(MyUserDetails user, Long courseId) {
         Course course = courseMapper.selectById(courseId);
-        if (course == null)
+        if (course == null) {
             throw MyException.create(HttpStatus.BAD_REQUEST, "课程不存在");
+        }
 
-        if (user.getRole() != Role.ADMIN && !course.getTeacherIds().contains(String.valueOf(user.getId())))
+        if (user.getRole() != Role.ADMIN && !course.getTeacherIds().contains(String.valueOf(user.getId()))) {
             throw MyException.create(HttpStatus.BAD_REQUEST, "无权限删除");
+        }
 
         try {
+            // 首先找到选了该课程的所有学生
+            List<User> students = courseStudentMapper.selectStudentsByCourseId(courseId);
+            // 所有学生执行退课操作
+            for(User student : students) {
+                dropCourse(student.getId(), courseId);
+            }
+            // 删除该课程下的所有assignment信息
+            QueryWrapper<Assignment> wrapper = new QueryWrapper<>();
+            wrapper.eq("course_id", courseId);
+            List<Assignment> assignments = assignmentMapper.selectList(wrapper);
+            for(Assignment assignment : assignments) {
+                assignmentMapper.deleteById(assignment.getAssignmentId());
+            }
+            // 删除课程信息
             int code = courseMapper.deleteById(courseId);
-            if (code == 0)
+            if (code == 0) {
                 throw MyException.create(HttpStatus.INTERNAL_SERVER_ERROR, "删除课程失败");
+            }
         } catch (Exception e) {
             log.error(e.getMessage());
             throw MyException.create(HttpStatus.INTERNAL_SERVER_ERROR, "删除课程失败");
@@ -249,6 +269,29 @@ public class CourseServiceImpl implements CourseService {
         return courseMapper.getEnrollCodeByCourseId(courseId);
     }
 
+    /**
+     * 学生退课
+     * @param studentId
+     * @param courseId
+     */
+    @Override
+    @Transactional
+    public void dropCourse(Long studentId, Long courseId) {
+        // 首先找到该课程的所有作业信息
+        QueryWrapper<Assignment> wrapper = new QueryWrapper<>();
+        wrapper.eq("course_id", courseId);
+        List<Assignment> assignments = assignmentMapper.selectList(wrapper);
+        // 删除学生的所有作业记录
+        for(Assignment assignment : assignments) {
+            studentAssignmentMapper.delete(studentId, assignment.getAssignmentId());
+        }
+        // 学生退课
+        int code = courseStudentMapper.dropCourse(studentId, courseId);
+        if (code == 0) {
+            throw MyException.create(HttpStatus.INTERNAL_SERVER_ERROR, "退课失败");
+        }
+    }
+
     /**
      * 将DTO转换成PO
      * @param courseDTO

+ 3 - 3
src/main/resources/application-dev.yaml

@@ -12,9 +12,9 @@ spring:
       uri: mongodb://admin:eai123456@139.196.252.184:27017/eai?authSource=admin
       authentication-database: admin
     redis:
-      host: localhost
-      port: 6379
-      password:
+      host: 139.196.252.184
+      port: 6378
+      password: eai123456
   mail:
     host: smtp.163.com
     port: 25

+ 6 - 0
src/main/resources/mapper/CourseStudentMapper.xml

@@ -20,4 +20,10 @@
         FROM student_assignment
         WHERE student_id = #{studentId} AND assignment_id = #{assignmentId}
     </select>
+
+    <delete id="dropCourse">
+        DELETE
+        FROM course_student
+        WHERE student_id = #{studentId} AND course_id = #{courseId}
+    </delete>
 </mapper>

+ 5 - 0
src/main/resources/mapper/StudentAssignmentMapper.xml

@@ -14,4 +14,9 @@
         WHERE assignment_id = #{assignmentId}
     </select>
 
+    <delete id="delete">
+        DELETE FROM student_assignment
+        WHERE student_id = #{studentId} AND assignment_id = #{assignmentId}
+    </delete>
+
 </mapper>