From 3106d787daf6ec522dd50d9a9eb82a94fac3d88c Mon Sep 17 00:00:00 2001 From: Ziin Date: Tue, 5 Aug 2025 15:39:38 +0800 Subject: [PATCH] =?UTF-8?q?1.=E7=94=A8=E6=88=B7=E4=BF=AE=E6=94=B9=E9=82=AE?= =?UTF-8?q?=E7=AE=B1=E9=80=BB=E8=BE=91=202.=E7=94=A8=E6=88=B7=E9=AA=8C?= =?UTF-8?q?=E8=AF=81=E9=82=AE=E7=AE=B1=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + .idea/.cache/.Apifox_Helper/.toolWindow.db | Bin 180224 -> 180224 bytes .../User/controller/UserController.java | 8 +- .../vvpkassistant/User/model/UserModel.java | 2 +- .../User/service/UserService.java | 2 + .../User/service/UserServiceImpl.java | 17 ++ .../mail/service/MailService.java | 4 + .../mail/service/MailServiceImpl.java | 168 ++++++++++++++++++ src/main/resources/application.yml | 3 +- 9 files changed, 201 insertions(+), 4 deletions(-) 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 096b99bb03d476f9fa960925b239ad637909c6fc..2d8ba4bbd809b1f09042ee46b47d553e29d81736 100644 GIT binary patch delta 1656 zcmah|Yitx%6yAGxrxcd1eeL@-)NM;kA3N`vwzQ>+4J1t!EqxFxcV_OCn%ctBNh*!%-vgoj5l5n;GYmpn$ zV3}FjnE=gZduM`b%F-L|0U9)#y9mA1JVmg?Qe#dNy4v*g zB&ez^JzGfVC1zJo0#ur#gs#ZaSL2YT7H7@%jgVeho-q}qa3U)zSd|$`V`Mdn1Z?nv zfsi69MzSoEWFS`56kXC}@@a;qDy*n0f|Nvv)dWS^KGS2*^nl=U+jSaD$3cg6;|lO4 z<`wihLYKT3iw_hXEc~S4CUFZ%ZwtuEblOLjXDWTnb@<1`)`iY(o)&Azaj+9Cv!W-! zMbK>haspffP1biO!9CDuUpfUUfph%TrTfqBg%oJ8Ki&t+siV!%MeldfkPf*WEsk)& zJ6rr=(UHQ>@-F9|bsCTXHI9~aI^o>bUu$(OfHR=Re$ovg0M&NuLdXM9WpB-cYbdb9 zzFY{s6sWXs_~9)VsIaa?Ncv*?i)bdj-2N&CSs+g=F7vj%-q|+fT@rkQSVQHR`#2nP z329B`!7{741jei@%`h(~g*W0s-Ab21-$VQTGI*QD$dDC5mJA7ts;)_ls&I-Xk)<<| z%-{PdZcGLvkrA`vYJ|;f8PCyZPwT#VEv3j3}1GHhVN!efxgn4Yp5|%U(8?34btRj%@k_8&!_X{5U9`z4c z-}FN7qvM=j0V_;e@mS|eA!Sv+058-r!ZshsIAXY`Yr4X+B~>NsQ3{djIF&8Svl=U?m_vfD zat33_oFo~%#_Fobss>i9f@#nY*A&EK6-yX%GERz|#3(Y0MTO^ZQfKdXD)*5znLhpN zZK#FC=CQ^C>-0@Pxd+f-U(G|=O5sT_pGT%V2aGtvzMhP-kCw51yldVp~UGKLunP9EX3qoD)&W_Wc0j6cBCkI#@{^ O9V74GcCCeXn%04+k+8SpqWBcBq6=@P*j4pA_Pi- z!;uC-Qi3utg2nJafff`=C01s1BcviIOG7Gz>~fli@5lH5@xggG(WomLb@j=hS;`jB zVh2WbNE%BtX7n@O3XbF4#SAG045=oAM`K9yF{Ha0lH(H?YrONE{>wY>`zR&(f~qJ# z@VEO0m2x@7?^5Xp;Ivj;fW~ ztnZG}tyOD1;y}KVCb!6!)luIb5$mdUT|cKE5#KAzV!#*gJ1KRjXT=G9v()4-l9A6HXP5B3ymhOG5MW99%mU)P3GCX>Hlp{&VqrfoLXCl45%dadre&7h^1Fxz(z8# z*MxF1!E~9UYmTyADT!|~p@amROkC{fNA1YK5vQK7Ws5KwWQ!2F!xlx3hTTjT64yQx z3P|BT6X!cRC4=c8X=gf*3^ASS=*~>01LPCa8%R>KiE|wNHpHIEcItF7TdXG?&1UyP zGhJu~|27lLJ)AbHK2yFa6083|B!wlF#lw=uk{q*c3S;lg5ij4BRAV1}0)0?zFF%1f z*kn&Vh4)ZpUz>$LP)SFhK>)^w;j0ci?Zrv(y5qpZN#E0dy05sRabfUS)?dC?Ev6Sv zARR-5j<=&a%=c!7>8Vi5MfIbLNMq69aT@0l( Pa1^y+D53qw&|l#n$AIRD 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