瀏覽代碼

refactor: 重构参数约束

ChenSiTong 6 年之前
父節點
當前提交
985fe8cfe1
共有 28 個文件被更改,包括 260 次插入212 次删除
  1. 8 13
      src/main/java/nju/seec/helper/controller/CodeController.java
  2. 4 5
      src/main/java/nju/seec/helper/controller/ControllerAdvice.java
  3. 5 4
      src/main/java/nju/seec/helper/controller/CourseController.java
  4. 9 4
      src/main/java/nju/seec/helper/controller/SlideController.java
  5. 10 5
      src/main/java/nju/seec/helper/controller/UserController.java
  6. 4 1
      src/main/java/nju/seec/helper/dto/CourseDTO.java
  7. 2 3
      src/main/java/nju/seec/helper/dto/LoginDTO.java
  8. 0 27
      src/main/java/nju/seec/helper/dto/ModifyCourseDTO.java
  9. 0 21
      src/main/java/nju/seec/helper/dto/ModifySlideDTO.java
  10. 0 18
      src/main/java/nju/seec/helper/dto/ModifyUserDTO.java
  11. 0 34
      src/main/java/nju/seec/helper/dto/RegisterDTO.java
  12. 2 6
      src/main/java/nju/seec/helper/dto/ResetPasswordDTO.java
  13. 8 3
      src/main/java/nju/seec/helper/dto/SlideDTO.java
  14. 34 0
      src/main/java/nju/seec/helper/dto/UserDTO.java
  15. 20 0
      src/main/java/nju/seec/helper/dto/validator/phone/Phone.java
  16. 21 0
      src/main/java/nju/seec/helper/dto/validator/phone/PhoneValidator.java
  17. 32 0
      src/main/java/nju/seec/helper/dto/validator/schoolemail/SchoolEmail.java
  18. 54 0
      src/main/java/nju/seec/helper/dto/validator/schoolemail/SchoolEmailValidator.java
  19. 2 3
      src/main/java/nju/seec/helper/service/CourseService.java
  20. 6 3
      src/main/java/nju/seec/helper/service/SlideService.java
  21. 5 6
      src/main/java/nju/seec/helper/service/UserService.java
  22. 6 7
      src/main/java/nju/seec/helper/service/impl/CourseServiceImpl.java
  23. 0 3
      src/main/java/nju/seec/helper/service/impl/MessageServiceImpl.java
  24. 11 10
      src/main/java/nju/seec/helper/service/impl/SlideServiceImpl.java
  25. 14 15
      src/main/java/nju/seec/helper/service/impl/UserServiceImpl.java
  26. 0 3
      src/main/java/nju/seec/helper/util/Consts.java
  27. 2 17
      src/main/java/nju/seec/helper/util/FileUtils.java
  28. 1 1
      src/main/resources/application-deploy.yml

+ 8 - 13
src/main/java/nju/seec/helper/controller/CodeController.java

@@ -1,20 +1,21 @@
 package nju.seec.helper.controller;
 
+import nju.seec.helper.dto.validator.phone.Phone;
+import nju.seec.helper.dto.validator.schoolemail.SchoolEmail;
 import nju.seec.helper.service.CodeService;
-import nju.seec.helper.util.Consts;
-import nju.seec.helper.util.enums.ExceptionType;
-import nju.seec.helper.util.exception.HelperException;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
-import java.util.regex.Pattern;
+import javax.validation.constraints.NotBlank;
 
 /**
  * 发送验证码
  *
  * @author cst
  */
+@Validated
 @RestController
 @RequestMapping("/api/code")
 public class CodeController {
@@ -31,24 +32,18 @@ public class CodeController {
      * @return
      */
     @PostMapping("/email")
-    public void sendEmailCode(String email) {
-        if (email == null || !Pattern.matches(Consts.SCHOOL_EMAIL_REGEX, email)) {
-            throw HelperException.of(ExceptionType.PARAM_ERROR, "该邮箱不是南大校邮");
-        }
+    public void sendEmailCode(@NotBlank(message = "邮箱不能为空") @SchoolEmail String email) {
         codeService.sendEmailCode(email);
     }
 
     /**
-     * 发送手机验证码(TODO)
+     * 发送手机验证码
      *
      * @param phone
      * @return
      */
     @PostMapping("/phone")
-    public void sendPhoneCode(String phone) {
-        if (phone == null || !Pattern.matches(Consts.PHONE_REGEX, phone)) {
-            throw HelperException.of(ExceptionType.PARAM_ERROR, "手机号格式错误");
-        }
+    public void sendPhoneCode(@NotBlank(message = "手机号不能为空") @Phone String phone) {
         codeService.sendPhoneCode(phone);
     }
 }

+ 4 - 5
src/main/java/nju/seec/helper/controller/ControllerAdvice.java

@@ -8,8 +8,8 @@ import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.MethodArgumentNotValidException;
 import org.springframework.web.bind.annotation.ExceptionHandler;
 import org.springframework.web.bind.annotation.RestControllerAdvice;
-import org.springframework.web.servlet.NoHandlerFoundException;
 
+import javax.validation.ConstraintViolationException;
 import java.util.Objects;
 
 /**
@@ -23,10 +23,9 @@ public class ControllerAdvice {
         return ResponseEntity.badRequest().body(ErrorResponse.of(Objects.requireNonNull(e.getBindingResult().getFieldError()).getDefaultMessage()));
     }
 
-    @ExceptionHandler(NoHandlerFoundException.class)
-    public ResponseEntity<ErrorResponse> handlerNoFoundException(Exception e) {
-        log.error(e.getMessage(), e);
-        return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ErrorResponse.of("路径不存在,请检查路径是否正确"));
+    @ExceptionHandler(ConstraintViolationException.class)
+    public ResponseEntity<ErrorResponse> handleConstraintViolationException(ConstraintViolationException e) {
+        return ResponseEntity.badRequest().body(ErrorResponse.of(e.getLocalizedMessage()));
     }
 
     @ExceptionHandler(HelperException.class)

+ 5 - 4
src/main/java/nju/seec/helper/controller/CourseController.java

@@ -5,7 +5,8 @@ import nju.seec.helper.controller.response.PageResponse;
 import nju.seec.helper.dto.ChooseDTO;
 import nju.seec.helper.dto.CourseDTO;
 import nju.seec.helper.dto.LoginUser;
-import nju.seec.helper.dto.ModifyCourseDTO;
+import nju.seec.helper.dto.groups.Create;
+import nju.seec.helper.dto.groups.Modify;
 import nju.seec.helper.service.CourseService;
 import nju.seec.helper.util.enums.UserType;
 import nju.seec.helper.vo.CourseVO;
@@ -34,7 +35,7 @@ public class CourseController {
     @Auth(roles = UserType.TEACHER, message = "创建课程")
     @PostMapping
     public CourseVO createCourse(LoginUser user,
-                                 @Validated @RequestBody CourseDTO courseDTO) {
+                                 @Validated(Create.class) @RequestBody CourseDTO courseDTO) {
         return courseService.createCourse(user, courseDTO);
     }
 
@@ -54,8 +55,8 @@ public class CourseController {
     @Auth(roles = UserType.TEACHER, message = "修改课程")
     @PutMapping
     public CourseVO modifyCourse(LoginUser user,
-                                 @Validated @RequestBody ModifyCourseDTO modifyCourseDTO) {
-        return courseService.modifyCourse(user, modifyCourseDTO);
+                                 @Validated(Modify.class) @RequestBody CourseDTO courseDTO) {
+        return courseService.modifyCourse(user, courseDTO);
     }
 
     /**

+ 9 - 4
src/main/java/nju/seec/helper/controller/SlideController.java

@@ -2,7 +2,12 @@ package nju.seec.helper.controller;
 
 import nju.seec.helper.aspect.auth.Auth;
 import nju.seec.helper.controller.response.PageResponse;
-import nju.seec.helper.dto.*;
+import nju.seec.helper.dto.LoginUser;
+import nju.seec.helper.dto.SlideDTO;
+import nju.seec.helper.dto.SlideFileDTO;
+import nju.seec.helper.dto.SlideStateDTO;
+import nju.seec.helper.dto.groups.Create;
+import nju.seec.helper.dto.groups.Modify;
 import nju.seec.helper.service.SlideService;
 import nju.seec.helper.util.enums.UserType;
 import nju.seec.helper.vo.SlideVO;
@@ -32,7 +37,7 @@ public class SlideController {
     @Auth(roles = UserType.TEACHER, message = "创建课件")
     @PostMapping
     public ResponseEntity<SlideVO> createSlide(LoginUser user,
-                                               @Validated SlideDTO slideDTO) {
+                                               @Validated(Create.class) SlideDTO slideDTO) {
         SlideVO slideVO = slideService.createSlide(user, slideDTO);
         return ResponseEntity.ok(slideVO);
     }
@@ -43,8 +48,8 @@ public class SlideController {
     @Auth(roles = UserType.TEACHER, message = "修改课件")
     @PutMapping
     public SlideVO modifySlide(LoginUser user,
-                               @Validated @RequestBody ModifySlideDTO modifySlideDTO) {
-        return slideService.modifySlide(user, modifySlideDTO);
+                               @Validated(Modify.class) @RequestBody SlideDTO slideDTO) {
+        return slideService.modifySlide(user, slideDTO);
     }
 
     /**

+ 10 - 5
src/main/java/nju/seec/helper/controller/UserController.java

@@ -1,7 +1,12 @@
 package nju.seec.helper.controller;
 
 import nju.seec.helper.aspect.auth.Auth;
-import nju.seec.helper.dto.*;
+import nju.seec.helper.dto.LoginDTO;
+import nju.seec.helper.dto.LoginUser;
+import nju.seec.helper.dto.ResetPasswordDTO;
+import nju.seec.helper.dto.UserDTO;
+import nju.seec.helper.dto.groups.Create;
+import nju.seec.helper.dto.groups.Modify;
 import nju.seec.helper.service.UserService;
 import nju.seec.helper.util.Consts;
 import nju.seec.helper.util.enums.UserType;
@@ -29,8 +34,8 @@ public class UserController {
      * 注册
      */
     @PostMapping("/register")
-    public UserVO register(@Validated @RequestBody RegisterDTO registerDTO) {
-        return userService.createUser(registerDTO);
+    public UserVO register(@Validated(Create.class) @RequestBody UserDTO userDTO) {
+        return userService.createUser(userDTO);
     }
 
     /**
@@ -67,9 +72,9 @@ public class UserController {
     @Auth(roles = {UserType.TEACHER, UserType.STUDENT}, message = "修改个人信息")
     @PutMapping
     public UserVO modifyUser(LoginUser user,
-                             @Validated @RequestBody ModifyUserDTO modifyUserDTO,
+                             @Validated(Modify.class) @RequestBody UserDTO userDTO,
                              HttpSession session) {
-        UserVO userVO = userService.modifyUser(user, modifyUserDTO);
+        UserVO userVO = userService.modifyUser(user, userDTO);
         user = ((LoginUser) session.getAttribute(Consts.SESSION_USER_NAME))
                 .setId(userVO.getId())
                 .setName(userVO.getName())

+ 4 - 1
src/main/java/nju/seec/helper/dto/CourseDTO.java

@@ -1,6 +1,7 @@
 package nju.seec.helper.dto;
 
 import lombok.Data;
+import nju.seec.helper.dto.groups.Modify;
 import org.hibernate.validator.constraints.Length;
 
 import javax.validation.constraints.NotBlank;
@@ -12,7 +13,9 @@ import java.io.Serializable;
  */
 @Data
 public class CourseDTO implements Serializable {
-    private static final long serialVersionUID = -5583485560614228661L;
+    private static final long serialVersionUID = 4747833899049996472L;
+    @NotNull(message = "缺少课程ID", groups = Modify.class)
+    private Integer id;
     @NotBlank(message = "课程名不能为空")
     @Length(max = 50, message = "课程名长度不能超过50")
     private String name;

+ 2 - 3
src/main/java/nju/seec/helper/dto/LoginDTO.java

@@ -1,6 +1,7 @@
 package nju.seec.helper.dto;
 
 import lombok.Data;
+import nju.seec.helper.dto.validator.schoolemail.SchoolEmail;
 
 import javax.validation.constraints.NotBlank;
 import java.io.Serializable;
@@ -11,10 +12,8 @@ import java.io.Serializable;
 @Data
 public class LoginDTO implements Serializable {
     private static final long serialVersionUID = -3359173125836901241L;
-    /**
-     * 邮箱或手机号
-     */
     @NotBlank(message = "邮箱不能为空")
+    @SchoolEmail
     private String username;
     @NotBlank(message = "密码不能为空")
     private String password;

+ 0 - 27
src/main/java/nju/seec/helper/dto/ModifyCourseDTO.java

@@ -1,27 +0,0 @@
-package nju.seec.helper.dto;
-
-import lombok.Data;
-import org.hibernate.validator.constraints.Length;
-
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
-import java.io.Serializable;
-
-/**
- * @author cst
- */
-@Data
-public class ModifyCourseDTO implements Serializable {
-    private static final long serialVersionUID = -6732295262720425577L;
-    @NotNull(message = "缺少课程ID")
-    private Integer id;
-    @NotBlank(message = "课程名不能为空")
-    @Length(max = 50, message = "课程名长度不能超过50")
-    private String name;
-    @NotNull
-    @Length(max = 200, message = "课程简介长度不能超过200")
-    private String bio;
-    @NotBlank
-    @Length(max = 50, message = "选课码长度不能超过50")
-    private String code;
-}

+ 0 - 21
src/main/java/nju/seec/helper/dto/ModifySlideDTO.java

@@ -1,21 +0,0 @@
-package nju.seec.helper.dto;
-
-import lombok.Data;
-import org.hibernate.validator.constraints.Length;
-
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
-import java.io.Serializable;
-
-/**
- * @author cst
- */
-@Data
-public class ModifySlideDTO implements Serializable {
-    private static final long serialVersionUID = 7417738035207797449L;
-    @NotNull(message = "缺少课件ID")
-    private Integer id;
-    @NotBlank(message = "课件名不能为空")
-    @Length(max = 50, message = "课件名长度不能超过50")
-    private String name;
-}

+ 0 - 18
src/main/java/nju/seec/helper/dto/ModifyUserDTO.java

@@ -1,18 +0,0 @@
-package nju.seec.helper.dto;
-
-import lombok.Data;
-import org.hibernate.validator.constraints.Length;
-
-import javax.validation.constraints.NotBlank;
-import java.io.Serializable;
-
-/**
- * @author cst
- */
-@Data
-public class ModifyUserDTO implements Serializable {
-    private static final long serialVersionUID = 445794055111374104L;
-    @NotBlank(message = "姓名不能为空")
-    @Length(min = 2, max = 50, message = "姓名长度必须在2到50之间")
-    private String name;
-}

+ 0 - 34
src/main/java/nju/seec/helper/dto/RegisterDTO.java

@@ -1,34 +0,0 @@
-package nju.seec.helper.dto;
-
-import lombok.Data;
-import nju.seec.helper.util.Consts;
-import org.hibernate.validator.constraints.Length;
-
-import javax.validation.constraints.Email;
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.Pattern;
-import java.io.Serializable;
-
-/**
- * @author cst
- */
-@Data
-public class RegisterDTO implements Serializable {
-    private static final long serialVersionUID = -5962331511813309322L;
-    @NotBlank(message = "姓名不能为空")
-    @Length(min = 2, max = 50, message = "姓名长度必须在2到50之间")
-    private String name;
-    @NotBlank(message = "邮箱不能为空")
-    @Email(regexp = Consts.SCHOOL_EMAIL_REGEX, message = "该邮箱不是南大校邮")
-    private String email;
-    @NotBlank(message = "邮箱验证码不能为空")
-    private String emailCode;
-    @NotBlank(message = "手机号不能为空")
-    @Pattern(regexp = Consts.PHONE_REGEX, message = "手机号格式错误")
-    private String phone;
-    @NotBlank(message = "手机号验证码不能为空")
-    private String phoneCode;
-    @NotBlank(message = "密码不能为空")
-    @Length(max = 50, message = "密码长度不能超过50位")
-    private String password;
-}

+ 2 - 6
src/main/java/nju/seec/helper/dto/ResetPasswordDTO.java

@@ -1,10 +1,9 @@
 package nju.seec.helper.dto;
 
 import lombok.Data;
-import nju.seec.helper.util.Consts;
+import nju.seec.helper.dto.validator.schoolemail.SchoolEmail;
 import org.hibernate.validator.constraints.Length;
 
-import javax.validation.constraints.Email;
 import javax.validation.constraints.NotBlank;
 import java.io.Serializable;
 
@@ -14,11 +13,8 @@ import java.io.Serializable;
 @Data
 public class ResetPasswordDTO implements Serializable {
     private static final long serialVersionUID = 3884011149489695206L;
-    /**
-     * 邮箱或手机号
-     */
     @NotBlank(message = "邮箱不能为空")
-    @Email(regexp = Consts.SCHOOL_EMAIL_REGEX, message = "该邮箱不是南大校邮")
+    @SchoolEmail
     private String username;
     /**
      * 验证码

+ 8 - 3
src/main/java/nju/seec/helper/dto/SlideDTO.java

@@ -1,6 +1,8 @@
 package nju.seec.helper.dto;
 
 import lombok.Data;
+import nju.seec.helper.dto.groups.Create;
+import nju.seec.helper.dto.groups.Modify;
 import nju.seec.helper.util.enums.SlideState;
 import org.hibernate.validator.constraints.Length;
 import org.springframework.web.multipart.MultipartFile;
@@ -14,13 +16,16 @@ import java.io.Serializable;
  */
 @Data
 public class SlideDTO implements Serializable {
-    @NotNull(message = "缺少课程ID")
+    private static final long serialVersionUID = -4127324852405823476L;
+    @NotNull(message = "缺少课件ID", groups = Modify.class)
+    private Integer id;
+    @NotNull(message = "缺少课程ID", groups = Create.class)
     private Integer courseId;
     @NotBlank(message = "课件名不能为空")
     @Length(max = 50, message = "课件名长度不能超过50")
     private String name;
-    @NotNull(message = "缺少状态")
+    @NotNull(message = "缺少状态", groups = Create.class)
     private SlideState state;
-    @NotNull(message = "缺少文件")
+    @NotNull(message = "缺少文件", groups = Create.class)
     private MultipartFile file;
 }

+ 34 - 0
src/main/java/nju/seec/helper/dto/UserDTO.java

@@ -0,0 +1,34 @@
+package nju.seec.helper.dto;
+
+import lombok.Data;
+import nju.seec.helper.dto.groups.Create;
+import nju.seec.helper.dto.validator.phone.Phone;
+import nju.seec.helper.dto.validator.schoolemail.SchoolEmail;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+/**
+ * @author cst
+ */
+@Data
+public class UserDTO implements Serializable {
+    private static final long serialVersionUID = -5962331511813309322L;
+    @NotBlank(message = "姓名不能为空")
+    @Length(min = 2, max = 50, message = "姓名长度必须在2到50之间")
+    private String name;
+    @NotBlank(message = "邮箱不能为空", groups = Create.class)
+    @SchoolEmail(groups = Create.class)
+    private String email;
+    @NotBlank(message = "邮箱验证码不能为空", groups = Create.class)
+    private String emailCode;
+    @NotBlank(message = "手机号不能为空", groups = Create.class)
+    @Phone(groups = Create.class)
+    private String phone;
+    @NotBlank(message = "手机号验证码不能为空", groups = Create.class)
+    private String phoneCode;
+    @NotBlank(message = "密码不能为空", groups = Create.class)
+    @Length(max = 50, message = "密码长度不能超过50位", groups = Create.class)
+    private String password;
+}

+ 20 - 0
src/main/java/nju/seec/helper/dto/validator/phone/Phone.java

@@ -0,0 +1,20 @@
+package nju.seec.helper.dto.validator.phone;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+import java.lang.annotation.*;
+
+/**
+ * @author cst
+ */
+@Documented
+@Target({ElementType.PARAMETER, ElementType.FIELD})
+@Retention(RetentionPolicy.RUNTIME)
+@Constraint(validatedBy = PhoneValidator.class)
+public @interface Phone {
+    String message() default "手机号格式错误";
+
+    Class<?>[] groups() default {};
+
+    Class<? extends Payload>[] payload() default {};
+}

+ 21 - 0
src/main/java/nju/seec/helper/dto/validator/phone/PhoneValidator.java

@@ -0,0 +1,21 @@
+package nju.seec.helper.dto.validator.phone;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+
+/**
+ * @author cst
+ */
+public class PhoneValidator implements ConstraintValidator<Phone, String> {
+    private static final String PHONE_REGEX = "1[3-9]\\d{9}";
+
+    @Override
+    public boolean isValid(String value, ConstraintValidatorContext context) {
+        return value != null && value.matches(PHONE_REGEX);
+    }
+
+    @Override
+    public void initialize(Phone constraintAnnotation) {
+
+    }
+}

+ 32 - 0
src/main/java/nju/seec/helper/dto/validator/schoolemail/SchoolEmail.java

@@ -0,0 +1,32 @@
+package nju.seec.helper.dto.validator.schoolemail;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+import javax.validation.constraints.Email;
+import javax.validation.constraints.Pattern;
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+/**
+ * @author cst
+ * copy from {@link Email}
+ */
+@Documented
+@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
+@Retention(RUNTIME)
+@Constraint(validatedBy = SchoolEmailValidator.class)
+public @interface SchoolEmail {
+    String message() default "该邮箱不是南大校邮";
+
+    Class<?>[] groups() default {};
+
+    Class<? extends Payload>[] payload() default {};
+
+    String regexp() default ".+@(nju.edu.cn|smail.nju.edu.cn)";
+
+    Pattern.Flag[] flags() default {};
+}

+ 54 - 0
src/main/java/nju/seec/helper/dto/validator/schoolemail/SchoolEmailValidator.java

@@ -0,0 +1,54 @@
+package nju.seec.helper.dto.validator.schoolemail;
+
+import org.hibernate.validator.internal.constraintvalidators.AbstractEmailValidator;
+import org.hibernate.validator.internal.util.logging.Log;
+import org.hibernate.validator.internal.util.logging.LoggerFactory;
+
+import javax.validation.ConstraintValidatorContext;
+import java.lang.invoke.MethodHandles;
+import java.util.regex.Matcher;
+import java.util.regex.PatternSyntaxException;
+
+/**
+ * @author cst
+ * copy from {@link org.hibernate.validator.internal.constraintvalidators.bv.EmailValidator}
+ */
+public class SchoolEmailValidator extends AbstractEmailValidator<SchoolEmail> {
+    private static final Log LOG = LoggerFactory.make(MethodHandles.lookup());
+    private java.util.regex.Pattern pattern;
+
+    @Override
+    public void initialize(SchoolEmail emailAnnotation) {
+        super.initialize(emailAnnotation);
+
+        javax.validation.constraints.Pattern.Flag[] flags = emailAnnotation.flags();
+        int intFlag = 0;
+        for (javax.validation.constraints.Pattern.Flag flag : flags) {
+            intFlag = intFlag | flag.getValue();
+        }
+
+        // we only apply the regexp if there is one to apply
+        if (!".*".equals(emailAnnotation.regexp()) || emailAnnotation.flags().length > 0) {
+            try {
+                pattern = java.util.regex.Pattern.compile(emailAnnotation.regexp(), intFlag);
+            } catch (PatternSyntaxException e) {
+                throw LOG.getInvalidRegularExpressionException(e);
+            }
+        }
+    }
+
+    @Override
+    public boolean isValid(CharSequence value, ConstraintValidatorContext context) {
+        if (value == null) {
+            return true;
+        }
+
+        boolean isValid = super.isValid(value, context);
+        if (pattern == null || !isValid) {
+            return isValid;
+        }
+
+        Matcher m = pattern.matcher(value);
+        return m.matches();
+    }
+}

+ 2 - 3
src/main/java/nju/seec/helper/service/CourseService.java

@@ -3,7 +3,6 @@ package nju.seec.helper.service;
 import nju.seec.helper.dto.ChooseDTO;
 import nju.seec.helper.dto.CourseDTO;
 import nju.seec.helper.dto.LoginUser;
-import nju.seec.helper.dto.ModifyCourseDTO;
 import nju.seec.helper.vo.CourseVO;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
@@ -25,10 +24,10 @@ public interface CourseService {
      * 修改课程
      *
      * @param user
-     * @param modifyCourseDTO
+     * @param courseDTO
      * @return
      */
-    CourseVO modifyCourse(LoginUser user, ModifyCourseDTO modifyCourseDTO);
+    CourseVO modifyCourse(LoginUser user, CourseDTO courseDTO);
 
     /**
      * 删除课程(伪删除)

+ 6 - 3
src/main/java/nju/seec/helper/service/SlideService.java

@@ -1,6 +1,9 @@
 package nju.seec.helper.service;
 
-import nju.seec.helper.dto.*;
+import nju.seec.helper.dto.LoginUser;
+import nju.seec.helper.dto.SlideDTO;
+import nju.seec.helper.dto.SlideFileDTO;
+import nju.seec.helper.dto.SlideStateDTO;
 import nju.seec.helper.vo.SlideVO;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
@@ -22,10 +25,10 @@ public interface SlideService {
      * 修改课件
      *
      * @param user
-     * @param modifySlideDTO
+     * @param slideDTO
      * @return
      */
-    SlideVO modifySlide(LoginUser user, ModifySlideDTO modifySlideDTO);
+    SlideVO modifySlide(LoginUser user, SlideDTO slideDTO);
 
     /**
      * 修改课件状态

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

@@ -1,9 +1,8 @@
 package nju.seec.helper.service;
 
 import nju.seec.helper.dto.LoginUser;
-import nju.seec.helper.dto.ModifyUserDTO;
-import nju.seec.helper.dto.RegisterDTO;
 import nju.seec.helper.dto.ResetPasswordDTO;
+import nju.seec.helper.dto.UserDTO;
 import nju.seec.helper.vo.UserVO;
 
 /**
@@ -13,19 +12,19 @@ public interface UserService {
     /**
      * 创建用户
      *
-     * @param registerDTO
+     * @param userDTO
      * @return
      */
-    UserVO createUser(RegisterDTO registerDTO);
+    UserVO createUser(UserDTO userDTO);
 
     /**
      * 修改用户信息
      *
      * @param loginUser
-     * @param modifyUserDTO
+     * @param userDTO
      * @return
      */
-    UserVO modifyUser(LoginUser loginUser, ModifyUserDTO modifyUserDTO);
+    UserVO modifyUser(LoginUser loginUser, UserDTO userDTO);
 
     /**
      * 重设密码

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

@@ -5,7 +5,6 @@ import nju.seec.helper.dao.CourseDAO;
 import nju.seec.helper.dto.ChooseDTO;
 import nju.seec.helper.dto.CourseDTO;
 import nju.seec.helper.dto.LoginUser;
-import nju.seec.helper.dto.ModifyCourseDTO;
 import nju.seec.helper.entity.Choose;
 import nju.seec.helper.entity.Course;
 import nju.seec.helper.service.CourseService;
@@ -54,16 +53,16 @@ public class CourseServiceImpl implements CourseService {
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public CourseVO modifyCourse(LoginUser user, ModifyCourseDTO modifyCourseDTO) {
-        Course course = courseDAO.findCourseById(modifyCourseDTO.getId());
+    public CourseVO modifyCourse(LoginUser user, CourseDTO courseDTO) {
+        Course course = courseDAO.findCourseById(courseDTO.getId());
 
         // 检查
         AuthUtils.checkDataAuth(user.getId(), course.getTeacherId(), "您无权修改该课程");
-        checkSameCourseName(course.getId(), user.getId(), modifyCourseDTO.getName());
+        checkSameCourseName(course.getId(), user.getId(), courseDTO.getName());
 
-        course.setName(modifyCourseDTO.getName())
-                .setBio(modifyCourseDTO.getBio())
-                .setCode(EncryptUtils.encode(modifyCourseDTO.getCode()));
+        course.setName(courseDTO.getName())
+                .setBio(courseDTO.getBio())
+                .setCode(EncryptUtils.encode(courseDTO.getCode()));
         course = courseDAO.save(course);
         refreshUtils.refreshCourse(course);
         return new CourseVO(course);

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

@@ -5,16 +5,13 @@ 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.ExceptionType;
 import nju.seec.helper.util.enums.MessageType;
-import nju.seec.helper.util.exception.HelperException;
 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.Random;
 import java.util.Set;
 import java.util.stream.Collectors;
 

+ 11 - 10
src/main/java/nju/seec/helper/service/impl/SlideServiceImpl.java

@@ -5,7 +5,10 @@ import lombok.SneakyThrows;
 import nju.seec.helper.dao.ChooseDAO;
 import nju.seec.helper.dao.CourseDAO;
 import nju.seec.helper.dao.SlideDAO;
-import nju.seec.helper.dto.*;
+import nju.seec.helper.dto.LoginUser;
+import nju.seec.helper.dto.SlideDTO;
+import nju.seec.helper.dto.SlideFileDTO;
+import nju.seec.helper.dto.SlideStateDTO;
 import nju.seec.helper.entity.Course;
 import nju.seec.helper.entity.Slide;
 import nju.seec.helper.service.MessageService;
@@ -81,19 +84,18 @@ public class SlideServiceImpl implements SlideService {
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public SlideVO modifySlide(LoginUser user, ModifySlideDTO modifySlideDTO) {
-        Slide slide = slideDAO.findSlideById(modifySlideDTO.getId());
+    public SlideVO modifySlide(LoginUser user, SlideDTO slideDTO) {
+        Slide slide = slideDAO.findSlideById(slideDTO.getId());
         AuthUtils.checkDataAuth(user.getId(), slide.getTeacherId(), "您无权修改该课件");
 
-        checkSameName(slide.getId(), slide.getCourseId(), modifySlideDTO.getName());
-        if (!modifySlideDTO.getName().equals(slide.getName())) {
-            slide.setName(modifySlideDTO.getName());
+        checkSameName(slide.getId(), slide.getCourseId(), slideDTO.getName());
+        if (!slideDTO.getName().equals(slide.getName())) {
+            slide.setName(slideDTO.getName());
             String oldObjectName = slide.getObjectName();
             String newObjectName = getObjectName(slide.getCourseId(), slide.getName(), oldObjectName.substring(oldObjectName.lastIndexOf('.') + 1));
             slide.setObjectName(newObjectName);
-            fileUtils.copy(oldObjectName, newObjectName);
+            fileUtils.move(oldObjectName, newObjectName);
             slide = slideDAO.save(slide);
-            fileUtils.delete(oldObjectName);
         }
         return new SlideVO(slide);
     }
@@ -139,9 +141,8 @@ public class SlideServiceImpl implements SlideService {
         String deleteObjectName = getDeleteObjectName(slide.getCourseId(), slide.getName(), oldObjectName.substring(oldObjectName.lastIndexOf('.') + 1));
         slide.setObjectName(deleteObjectName);
         slide.setDeleteAt(System.currentTimeMillis());
-        fileUtils.copy(oldObjectName, deleteObjectName);
+        fileUtils.move(oldObjectName, deleteObjectName);
         slideDAO.save(slide);
-        fileUtils.delete(oldObjectName);
     }
 
     @SuppressWarnings("all")

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

@@ -3,9 +3,8 @@ package nju.seec.helper.service.impl;
 import com.google.common.collect.ImmutableMap;
 import nju.seec.helper.dao.UserDAO;
 import nju.seec.helper.dto.LoginUser;
-import nju.seec.helper.dto.ModifyUserDTO;
-import nju.seec.helper.dto.RegisterDTO;
 import nju.seec.helper.dto.ResetPasswordDTO;
+import nju.seec.helper.dto.UserDTO;
 import nju.seec.helper.entity.User;
 import nju.seec.helper.service.UserService;
 import nju.seec.helper.service.util.AuthUtils;
@@ -44,25 +43,25 @@ public class UserServiceImpl implements UserService {
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public UserVO createUser(RegisterDTO registerDTO) {
-        checkSameEmail(registerDTO.getEmail());
-        checkSamePhone(registerDTO.getPhone());
+    public UserVO createUser(UserDTO userDTO) {
+        checkSameEmail(userDTO.getEmail());
+        checkSamePhone(userDTO.getPhone());
 
-        String email = registerDTO.getEmail();
-        if (!registerDTO.getEmailCode().equals(cacheUtils.get(Consts.EMAIL_CACHE_NAME, email))) {
+        String email = userDTO.getEmail();
+        if (!userDTO.getEmailCode().equals(cacheUtils.get(Consts.EMAIL_CACHE_NAME, email))) {
             throw HelperException.of(ExceptionType.NOT_FOUND, "邮箱或验证码错误");
         }
 
-        String phone = registerDTO.getPhone();
-        if (!registerDTO.getPhoneCode().equals(cacheUtils.get(Consts.PHONE_CACHE_NAME, phone))) {
+        String phone = userDTO.getPhone();
+        if (!userDTO.getPhoneCode().equals(cacheUtils.get(Consts.PHONE_CACHE_NAME, phone))) {
             throw HelperException.of(ExceptionType.NOT_FOUND, "手机号或验证码错误");
         }
 
         User user = new User()
-                .setName(registerDTO.getName())
-                .setEmail(registerDTO.getEmail())
-                .setPhone(registerDTO.getPhone())
-                .setPassword(EncryptUtils.encode(registerDTO.getPassword()))
+                .setName(userDTO.getName())
+                .setEmail(userDTO.getEmail())
+                .setPhone(userDTO.getPhone())
+                .setPassword(EncryptUtils.encode(userDTO.getPassword()))
                 .setType(getUserType(email));
 
         user = userDAO.save(user);
@@ -77,10 +76,10 @@ public class UserServiceImpl implements UserService {
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public UserVO modifyUser(LoginUser loginUser, ModifyUserDTO modifyUserDTO) {
+    public UserVO modifyUser(LoginUser loginUser, UserDTO userDTO) {
         User user = userDAO.findUserById(loginUser.getId());
         AuthUtils.checkDataAuth(loginUser.getId(), user.getId(), "您无权修改该用户的个人信息");
-        user.setName(modifyUserDTO.getName());
+        user.setName(userDTO.getName());
         user = userDAO.save(user);
         refreshUtils.refreshUser(user);
         return new UserVO(user);

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

@@ -6,9 +6,6 @@ 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-9]\\d{9}";
-
     public static final String EMAIL_CACHE_NAME = "email";
     public static final String PHONE_CACHE_NAME = "phone";
     public static final String SLIDE_URL_CACHE_NAME = "slide_url";

+ 2 - 17
src/main/java/nju/seec/helper/util/FileUtils.java

@@ -9,7 +9,6 @@ import lombok.extern.slf4j.Slf4j;
 import nju.seec.helper.config.properties.OssProperties;
 import nju.seec.helper.util.enums.ExceptionType;
 import nju.seec.helper.util.exception.HelperException;
-import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Component;
 
 import java.io.InputStream;
@@ -61,25 +60,11 @@ public class FileUtils {
         }
     }
 
-    public void copy(String sourceObjectName, String destinationObjectName) {
+    public void move(String sourceObjectName, String destinationObjectName) {
         OSS ossClient = getOss();
         try {
             ossClient.copyObject(ossProperties.getBucketName(), sourceObjectName, ossProperties.getBucketName(), destinationObjectName);
-        } catch (OSSException | ClientException e) {
-            log.error(e.getMessage());
-            throw HelperException.of(ExceptionType.ERROR, "文件拷贝失败");
-        } finally {
-            if (ossClient != null) {
-                ossClient.shutdown();
-            }
-        }
-    }
-
-    @Async
-    public void delete(String objectName) {
-        OSS ossClient = getOss();
-        try {
-            ossClient.deleteObject(ossProperties.getBucketName(), objectName);
+            ossClient.deleteObject(ossProperties.getBucketName(), sourceObjectName);
         } catch (OSSException | ClientException e) {
             log.error(e.getMessage());
             throw HelperException.of(ExceptionType.ERROR, "文件拷贝失败");

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

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