From 2cfadf96ddb88c0218d5ee3eb4d4c008b633822a Mon Sep 17 00:00:00 2001 From: Ziin Date: Wed, 6 Aug 2025 20:45:49 +0800 Subject: [PATCH] =?UTF-8?q?1.=E6=B7=BB=E5=8A=A0=E9=82=AE=E7=AE=B1=E9=AA=8C?= =?UTF-8?q?=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/.cache/.Apifox_Helper/.toolWindow.db | Bin 188416 -> 196608 bytes .../java/vvpkassistant/Tools/CacheHolder.java | 16 ++ .../User/controller/UserController.java | 35 ++- .../User/model/DTO/UserModelDTO.java | 2 + .../User/service/UserService.java | 12 +- .../User/service/UserServiceImpl.java | 82 ++++++- .../config/SaTokenConfigure.java | 2 +- .../vvpkassistant/mail/model/MailModel.java | 4 +- .../mail/service/MailService.java | 5 +- .../mail/service/MailServiceImpl.java | 232 +++++++++++++++++- src/main/resources/application.yml | 3 +- src/main/resources/mail.setting | 6 +- target/classes/application.yml | 3 +- 13 files changed, 382 insertions(+), 20 deletions(-) create mode 100644 src/main/java/vvpkassistant/Tools/CacheHolder.java diff --git a/.idea/.cache/.Apifox_Helper/.toolWindow.db b/.idea/.cache/.Apifox_Helper/.toolWindow.db index b7b7bfdeca60b9f5f9229698e96f004f17889a36..11b441f4263671bc4d710c7e1a8a9d40ac9fdb94 100644 GIT binary patch delta 4250 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 VERIFICATION_MAIL = Caffeine.newBuilder() + .expireAfterWrite(5, TimeUnit.MINUTES) + .build(); +} diff --git a/src/main/java/vvpkassistant/User/controller/UserController.java b/src/main/java/vvpkassistant/User/controller/UserController.java index 20cdeb3..93fad65 100644 --- a/src/main/java/vvpkassistant/User/controller/UserController.java +++ b/src/main/java/vvpkassistant/User/controller/UserController.java @@ -1,6 +1,7 @@ package vvpkassistant.User.controller; import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.extra.mail.Mail; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import vvpkassistant.CoinRecords.CoinRecords; @@ -397,8 +398,8 @@ public class UserController { } @PostMapping("/resendMail") - public ResponseData resendMail(@RequestBody UserModelDTO userModelDTO){ - return ResponseData.success(mailService.resendMail(userModelDTO)); + public ResponseData resendMail(@RequestBody MailModel mailModel){ + return ResponseData.success(mailService.resendMail(mailModel)); } @GetMapping("/verificationMail") @@ -406,6 +407,10 @@ public class UserController { return ResponseData.success(userService.verificationMail(token)); } + @PostMapping("/forgetMail") + public ResponseData sendForgetPassWordMail(@RequestBody MailModel mailModel){ + return ResponseData.success(userService.sendForgetPassWordMail(mailModel)); + } @GetMapping("/qrcode") public ResponseData generatedQrcode(){ @@ -428,4 +433,30 @@ public class UserController { userService.confirm(scanInfoDTO); return ResponseData.success(""); } + + @PostMapping("/logout") + public ResponseData logOut(@RequestBody UserModelDTO userModelDTO){ + userService.logOut(userModelDTO.getId()); + return ResponseData.success(""); + } + + @PostMapping("/setPassword") + public ResponseDatasetPassWord(@RequestBody UserModelDTO userModelDTO){ + return ResponseData.success(userService.setPassWord(userModelDTO)); + } + + @GetMapping("/resetPassword/") + public ResponseDataresetPassWord(@RequestBody UserModelDTO userModelDTO){ + return ResponseData.success(userService.resetPassWord(userModelDTO)); + } + + @PostMapping("/updateUserMail") + public ResponseDataupdateUserMail(@RequestBody MailModel mailModel){ + return ResponseData.success(userService.updateUserMail(mailModel)); + } + + @PostMapping("/sendUpdateMailConfirmMail") + public ResponseDatasendUpdateMailConfirmMail(@RequestBody MailModel mailModel){ + return ResponseData.success(mailService.sendUpdateConfirmMail(mailModel)); + } } diff --git a/src/main/java/vvpkassistant/User/model/DTO/UserModelDTO.java b/src/main/java/vvpkassistant/User/model/DTO/UserModelDTO.java index 25b6e30..2455764 100644 --- a/src/main/java/vvpkassistant/User/model/DTO/UserModelDTO.java +++ b/src/main/java/vvpkassistant/User/model/DTO/UserModelDTO.java @@ -21,6 +21,8 @@ public class UserModelDTO { private Integer inviterId; // 邀请人id private String email; private String newPassword; + private String confirmPassword; private String oldPassword; private String password; + private String token; } diff --git a/src/main/java/vvpkassistant/User/service/UserService.java b/src/main/java/vvpkassistant/User/service/UserService.java index fecd2ea..e7ebeb1 100644 --- a/src/main/java/vvpkassistant/User/service/UserService.java +++ b/src/main/java/vvpkassistant/User/service/UserService.java @@ -5,7 +5,7 @@ import vvpkassistant.User.model.DTO.ScanInfoDTO; import vvpkassistant.User.model.DTO.UserModelDTO; import vvpkassistant.User.model.UserModel; import vvpkassistant.User.model.UserModelVO; - +import vvpkassistant.mail.model.MailModel; /* @@ -30,4 +30,14 @@ public interface UserService extends IService { void scanQrcode(ScanInfoDTO scanInfoDTO); void confirm(ScanInfoDTO scanInfoDTO); + + void logOut(Integer id); + + boolean setPassWord(UserModelDTO userModelDTO); + + Object sendForgetPassWordMail(MailModel mailModel); + + Object resetPassWord(UserModelDTO userModelDTO); + + Boolean updateUserMail(MailModel mailModel); } diff --git a/src/main/java/vvpkassistant/User/service/UserServiceImpl.java b/src/main/java/vvpkassistant/User/service/UserServiceImpl.java index e4f0db4..5253839 100644 --- a/src/main/java/vvpkassistant/User/service/UserServiceImpl.java +++ b/src/main/java/vvpkassistant/User/service/UserServiceImpl.java @@ -12,9 +12,11 @@ import com.github.benmanes.caffeine.cache.Caffeine; import com.google.zxing.WriterException; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Service; import vvpkassistant.Data.WxChatParam; import vvpkassistant.Tools.BcryptUtils; +import vvpkassistant.Tools.CacheHolder; import vvpkassistant.Tools.QRCodeUtil; import vvpkassistant.Tools.VVTools; import vvpkassistant.User.mapper.UserDao; @@ -25,6 +27,7 @@ import vvpkassistant.User.model.DTO.UserModelDTO; import vvpkassistant.User.model.enumeration.LoginStatusEnum; import vvpkassistant.common.ErrorCode; import vvpkassistant.exception.BusinessException; +import vvpkassistant.mail.model.MailModel; import vvpkassistant.mail.service.MailService; import javax.annotation.Resource; @@ -53,6 +56,9 @@ public class UserServiceImpl extends ServiceImpl implements .expireAfterWrite(2, TimeUnit.MINUTES) .build(); + + + @Override public UserModelVO loginWithMail(UserModelDTO model) { @@ -99,7 +105,7 @@ public class UserServiceImpl extends ServiceImpl implements // 用户有密码的情况下重新设置密码 if (userInfo.getPassword() != null && userModelDTO.getOldPassword() != null) { - if (BcryptUtils.matchPassword(userModelDTO.getOldPassword(), userInfo.getPassword())) { + if (BcryptUtils.matchPassword(userInfo.getPassword(),userModelDTO.getOldPassword())) { userModelDTO.setPassword(BcryptUtils.encryptPassword(userModelDTO.getNewPassword())); }else { throw new BusinessException(ErrorCode.PASSWORD_ERROR,"旧密码不正确"); @@ -150,6 +156,7 @@ public class UserServiceImpl extends ServiceImpl implements userDao.updateById(oldUser); } UserModelVO userModelVO = BeanUtil.copyProperties(userModelEntity, UserModelVO.class); + userModelVO.setHavaPassword(true); userModelVO.setNewAccount(true); userModelVO.setChatInfo(wxChatParam); return userModelVO; @@ -251,4 +258,77 @@ public class UserServiceImpl extends ServiceImpl implements } log.info("-------确认登录成功uuid:{}-------", scanInfoDTO.getUuid()); } + + @Override + public void logOut(Integer id) { + StpUtil.logout(id); + } + + @Override + public boolean setPassWord(UserModelDTO userModelDTO) { + UserModel userModel = userDao.selectById(userModelDTO.getId()); + if (userModel == null) { + throw new BusinessException(ErrorCode.USER_DOES_NOT_EXIST); + } + if (userModel.getPassword()!= null){ + throw new BusinessException(ErrorCode.SYSTEM_ERROR,"已设置过密码"); + } + if (userModelDTO.getPassword().length()< 6 ){ + throw new BusinessException(ErrorCode.PARAMS_ERROR,"密码长度不能小于 6 位"); + } + if (!Objects.equals(userModelDTO.getPassword(), userModelDTO.getConfirmPassword())) { + log.error("密码{},确认密码{}",userModelDTO.getPassword(),userModelDTO.getConfirmPassword()); + throw new BusinessException(ErrorCode.PARAMS_ERROR,"两次密码输入不一致"); + }else{ + UserModel saveEntity = BeanUtil.copyProperties(userModelDTO, UserModel.class); + saveEntity.setPassword(BcryptUtils.encryptPassword(userModelDTO.getPassword())); + return userDao.updateById(saveEntity) == 1 ; + } + } + + @Override + public Object sendForgetPassWordMail(MailModel mailModel) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + UserModel userModel = userDao.selectOne(lambdaQueryWrapper + .eq(UserModel::getEmail, mailModel.getMailAddress()) + .eq(UserModel::getStatus, 0) + .eq(UserModel::getMailVerification, 0)); + if (userModel == null) { + throw new BusinessException(ErrorCode.USER_DOES_NOT_EXIST); + } + + mailService.sendForgetPassWordMail(mailModel.getMailAddress(),userModel.getId()); + return true; + } + + @Override + public Object resetPassWord(UserModelDTO userModelDTO) { + Integer i = SaTempUtil.parseToken(userModelDTO.getToken(), Integer.class); + UserModel userModel = userDao.selectById(i); + if (userModel == null) { + throw new BusinessException(ErrorCode.USER_DOES_NOT_EXIST); + } + if (userModelDTO.getPassword().equals(userModelDTO.getConfirmPassword())) { + UserModel updateEntity = BeanUtil.copyProperties(userModelDTO, UserModel.class); + updateEntity.setPassword(BcryptUtils.encryptPassword(updateEntity.getPassword())); + return userDao.updateById(updateEntity) == 1; + } + return false; + } + + @Override + public Boolean updateUserMail(MailModel mailModel) { + String mail = CacheHolder.VERIFICATION_MAIL.getIfPresent(mailModel.getCode()); + if (mail != null && mail.isEmpty()) { + throw new BusinessException(ErrorCode.SYSTEM_ERROR,"验证码过期或验证码错误"); + } + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + UserModel userModel = userDao.selectOne(lambdaQueryWrapper + .eq(UserModel::getEmail, mail) + .eq(UserModel::getStatus, 0)); + userModel.setEmail(mailModel.getMailAddress()); + mailService.sendVerificationMail(mailModel.getMailAddress(),userModel.getId()); + userModel.setMailVerification(1); + return userDao.updateById(userModel) == 1; + } } diff --git a/src/main/java/vvpkassistant/config/SaTokenConfigure.java b/src/main/java/vvpkassistant/config/SaTokenConfigure.java index e269c02..95a9a8e 100644 --- a/src/main/java/vvpkassistant/config/SaTokenConfigure.java +++ b/src/main/java/vvpkassistant/config/SaTokenConfigure.java @@ -49,7 +49,7 @@ public class SaTokenConfigure implements WebMvcConfigurer { "/user/verificationMail", "/user/activate", "/user/qrcode", - "/user/check/*", + "/user/check/**", "/user/scan", "/user/confirm" diff --git a/src/main/java/vvpkassistant/mail/model/MailModel.java b/src/main/java/vvpkassistant/mail/model/MailModel.java index 8d78ec3..e52e1cd 100644 --- a/src/main/java/vvpkassistant/mail/model/MailModel.java +++ b/src/main/java/vvpkassistant/mail/model/MailModel.java @@ -9,5 +9,7 @@ import lombok.Data; @Data public class MailModel { private String mailAddress; - private Integer code; + private Integer userId; + private Integer type; + private String code; } diff --git a/src/main/java/vvpkassistant/mail/service/MailService.java b/src/main/java/vvpkassistant/mail/service/MailService.java index 8bb5faa..b79a790 100644 --- a/src/main/java/vvpkassistant/mail/service/MailService.java +++ b/src/main/java/vvpkassistant/mail/service/MailService.java @@ -1,6 +1,5 @@ package vvpkassistant.mail.service; -import vvpkassistant.User.model.DTO.UserModelDTO; import vvpkassistant.mail.model.MailModel; /* @@ -13,7 +12,9 @@ public interface MailService { void sendVerificationMail(String emailAddress,Integer userId); + Boolean resendMail(MailModel mailModel); + void sendForgetPassWordMail(String mailAddress, Integer id); - Boolean resendMail(UserModelDTO userModelDTO); + Object sendUpdateConfirmMail(MailModel mailModel); } diff --git a/src/main/java/vvpkassistant/mail/service/MailServiceImpl.java b/src/main/java/vvpkassistant/mail/service/MailServiceImpl.java index 2d685d3..cb0c663 100644 --- a/src/main/java/vvpkassistant/mail/service/MailServiceImpl.java +++ b/src/main/java/vvpkassistant/mail/service/MailServiceImpl.java @@ -1,17 +1,23 @@ package vvpkassistant.mail.service; import cn.dev33.satoken.temp.SaTempUtil; +import cn.hutool.core.util.RandomUtil; import cn.hutool.extra.mail.MailUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.github.benmanes.caffeine.cache.Cache; import com.github.benmanes.caffeine.cache.Caffeine; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; -import vvpkassistant.User.model.DTO.UserModelDTO; +import vvpkassistant.Tools.CacheHolder; +import vvpkassistant.User.mapper.UserDao; +import vvpkassistant.User.model.UserModel; import vvpkassistant.common.ErrorCode; import vvpkassistant.exception.BusinessException; +import vvpkassistant.mail.model.MailModel; +import javax.annotation.Resource; import java.util.concurrent.TimeUnit; /* @@ -29,8 +35,15 @@ public class MailServiceImpl implements MailService { @Value("${verificationMailUrl}") private String verificationMailUrl; + @Value("${forgetPassWordUrl}") + private String forgetPassWordUrl; - private final Cache emailSendCache = Caffeine.newBuilder() + + @Resource + private UserDao userDao; + + + private static final Cache emailSendCache = Caffeine.newBuilder() .expireAfterWrite(1, TimeUnit.MINUTES) .build(); @@ -365,12 +378,217 @@ public class MailServiceImpl implements MailService { } @Override - public Boolean resendMail(UserModelDTO userModelDTO) { - try { - sendMail(userModelDTO.getEmail(), userModelDTO.getId()); + public Boolean resendMail(MailModel mailModel) { + Object ifPresent = emailSendCache.getIfPresent(mailModel.getMailAddress()); + if (ifPresent == null) { + switch (mailModel.getType()) { + case 1: + sendMail(mailModel.getMailAddress(), mailModel.getUserId()); + break; + case 2: + sendVerificationMail(mailModel.getMailAddress(), mailModel.getUserId()); + break; + case 3: + sendForgetPassWordMail(mailModel.getMailAddress(), mailModel.getUserId()); + break; + } + return true; + }else { + throw new BusinessException(ErrorCode.EMAIL_SEND_FREQUENT); + } + } + + @Override + public void sendForgetPassWordMail(String mailAddress, Integer userId) { + if (checkCache(mailAddress)){ + String token = SaTempUtil.createToken(userId, 600); + MailUtil.send(mailAddress, "验证你的邮箱", "\n" + + "\n" + + "\n" + + " \n" + + " \n" + + " Account Activation\n" + + " \n" + + "\n" + + "\n" + + "
\n" + + "
\n" + + " \n" + + "

Verification Mail

\n" + + "

Please click the button below to reset your password

\n" + + " \n" + + " \n" + + " Reset PassWord\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(mailAddress, userId); + } + + } + + @Override + public Object sendUpdateConfirmMail(MailModel mailModel) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + UserModel userModel = userDao.selectOne( + lambdaQueryWrapper.eq(UserModel::getEmail, mailModel.getMailAddress()) + .eq(UserModel::getStatus, 0) + .eq(UserModel::getMailVerification, 0)); + if (userModel == null){ + throw new BusinessException(ErrorCode.USER_DOES_NOT_EXIST); + } + if (checkCache(mailModel.getMailAddress())) { + String code = RandomUtil.randomString(6); + emailSendCache.put(mailModel.getMailAddress(), code); + CacheHolder.VERIFICATION_MAIL.put(code, mailModel.getMailAddress()); + MailUtil.send(mailModel.getMailAddress(),"your Verification code is :" + code, + "your Verification code is :" + code,false); + log.info("sendMailto:{},Verification code is :{}", mailModel.getMailAddress(),code); + } + return true; + } + + + public Boolean checkCache(String mailAddress){ + Object ifPresent = emailSendCache.getIfPresent(mailAddress); + if (ifPresent == null) { return true; - }catch (Exception e){ - throw new BusinessException(ErrorCode.SYSTEM_ERROR,e.getMessage()); + }else { + throw new BusinessException(ErrorCode.EMAIL_SEND_FREQUENT); } } } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 054a339..4dc0438 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -43,4 +43,5 @@ sa-token: is-log: true 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 +verificationMailUrl: http://192.168.1.174:8086/user/verification?token= +forgetPassWordUrl: http://192.168.1.174:8086/user//resetPassword/?token= \ No newline at end of file diff --git a/src/main/resources/mail.setting b/src/main/resources/mail.setting index 7d89bf0..8a18366 100644 --- a/src/main/resources/mail.setting +++ b/src/main/resources/mail.setting @@ -3,8 +3,8 @@ host = smtp.exmail.qq.com # 邮件服务器的SMTP端口,可选,默认25 port = 465 # 发件人(必须正确,否则发送失败) -from = chenfu@bilibili.so +from = niuyuxi@hanxiaokj.cn # 用户名,默认为发件人邮箱前缀 -user = chenfu@bilibili.so -pass = Yt7rWTizdAvE4dc7 +user = niuyuxi@hanxiaokj.cn +pass = tF35umug9CBCBKqR sslEnable = true \ No newline at end of file diff --git a/target/classes/application.yml b/target/classes/application.yml index 054a339..4dc0438 100644 --- a/target/classes/application.yml +++ b/target/classes/application.yml @@ -43,4 +43,5 @@ sa-token: is-log: true 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 +verificationMailUrl: http://192.168.1.174:8086/user/verification?token= +forgetPassWordUrl: http://192.168.1.174:8086/user//resetPassword/?token= \ No newline at end of file