Files
Disk/easypan-java/src/main/java/com/easypan/service/impl/EmailCodeServiceImpl.java
T
2026-06-13 18:35:43 +08:00

131 lines
4.3 KiB
Java

package com.easypan.service.impl;
import com.easypan.utils.RedisComponent;
import com.easypan.config.AppConfig;
import com.easypan.entity.constants.Constants;
import com.easypan.entity.dto.SysSettingsDto;
import com.easypan.entity.po.EmailCode;
import com.easypan.entity.po.UserInfo;
import com.easypan.entity.query.EmailCodeQuery;
import com.easypan.entity.query.UserInfoQuery;
import com.easypan.exception.BusinessException;
import com.easypan.mappers.EmailCodeMapper;
import com.easypan.mappers.UserInfoMapper;
import com.easypan.service.EmailCodeService;
import com.easypan.utils.StringTools;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import javax.mail.internet.MimeMessage;
import java.util.Date;
/**
* 邮箱验证码 业务接口实现
*/
@Service
public class EmailCodeServiceImpl implements EmailCodeService {
private static final Logger logger = LoggerFactory.getLogger(EmailCodeServiceImpl.class);
@Resource
private JavaMailSender javaMailSender;
@Resource
private EmailCodeMapper<EmailCode, EmailCodeQuery> emailCodeMapper;
@Resource
private UserInfoMapper<UserInfo, UserInfoQuery> userInfoMapper;
@Resource
private AppConfig appConfig;
@Resource
private RedisComponent redisComponent;
/**
* 真正发送邮件验证码
* @param toEmail 发送到德邮箱
* @param code 需要发送的验证码
*/
private void sendEmailCode(String toEmail, String code) {
try {
MimeMessage message = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
//邮件发件人
helper.setFrom(appConfig.getSendUserName());
//邮件收件人 1或多个
helper.setTo(toEmail);
SysSettingsDto sysSettingsDto = redisComponent.getSysSettingsDto();
//邮件主题
helper.setSubject(sysSettingsDto.getRegisterEmailTitle());
//邮件内容
helper.setText(String.format(sysSettingsDto.getRegisterEmailContent(), code));
//邮件发送时间
helper.setSentDate(new Date());
//发送
javaMailSender.send(message);
} catch (Exception e) {
logger.error("邮件发送失败", e);
throw new BusinessException("邮件发送失败");
}
}
/**
* 发送邮箱验证码的前置和后置工作
* @param toEmail 发送的邮箱地址
* @param type 0:注册 1:找回密码
*/
@Override
@Transactional
public void sendEmailCode(String toEmail, Integer type) {
//如果是注册,校验邮箱是否已存在
if (type == Constants.REGISTER_ZERO) {
UserInfo userInfo = userInfoMapper.selectByEmail(toEmail);
if (null != userInfo) {
throw new BusinessException("邮箱已经存在");
}
}
String code = StringTools.getRandomNumber(Constants.LENGTH_5);
sendEmailCode(toEmail, code);
// 数据库中的其他验证码置于不可用
emailCodeMapper.disableEmailCode(toEmail);
// 封装EmailCode对象
EmailCode emailCode = new EmailCode();
emailCode.setCode(code);
emailCode.setEmail(toEmail);
emailCode.setStatus(Constants.REGISTER_ZERO);
emailCode.setCreateTime(new Date());
// 插入数据库
emailCodeMapper.insert(emailCode);
}
@Override
public void checkCode(String email, String code) {
EmailCode emailCode = emailCodeMapper.selectByEmailAndCode(email, code);
// 如果没查到数据
if (emailCode == null) {
throw new BusinessException("邮箱验证码不正确");
}
// 如果已经失效或超时
if (emailCode.getStatus() == 1 || System.currentTimeMillis() - emailCode.getCreateTime()
.getTime() > Constants.LENGTH_15 * 1000 * 60) {
throw new BusinessException("邮箱验证已失效");
}
emailCodeMapper.disableEmailCode(email);
}
}