131 lines
4.3 KiB
Java
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);
|
|
}
|
|
|
|
} |