邮箱登录注册后端实现

/**
 * 登录注册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返回给前端

    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JalenG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值