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

feat: 增加消息模块,通知学生上课功能

ChenSiTong 6 лет назад
Родитель
Сommit
4499bc2a75

+ 57 - 0
src/main/java/nju/seec/helper/controller/MessageController.java

@@ -0,0 +1,57 @@
+package nju.seec.helper.controller;
+
+import nju.seec.helper.aspect.auth.Auth;
+import nju.seec.helper.controller.response.PageResponse;
+import nju.seec.helper.dto.LoginUser;
+import nju.seec.helper.dto.MessageDTO;
+import nju.seec.helper.entity.Message;
+import nju.seec.helper.service.MessageService;
+import nju.seec.helper.util.enums.UserType;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.web.PageableDefault;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+
+/**
+ * @author cst
+ */
+@RestController
+@RequestMapping("/api/message")
+public class MessageController {
+    private final MessageService messageService;
+
+    public MessageController(MessageService messageService) {
+        this.messageService = messageService;
+    }
+
+    @Auth(roles = {UserType.TEACHER, UserType.STUDENT}, message = "设置已读")
+    @PutMapping("/read")
+    public void readMessages(LoginUser user,
+                             @Valid @RequestBody MessageDTO messageDTO) {
+        messageService.readMessages(user, messageDTO);
+    }
+
+    @Auth(roles = {UserType.TEACHER, UserType.STUDENT}, message = "删除消息")
+    @PutMapping("/delete")
+    public void deleteMessages(LoginUser user,
+                               @Valid @RequestBody MessageDTO messageDTO) {
+        messageService.deleteMessages(user, messageDTO);
+    }
+
+    @Auth(roles = {UserType.TEACHER, UserType.STUDENT}, message = "获取未读消息")
+    @GetMapping("/unread")
+    public PageResponse<Message> getUnreadMessages(LoginUser user,
+                                                   @RequestParam(required = false, defaultValue = "") String key,
+                                                   @PageableDefault(Integer.MAX_VALUE) Pageable pageable) {
+        return PageResponse.of(messageService.getUnreadMessages(user, key, pageable));
+    }
+
+    @Auth(roles = {UserType.TEACHER, UserType.STUDENT}, message = "获取已读消息")
+    @GetMapping("/read")
+    public PageResponse<Message> getReadMessages(LoginUser user,
+                                                 @RequestParam(required = false, defaultValue = "") String key,
+                                                 @PageableDefault(Integer.MAX_VALUE) Pageable pageable) {
+        return PageResponse.of(messageService.getReadMessages(user, key, pageable));
+    }
+}

+ 9 - 0
src/main/java/nju/seec/helper/dao/ChooseDAO.java

@@ -39,4 +39,13 @@ public interface ChooseDAO extends JpaRepository<Choose, Integer> {
      */
      */
     @Query("select distinct choose.courseId from Choose choose where choose.studentId=?1")
     @Query("select distinct choose.courseId from Choose choose where choose.studentId=?1")
     Set<Integer> findCourseIdsByStudentId(Integer studentId);
     Set<Integer> findCourseIdsByStudentId(Integer studentId);
+
+    /**
+     * 查询课程的选课学生
+     *
+     * @param courseId
+     * @return
+     */
+    @Query("select distinct c.studentId from Choose c where c.courseId=?1")
+    Set<Integer> findStudentIdsByCourseId(Integer courseId);
 }
 }

+ 56 - 0
src/main/java/nju/seec/helper/dao/MessageDAO.java

@@ -0,0 +1,56 @@
+package nju.seec.helper.dao;
+
+import nju.seec.helper.entity.Message;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Set;
+
+/**
+ * @author cst
+ */
+@Repository
+public interface MessageDAO extends JpaRepository<Message, Integer> {
+    /**
+     * 更新消息已读
+     *
+     * @param toUserId
+     * @param messageIds
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Modifying
+    @Query("update Message m " +
+            "set m.read=true " +
+            "where m.toUserId=?1 " +
+            "and m.id in ?2 ")
+    void updateRead(Integer toUserId, Set<Integer> messageIds);
+
+    /**
+     * 删除消息
+     *
+     * @param toUserId
+     * @param messageIds
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Modifying
+    @Query("delete from Message m " +
+            "where m.toUserId=?1 " +
+            "and m.id in ?2 ")
+    void delete(Integer toUserId, Set<Integer> messageIds);
+
+    /**
+     * 获取消息
+     *
+     * @param toUserId
+     * @param read
+     * @param key
+     * @param pageable
+     * @return
+     */
+    Page<Message> findByToUserIdAndReadAndContentContains(Integer toUserId, Boolean read, String key, Pageable pageable);
+}

+ 15 - 0
src/main/java/nju/seec/helper/dto/MessageDTO.java

@@ -0,0 +1,15 @@
+package nju.seec.helper.dto;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import java.util.Set;
+
+/**
+ * @author cst
+ */
+@Data
+public class MessageDTO {
+    @NotEmpty
+    private Set<Integer> ids;
+}

+ 43 - 0
src/main/java/nju/seec/helper/entity/Message.java

@@ -0,0 +1,43 @@
+package nju.seec.helper.entity;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+import nju.seec.helper.util.enums.MessageType;
+import org.hibernate.annotations.CreationTimestamp;
+
+import javax.persistence.*;
+import java.time.LocalDateTime;
+
+/**
+ * @author cst
+ */
+@Data
+@Accessors(chain = true)
+@Entity
+@Table(name = "message")
+@Inheritance(strategy = InheritanceType.JOINED)
+public class Message {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Integer id;
+
+    @Enumerated(EnumType.STRING)
+    @Column(nullable = false)
+    private MessageType type;
+
+    @Column(name = "to_user_id", nullable = false)
+    private Integer toUserId;
+
+    @Column(name = "slide_id")
+    private Integer slideId;
+
+    @Column(nullable = false)
+    private String content;
+
+    @Column(name = "`read`", columnDefinition = "bit(1) default false not null")
+    private Boolean read = false;
+
+    @Column(name = "create_at", nullable = false, updatable = false)
+    @CreationTimestamp
+    private LocalDateTime createAt;
+}

+ 1 - 1
src/main/java/nju/seec/helper/entity/Reply.java

@@ -29,7 +29,7 @@ public class Reply {
     @Column(nullable = false)
     @Column(nullable = false)
     private String content;
     private String content;
 
 
-    @Column(name = "create_at", updatable = false)
+    @Column(name = "create_at", updatable = false, nullable = false)
     @CreationTimestamp
     @CreationTimestamp
     private LocalDateTime createAt;
     private LocalDateTime createAt;
 }
 }

+ 1 - 1
src/main/java/nju/seec/helper/entity/User.java

@@ -36,7 +36,7 @@ public class User {
     @Column(nullable = false)
     @Column(nullable = false)
     private String password;
     private String password;
 
 
-    @Column(name = "create_at", updatable = false)
+    @Column(name = "create_at", updatable = false, nullable = false)
     @CreationTimestamp
     @CreationTimestamp
     private LocalDateTime createAt;
     private LocalDateTime createAt;
 }
 }

+ 61 - 0
src/main/java/nju/seec/helper/service/MessageService.java

@@ -0,0 +1,61 @@
+package nju.seec.helper.service;
+
+import nju.seec.helper.dto.LoginUser;
+import nju.seec.helper.dto.MessageDTO;
+import nju.seec.helper.entity.Message;
+import nju.seec.helper.util.enums.MessageType;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+
+import java.util.Set;
+
+/**
+ * @author cst
+ */
+public interface MessageService {
+    /**
+     * 创建消息
+     *
+     * @param toUserIds
+     * @param type
+     * @param content
+     * @param slideId
+     */
+    void createMessage(Set<Integer> toUserIds, MessageType type, String content, Integer slideId);
+
+    /**
+     * 删除消息
+     *
+     * @param user
+     * @param messageDTO
+     */
+    void deleteMessages(LoginUser user, MessageDTO messageDTO);
+
+    /**
+     * 设置消息已阅
+     *
+     * @param user
+     * @param messageDTO
+     */
+    void readMessages(LoginUser user, MessageDTO messageDTO);
+
+    /**
+     * 取得未读消息
+     *
+     * @param user
+     * @param key
+     * @param pageable
+     * @return
+     */
+    Page<Message> getUnreadMessages(LoginUser user, String key, Pageable pageable);
+
+    /**
+     * 取得已读消息
+     *
+     * @param user
+     * @param key
+     * @param pageable
+     * @return
+     */
+    Page<Message> getReadMessages(LoginUser user, String key, Pageable pageable);
+}

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

@@ -5,7 +5,7 @@ import nju.seec.helper.dao.SlideDAO;
 import nju.seec.helper.dto.CommentDTO;
 import nju.seec.helper.dto.CommentDTO;
 import nju.seec.helper.dto.LoginUser;
 import nju.seec.helper.dto.LoginUser;
 import nju.seec.helper.entity.Comment;
 import nju.seec.helper.entity.Comment;
-import nju.seec.helper.service.AuthUtil;
+import nju.seec.helper.service.util.AuthUtils;
 import nju.seec.helper.service.CommentService;
 import nju.seec.helper.service.CommentService;
 import nju.seec.helper.vo.CommentVO;
 import nju.seec.helper.vo.CommentVO;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Page;
@@ -46,7 +46,7 @@ public class CommentServiceImpl implements CommentService {
     public void removeComment(LoginUser user, Integer commentId) {
     public void removeComment(LoginUser user, Integer commentId) {
         Comment comment = commentDAO.findCommentById(commentId);
         Comment comment = commentDAO.findCommentById(commentId);
 
 
-        AuthUtil.checkDataAuth(user.getId(), comment.getUserId(), "您无权删除该评论");
+        AuthUtils.checkDataAuth(user.getId(), comment.getUserId(), "您无权删除该评论");
 
 
         unTopComment(comment);
         unTopComment(comment);
         commentDAO.delete(comment);
         commentDAO.delete(comment);
@@ -57,7 +57,7 @@ public class CommentServiceImpl implements CommentService {
     public void topComment(LoginUser user, Integer commentId) {
     public void topComment(LoginUser user, Integer commentId) {
         Comment comment = commentDAO.findCommentById(commentId);
         Comment comment = commentDAO.findCommentById(commentId);
 
 
-        AuthUtil.checkDataAuth(user.getId(), slideDAO.findSlideById(comment.getSlideId()).getTeacherId(), "您无权在该评论区置顶评论");
+        AuthUtils.checkDataAuth(user.getId(), slideDAO.findSlideById(comment.getSlideId()).getTeacherId(), "您无权在该评论区置顶评论");
 
 
         unTopComment(comment);
         unTopComment(comment);
         comment.setTopNumber(commentDAO.countTopComments(comment.getSlideId(), comment.getPageNumber()) + 1);
         comment.setTopNumber(commentDAO.countTopComments(comment.getSlideId(), comment.getPageNumber()) + 1);
@@ -69,7 +69,7 @@ public class CommentServiceImpl implements CommentService {
     public void unTopComment(LoginUser user, Integer commentId) {
     public void unTopComment(LoginUser user, Integer commentId) {
         Comment comment = commentDAO.findCommentById(commentId);
         Comment comment = commentDAO.findCommentById(commentId);
 
 
-        AuthUtil.checkDataAuth(user.getId(), slideDAO.findSlideById(comment.getSlideId()).getTeacherId(), "您无权在该评论区取消置顶评论");
+        AuthUtils.checkDataAuth(user.getId(), slideDAO.findSlideById(comment.getSlideId()).getTeacherId(), "您无权在该评论区取消置顶评论");
 
 
         unTopComment(comment);
         unTopComment(comment);
         commentDAO.save(comment);
         commentDAO.save(comment);

+ 5 - 5
src/main/java/nju/seec/helper/service/impl/CourseServiceImpl.java

@@ -8,9 +8,9 @@ import nju.seec.helper.dto.LoginUser;
 import nju.seec.helper.dto.ModifyCourseDTO;
 import nju.seec.helper.dto.ModifyCourseDTO;
 import nju.seec.helper.entity.Choose;
 import nju.seec.helper.entity.Choose;
 import nju.seec.helper.entity.Course;
 import nju.seec.helper.entity.Course;
-import nju.seec.helper.service.AuthUtil;
+import nju.seec.helper.service.util.AuthUtils;
 import nju.seec.helper.service.CourseService;
 import nju.seec.helper.service.CourseService;
-import nju.seec.helper.service.RefreshUtils;
+import nju.seec.helper.service.util.RefreshUtils;
 import nju.seec.helper.util.EncryptUtils;
 import nju.seec.helper.util.EncryptUtils;
 import nju.seec.helper.util.enums.ExceptionType;
 import nju.seec.helper.util.enums.ExceptionType;
 import nju.seec.helper.util.exception.HelperException;
 import nju.seec.helper.util.exception.HelperException;
@@ -58,7 +58,7 @@ public class CourseServiceImpl implements CourseService {
         Course course = courseDAO.findCourseById(modifyCourseDTO.getId());
         Course course = courseDAO.findCourseById(modifyCourseDTO.getId());
 
 
         // 检查
         // 检查
-        AuthUtil.checkDataAuth(user.getId(), course.getTeacherId(), "您无权修改该课程");
+        AuthUtils.checkDataAuth(user.getId(), course.getTeacherId(), "您无权修改该课程");
         checkSameCourseName(user.getId(), modifyCourseDTO.getName(), course.getId());
         checkSameCourseName(user.getId(), modifyCourseDTO.getName(), course.getId());
 
 
         course.setName(modifyCourseDTO.getName())
         course.setName(modifyCourseDTO.getName())
@@ -73,7 +73,7 @@ public class CourseServiceImpl implements CourseService {
     @Override
     @Override
     public void removeCourse(LoginUser user, Integer courseId) {
     public void removeCourse(LoginUser user, Integer courseId) {
         Course course = courseDAO.findCourseById(courseId);
         Course course = courseDAO.findCourseById(courseId);
-        AuthUtil.checkDataAuth(user.getId(), course.getTeacherId(), "您无权删除该课程");
+        AuthUtils.checkDataAuth(user.getId(), course.getTeacherId(), "您无权删除该课程");
 
 
         course.setDeleteAt(System.currentTimeMillis());
         course.setDeleteAt(System.currentTimeMillis());
         courseDAO.save(course);
         courseDAO.save(course);
@@ -134,7 +134,7 @@ public class CourseServiceImpl implements CourseService {
     @Override
     @Override
     public String getCourseCode(LoginUser user, Integer courseId) {
     public String getCourseCode(LoginUser user, Integer courseId) {
         Course course = courseDAO.findCourseById(courseId);
         Course course = courseDAO.findCourseById(courseId);
-        AuthUtil.checkDataAuth(user.getId(), course.getTeacherId(), "您无权查看该课程选课码");
+        AuthUtils.checkDataAuth(user.getId(), course.getTeacherId(), "您无权查看该课程选课码");
 
 
         return EncryptUtils.decode(course.getCode());
         return EncryptUtils.decode(course.getCode());
     }
     }

+ 66 - 0
src/main/java/nju/seec/helper/service/impl/MessageServiceImpl.java

@@ -0,0 +1,66 @@
+package nju.seec.helper.service.impl;
+
+import nju.seec.helper.dao.MessageDAO;
+import nju.seec.helper.dto.LoginUser;
+import nju.seec.helper.dto.MessageDTO;
+import nju.seec.helper.entity.Message;
+import nju.seec.helper.service.MessageService;
+import nju.seec.helper.util.enums.MessageType;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * @author cst
+ */
+@Service
+public class MessageServiceImpl implements MessageService {
+    private final MessageDAO messageDAO;
+
+    public MessageServiceImpl(MessageDAO messageDAO) {
+        this.messageDAO = messageDAO;
+    }
+
+    @Async
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void createMessage(Set<Integer> toUserIds, MessageType type, String content, Integer slideId) {
+        messageDAO.saveAll(
+                toUserIds.parallelStream()
+                        .map(toUserId -> new Message()
+                                .setToUserId(toUserId)
+                                .setType(type)
+                                .setContent(content)
+                                .setSlideId(slideId))
+                        .collect(Collectors.toSet()));
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void deleteMessages(LoginUser user, MessageDTO messageDTO) {
+        messageDAO.delete(user.getId(), messageDTO.getIds());
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void readMessages(LoginUser user, MessageDTO messageDTO) {
+        messageDAO.updateRead(user.getId(), messageDTO.getIds());
+    }
+
+    @Transactional(readOnly = true)
+    @Override
+    public Page<Message> getUnreadMessages(LoginUser user, String key, Pageable pageable) {
+        return messageDAO.findByToUserIdAndReadAndContentContains(user.getId(), false, key, pageable);
+    }
+
+    @Transactional(readOnly = true)
+    @Override
+    public Page<Message> getReadMessages(LoginUser user, String key, Pageable pageable) {
+        return messageDAO.findByToUserIdAndReadAndContentContains(user.getId(), true, key, pageable);
+    }
+}

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

@@ -8,7 +8,7 @@ import nju.seec.helper.dto.LoginUser;
 import nju.seec.helper.dto.ReplyDTO;
 import nju.seec.helper.dto.ReplyDTO;
 import nju.seec.helper.entity.Comment;
 import nju.seec.helper.entity.Comment;
 import nju.seec.helper.entity.Reply;
 import nju.seec.helper.entity.Reply;
-import nju.seec.helper.service.AuthUtil;
+import nju.seec.helper.service.util.AuthUtils;
 import nju.seec.helper.service.ReplyService;
 import nju.seec.helper.service.ReplyService;
 import nju.seec.helper.util.enums.ExceptionType;
 import nju.seec.helper.util.enums.ExceptionType;
 import nju.seec.helper.util.exception.HelperException;
 import nju.seec.helper.util.exception.HelperException;
@@ -36,7 +36,7 @@ public class ReplyServiceImpl implements ReplyService {
     @Override
     @Override
     public ReplyVO createReply(LoginUser user, ReplyDTO replyDTO) {
     public ReplyVO createReply(LoginUser user, ReplyDTO replyDTO) {
         Comment comment = commentDAO.findCommentById(replyDTO.getCommentId());
         Comment comment = commentDAO.findCommentById(replyDTO.getCommentId());
-        AuthUtil.checkDataAuth(user.getId(), slideDAO.findSlideById(comment.getSlideId()).getTeacherId(), "您无权回复该评论");
+        AuthUtils.checkDataAuth(user.getId(), slideDAO.findSlideById(comment.getSlideId()).getTeacherId(), "您无权回复该评论");
 
 
         if (comment.getReply() != null) {
         if (comment.getReply() != null) {
             throw HelperException.of(ExceptionType.FORBIDDEN, "您已回复该评论");
             throw HelperException.of(ExceptionType.FORBIDDEN, "您已回复该评论");
@@ -54,7 +54,7 @@ public class ReplyServiceImpl implements ReplyService {
     @Override
     @Override
     public void removeReply(LoginUser user, Integer replyId) {
     public void removeReply(LoginUser user, Integer replyId) {
         Reply reply = replyDAO.findReplyById(replyId);
         Reply reply = replyDAO.findReplyById(replyId);
-        AuthUtil.checkDataAuth(user.getId(), reply.getTeacherId(), "您无权回复该评论");
+        AuthUtils.checkDataAuth(user.getId(), reply.getTeacherId(), "您无权回复该评论");
 
 
         Comment comment = reply.getComment();
         Comment comment = reply.getComment();
         comment.setReply(null);
         comment.setReply(null);

+ 16 - 6
src/main/java/nju/seec/helper/service/impl/SlideServiceImpl.java

@@ -12,12 +12,14 @@ import nju.seec.helper.dto.SlideDTO;
 import nju.seec.helper.dto.SlideStateDTO;
 import nju.seec.helper.dto.SlideStateDTO;
 import nju.seec.helper.entity.Course;
 import nju.seec.helper.entity.Course;
 import nju.seec.helper.entity.Slide;
 import nju.seec.helper.entity.Slide;
-import nju.seec.helper.service.AuthUtil;
+import nju.seec.helper.service.MessageService;
 import nju.seec.helper.service.SlideService;
 import nju.seec.helper.service.SlideService;
+import nju.seec.helper.service.util.AuthUtils;
 import nju.seec.helper.util.CacheUtils;
 import nju.seec.helper.util.CacheUtils;
 import nju.seec.helper.util.Consts;
 import nju.seec.helper.util.Consts;
 import nju.seec.helper.util.FileUtils;
 import nju.seec.helper.util.FileUtils;
 import nju.seec.helper.util.enums.ExceptionType;
 import nju.seec.helper.util.enums.ExceptionType;
+import nju.seec.helper.util.enums.MessageType;
 import nju.seec.helper.util.enums.SlideState;
 import nju.seec.helper.util.enums.SlideState;
 import nju.seec.helper.util.exception.HelperException;
 import nju.seec.helper.util.exception.HelperException;
 import nju.seec.helper.vo.SlideVO;
 import nju.seec.helper.vo.SlideVO;
@@ -31,6 +33,7 @@ import org.springframework.web.multipart.MultipartFile;
 import java.io.InputStream;
 import java.io.InputStream;
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
 import java.util.Objects;
 import java.util.Objects;
+import java.util.Set;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeUnit;
 
 
 /**
 /**
@@ -47,12 +50,15 @@ public class SlideServiceImpl implements SlideService {
     private final FileUtils fileUtils;
     private final FileUtils fileUtils;
     private final CacheUtils cacheUtils;
     private final CacheUtils cacheUtils;
 
 
-    public SlideServiceImpl(CourseDAO courseDAO, SlideDAO slideDAO, ChooseDAO chooseDAO, FileUtils fileUtils, CacheUtils cacheUtils) {
+    private final MessageService messageService;
+
+    public SlideServiceImpl(CourseDAO courseDAO, SlideDAO slideDAO, ChooseDAO chooseDAO, FileUtils fileUtils, CacheUtils cacheUtils, MessageService messageService) {
         this.courseDAO = courseDAO;
         this.courseDAO = courseDAO;
         this.slideDAO = slideDAO;
         this.slideDAO = slideDAO;
         this.chooseDAO = chooseDAO;
         this.chooseDAO = chooseDAO;
         this.fileUtils = fileUtils;
         this.fileUtils = fileUtils;
         this.cacheUtils = cacheUtils;
         this.cacheUtils = cacheUtils;
+        this.messageService = messageService;
     }
     }
 
 
     @Transactional(rollbackFor = Exception.class)
     @Transactional(rollbackFor = Exception.class)
@@ -60,7 +66,7 @@ public class SlideServiceImpl implements SlideService {
     @Override
     @Override
     public SlideVO createSlide(LoginUser teacher, SlideDTO slideDTO) {
     public SlideVO createSlide(LoginUser teacher, SlideDTO slideDTO) {
         Course course = courseDAO.findCourseById(slideDTO.getCourseId());
         Course course = courseDAO.findCourseById(slideDTO.getCourseId());
-        AuthUtil.checkDataAuth(teacher.getId(), course.getTeacherId(), "您无权创建该课程的幻灯片");
+        AuthUtils.checkDataAuth(teacher.getId(), course.getTeacherId(), "您无权创建该课程的幻灯片");
 
 
         Slide slide = new Slide()
         Slide slide = new Slide()
                 .setCourseId(slideDTO.getCourseId())
                 .setCourseId(slideDTO.getCourseId())
@@ -97,7 +103,7 @@ public class SlideServiceImpl implements SlideService {
     @Override
     @Override
     public SlideVO modifySlide(LoginUser user, ModifySlideDTO modifySlideDTO) {
     public SlideVO modifySlide(LoginUser user, ModifySlideDTO modifySlideDTO) {
         Slide slide = slideDAO.findSlideById(modifySlideDTO.getId());
         Slide slide = slideDAO.findSlideById(modifySlideDTO.getId());
-        AuthUtil.checkDataAuth(user.getId(), slide.getTeacherId(), "您无权修改该幻灯片");
+        AuthUtils.checkDataAuth(user.getId(), slide.getTeacherId(), "您无权修改该幻灯片");
 
 
         slide.setName(modifySlideDTO.getName());
         slide.setName(modifySlideDTO.getName());
         slide = slideDAO.save(slide);
         slide = slideDAO.save(slide);
@@ -108,9 +114,13 @@ public class SlideServiceImpl implements SlideService {
     @Override
     @Override
     public void modifySlideState(LoginUser user, SlideStateDTO slideStateDTO) {
     public void modifySlideState(LoginUser user, SlideStateDTO slideStateDTO) {
         Slide slide = slideDAO.findSlideById(slideStateDTO.getId());
         Slide slide = slideDAO.findSlideById(slideStateDTO.getId());
-        AuthUtil.checkDataAuth(user.getId(), slide.getTeacherId(), "您无权修改该幻灯片状态");
+        AuthUtils.checkDataAuth(user.getId(), slide.getTeacherId(), "您无权修改该幻灯片状态");
 
 
         slide.setState(slideStateDTO.getState());
         slide.setState(slideStateDTO.getState());
+        if (slide.getState() == SlideState.IN_CLASS) {
+            Set<Integer> studentIds = chooseDAO.findStudentIdsByCourseId(slide.getCourseId());
+            messageService.createMessage(studentIds, MessageType.SLIDE_IN_CLASS, String.format("【%s】课程的【%s】已开课,请及时学习", slide.getCourseName(), slide.getName()), slide.getId());
+        }
         slideDAO.save(slide);
         slideDAO.save(slide);
     }
     }
 
 
@@ -118,7 +128,7 @@ public class SlideServiceImpl implements SlideService {
     @Override
     @Override
     public void removeSlide(LoginUser user, Integer slideId) {
     public void removeSlide(LoginUser user, Integer slideId) {
         Slide slide = slideDAO.findSlideById(slideId);
         Slide slide = slideDAO.findSlideById(slideId);
-        AuthUtil.checkDataAuth(user.getId(), slide.getTeacherId(), "您无权删除该幻灯片");
+        AuthUtils.checkDataAuth(user.getId(), slide.getTeacherId(), "您无权删除该幻灯片");
 
 
         slide.setDeleteAt(System.currentTimeMillis());
         slide.setDeleteAt(System.currentTimeMillis());
         slideDAO.save(slide);
         slideDAO.save(slide);

+ 3 - 3
src/main/java/nju/seec/helper/service/impl/UserServiceImpl.java

@@ -7,8 +7,8 @@ import nju.seec.helper.dto.ModifyUserDTO;
 import nju.seec.helper.dto.RegisterDTO;
 import nju.seec.helper.dto.RegisterDTO;
 import nju.seec.helper.dto.ResetPasswordDTO;
 import nju.seec.helper.dto.ResetPasswordDTO;
 import nju.seec.helper.entity.User;
 import nju.seec.helper.entity.User;
-import nju.seec.helper.service.AuthUtil;
-import nju.seec.helper.service.RefreshUtils;
+import nju.seec.helper.service.util.AuthUtils;
+import nju.seec.helper.service.util.RefreshUtils;
 import nju.seec.helper.service.UserService;
 import nju.seec.helper.service.UserService;
 import nju.seec.helper.util.CacheUtils;
 import nju.seec.helper.util.CacheUtils;
 import nju.seec.helper.util.Consts;
 import nju.seec.helper.util.Consts;
@@ -79,7 +79,7 @@ public class UserServiceImpl implements UserService {
     @Override
     @Override
     public UserVO modifyUser(LoginUser loginUser, ModifyUserDTO modifyUserDTO) {
     public UserVO modifyUser(LoginUser loginUser, ModifyUserDTO modifyUserDTO) {
         User user = userDAO.findUserById(loginUser.getId());
         User user = userDAO.findUserById(loginUser.getId());
-        AuthUtil.checkDataAuth(loginUser.getId(), user.getId(), "您无权修改该用户的个人信息");
+        AuthUtils.checkDataAuth(loginUser.getId(), user.getId(), "您无权修改该用户的个人信息");
         user.setName(modifyUserDTO.getName());
         user.setName(modifyUserDTO.getName());
         user = userDAO.save(user);
         user = userDAO.save(user);
         refreshUtils.refreshUser(user);
         refreshUtils.refreshUser(user);

+ 2 - 2
src/main/java/nju/seec/helper/service/AuthUtil.java → src/main/java/nju/seec/helper/service/util/AuthUtils.java

@@ -1,4 +1,4 @@
-package nju.seec.helper.service;
+package nju.seec.helper.service.util;
 
 
 import lombok.NonNull;
 import lombok.NonNull;
 import lombok.experimental.UtilityClass;
 import lombok.experimental.UtilityClass;
@@ -9,7 +9,7 @@ import nju.seec.helper.util.exception.HelperException;
  * @author cst
  * @author cst
  */
  */
 @UtilityClass
 @UtilityClass
-public class AuthUtil {
+public class AuthUtils {
     public void checkDataAuth(@NonNull Integer userId, @NonNull Integer dateUserId, String errMsg) {
     public void checkDataAuth(@NonNull Integer userId, @NonNull Integer dateUserId, String errMsg) {
         if (!userId.equals(dateUserId)) {
         if (!userId.equals(dateUserId)) {
             throw HelperException.of(ExceptionType.FORBIDDEN, errMsg);
             throw HelperException.of(ExceptionType.FORBIDDEN, errMsg);

+ 1 - 1
src/main/java/nju/seec/helper/service/RefreshUtils.java → src/main/java/nju/seec/helper/service/util/RefreshUtils.java

@@ -1,4 +1,4 @@
-package nju.seec.helper.service;
+package nju.seec.helper.service.util;
 
 
 import nju.seec.helper.dao.CommentDAO;
 import nju.seec.helper.dao.CommentDAO;
 import nju.seec.helper.dao.CourseDAO;
 import nju.seec.helper.dao.CourseDAO;

+ 23 - 0
src/main/java/nju/seec/helper/util/enums/MessageType.java

@@ -0,0 +1,23 @@
+package nju.seec.helper.util.enums;
+
+/**
+ * @author cst
+ */
+public enum MessageType {
+    /**
+     * 幻灯片开课
+     */
+    SLIDE_IN_CLASS,
+    /**
+     * 新的评论
+     */
+    COMMENT_NEW,
+    /**
+     * 评论被置顶
+     */
+    COMMENT_TOP,
+    /**
+     * 评论被老师回复
+     */
+    COMMENT_REPLY
+}

+ 1 - 1
src/main/resources/application-dev.yml

@@ -10,7 +10,7 @@ spring:
       ddl-auto: update
       ddl-auto: update
     database: mysql
     database: mysql
     database-platform: org.hibernate.dialect.MySQL8Dialect
     database-platform: org.hibernate.dialect.MySQL8Dialect
-  #    show-sql: true
+    show-sql: true
   http:
   http:
     encoding:
     encoding:
       force: true
       force: true