fix: 会员注册验证码

This commit is contained in:
xiongxiaoyang 2023-04-18 09:17:30 +08:00
parent cab350dbb2
commit 281561c85b
3 changed files with 81 additions and 80 deletions

View File

@ -1,13 +1,13 @@
package com.java2nb.novel.core.utils; package com.java2nb.novel.core.utils;
import com.java2nb.novel.core.cache.CacheService; import lombok.SneakyThrows;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;
import java.awt.*; import java.awt.*;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.io.OutputStream;
import java.util.Random; import java.util.Random;
/** /**
@ -18,27 +18,27 @@ public class RandomValidateCodeUtil {
/** /**
* 放到session中的key * 放到session中的key
* */ */
public static final String RANDOM_CODE_KEY = "randomValidateCodeKey"; public static final String RANDOM_CODE_KEY = "randomValidateCodeKey";
/** /**
* 随机产生只有数字的字符串 private String * 随机产生只有数字的字符串 private String
* */ */
private String randString = "0123456789"; private String randString = "0123456789";
/** /**
* 图片宽 * 图片宽
* */ */
private int width = 100; private int width = 100;
/** /**
* 图片高 * 图片高
* */ */
private int height = 38; private int height = 38;
/** /**
* 干扰线数量 * 干扰线数量
* */ */
private int lineSize = 40; private int lineSize = 40;
/** /**
* 随机产生字符数量 * 随机产生字符数量
* */ */
private int stringNum = 4; private int stringNum = 4;
private static final Logger logger = LoggerFactory.getLogger(RandomValidateCodeUtil.class); private static final Logger logger = LoggerFactory.getLogger(RandomValidateCodeUtil.class);
@ -69,9 +69,10 @@ public class RandomValidateCodeUtil {
} }
/** /**
* 生成随机图片 * 生成随机图片
*/ */
public void getRandcode(CacheService cacheService, HttpServletResponse response) { @SneakyThrows
public String genRandCodeImage(OutputStream out) {
// BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类 // BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR); BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
// 产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作 // 产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作
@ -80,7 +81,7 @@ public class RandomValidateCodeUtil {
g.fillRect(0, 0, width, height); g.fillRect(0, 0, width, height);
//字体大小 //字体大小
//字体颜色 //字体颜色
g.setColor(new Color(204,204,204)); g.setColor(new Color(204, 204, 204));
// 绘制干扰线 // 绘制干扰线
for (int i = 0; i <= lineSize; i++) { for (int i = 0; i <= lineSize; i++) {
drowLine(g); drowLine(g);
@ -90,17 +91,10 @@ public class RandomValidateCodeUtil {
for (int i = 1; i <= stringNum; i++) { for (int i = 1; i <= stringNum; i++) {
randomString = drowString(g, randomString, i); randomString = drowString(g, randomString, i);
} }
logger.info(randomString);
//将生成的随机字符串保存到缓存中
cacheService.set(RANDOM_CODE_KEY,randomString,60*5);
g.dispose(); g.dispose();
try { // 将内存中的图片通过流动形式输出到客户端
// 将内存中的图片通过流动形式输出到客户端 ImageIO.write(image, "JPEG", out);
ImageIO.write(image, "JPEG", response.getOutputStream()); return randomString;
} catch (Exception e) {
logger.error("将内存中的图片通过流动形式输出到客户端失败>>>> ", e);
}
} }
/** /**
@ -109,9 +103,9 @@ public class RandomValidateCodeUtil {
private String drowString(Graphics g, String randomString, int i) { private String drowString(Graphics g, String randomString, int i) {
g.setFont(getFont()); g.setFont(getFont());
g.setColor(new Color(random.nextInt(101), random.nextInt(111), random g.setColor(new Color(random.nextInt(101), random.nextInt(111), random
.nextInt(121))); .nextInt(121)));
String rand = String.valueOf(getRandomString(random.nextInt(randString String rand = String.valueOf(getRandomString(random.nextInt(randString
.length()))); .length())));
randomString += rand; randomString += rand;
g.translate(random.nextInt(3), random.nextInt(3)); g.translate(random.nextInt(3), random.nextInt(3));
g.drawString(rand, 13 * i, 23); g.drawString(rand, 13 * i, 23);

View File

@ -5,6 +5,7 @@ import com.java2nb.novel.core.cache.CacheService;
import com.java2nb.novel.core.enums.ResponseStatus; import com.java2nb.novel.core.enums.ResponseStatus;
import com.java2nb.novel.core.utils.Constants; import com.java2nb.novel.core.utils.Constants;
import com.java2nb.novel.core.utils.FileUtil; import com.java2nb.novel.core.utils.FileUtil;
import com.java2nb.novel.core.utils.IpUtil;
import com.java2nb.novel.core.utils.RandomValidateCodeUtil; import com.java2nb.novel.core.utils.RandomValidateCodeUtil;
import io.github.xxyopen.model.resp.RestResult; import io.github.xxyopen.model.resp.RestResult;
import io.github.xxyopen.util.UUIDUtil; import io.github.xxyopen.util.UUIDUtil;
@ -41,24 +42,25 @@ public class FileController {
* 生成验证码 * 生成验证码
*/ */
@GetMapping(value = "getVerify") @GetMapping(value = "getVerify")
@SneakyThrows
public void getVerify(HttpServletRequest request, HttpServletResponse response) { public void getVerify(HttpServletRequest request, HttpServletResponse response) {
try { //设置相应类型,告诉浏览器输出的内容为图片
//设置相应类型,告诉浏览器输出的内容为图片 response.setContentType("image/jpeg");
response.setContentType("image/jpeg"); //设置响应头信息告诉浏览器不要缓存此内容
//设置响应头信息告诉浏览器不要缓存此内容 response.setHeader("Pragma", "No-cache");
response.setHeader("Pragma", "No-cache"); response.setHeader("Cache-Control", "no-cache");
response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expire", 0);
response.setDateHeader("Expire", 0); RandomValidateCodeUtil randomValidateCode = new RandomValidateCodeUtil();
RandomValidateCodeUtil randomValidateCode = new RandomValidateCodeUtil(); //输出验证码图片方法
//输出验证码图片方法 String randomString = randomValidateCode.genRandCodeImage(response.getOutputStream());
randomValidateCode.getRandcode(cacheService, response); //将生成的随机字符串保存到缓存中
} catch (Exception e) { cacheService.set(RandomValidateCodeUtil.RANDOM_CODE_KEY + ":" + IpUtil.getRealIp(request), randomString,
log.error("获取验证码失败>>>> ", e); 60 * 5);
}
} }
/** /**
* 图片上传 * 图片上传
*
* @return * @return
*/ */
@SneakyThrows @SneakyThrows
@ -67,25 +69,26 @@ public class FileController {
RestResult<String> upload(@RequestParam("file") MultipartFile file) { RestResult<String> upload(@RequestParam("file") MultipartFile file) {
Date currentDate = new Date(); Date currentDate = new Date();
String savePath = String savePath =
Constants.LOCAL_PIC_PREFIX + DateUtils.formatDate(currentDate, "yyyy") + "/" + Constants.LOCAL_PIC_PREFIX + DateUtils.formatDate(currentDate, "yyyy") + "/" +
DateUtils.formatDate(currentDate, "MM") + "/" + DateUtils.formatDate(currentDate, "MM") + "/" +
DateUtils.formatDate(currentDate, "dd"); DateUtils.formatDate(currentDate, "dd");
String oriName = file.getOriginalFilename(); String oriName = file.getOriginalFilename();
assert oriName != null; assert oriName != null;
String saveFileName = UUIDUtil.getUUID32() + oriName.substring(oriName.lastIndexOf(".")); String saveFileName = UUIDUtil.getUUID32() + oriName.substring(oriName.lastIndexOf("."));
File saveFile = new File(picSavePath + savePath, saveFileName); File saveFile = new File(picSavePath + savePath, saveFileName);
if (!saveFile.getParentFile().exists()) { if (!saveFile.getParentFile().exists()) {
boolean isSuccess = saveFile.getParentFile().mkdirs(); boolean isSuccess = saveFile.getParentFile().mkdirs();
if(!isSuccess){ if (!isSuccess) {
throw new BusinessException(ResponseStatus.FILE_DIR_MAKE_FAIL); throw new BusinessException(ResponseStatus.FILE_DIR_MAKE_FAIL);
} }
} }
file.transferTo(saveFile); file.transferTo(saveFile);
if(!FileUtil.isImage(saveFile)){ if (!FileUtil.isImage(saveFile)) {
//上传的文件不是图片 //上传的文件不是图片
saveFile.delete(); saveFile.delete();
throw new BusinessException(ResponseStatus.FILE_NOT_IMAGE); throw new BusinessException(ResponseStatus.FILE_NOT_IMAGE);
}; }
;
return RestResult.ok(savePath + "/" + saveFileName); return RestResult.ok(savePath + "/" + saveFileName);
} }

View File

@ -4,6 +4,7 @@ package com.java2nb.novel.controller;
import com.java2nb.novel.core.bean.UserDetails; import com.java2nb.novel.core.bean.UserDetails;
import com.java2nb.novel.core.cache.CacheService; import com.java2nb.novel.core.cache.CacheService;
import com.java2nb.novel.core.enums.ResponseStatus; import com.java2nb.novel.core.enums.ResponseStatus;
import com.java2nb.novel.core.utils.IpUtil;
import com.java2nb.novel.core.utils.RandomValidateCodeUtil; import com.java2nb.novel.core.utils.RandomValidateCodeUtil;
import com.java2nb.novel.entity.User; import com.java2nb.novel.entity.User;
import com.java2nb.novel.entity.UserBuyRecord; import com.java2nb.novel.entity.UserBuyRecord;
@ -59,11 +60,12 @@ public class UserController extends BaseController {
* 注册 * 注册
*/ */
@PostMapping("register") @PostMapping("register")
public RestResult<?> register(@Validated({AddGroup.class}) User user, @RequestParam(value = "velCode", defaultValue = "") String velCode) { public RestResult<?> register(@Validated({AddGroup.class}) User user,
@RequestParam(value = "velCode", defaultValue = "") String velCode, HttpServletRequest request) {
//判断验证码是否正确 //判断验证码是否正确
if (!velCode.equals(cacheService.get(RandomValidateCodeUtil.RANDOM_CODE_KEY))) { if (!velCode.equals(
cacheService.get(RandomValidateCodeUtil.RANDOM_CODE_KEY + ":" + IpUtil.getRealIp(request)))) {
return RestResult.fail(ResponseStatus.VEL_CODE_ERROR); return RestResult.fail(ResponseStatus.VEL_CODE_ERROR);
} }
@ -113,95 +115,98 @@ public class UserController extends BaseController {
/** /**
* 加入书架 * 加入书架
* */ */
@PostMapping("addToBookShelf") @PostMapping("addToBookShelf")
public RestResult<Void> addToBookShelf(Long bookId,Long preContentId, HttpServletRequest request) { public RestResult<Void> addToBookShelf(Long bookId, Long preContentId, HttpServletRequest request) {
UserDetails userDetails = getUserDetails(request); UserDetails userDetails = getUserDetails(request);
if (userDetails == null) { if (userDetails == null) {
return RestResult.fail(ResponseStatus.NO_LOGIN); return RestResult.fail(ResponseStatus.NO_LOGIN);
} }
userService.addToBookShelf(userDetails.getId(),bookId,preContentId); userService.addToBookShelf(userDetails.getId(), bookId, preContentId);
return RestResult.ok(); return RestResult.ok();
} }
/** /**
* 移出书架 * 移出书架
* */ */
@DeleteMapping("removeFromBookShelf/{bookId}") @DeleteMapping("removeFromBookShelf/{bookId}")
public RestResult<?> removeFromBookShelf(@PathVariable("bookId") Long bookId, HttpServletRequest request) { public RestResult<?> removeFromBookShelf(@PathVariable("bookId") Long bookId, HttpServletRequest request) {
UserDetails userDetails = getUserDetails(request); UserDetails userDetails = getUserDetails(request);
if (userDetails == null) { if (userDetails == null) {
return RestResult.fail(ResponseStatus.NO_LOGIN); return RestResult.fail(ResponseStatus.NO_LOGIN);
} }
userService.removeFromBookShelf(userDetails.getId(),bookId); userService.removeFromBookShelf(userDetails.getId(), bookId);
return RestResult.ok(); return RestResult.ok();
} }
/** /**
* 分页查询书架 * 分页查询书架
* */ */
@GetMapping("listBookShelfByPage") @GetMapping("listBookShelfByPage")
public RestResult<?> listBookShelfByPage(@RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "10") int pageSize,HttpServletRequest request) { public RestResult<?> listBookShelfByPage(@RequestParam(value = "curr", defaultValue = "1") int page,
@RequestParam(value = "limit", defaultValue = "10") int pageSize, HttpServletRequest request) {
UserDetails userDetails = getUserDetails(request); UserDetails userDetails = getUserDetails(request);
if (userDetails == null) { if (userDetails == null) {
return RestResult.fail(ResponseStatus.NO_LOGIN); return RestResult.fail(ResponseStatus.NO_LOGIN);
} }
return RestResult.ok(userService.listBookShelfByPage(userDetails.getId(),page,pageSize)); return RestResult.ok(userService.listBookShelfByPage(userDetails.getId(), page, pageSize));
} }
/** /**
* 分页查询阅读记录 * 分页查询阅读记录
* */ */
@GetMapping("listReadHistoryByPage") @GetMapping("listReadHistoryByPage")
public RestResult<?> listReadHistoryByPage(@RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "10") int pageSize,HttpServletRequest request) { public RestResult<?> listReadHistoryByPage(@RequestParam(value = "curr", defaultValue = "1") int page,
@RequestParam(value = "limit", defaultValue = "10") int pageSize, HttpServletRequest request) {
UserDetails userDetails = getUserDetails(request); UserDetails userDetails = getUserDetails(request);
if (userDetails == null) { if (userDetails == null) {
return RestResult.fail(ResponseStatus.NO_LOGIN); return RestResult.fail(ResponseStatus.NO_LOGIN);
} }
return RestResult.ok(userService.listReadHistoryByPage(userDetails.getId(),page,pageSize)); return RestResult.ok(userService.listReadHistoryByPage(userDetails.getId(), page, pageSize));
} }
/** /**
* 添加阅读记录 * 添加阅读记录
* */ */
@PostMapping("addReadHistory") @PostMapping("addReadHistory")
public RestResult<?> addReadHistory(Long bookId,Long preContentId, HttpServletRequest request) { public RestResult<?> addReadHistory(Long bookId, Long preContentId, HttpServletRequest request) {
UserDetails userDetails = getUserDetails(request); UserDetails userDetails = getUserDetails(request);
if (userDetails == null) { if (userDetails == null) {
return RestResult.fail(ResponseStatus.NO_LOGIN); return RestResult.fail(ResponseStatus.NO_LOGIN);
} }
userService.addReadHistory(userDetails.getId(),bookId,preContentId); userService.addReadHistory(userDetails.getId(), bookId, preContentId);
return RestResult.ok(); return RestResult.ok();
} }
/** /**
* 添加反馈 * 添加反馈
* */ */
@PostMapping("addFeedBack") @PostMapping("addFeedBack")
public RestResult<?> addFeedBack(String content, HttpServletRequest request) { public RestResult<?> addFeedBack(String content, HttpServletRequest request) {
UserDetails userDetails = getUserDetails(request); UserDetails userDetails = getUserDetails(request);
if (userDetails == null) { if (userDetails == null) {
return RestResult.fail(ResponseStatus.NO_LOGIN); return RestResult.fail(ResponseStatus.NO_LOGIN);
} }
userService.addFeedBack(userDetails.getId(),content); userService.addFeedBack(userDetails.getId(), content);
return RestResult.ok(); return RestResult.ok();
} }
/** /**
* 分页查询我的反馈列表 * 分页查询我的反馈列表
* */ */
@GetMapping("listUserFeedBackByPage") @GetMapping("listUserFeedBackByPage")
public RestResult<?> listUserFeedBackByPage(@RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "5") int pageSize, HttpServletRequest request){ public RestResult<?> listUserFeedBackByPage(@RequestParam(value = "curr", defaultValue = "1") int page,
@RequestParam(value = "limit", defaultValue = "5") int pageSize, HttpServletRequest request) {
UserDetails userDetails = getUserDetails(request); UserDetails userDetails = getUserDetails(request);
if (userDetails == null) { if (userDetails == null) {
return RestResult.fail(ResponseStatus.NO_LOGIN); return RestResult.fail(ResponseStatus.NO_LOGIN);
} }
return RestResult.ok(userService.listUserFeedBackByPage(userDetails.getId(),page,pageSize)); return RestResult.ok(userService.listUserFeedBackByPage(userDetails.getId(), page, pageSize));
} }
/** /**
* 查询个人信息 * 查询个人信息
* */ */
@GetMapping("userInfo") @GetMapping("userInfo")
public RestResult<?> userInfo(HttpServletRequest request) { public RestResult<?> userInfo(HttpServletRequest request) {
UserDetails userDetails = getUserDetails(request); UserDetails userDetails = getUserDetails(request);
@ -213,15 +218,15 @@ public class UserController extends BaseController {
/** /**
* 更新个人信息 * 更新个人信息
* */ */
@PostMapping("updateUserInfo") @PostMapping("updateUserInfo")
public RestResult<?> updateUserInfo(@Validated({UpdateGroup.class}) User user, HttpServletRequest request) { public RestResult<?> updateUserInfo(@Validated({UpdateGroup.class}) User user, HttpServletRequest request) {
UserDetails userDetails = getUserDetails(request); UserDetails userDetails = getUserDetails(request);
if (userDetails == null) { if (userDetails == null) {
return RestResult.fail(ResponseStatus.NO_LOGIN); return RestResult.fail(ResponseStatus.NO_LOGIN);
} }
userService.updateUserInfo(userDetails.getId(),user); userService.updateUserInfo(userDetails.getId(), user);
if(user.getNickName() != null){ if (user.getNickName() != null) {
userDetails.setNickName(user.getNickName()); userDetails.setNickName(user.getNickName());
Map<String, Object> data = new HashMap<>(1); Map<String, Object> data = new HashMap<>(1);
data.put("token", jwtTokenUtil.generateToken(userDetails)); data.put("token", jwtTokenUtil.generateToken(userDetails));
@ -233,36 +238,38 @@ public class UserController extends BaseController {
/** /**
* 更新密码 * 更新密码
* */ */
@PostMapping("updatePassword") @PostMapping("updatePassword")
public RestResult<?> updatePassword(String oldPassword,String newPassword1,String newPassword2,HttpServletRequest request) { public RestResult<?> updatePassword(String oldPassword, String newPassword1, String newPassword2,
HttpServletRequest request) {
UserDetails userDetails = getUserDetails(request); UserDetails userDetails = getUserDetails(request);
if (userDetails == null) { if (userDetails == null) {
return RestResult.fail(ResponseStatus.NO_LOGIN); return RestResult.fail(ResponseStatus.NO_LOGIN);
} }
if(!(StringUtils.isNotBlank(newPassword1) && newPassword1.equals(newPassword2))){ if (!(StringUtils.isNotBlank(newPassword1) && newPassword1.equals(newPassword2))) {
RestResult.fail(ResponseStatus.TWO_PASSWORD_DIFF); RestResult.fail(ResponseStatus.TWO_PASSWORD_DIFF);
} }
userService.updatePassword(userDetails.getId(),oldPassword,newPassword1); userService.updatePassword(userDetails.getId(), oldPassword, newPassword1);
return RestResult.ok(); return RestResult.ok();
} }
/** /**
* 分页查询用户书评 * 分页查询用户书评
* */ */
@GetMapping("listCommentByPage") @GetMapping("listCommentByPage")
public RestResult<?> listCommentByPage(@RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "5") int pageSize,HttpServletRequest request) { public RestResult<?> listCommentByPage(@RequestParam(value = "curr", defaultValue = "1") int page,
@RequestParam(value = "limit", defaultValue = "5") int pageSize, HttpServletRequest request) {
UserDetails userDetails = getUserDetails(request); UserDetails userDetails = getUserDetails(request);
if (userDetails == null) { if (userDetails == null) {
return RestResult.fail(ResponseStatus.NO_LOGIN); return RestResult.fail(ResponseStatus.NO_LOGIN);
} }
return RestResult.ok(bookService.listCommentByPage(userDetails.getId(),null,page,pageSize)); return RestResult.ok(bookService.listCommentByPage(userDetails.getId(), null, page, pageSize));
} }
/** /**
* 购买小说章节 * 购买小说章节
* */ */
@PostMapping("buyBookIndex") @PostMapping("buyBookIndex")
public RestResult<?> buyBookIndex(UserBuyRecord buyRecord, HttpServletRequest request) { public RestResult<?> buyBookIndex(UserBuyRecord buyRecord, HttpServletRequest request) {
UserDetails userDetails = getUserDetails(request); UserDetails userDetails = getUserDetails(request);
@ -270,12 +277,9 @@ public class UserController extends BaseController {
return RestResult.fail(ResponseStatus.NO_LOGIN); return RestResult.fail(ResponseStatus.NO_LOGIN);
} }
buyRecord.setBuyAmount(bookService.queryBookIndex(buyRecord.getBookIndexId()).getBookPrice()); buyRecord.setBuyAmount(bookService.queryBookIndex(buyRecord.getBookIndexId()).getBookPrice());
userService.buyBookIndex(userDetails.getId(),buyRecord); userService.buyBookIndex(userDetails.getId(), buyRecord);
return RestResult.ok(); return RestResult.ok();
} }
} }