1.添加邮箱验证

This commit is contained in:
2025-08-06 20:45:49 +08:00
parent fda3e45dc6
commit 2cfadf96dd
13 changed files with 382 additions and 20 deletions

View File

@@ -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<Object> resendMail(@RequestBody UserModelDTO userModelDTO){
return ResponseData.success(mailService.resendMail(userModelDTO));
public ResponseData<Object> 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<Object> sendForgetPassWordMail(@RequestBody MailModel mailModel){
return ResponseData.success(userService.sendForgetPassWordMail(mailModel));
}
@GetMapping("/qrcode")
public ResponseData<Object> generatedQrcode(){
@@ -428,4 +433,30 @@ public class UserController {
userService.confirm(scanInfoDTO);
return ResponseData.success("");
}
@PostMapping("/logout")
public ResponseData<Object> logOut(@RequestBody UserModelDTO userModelDTO){
userService.logOut(userModelDTO.getId());
return ResponseData.success("");
}
@PostMapping("/setPassword")
public ResponseData<Object>setPassWord(@RequestBody UserModelDTO userModelDTO){
return ResponseData.success(userService.setPassWord(userModelDTO));
}
@GetMapping("/resetPassword/")
public ResponseData<Object>resetPassWord(@RequestBody UserModelDTO userModelDTO){
return ResponseData.success(userService.resetPassWord(userModelDTO));
}
@PostMapping("/updateUserMail")
public ResponseData<Object>updateUserMail(@RequestBody MailModel mailModel){
return ResponseData.success(userService.updateUserMail(mailModel));
}
@PostMapping("/sendUpdateMailConfirmMail")
public ResponseData<Object>sendUpdateMailConfirmMail(@RequestBody MailModel mailModel){
return ResponseData.success(mailService.sendUpdateConfirmMail(mailModel));
}
}

View File

@@ -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;
}

View File

@@ -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<UserModel> {
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);
}

View File

@@ -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<UserDao, UserModel> implements
.expireAfterWrite(2, TimeUnit.MINUTES)
.build();
@Override
public UserModelVO loginWithMail(UserModelDTO model) {
@@ -99,7 +105,7 @@ public class UserServiceImpl extends ServiceImpl<UserDao, UserModel> 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<UserDao, UserModel> 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<UserDao, UserModel> 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<UserModel> 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<UserModel> 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;
}
}