Преглед изворни кода

improvement: 缓存幻灯片临时链接;文件上传时加入时间戳

ChenSiTong пре 6 година
родитељ
комит
7c50b75b9e

+ 0 - 1
src/main/java/nju/seec/helper/config/properties/OssProperties.java

@@ -15,5 +15,4 @@ public class OssProperties {
     private String accessKeyId;
     private String accessKeySecret;
     private String bucketName;
-    private Integer expirationMinutes;
 }

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

@@ -1,8 +1,9 @@
 package nju.seec.helper.service.impl;
 
 import nju.seec.helper.service.CodeService;
+import nju.seec.helper.util.CacheUtils;
+import nju.seec.helper.util.Consts;
 import nju.seec.helper.util.MailUtils;
-import nju.seec.helper.util.RedisUtils;
 import org.springframework.stereotype.Service;
 
 import java.util.Random;
@@ -16,18 +17,18 @@ public class CodeServiceImpl implements CodeService {
     private static final int MAIL_CODE_LIVING_MINUTES = 5;
 
     private final MailUtils mailUtils;
-    private final RedisUtils redisUtils;
+    private final CacheUtils cacheUtils;
 
-    public CodeServiceImpl(MailUtils mailUtils, RedisUtils redisUtils) {
+    public CodeServiceImpl(MailUtils mailUtils, CacheUtils cacheUtils) {
         this.mailUtils = mailUtils;
-        this.redisUtils = redisUtils;
+        this.cacheUtils = cacheUtils;
     }
 
     @Override
     public void sendEmailCode(String email) {
         String code = getSixBitsCode();
         mailUtils.sendSimpleMailMessage("【南京大学】", String.format("您的验证码:%s,该验证码%d分钟内有效,请勿泄漏于他人!", code, MAIL_CODE_LIVING_MINUTES), email);
-        redisUtils.set(email, code, MAIL_CODE_LIVING_MINUTES, TimeUnit.MINUTES);
+        cacheUtils.set(Consts.EMAIL_CACHE_NAME, email, code, MAIL_CODE_LIVING_MINUTES, TimeUnit.MINUTES);
     }
 
     private String getSixBitsCode() {

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

@@ -11,7 +11,9 @@ import nju.seec.helper.entity.Course;
 import nju.seec.helper.entity.Page;
 import nju.seec.helper.entity.Slide;
 import nju.seec.helper.service.SlideService;
-import nju.seec.helper.util.OssUtils;
+import nju.seec.helper.util.CacheUtils;
+import nju.seec.helper.util.Consts;
+import nju.seec.helper.util.FileUtils;
 import nju.seec.helper.util.enums.SlideState;
 import nju.seec.helper.util.exception.HelperException;
 import nju.seec.helper.vo.SlideVO;
@@ -21,8 +23,10 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.time.LocalDateTime;
 import java.util.List;
 import java.util.Objects;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 
@@ -31,17 +35,21 @@ import java.util.stream.IntStream;
  */
 @Service
 public class SlideServiceImpl implements SlideService {
+    private static final long SLIDE_URL_LIVING_SECONDS = 20 * 60;
+
     private final CourseDAO courseDAO;
     private final SlideDAO slideDAO;
     private final ChooseDAO chooseDAO;
 
-    private final OssUtils ossUtils;
+    private final FileUtils fileUtils;
+    private final CacheUtils cacheUtils;
 
-    public SlideServiceImpl(CourseDAO courseDAO, SlideDAO slideDAO, ChooseDAO chooseDAO, OssUtils ossUtils) {
+    public SlideServiceImpl(CourseDAO courseDAO, SlideDAO slideDAO, ChooseDAO chooseDAO, FileUtils fileUtils, CacheUtils cacheUtils) {
         this.courseDAO = courseDAO;
         this.slideDAO = slideDAO;
         this.chooseDAO = chooseDAO;
-        this.ossUtils = ossUtils;
+        this.fileUtils = fileUtils;
+        this.cacheUtils = cacheUtils;
     }
 
     @Transactional(rollbackFor = Exception.class)
@@ -75,7 +83,6 @@ public class SlideServiceImpl implements SlideService {
         slide.setPages(IntStream.rangeClosed(1, pageNum)
                 .mapToObj(number -> {
                     Page page = new Page();
-//                    page.setSlide(slide);
                     page.setTeacherId(teacher.getId());
                     page.setNumber(number);
                     return page;
@@ -84,7 +91,7 @@ public class SlideServiceImpl implements SlideService {
         );
 
         // 上传文件
-        String objectName = ossUtils.upload(file.getOriginalFilename(), file.getInputStream());
+        String objectName = fileUtils.upload(LocalDateTime.now().toString() + "-" + file.getOriginalFilename(), file.getInputStream());
         slide.setObjectName(objectName);
 
         return new SlideVO(slideDAO.save(slide));
@@ -118,8 +125,17 @@ public class SlideServiceImpl implements SlideService {
     @Override
     public String getSlideUrl(LoginUser user, Integer slideId) {
         checkDataAccessAuth(user, slideId);
+
         Slide slide = slideDAO.findSlideById(slideId);
-        return ossUtils.getUrl(slide.getObjectName());
+        String url = cacheUtils.get(Consts.SLIDE_URL_CACHE_NAME, slide.getObjectName());
+
+        if (url != null) {
+            return url;
+        }
+
+        url = fileUtils.getUrl(slide.getObjectName(), SLIDE_URL_LIVING_SECONDS);
+        cacheUtils.set(Consts.SLIDE_URL_CACHE_NAME, slide.getObjectName(), url, SLIDE_URL_LIVING_SECONDS, TimeUnit.SECONDS);
+        return url;
     }
 
     private void checkDataAccessAuth(LoginUser user, Integer slideId) {

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

@@ -5,8 +5,9 @@ import nju.seec.helper.dao.UserDAO;
 import nju.seec.helper.dto.RegisterDTO;
 import nju.seec.helper.entity.User;
 import nju.seec.helper.service.UserService;
+import nju.seec.helper.util.CacheUtils;
+import nju.seec.helper.util.Consts;
 import nju.seec.helper.util.EncryptUtils;
-import nju.seec.helper.util.RedisUtils;
 import nju.seec.helper.util.enums.UserType;
 import nju.seec.helper.util.exception.HelperException;
 import nju.seec.helper.vo.UserVO;
@@ -20,7 +21,7 @@ import java.util.Map;
  */
 @Service
 public class UserServiceImpl implements UserService {
-    private final RedisUtils redisUtils;
+    private final CacheUtils cacheUtils;
     private final UserDAO userDAO;
     private final static Map<String, UserType> EMAIL_SUFFIX_AND_USER_TYPE_MAP =
             ImmutableMap.of(
@@ -28,9 +29,9 @@ public class UserServiceImpl implements UserService {
                     "nju.edu.cn", UserType.TEACHER
             );
 
-    public UserServiceImpl(UserDAO userDAO, RedisUtils redisUtils) {
+    public UserServiceImpl(UserDAO userDAO, CacheUtils cacheUtils) {
         this.userDAO = userDAO;
-        this.redisUtils = redisUtils;
+        this.cacheUtils = cacheUtils;
     }
 
     @Transactional(rollbackFor = Exception.class)
@@ -43,7 +44,7 @@ public class UserServiceImpl implements UserService {
         }
 
         String email = registerDTO.getEmail();
-        if (!registerDTO.getEmailCode().equals(redisUtils.get(email))) {
+        if (!registerDTO.getEmailCode().equals(cacheUtils.get(Consts.EMAIL_CACHE_NAME, email))) {
             throw HelperException.of(HelperException.ExceptionType.FORBIDDEN, "邮箱验证码错误");
         }
 
@@ -55,7 +56,7 @@ public class UserServiceImpl implements UserService {
                 .setType(getUserType(email));
 
         user = userDAO.save(user);
-        redisUtils.remove(email);
+        cacheUtils.remove(Consts.EMAIL_CACHE_NAME, email);
         return new UserVO(user);
     }
 

+ 32 - 0
src/main/java/nju/seec/helper/util/CacheUtils.java

@@ -0,0 +1,32 @@
+package nju.seec.helper.util;
+
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * use redis
+ *
+ * @author cst
+ */
+@Component
+public class CacheUtils {
+    private final RedisTemplate<String, String> redisTemplate;
+
+    public CacheUtils(RedisTemplate<String, String> redisTemplate) {
+        this.redisTemplate = redisTemplate;
+    }
+
+    public void set(String cacheName, String key, String value, long expireTime, TimeUnit timeUnit) {
+        redisTemplate.opsForValue().set(cacheName + ":" + key, value, expireTime, timeUnit);
+    }
+
+    public String get(String cacheName, String key) {
+        return redisTemplate.opsForValue().get(cacheName + ":" + key);
+    }
+
+    public void remove(String cacheName, String key) {
+        redisTemplate.delete(cacheName + ":" + key);
+    }
+}

+ 4 - 0
src/main/java/nju/seec/helper/util/Consts.java

@@ -5,6 +5,10 @@ package nju.seec.helper.util;
  */
 public class Consts {
     public static final String SESSION_USER_NAME = "helper_user";
+
     public static final String SCHOOL_EMAIL_REGEX = ".+@(nju.edu.cn|smail.nju.edu.cn)";
     public static final String PHONE_REGEX = "1[3|4|5|7|8]\\d{9}";
+
+    public static final String EMAIL_CACHE_NAME = "email";
+    public static final String SLIDE_URL_CACHE_NAME = "slide_url";
 }

+ 6 - 4
src/main/java/nju/seec/helper/util/OssUtils.java → src/main/java/nju/seec/helper/util/FileUtils.java

@@ -11,13 +11,15 @@ import java.net.URL;
 import java.util.Date;
 
 /**
+ * use oss
+ *
  * @author cst
  */
 @Component
-public class OssUtils {
+public class FileUtils {
     private final OssProperties ossProperties;
 
-    public OssUtils(OssProperties ossProperties) {
+    public FileUtils(OssProperties ossProperties) {
         this.ossProperties = ossProperties;
     }
 
@@ -29,9 +31,9 @@ public class OssUtils {
         return objectName;
     }
 
-    public String getUrl(String objectName) {
+    public String getUrl(String objectName, long seconds) {
         OSS ossClient = new OSSClientBuilder().build(ossProperties.getEndpoint(), ossProperties.getAccessKeyId(), ossProperties.getAccessKeySecret());
-        Date expiration = new Date(System.currentTimeMillis() + ossProperties.getExpirationMinutes() * 60 * 1000);
+        Date expiration = new Date(System.currentTimeMillis() + seconds * 1000);
         URL url = ossClient.generatePresignedUrl(ossProperties.getBucketName(), objectName, expiration);
         ossClient.shutdown();
         return url.toString();

+ 0 - 30
src/main/java/nju/seec/helper/util/RedisUtils.java

@@ -1,30 +0,0 @@
-package nju.seec.helper.util;
-
-import org.springframework.data.redis.core.RedisTemplate;
-import org.springframework.stereotype.Component;
-
-import java.util.concurrent.TimeUnit;
-
-/**
- * @author cst
- */
-@Component
-public class RedisUtils {
-    private final RedisTemplate<String, String> redisTemplate;
-
-    public RedisUtils(RedisTemplate<String, String> redisTemplate) {
-        this.redisTemplate = redisTemplate;
-    }
-
-    public void set(String key, String value, long expireTime, TimeUnit timeUnit) {
-        redisTemplate.opsForValue().set(key, value, expireTime, timeUnit);
-    }
-
-    public String get(String key) {
-        return redisTemplate.opsForValue().get(key);
-    }
-
-    public void remove(String key) {
-        redisTemplate.delete(key);
-    }
-}

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

@@ -38,7 +38,6 @@ aliyun:
     access-key-id: LTAI4Fi1qmL4iuhH8t7G7r2H
     access-key-secret: 7tJWyQqa0cMkQGaPMMvtH6c0VLiOO2
     bucket-name: seec-helper-pdf
-    expiration-minutes: 10
 
 # 自定义数据
 helper: