使用技术:
1. MySQL数据库
2. Redis缓存(极其简单)
功能介绍:
- 发送验证码到QQ邮箱,验证码存到Redis中三分组有效,到时间自动清理
- 登录时返回结果,密码不添加表格展示了,密码不正确提示密码不正确
输入邮箱 | 输入验证码 | 返回提示 |
正确、不正确 | 没输入 | 验证码不能为空 |
不正确 | 输入 | 邮箱未注册 |
正确 | 输入错误 | 验证码不对哦 |
正确 | 输入过期的 | 验证码失效了哦,请重新获取 |
不正确 | 没输入 | 邮箱未注册 |
正确 | 输入不过期正确 | 登录成功了 |
- 详细思路在代码的注释里面。一步一个注释哦。
项目总览
数据库:
项目:
实现过程
4. 引入依赖
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.1.tmp</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.3.1.tmp</version>
</dependency>
<!--Redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--redis-->
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
<version>1.5.22</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>2.5.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
- 配置项目
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/email_test?serverTimezone=UTC?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root
#邮箱配置
#平台地址,这里用的是qq邮箱,使用其他邮箱请更换
spring.mail.host = smtp.qq.com
#改成自己的邮箱
spring.mail.username = xxxxx@qq.com
#发送短信后它给你的授权码 填写到这里
spring.mail.password = xxxxxx
#这东西不用改
spring.mail.properties.mail.smtp.ssl.enable=true
##编码格式
spring.mail.default-encoding=UTF-8
server.port=7002
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器地址
spring.redis.host=127.0.0.1
# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器连接密码(默认为空)
spring.redis.password=
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.jedis.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.jedis.pool.max-wait=-1ms
# 连接池中的最大空闲连接
spring.redis.jedis.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.jedis.pool.min-idle=0
# 连接超时时间(毫秒)
spring.redis.timeout=5000ms
- 关键代码
【遇到缺失Redis和mailSender,添加代码】
@Autowired
private JavaMailSender mailSender;
@Autowired
RedisTemplate<String, String> redisTemplate;
--------------------------发送邮件-------------------------------------------------
@Override
public Map<String, Object> send(UserInfo userInfo) {
Map<String, Object> map=new HashMap<>();
/**
* 前提:
* 为了区分验证码是属于谁发送的,发送验证码时需要提交邮箱
* 参数:email 邮箱 code 验证码
*/
//判断是否提交了邮箱
if (StringUtils.isEmpty(userInfo.getEmail())){
map.put("date","null");
map.put("msg","请提交账号");
return map;
}
String code;
//发送邮箱验证码
try {
SimpleMailMessage mailMessage = new SimpleMailMessage();
//主题
mailMessage.setSubject("验证码邮件");
//生成随机数
code = randomCode();
//内容
mailMessage.setText("您收到的验证码是:" + code);
//发给谁
mailMessage.setTo(userInfo.getEmail());
//你自己的邮箱(可以去配置文件中获取)当前写死
mailMessage.setFrom("xxxxxxxx@qq.com");
//发送
mailSender.send(mailMessage);
} catch (Exception e) {
e.printStackTrace();
map.put("date",null);
map.put("msg","数据异常啦");
return map;
}
//如果成功把手机号和验证码放到redis中保存
//设置key,value,过期时间,时间单位
//时间单位为 TimeUnit.MINUTES 两分钟,TimeUnit可以决定单位
redisTemplate.opsForValue().set(userInfo.getEmail(), code, 2, TimeUnit.MINUTES);
map.put("code",code);
map.put("msg","发送成功");
return map;
}
/**
* 随机生成6位数的虚拟银行卡
* @return String code
*/
public String randomCode(){
StringBuilder str = new StringBuilder();
Random random = new Random();
for (int i = 0; i < 6; i++) {
str.append(random.nextInt(10));
}
return str.toString();
}
@Override
public Map<String, Object> login(UserInfo userInfo) {
Map<String, Object> map=new HashMap<>();
if (StringUtils.isEmpty(userInfo.getCode())){
//没输入验证码
map.put("date",null);
map.put("msg","验证码不能为空");
return map;
}
//首先判断邮箱是否存在
UserInfo userInfoDB = baseMapper.selectOne(Wrappers.<UserInfo>lambdaQuery().eq(UserInfo::getEmail, userInfo.getEmail()));
//判断该邮箱是否存在
if (userInfoDB==null){
//不存在,返回
map.put("date",null);
map.put("msg","该邮箱还未注册");
return map;
}
//存在,去缓存中获取验证码
String redisCode = redisTemplate.opsForValue().get(userInfo.getEmail());
if (StringUtils.isEmpty(redisCode)){
map.put("date",null);
map.put("msg","验证码失效了哦,请重新获取");
return map;
}
//验证验证码是否正确
if (redisCode.equals(userInfo.getCode())){
//正确,直接登录
map.put("date",userInfoDB);
map.put("msg","登录成功了");
return map;
}else {
//不正确
map.put("date","null");
map.put("msg","验证码不对哦");
return map;
}
}
- 测试结果(验证码过期测试),其他测试不展示
- 项目链接
- 数据库单表只有这几个字段,自行创建吧
项目链接
8. 提示:
需要修改的地方大概有,配置文件(数据库账号密码。数据库名称,QQ邮箱配置),代码里面一些xxxxx私密数据也需要更换成自己的。