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

feat: 异步更新关联数据

ChenSiTong 6 лет назад
Родитель
Сommit
9fdca392aa

+ 2 - 0
src/main/java/nju/seec/helper/HelperApplication.java

@@ -3,6 +3,7 @@ package nju.seec.helper;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
+import org.springframework.scheduling.annotation.EnableAsync;
 import org.springframework.transaction.annotation.EnableTransactionManagement;
 
 /**
@@ -10,6 +11,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
  */
 @ConfigurationPropertiesScan("nju.seec.helper.config.properties")
 @EnableTransactionManagement
+@EnableAsync
 @SpringBootApplication
 public class HelperApplication {
     public static void main(String[] args) {

+ 16 - 0
src/main/java/nju/seec/helper/dao/CommentDAO.java

@@ -2,6 +2,7 @@ package nju.seec.helper.dao;
 
 import nju.seec.helper.entity.Comment;
 import nju.seec.helper.util.enums.ExceptionType;
+import nju.seec.helper.util.enums.UserType;
 import nju.seec.helper.util.exception.HelperException;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
@@ -70,4 +71,19 @@ public interface CommentDAO extends JpaRepository<Comment, Integer> {
             "and c.topNumber is not null " +
             "and c.topNumber>?3")
     void decTopNumber(Integer slideId, Integer pageNumber, Integer topNumber);
+
+    /**
+     * 更新所有人信息
+     *
+     * @param userId
+     * @param userName
+     * @param userType
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Modifying
+    @Query("update Comment c " +
+            "set c.userName=?2, " +
+            "c.userType=?3 " +
+            "where c.userId=?1 ")
+    void updateUser(Integer userId, String userName, UserType userType);
 }

+ 15 - 0
src/main/java/nju/seec/helper/dao/CourseDAO.java

@@ -6,8 +6,10 @@ import nju.seec.helper.util.exception.HelperException;
 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;
 
@@ -82,4 +84,17 @@ public interface CourseDAO extends JpaRepository<Course, Integer> {
             "and (c.name like concat('%',?2,'%') or c.teacherName like concat('%',?2,'%')) " +
             "and c.deleteAt=0 ")
     Page<Course> findByIdsAndKey(Set<Integer> courseIds, String key, Pageable pageable);
+
+    /**
+     * 更新所有人信息
+     *
+     * @param userId
+     * @param userName
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Modifying
+    @Query("update Course c " +
+            "set c.teacherName=?2 " +
+            "where c.teacherId=?1 ")
+    void updateUser(Integer userId, String userName);
 }

+ 28 - 0
src/main/java/nju/seec/helper/dao/SlideDAO.java

@@ -7,8 +7,10 @@ import nju.seec.helper.util.exception.HelperException;
 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;
 
@@ -73,4 +75,30 @@ public interface SlideDAO extends JpaRepository<Slide, Integer> {
             "and s.name like concat('%',?3,'%') " +
             "and s.deleteAt=0")
     Page<Slide> findByCourseIdAndStateNotInAndNameContains(Integer courseId, Set<SlideState> exclusiveStates, String key, Pageable pageable);
+
+    /**
+     * 更新所有人信息
+     *
+     * @param userId
+     * @param userName
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Modifying
+    @Query("update Slide s " +
+            "set s.teacherName=?2 " +
+            "where s.teacherId=?1 ")
+    void updateUser(Integer userId, String userName);
+
+    /**
+     * 更新课程信息
+     *
+     * @param courseId
+     * @param courseName
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Modifying
+    @Query("update Slide s " +
+            "set s.courseName=?2 " +
+            "where s.courseId=?1 ")
+    void updateCourse(Integer courseId, String courseName);
 }

+ 37 - 0
src/main/java/nju/seec/helper/service/RefreshUtils.java

@@ -0,0 +1,37 @@
+package nju.seec.helper.service;
+
+import nju.seec.helper.dao.CommentDAO;
+import nju.seec.helper.dao.CourseDAO;
+import nju.seec.helper.dao.SlideDAO;
+import nju.seec.helper.entity.Course;
+import nju.seec.helper.entity.User;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author cst
+ */
+@Component
+public class RefreshUtils {
+    private final CourseDAO courseDAO;
+    private final SlideDAO slideDAO;
+    private final CommentDAO commentDAO;
+
+    public RefreshUtils(CourseDAO courseDAO, SlideDAO slideDAO, CommentDAO commentDAO) {
+        this.courseDAO = courseDAO;
+        this.slideDAO = slideDAO;
+        this.commentDAO = commentDAO;
+    }
+
+    @Async
+    public void refreshUser(User user) {
+        courseDAO.updateUser(user.getId(), user.getName());
+        slideDAO.updateUser(user.getId(), user.getName());
+        commentDAO.updateUser(user.getId(), user.getName(), user.getType());
+    }
+
+    @Async
+    public void refreshCourse(Course course) {
+        slideDAO.updateCourse(course.getId(), course.getName());
+    }
+}

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

@@ -10,6 +10,7 @@ import nju.seec.helper.entity.Choose;
 import nju.seec.helper.entity.Course;
 import nju.seec.helper.service.AuthUtil;
 import nju.seec.helper.service.CourseService;
+import nju.seec.helper.service.RefreshUtils;
 import nju.seec.helper.util.EncryptUtils;
 import nju.seec.helper.util.enums.ExceptionType;
 import nju.seec.helper.util.exception.HelperException;
@@ -27,9 +28,12 @@ public class CourseServiceImpl implements CourseService {
     private final CourseDAO courseDAO;
     private final ChooseDAO chooseDAO;
 
-    public CourseServiceImpl(CourseDAO courseDAO, ChooseDAO chooseDAO) {
+    private final RefreshUtils refreshUtils;
+
+    public CourseServiceImpl(CourseDAO courseDAO, ChooseDAO chooseDAO, RefreshUtils refreshUtils) {
         this.courseDAO = courseDAO;
         this.chooseDAO = chooseDAO;
+        this.refreshUtils = refreshUtils;
     }
 
     @Transactional(rollbackFor = Exception.class)
@@ -61,6 +65,7 @@ public class CourseServiceImpl implements CourseService {
                 .setBio(modifyCourseDTO.getBio())
                 .setCode(EncryptUtils.encode(modifyCourseDTO.getCode()));
         course = courseDAO.save(course);
+        refreshUtils.refreshCourse(course);
         return new CourseVO(course);
     }
 

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

@@ -8,6 +8,7 @@ import nju.seec.helper.dto.RegisterDTO;
 import nju.seec.helper.dto.ResetPasswordDTO;
 import nju.seec.helper.entity.User;
 import nju.seec.helper.service.AuthUtil;
+import nju.seec.helper.service.RefreshUtils;
 import nju.seec.helper.service.UserService;
 import nju.seec.helper.util.CacheUtils;
 import nju.seec.helper.util.Consts;
@@ -27,6 +28,7 @@ import java.util.Map;
 @Service
 public class UserServiceImpl implements UserService {
     private final CacheUtils cacheUtils;
+    private final RefreshUtils refreshUtils;
     private final UserDAO userDAO;
     private final static Map<String, UserType> EMAIL_SUFFIX_AND_USER_TYPE_MAP =
             ImmutableMap.of(
@@ -34,9 +36,10 @@ public class UserServiceImpl implements UserService {
                     "nju.edu.cn", UserType.TEACHER
             );
 
-    public UserServiceImpl(UserDAO userDAO, CacheUtils cacheUtils) {
+    public UserServiceImpl(UserDAO userDAO, CacheUtils cacheUtils, RefreshUtils refreshUtils) {
         this.userDAO = userDAO;
         this.cacheUtils = cacheUtils;
+        this.refreshUtils = refreshUtils;
     }
 
     @Transactional(rollbackFor = Exception.class)
@@ -79,6 +82,7 @@ public class UserServiceImpl implements UserService {
         AuthUtil.checkDataAuth(loginUser.getId(), user.getId(), "您无权修改该用户的个人信息");
         user.setName(modifyUserDTO.getName());
         user = userDAO.save(user);
+        refreshUtils.refreshUser(user);
         return new UserVO(user);
     }