/**
* 登录注册controller
*/
@RestController
@RequestMapping("/verify")
@RequiredArgsConstructor
public class LoginController {
private final LoginService loginService;
/**
* 生成验证码的接口
*
* @throws Exception
*/
@GetMapping("/getCode")
public CommonResponse getCode() throws Exception {
return new CommonResponse().success(loginService.getCode());
}
/**
* 发送邮箱验证码
*
* @param
* @return
*/
@PostMapping("/sendCode")
public CommonResponse sendCode(@Valid @RequestBody MemberSendCodeReq req) {
MemberSendCodeResp sendCodeResp = loginService.sendCode(req);
if (sendCodeResp.getFlag() == 0) {
return new CommonResponse().fail("图形验证码失效了喵");
} else if (sendCodeResp.getFlag() == 1) {
return new CommonResponse().fail("图形验证码输错了喵");
}
return new CommonResponse().success("邮箱验证码发送成功了喵", sendCodeResp);
}
/**
* 登录/注册
*
* @return
*/
@AccessLimit(second = 5 * 60, maxRequestCount = 1, forbiddenTime = 5 * 60)
@PostMapping("/login")
public CommonResponse login(MemberLoginRegisterReq req) throws Exception {
return new CommonResponse().success(loginService.login(req));
}
}
/**
* 登录注册service
*/
public interface LoginService {
/**
* 获取验证码
*/
public VerifyCodeResp getCode();
/**
* 发送邮件验证码,返回0表示图形验证码失效,返回1表示图形验证码错误,返回2表示发送成功
*
* @param req
* @return
*/
public MemberSendCodeResp sendCode(MemberSendCodeReq req);
/**
* 登录/注册
*
* @param req
*/
public MemberLoginRegisterResp login(MemberLoginRegisterReq req);
}
/**
* 登陆注册service实现类
*/
@Service
@RequiredArgsConstructor
public class LoginServiceImpl implements LoginService {
private final RedisTemplate redisTemplate;
private final JavaMailSenderImpl mailSender;
private final EmailRecordMapper emailRecordMapper;
private final MemberMapper memberMapper;
@Value("${spring.mail.username}")
private String username;
/**
* 获取图片验证码
*/
@Override
public VerifyCodeResp getCode() {
//生成uuid作为key,验证码作为值存入redis
String captchaKey = UUID.randomUUID().toString();
//定义图形验证码的长、宽、验证码字符数、干扰线宽度
ShearCaptcha shearCaptcha = CaptchaUtil.createShearCaptcha(100, 30, 6, 0);
// 打印验证码
System.out.println(shearCaptcha.getCode());
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.opsForValue().set("captcha:" + captchaKey, shearCaptcha.getCode(), 5, TimeUnit.MINUTES);
//图形验证码
String base64String = "";
try {
base64String = "data:image/png;base64," + shearCaptcha.getImageBase64();
} catch (Exception e) {
e.printStackTrace();
}
VerifyCodeResp verifyCodeResp = new VerifyCodeResp();
verifyCodeResp.setCaptchaKey(captchaKey);
verifyCodeResp.setCaptchaImg(base64String);
return verifyCodeResp;
}
/**
* 发送邮件验证码,返回0表示图形验证码失效,返回1表示图形验证码错误,返回2表示发送成功
*
* @param req
* @return
*/
@Override
public MemberSendCodeResp sendCode(MemberSendCodeReq req) {
//从redis中得到正确的图形验证码
String rightCode = (String) redisTemplate.opsForValue().get("captcha:" + req.getCaptchaKey());
if (rightCode == null) {
//redis中的图形验证码过期,图形验证码已失效
return new MemberSendCodeResp(0, null);
}
if (!rightCode.equals(req.getVerifyCode())) {
//输入的验证码有误
return new MemberSendCodeResp(1, null);
}
//如果正确则向指定邮箱发送邮件
SimpleMailMessage message = new SimpleMailMessage();
message.setSubject("【12306】");
String code = RandomUtil.randomString(6);
message.setText("【12306】您正在注册12306平台账号,验证码是:" + RandomUtil.randomString(6)
+ ",未注册的用户将自动为您注册喵(●♡ᴗ♡●),5分钟内有效,请及时输入。");
message.setTo(req.getEmail());
message.setFrom(username);
mailSender.send(message);
//将发送邮箱验证码记录存储在数据库中
EmailRecord emailRecord = new EmailRecord();
emailRecord.setCode(code);
emailRecord.setValidDate(5);
emailRecord.setType(0);
emailRecord.setSendTime(new Date());
emailRecordMapper.insert(emailRecord);
return new MemberSendCodeResp(2, Math.toIntExact(emailRecord.getId()));
}
/**
* 登录/注册
*
* @param req
*/
@Override
public MemberLoginRegisterResp login(MemberLoginRegisterReq req) {
//判断图形验证码是否正确
String rightCode = (String) redisTemplate.opsForValue().get("captcha:" + req.getCaptchaKey());
if (rightCode == null) {
//redis中的图形验证码过期,验证码已失效
TrainException.cast("验证码已失效");
}
if (!rightCode.equals(req.getVerifyCode())) {
//输入的验证码有误
TrainException.cast("输入的验证码有误");
}
//判断邮箱验证码是否正确
Integer emailRecordId = req.getEmailRecordId();
EmailRecord emailRecord = emailRecordMapper.selectById(emailRecordId);
if (emailRecord == null) {
TrainException.cast("查不到对应的邮箱验证码发送记录");
}
if (!emailRecord.getCode().equals(req.getEmailCode())) {
TrainException.cast("输入的邮箱验证码有误");
}
emailRecord.setIsUse(1);
boolean flag = emailRecordMapper.updateById(emailRecord);
if (!flag) {
TrainException.cast("更新验证码使用状态失败");
}
//查看用户表中是否存在此邮箱
MemberExample memberExample = new MemberExample();
memberExample.createCriteria().andEmailEqualTo(req.getEmail());
List<Member> list = memberMapper.selectByExample(memberExample);
if (CollectionUtils.isEmpty(list)) {
//若不存在则为注册,向用户表插入一行数据
Member member = new Member();
member.setId(SnowUtil.getSnowflakeNextId());
member.setEmail(req.getEmail());
memberMapper.insert(member);
}
//生成jwt返回给前端
}
}