Просмотр исходного кода

refactor: 使用切面重构发送系统消息,从业务代码中剥离

ChenSiTong 6 лет назад
Родитель
Сommit
18e2b20f41

+ 30 - 34
src/main/java/nju/seec/helper/aspect/event/EventAspect.java

@@ -20,6 +20,7 @@ import java.time.LocalDateTime;
 import java.util.Collections;
 import java.util.Map;
 import java.util.Objects;
+import java.util.stream.Stream;
 
 /**
  * @author cst
@@ -34,42 +35,37 @@ public class EventAspect {
         this.eventHandleMap = ImmutableMap.of(
                 EventType.LESSON, ImmutableMap.of(
                         EventAction.PARTICIPATE, ((joinPoint, user) -> {
-                            Object[] args = joinPoint.getArgs();
-                            Long courseId = null;
-                            for (Object arg : args) {
-                                if (arg instanceof Long) {
-                                    courseId = (Long) arg;
-                                    break;
-                                }
-                            }
-                            eventApi.reportEvent(eventApi.createParticipateClassEventDTO(String.valueOf(user.getPid()), LocalDateTime.now(), courseDAO.findCourseById(courseId)));
-                        })),
-                EventType.POST, ImmutableMap.of(
+                            Stream.of(joinPoint.getArgs())
+                                    .filter(o -> o instanceof Long)
+                                    .map(o -> (Long) o)
+                                    .findFirst()
+                                    .ifPresent(courseId ->
+                                            eventApi.reportEvent(eventApi.createParticipateClassEventDTO(String.valueOf(user.getPid()), LocalDateTime.now(), courseDAO.findCourseById(courseId)))
+                                    )
+                            ;
+                        }))
+                , EventType.POST, ImmutableMap.of(
                         EventAction.INITIATE, ((joinPoint, user) -> {
-                            Object[] args = joinPoint.getArgs();
-                            CommentDTO commentDTO = null;
-                            for (Object arg : args) {
-                                if (arg instanceof CommentDTO) {
-                                    commentDTO = (CommentDTO) arg;
-                                    break;
-                                }
-                            }
-                            eventApi.reportEvent(eventApi.createInitPostEventDTO(String.valueOf(user.getPid()), LocalDateTime.now(), Objects.requireNonNull(commentDTO).getTitle()));
-                        })
-                ),
-                EventType.QUIZ, ImmutableMap.of(
+                            Stream.of(joinPoint.getArgs())
+                                    .filter(o -> o instanceof CommentDTO)
+                                    .map(o -> (CommentDTO) o)
+                                    .findFirst()
+                                    .ifPresent(commentDTO ->
+                                            eventApi.reportEvent(eventApi.createInitPostEventDTO(String.valueOf(user.getPid()), LocalDateTime.now(), Objects.requireNonNull(commentDTO).getTitle()))
+                                    )
+                            ;
+                        }))
+                , EventType.QUIZ, ImmutableMap.of(
                         EventAction.COMPLETE, ((joinPoint, user) -> {
-                            Object[] args = joinPoint.getArgs();
-                            Long quizId = null;
-                            for (Object arg : args) {
-                                if (arg instanceof Long) {
-                                    quizId = (Long) arg;
-                                    break;
-                                }
-                            }
-                            eventApi.reportEvent(eventApi.createCompleteQuizEventDTO(String.valueOf(user.getPid()), LocalDateTime.now(), quizDAO.findQuizById(quizId)));
-                        })
-                )
+                            Stream.of(joinPoint.getArgs())
+                                    .filter(o -> o instanceof Long)
+                                    .map(o -> (Long) o)
+                                    .findFirst()
+                                    .ifPresent(quizId ->
+                                            eventApi.reportEvent(eventApi.createCompleteQuizEventDTO(String.valueOf(user.getPid()), LocalDateTime.now(), quizDAO.findQuizById(quizId)))
+                                    )
+                            ;
+                        }))
         );
     }
 

+ 15 - 0
src/main/java/nju/seec/helper/aspect/message/Message.java

@@ -0,0 +1,15 @@
+package nju.seec.helper.aspect.message;
+
+import nju.seec.helper.enums.MessageType;
+
+import java.lang.annotation.*;
+
+/**
+ * @author cst
+ */
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface Message {
+    MessageType value();
+}

+ 128 - 0
src/main/java/nju/seec/helper/aspect/message/MessageAspect.java

@@ -0,0 +1,128 @@
+package nju.seec.helper.aspect.message;
+
+import com.google.common.collect.ImmutableMap;
+import nju.seec.helper.dao.*;
+import nju.seec.helper.dto.reply.ReplyDTO;
+import nju.seec.helper.entity.Comment;
+import nju.seec.helper.entity.Course;
+import nju.seec.helper.entity.Quiz;
+import nju.seec.helper.entity.Slide;
+import nju.seec.helper.enums.MessageType;
+import nju.seec.helper.enums.QuizState;
+import nju.seec.helper.enums.SlideState;
+import nju.seec.helper.service.MessageService;
+import nju.seec.helper.vo.CommentVO;
+import nju.seec.helper.vo.NoticeVO;
+import nju.seec.helper.vo.quiz.QuizVO;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.AfterReturning;
+import org.aspectj.lang.annotation.Aspect;
+import org.springframework.stereotype.Component;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Stream;
+
+/**
+ * @author cst
+ */
+@Component
+@Aspect
+public class MessageAspect {
+    private final Map<MessageType, MessageCreator> messageCreatorMap;
+
+    public MessageAspect(CourseDAO courseDAO, SlideDAO slideDAO, QuizDAO quizDAO, CommentDAO commentDAO, ChooseDAO chooseDAO, MessageService messageService) {
+        messageCreatorMap = ImmutableMap.<MessageType, MessageCreator>builder()
+                .put(MessageType.SLIDE_IN_CLASS, ((joinPoint, object) -> {
+                    Object[] args = joinPoint.getArgs();
+                    Stream.of(args)
+                            .filter(o -> o instanceof Long)
+                            .map(o -> (Long) o)
+                            .findFirst()
+                            .ifPresent(slideId -> {
+                                Slide slide = slideDAO.findSlideById(slideId);
+                                if (slide.getState() == SlideState.IN_CLASS) {
+                                    Set<Long> studentIds = chooseDAO.findStudentIdsByCourseId(slide.getCourse().getId());
+                                    messageService.createMessage(studentIds, MessageType.SLIDE_IN_CLASS, String.format("[%s] - [%s] 已开课", slide.getCourse().getName(), slide.getName()), slide.getId());
+                                }
+                            });
+                }))
+                .put(MessageType.COMMENT_NEW, (joinPoint, object) -> {
+                    if (object instanceof CommentVO) {
+                        CommentVO commentVO = (CommentVO) object;
+                        Slide slide = slideDAO.findSlideById(commentVO.getSlideId());
+                        messageService.createMessage(Collections.singleton(slide.getTeacher().getId()), MessageType.COMMENT_NEW, String.format("[%s] - [%s] 在第%d页有新评论", slide.getCourse().getName(), slide.getName(), commentVO.getPageNumber()), slide.getId());
+                    }
+                })
+                .put(MessageType.COMMENT_REPLY, (joinPoint, object) -> {
+                    Stream.of(joinPoint.getArgs())
+                            .filter(o -> o instanceof ReplyDTO)
+                            .map(o -> (ReplyDTO) o)
+                            .findFirst()
+                            .ifPresent(replyDTO -> {
+                                Comment comment = commentDAO.findCommentById(replyDTO.getCommentId());
+                                Slide slide = slideDAO.findSlideById(comment.getSlideId());
+                                messageService.createMessage(Collections.singleton(comment.getUser().getId()), MessageType.COMMENT_REPLY, String.format("您在 [%s] - [%s] 第%d页发表的讨论帖已收到回复", slide.getCourse().getName(), slide.getName(), comment.getPageNumber()), slide.getId());
+                            })
+                    ;
+                })
+                .put(MessageType.NOTICE_NEW, (joinPoint, object) -> {
+                    if (object instanceof NoticeVO) {
+                        NoticeVO noticeVO = (NoticeVO) object;
+                        Set<Long> studentIds = chooseDAO.findStudentIdsByCourseId(noticeVO.getCourseId());
+                        Course course = courseDAO.findCourseById(noticeVO.getCourseId());
+                        messageService.createMessage(studentIds, MessageType.NOTICE_NEW, String.format("[%s] 发布了新公告", course.getName()), course.getId());
+                    }
+                })
+                .put(MessageType.QUIZ_NEW, new MessageCreator() {
+                    @Override
+                    public void createMessage(JoinPoint joinPoint, Object object) {
+
+                        if (object instanceof QuizVO) {
+                            sendMessages(quizDAO.findQuizById(((QuizVO) object).getId()));
+                        } else {
+                            Stream.of(joinPoint.getArgs())
+                                    .filter(o -> o instanceof Slide)
+                                    .map(o -> (Slide) o)
+                                    .findFirst()
+                                    .ifPresent(slide -> {
+                                        List<Quiz> quizzes = quizDAO.findBySlide(slide);
+                                        quizzes.forEach(this::sendMessages);
+                                    })
+                            ;
+                        }
+                    }
+
+                    private void sendMessages(Quiz quiz) {
+                        Slide slide = quiz.getSlide();
+                        Course course = slide.getCourse();
+                        Set<Long> chooseStudentIds = chooseDAO.findStudentIdsByCourseId(course.getId());
+                        if (quiz.getState() == QuizState.ONGOING) {
+                            messageService.createMessage(chooseStudentIds, MessageType.QUIZ_NEW, String.format("[%s] - [%s] 的测试 [%s] 已开放", course.getName(), slide.getName(), quiz.getName()), quiz.getId());
+                        }
+                    }
+                })
+                .build();
+    }
+
+    @AfterReturning(value = "@annotation(message)", returning = "object")
+    public void createMessage(JoinPoint joinPoint, Message message, Object object) {
+        messageCreatorMap.getOrDefault(message.value(), doNothing).createMessage(joinPoint, object);
+    }
+
+    @FunctionalInterface
+    interface MessageCreator {
+        /**
+         * 创建消息
+         *
+         * @param joinPoint
+         * @param object
+         */
+        void createMessage(JoinPoint joinPoint, Object object);
+    }
+
+    private final MessageCreator doNothing = ((joinPoint, object) -> {
+    });
+}

+ 12 - 0
src/main/java/nju/seec/helper/aspect/record/ExerciseRecord.java

@@ -0,0 +1,12 @@
+package nju.seec.helper.aspect.record;
+
+import java.lang.annotation.*;
+
+/**
+ * @author cst
+ */
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface ExerciseRecord {
+}

+ 54 - 0
src/main/java/nju/seec/helper/aspect/record/ExerciseRecordAspect.java

@@ -0,0 +1,54 @@
+package nju.seec.helper.aspect.record;
+
+import com.google.common.collect.Lists;
+import nju.seec.helper.api.bok.RecordApi;
+import nju.seec.helper.api.bok.dto.RecordDTO;
+import nju.seec.helper.api.dataanalysis.ExerciseApi;
+import nju.seec.helper.api.dataanalysis.dto.ExerciseRecordDTO;
+import nju.seec.helper.aspect.auth.LoginUser;
+import nju.seec.helper.dto.quiz.QuizStudentAnswerDTO;
+import nju.seec.helper.vo.quiz.QuizStudentAnswerVO;
+import org.aspectj.lang.annotation.AfterReturning;
+import org.aspectj.lang.annotation.Aspect;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author cst
+ */
+@Aspect
+@Component
+@Order(2)
+public class ExerciseRecordAspect {
+    private final ExerciseApi exerciseApi;
+    private final RecordApi recordApi;
+
+    public ExerciseRecordAspect(ExerciseApi exerciseApi, RecordApi recordApi) {
+        this.exerciseApi = exerciseApi;
+        this.recordApi = recordApi;
+    }
+
+    @AfterReturning(value = "@annotation(exerciseRecord) && args(user,..,quizStudentAnswerDTO)", returning = "quizStudentAnswerVO", argNames = "exerciseRecord,user,quizStudentAnswerDTO,quizStudentAnswerVO")
+    public void reportExerciseRecordEvent(ExerciseRecord exerciseRecord, LoginUser user, QuizStudentAnswerDTO quizStudentAnswerDTO, QuizStudentAnswerVO quizStudentAnswerVO) {
+        String userId = String.valueOf(user.getPid());
+        Map<String, QuizStudentAnswerVO.QuestionStudentAnswerInfo> questionStudentAnswerInfoMap = quizStudentAnswerVO.getAnswers();
+        int size = quizStudentAnswerDTO.getRecords().size();
+        List<ExerciseRecordDTO> exerciseRecords = Lists.newArrayListWithExpectedSize(size);
+        List<RecordDTO> records = Lists.newArrayListWithExpectedSize(size);
+
+        quizStudentAnswerDTO
+                .getRecords()
+                .forEach((key, value) -> {
+                    QuizStudentAnswerVO.QuestionStudentAnswerInfo studentAnswerInfo = questionStudentAnswerInfoMap.get(key);
+                    Boolean pass = studentAnswerInfo.getCorrect();
+                    Object answer = studentAnswerInfo.getAnswer();
+                    exerciseRecords.add(exerciseApi.createExerciseRecordDTO(userId, key, value.getStartAt(), value.getEndAt(), pass));
+                    records.add(recordApi.createRecordDTO(userId, key, answer, pass, value.getStartAt(), value.getEndAt()));
+                });
+        exerciseApi.reportExercise(exerciseRecords);
+        recordApi.reportUserRecord(records);
+    }
+}

+ 1 - 1
src/main/java/nju/seec/helper/controller/QuizController.java

@@ -5,7 +5,7 @@ import nju.seec.helper.api.dataanalysis.constant.EventType;
 import nju.seec.helper.aspect.auth.Auth;
 import nju.seec.helper.aspect.auth.LoginUser;
 import nju.seec.helper.aspect.event.Event;
-import nju.seec.helper.aspect.event.ExerciseRecord;
+import nju.seec.helper.aspect.record.ExerciseRecord;
 import nju.seec.helper.controller.response.PageResponse;
 import nju.seec.helper.dto.groups.Create;
 import nju.seec.helper.dto.groups.Modify;

+ 2 - 6
src/main/java/nju/seec/helper/service/impl/CommentServiceImpl.java

@@ -1,6 +1,7 @@
 package nju.seec.helper.service.impl;
 
 import nju.seec.helper.aspect.auth.LoginUser;
+import nju.seec.helper.aspect.message.Message;
 import nju.seec.helper.dao.CommentDAO;
 import nju.seec.helper.dao.SlideDAO;
 import nju.seec.helper.dao.UserDAO;
@@ -18,7 +19,6 @@ import org.springframework.data.domain.Pageable;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.Collections;
 import java.util.stream.Collectors;
 
 /**
@@ -39,6 +39,7 @@ public class CommentServiceImpl implements CommentService {
         this.messageService = messageService;
     }
 
+    @Message(MessageType.COMMENT_NEW)
     @Transactional(rollbackFor = Exception.class)
     @Override
     public CommentVO createComment(LoginUser user, CommentDTO commentDTO) {
@@ -53,11 +54,6 @@ public class CommentServiceImpl implements CommentService {
                         .setContent(commentDTO.getContent())
         );
 
-        // 增加通知
-        if (!user.getId().equals(slide.getTeacher().getId())) {
-            messageService.createMessage(Collections.singleton(slide.getTeacher().getId()), MessageType.COMMENT_NEW, String.format("[%s] - [%s] 在第%d页有新评论", slide.getCourse().getName(), slide.getName(), comment.getPageNumber()), slide.getId());
-        }
-
         return new CommentVO(comment);
     }
 

+ 2 - 4
src/main/java/nju/seec/helper/service/impl/NoticeServiceImpl.java

@@ -1,6 +1,7 @@
 package nju.seec.helper.service.impl;
 
 import nju.seec.helper.aspect.auth.LoginUser;
+import nju.seec.helper.aspect.message.Message;
 import nju.seec.helper.dao.ChooseDAO;
 import nju.seec.helper.dao.CourseDAO;
 import nju.seec.helper.dao.NoticeDAO;
@@ -18,8 +19,6 @@ import org.springframework.data.domain.Pageable;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.Set;
-
 /**
  * @author cst
  */
@@ -38,6 +37,7 @@ public class NoticeServiceImpl implements NoticeService {
         this.messageService = messageService;
     }
 
+    @Message(MessageType.NOTICE_NEW)
     @Transactional(rollbackFor = Exception.class)
     @Override
     public NoticeVO createNotice(LoginUser user, NoticeDTO noticeDTO) {
@@ -53,8 +53,6 @@ public class NoticeServiceImpl implements NoticeService {
             throw HelperException.of(ExceptionType.FORBIDDEN, "您无权创建该公告");
         }
 
-        Set<Long> studentIds = chooseDAO.findStudentIdsByCourseId(noticeDTO.getCourseId());
-        messageService.createMessage(studentIds, MessageType.NOTICE_NEW, String.format("[%s] 发布了新公告", course.getName()), course.getId());
         return new NoticeVO(noticeDAO.save(notice));
     }
 

+ 7 - 18
src/main/java/nju/seec/helper/service/impl/QuizServiceImpl.java

@@ -3,9 +3,9 @@ package nju.seec.helper.service.impl;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import nju.seec.helper.aspect.auth.LoginUser;
+import nju.seec.helper.aspect.message.Message;
 import nju.seec.helper.dao.*;
 import nju.seec.helper.dto.quiz.QuizDTO;
-import nju.seec.helper.entity.Course;
 import nju.seec.helper.entity.Quiz;
 import nju.seec.helper.entity.Slide;
 import nju.seec.helper.enums.*;
@@ -78,6 +78,7 @@ public class QuizServiceImpl implements QuizService {
             )
     );
 
+    @Message(MessageType.QUIZ_NEW)
     @Transactional(rollbackFor = Exception.class)
     @Override
     public QuizVO createQuiz(LoginUser user, QuizDTO quizDTO) {
@@ -99,13 +100,13 @@ public class QuizServiceImpl implements QuizService {
 
         try {
             quiz = quizDAO.save(quiz);
-            sendMessages(quiz);
             return new QuizVO(quiz);
         } catch (DataIntegrityViolationException e) {
             throw HelperException.of(ExceptionType.CONFLICT, "创建失败,请检查测试信息是否正确且不与已有测试冲突");
         }
     }
 
+    @Message(MessageType.QUIZ_NEW)
     @Transactional(rollbackFor = Exception.class)
     @Override
     public QuizVO modifyQuiz(LoginUser user, Long quizId, QuizDTO quizDTO) {
@@ -126,7 +127,6 @@ public class QuizServiceImpl implements QuizService {
                     .setName(quizDTO.getName())
                     .setMaxSubmitNumber(quizDTO.getMaxSubmitTime())
                     .setQuestions(quizDTO.getQuestions()));
-            sendMessages(quiz);
             return new QuizVO(quiz);
         } catch (DataIntegrityViolationException e) {
             throw HelperException.of(ExceptionType.CONFLICT, "修改失败,请检查测试信息是否正确且不与已有测试冲突");
@@ -184,23 +184,12 @@ public class QuizServiceImpl implements QuizService {
         return new QuizVO(quiz);
     }
 
+    @Message(MessageType.QUIZ_NEW)
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void modifyQuizState(Slide slide) {
         List<Quiz> quizzes = quizDAO.findBySlide(slide);
-        quizzes.forEach(quiz -> {
-            quiz.setState(MAP.get(slide.getState()).get(quiz.getType()));
-            sendMessages(quiz);
-        });
-    }
-
-    private void sendMessages(Quiz quiz) {
-        Slide slide = quiz.getSlide();
-        Course course = slide.getCourse();
-        Set<Long> chooseStudentIds = chooseDAO.findStudentIdsByCourseId(course.getId());
-        if (quiz.getState() == QuizState.ONGOING) {
-            messageService.createMessage(chooseStudentIds, MessageType.QUIZ_NEW, String.format("[%s] - [%s] 的测试 [%s] 已开放", course.getName(), slide.getName(), quiz.getName()), quiz.getId());
-        }
+        quizzes.forEach(quiz -> quiz.setState(MAP.get(slide.getState()).get(quiz.getType())));
     }
 
     @Override
@@ -220,7 +209,7 @@ public class QuizServiceImpl implements QuizService {
 
     @Override
     public boolean existsGetAuth(LoginUser user, Quiz quiz) {
-        return quiz.getState() != QuizState.NOT_STARTED
-                || user.getRole() == UserRole.TEACHER;
+        return user.getRole() == UserRole.TEACHER
+                || !STATES_NOT_GET_BY_STUDENT_SET.contains(quiz.getState());
     }
 }

+ 2 - 9
src/main/java/nju/seec/helper/service/impl/ReplyServiceImpl.java

@@ -2,6 +2,7 @@ package nju.seec.helper.service.impl;
 
 import lombok.extern.slf4j.Slf4j;
 import nju.seec.helper.aspect.auth.LoginUser;
+import nju.seec.helper.aspect.message.Message;
 import nju.seec.helper.dao.CommentDAO;
 import nju.seec.helper.dao.ReplyDAO;
 import nju.seec.helper.dao.SlideDAO;
@@ -9,7 +10,6 @@ import nju.seec.helper.dao.UserDAO;
 import nju.seec.helper.dto.reply.ReplyDTO;
 import nju.seec.helper.entity.Comment;
 import nju.seec.helper.entity.Reply;
-import nju.seec.helper.entity.Slide;
 import nju.seec.helper.enums.ExceptionType;
 import nju.seec.helper.enums.MessageType;
 import nju.seec.helper.exception.HelperException;
@@ -19,8 +19,6 @@ import nju.seec.helper.vo.ReplyVO;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.Collections;
-
 /**
  * @author cst
  */
@@ -42,6 +40,7 @@ public class ReplyServiceImpl implements ReplyService {
         this.messageService = messageService;
     }
 
+    @Message(MessageType.COMMENT_REPLY)
     @Transactional(rollbackFor = Exception.class)
     @Override
     public ReplyVO createReply(LoginUser user, ReplyDTO replyDTO) {
@@ -61,12 +60,6 @@ public class ReplyServiceImpl implements ReplyService {
         comment.setReply(reply);
         reply = replyDAO.save(reply);
 
-        // 增加通知
-        if (!user.getId().equals(comment.getUser().getId())) {
-            Slide slide = slideDAO.findSlideById(comment.getSlideId());
-            messageService.createMessage(Collections.singleton(comment.getUser().getId()), MessageType.COMMENT_REPLY, String.format("您在 [%s] - [%s] 第%d页发表的讨论帖已收到回复", slide.getCourse().getName(), slide.getName(), comment.getPageNumber()), slide.getId());
-        }
-
         return new ReplyVO(reply);
     }
 

+ 4 - 7
src/main/java/nju/seec/helper/service/impl/SlideServiceImpl.java

@@ -4,6 +4,7 @@ import cn.hutool.core.util.StrUtil;
 import com.google.common.collect.ImmutableSet;
 import lombok.SneakyThrows;
 import nju.seec.helper.aspect.auth.LoginUser;
+import nju.seec.helper.aspect.message.Message;
 import nju.seec.helper.dao.ChooseDAO;
 import nju.seec.helper.dao.CourseDAO;
 import nju.seec.helper.dao.SlideDAO;
@@ -131,6 +132,7 @@ public class SlideServiceImpl implements SlideService {
         }
     }
 
+    @Message(MessageType.SLIDE_IN_CLASS)
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void modifySlideState(LoginUser user, Long slideId, SlideStateDTO slideStateDTO) {
@@ -143,12 +145,6 @@ public class SlideServiceImpl implements SlideService {
         slide.setState(slideStateDTO.getState());
         slide = slideDAO.save(slide);
 
-        // 增加通知
-        if (slide.getState() == SlideState.IN_CLASS) {
-            Set<Long> studentIds = chooseDAO.findStudentIdsByCourseId(slide.getCourse().getId());
-            messageService.createMessage(studentIds, MessageType.SLIDE_IN_CLASS, String.format("[%s] - [%s] 已开课", slide.getCourse().getName(), slide.getName()), slide.getId());
-        }
-
         // 修改Slide状态同时推进quiz状态
         quizService.modifyQuizState(slide);
     }
@@ -268,6 +264,7 @@ public class SlideServiceImpl implements SlideService {
 
     @Override
     public boolean existsGetAuth(LoginUser user, Slide slide) {
-        return courseService.existsGetAuth(user, courseDAO.findCourseById(slide.getCourse().getId()));
+        return slide.getCourse().getTeacher().getId().equals(user.getId())
+                || (!STATES_NOT_GET_BY_STUDENT_SET.contains(slide.getState()) && chooseDAO.existsByStudentIdAndCourseId(user.getId(), slide.getCourse().getId()));
     }
 }