总体设计:使用shiro框架管理用户权限,未登录的用户只能阅读,注册与登录,登陆后的用户可以写小说,添加小说到书架,对书架的小说进行删除,对小说以及章节发表评论,用户可以删除自己发送的评论及自己小说下的评论。管理员可以设置网站首页的推荐,删除违规的章节,并把章节的备份发送到被删除用户的邮箱。用户在注册时,验证码将使用redis保存,并设置10分钟有效期,同一邮箱24h内只能发送十次验证码。
获取验证码
用户点击获取验证码时,前端将注册的邮箱传入后端,redis的key为注册的邮箱,value为验证码,时间戳,发送的次数,以json格式存放,并设置24小时过期时间。查找redis内是否有该key,如果没有,则为用户首次获取验证码,并发送验证码,将数据存入redis中,如果有,根据时间戳判断发送的间隔是否大于30s,发送的次数是否达到10次,符合条件后更新redis中的验证码,时间戳,发送次数+1
public String getCode(String email) throws MessagingException {
HashMap<String, String> map = new HashMap<>();
//判断是否首次获取验证码
if(redisTemplate.hasKey(email)){
//非首次获取从redis中拿到信息
String json = redisTemplate.opsForValue().get(email);
JSONObject obj = JSON.parseObject(json);
String time = obj.getString("time");//验证码获取时间
String num = obj.getString("num");//第几次获取
int number = Integer.parseInt(num);
if (number == 10){
return "验证码发送次数已用尽,请明天再来";
}
if ((System.currentTimeMillis()/1000 - Long.parseLong(time))<30){
return "距离上次验证码发送还不到30s!";
}
map.put("code",CodeUtil.code());
map.put("time", String.valueOf(System.currentTimeMillis()/ 1000));
number++;
map.put("num", String.valueOf(number));
redisTemplate.opsForValue().getAndS