diff --git a/.gitignore b/.gitignore index bcd1908..1b48d89 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,4 @@ replay_pid* /.idea/ /target/ + diff --git a/.idea/.cache/.Apifox_Helper/.toolWindow.db b/.idea/.cache/.Apifox_Helper/.toolWindow.db index 096b99b..2d8ba4b 100644 Binary files a/.idea/.cache/.Apifox_Helper/.toolWindow.db and b/.idea/.cache/.Apifox_Helper/.toolWindow.db differ diff --git a/src/main/java/vvpkassistant/User/controller/UserController.java b/src/main/java/vvpkassistant/User/controller/UserController.java index 00d02ba..cf693ed 100644 --- a/src/main/java/vvpkassistant/User/controller/UserController.java +++ b/src/main/java/vvpkassistant/User/controller/UserController.java @@ -375,8 +375,8 @@ public class UserController { return ResponseData.success(userService.addUserWithMail(model)); } - @GetMapping("/activate") - public ResponseData activate(@RequestParam("token") String token){ + @GetMapping("/activateAccount") + public ResponseData activateAccount(@RequestParam("token") String token){ return ResponseData.success(userService.activateAccount(token)); } @@ -385,4 +385,8 @@ public class UserController { return ResponseData.success(mailService.resendMail(userModelDTO)); } + @GetMapping("/verificationMail") + public ResponseData verificationMail(@RequestParam("token") String token){ + return ResponseData.success(userService.verificationMail(token)); + } } diff --git a/src/main/java/vvpkassistant/User/model/UserModel.java b/src/main/java/vvpkassistant/User/model/UserModel.java index 6ad2e58..bbbaa7e 100644 --- a/src/main/java/vvpkassistant/User/model/UserModel.java +++ b/src/main/java/vvpkassistant/User/model/UserModel.java @@ -22,5 +22,5 @@ public class UserModel { private Integer inviterId; // 邀请人id private String email; private String password; - + private Integer mailVerification; } diff --git a/src/main/java/vvpkassistant/User/service/UserService.java b/src/main/java/vvpkassistant/User/service/UserService.java index 497202a..044e53a 100644 --- a/src/main/java/vvpkassistant/User/service/UserService.java +++ b/src/main/java/vvpkassistant/User/service/UserService.java @@ -19,4 +19,6 @@ public interface UserService extends IService { UserModelVO addUserWithMail(UserModelDTO model); Boolean activateAccount(String token); + + Boolean verificationMail(String token); } diff --git a/src/main/java/vvpkassistant/User/service/UserServiceImpl.java b/src/main/java/vvpkassistant/User/service/UserServiceImpl.java index 760be50..228aaf7 100644 --- a/src/main/java/vvpkassistant/User/service/UserServiceImpl.java +++ b/src/main/java/vvpkassistant/User/service/UserServiceImpl.java @@ -75,6 +75,10 @@ public class UserServiceImpl extends ServiceImpl implements userModelDTO.setPassword(BcryptUtils.encryptPassword(userModelDTO.getNewPassword())); } } + if (userModelDTO.getEmail() != null) { + mailService.sendVerificationMail(userModelDTO.getEmail(), userModelDTO.getId()); + } + // 用户有密码的情况下重新设置密码 if (userInfo.getPassword() != null && userModelDTO.getOldPassword() != null) { if (BcryptUtils.matchPassword(userModelDTO.getOldPassword(), userInfo.getPassword())) { @@ -117,6 +121,7 @@ public class UserServiceImpl extends ServiceImpl implements //设置积分为0 userModelDTO.setPoints(0); UserModel userModelEntity = BeanUtil.copyProperties(userModelDTO, UserModel.class); + userModelEntity.setMailVerification(1); if ( userDao.insert(userModelEntity) != 1){ throw new BusinessException(ErrorCode.ADD_FAILED,"用户注册失败"); } @@ -141,10 +146,22 @@ public class UserServiceImpl extends ServiceImpl implements throw new BusinessException(ErrorCode.USER_DOES_NOT_EXIST); } userModel.setStatus(0); + userModel.setMailVerification(0); if (userDao.updateById(userModel) == 1){ return true; }else { throw new BusinessException(ErrorCode.UPDATE_FAILED,"激活失败"); } } + + @Override + public Boolean verificationMail(String token) { + Integer userId = SaTempUtil.parseToken(token, Integer.class); + UserModel userModel = userDao.selectById(userId); + userModel.setMailVerification(0); + if (userDao.updateById(userModel) == 1){ + return true; + } + throw new BusinessException(ErrorCode.SYSTEM_ERROR,"邮箱验证失败"); + } } diff --git a/src/main/java/vvpkassistant/mail/service/MailService.java b/src/main/java/vvpkassistant/mail/service/MailService.java index 162f158..8bb5faa 100644 --- a/src/main/java/vvpkassistant/mail/service/MailService.java +++ b/src/main/java/vvpkassistant/mail/service/MailService.java @@ -11,5 +11,9 @@ public interface MailService { void sendMail(String emailAddress,Integer userId); + void sendVerificationMail(String emailAddress,Integer userId); + + + Boolean resendMail(UserModelDTO userModelDTO); } diff --git a/src/main/java/vvpkassistant/mail/service/MailServiceImpl.java b/src/main/java/vvpkassistant/mail/service/MailServiceImpl.java index 7978594..2d685d3 100644 --- a/src/main/java/vvpkassistant/mail/service/MailServiceImpl.java +++ b/src/main/java/vvpkassistant/mail/service/MailServiceImpl.java @@ -26,6 +26,10 @@ public class MailServiceImpl implements MailService { @Value("${activateUrl}") private String activateUrl; + @Value("${verificationMailUrl}") + private String verificationMailUrl; + + private final Cache emailSendCache = Caffeine.newBuilder() .expireAfterWrite(1, TimeUnit.MINUTES) .build(); @@ -196,6 +200,170 @@ public class MailServiceImpl implements MailService { emailSendCache.put(emailAddress, userId); } + @Override + public void sendVerificationMail(String emailAddress, Integer userId) { + log.info("Sending email to {}", emailAddress); + String token = SaTempUtil.createToken(userId, 600); + if (emailSendCache.getIfPresent(emailAddress) != null) { + throw new BusinessException(ErrorCode.EMAIL_SEND_FREQUENT); + } + MailUtil.send(emailAddress, "验证你的邮箱", "\n" + + "\n" + + "\n" + + " \n" + + " \n" + + " Account Activation\n" + + " \n" + + "\n" + + "\n" + + "
\n" + + "
\n" + + " \n" + + "

Verification Mail

\n" + + "

Please click the button below to verification your mail

\n" + + " \n" + + " \n" + + " Verification\n" + + " \n" + + " \n" + + "
\n" + + "
Important Notice:
\n" + + "
\n" + + " • This activation link is valid for 10 minutes
\n" + + " • Please do not share this link with anyone
\n" + + " • If you didn't register an account, please ignore this message\n" + + "
\n" + + "
\n" + + " \n" + + "
\n" + + " This is an automated message. Please do not reply to this email.\n" + + "
\n" + + "
\n" + + "\n" + + "\n", true); + emailSendCache.put(emailAddress, userId); + } + @Override public Boolean resendMail(UserModelDTO userModelDTO) { try { diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 44a1dda..054a339 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -42,4 +42,5 @@ sa-token: # 是否输出操作日志 is-log: true -activateUrl: http://192.168.1.174:8086/user/activate?token= \ No newline at end of file +activateUrl: http://192.168.1.174:8086/user/activate?token= +verificationMailUrl: http://192.168.1.174:8086/user/verification?token= \ No newline at end of file