package com.ruoyi.web.controller.common; import com.google.code.kaptcha.Producer; import com.ruoyi.common.annotation.Anonymous; import com.ruoyi.common.config.RuoYiConfig; import com.ruoyi.common.constant.CacheConstants; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.sign.Base64; import com.ruoyi.common.utils.uuid.IdUtils; import com.ruoyi.generator.util.SendSms; import com.ruoyi.generator.util.SendSmsTencent; import com.ruoyi.system.service.ISysConfigService; import org.apache.logging.log4j.util.Strings; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.FastByteArrayOutputStream; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import javax.imageio.ImageIO; import javax.servlet.http.HttpServletResponse; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; /** * 验证码操作处理 * * @author ruoyi */ @RestController public class CaptchaController { @Resource(name = "captchaProducer") private Producer captchaProducer; @Resource(name = "captchaProducerMath") private Producer captchaProducerMath; @Autowired private RedisCache redisCache; @Autowired private ISysConfigService configService; @Autowired private SendSmsTencent sendSmsTencent; /** * 生成验证码 */ @GetMapping("/captchaImage") public AjaxResult getCode(HttpServletResponse response) throws IOException { AjaxResult ajax = AjaxResult.success(); boolean captchaEnabled = configService.selectCaptchaEnabled(); ajax.put("captchaEnabled", captchaEnabled); if (!captchaEnabled) { return ajax; } // 保存验证码信息 String uuid = IdUtils.simpleUUID(); String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + uuid; String capStr = null, code = null; BufferedImage image = null; // 生成验证码 String captchaType = RuoYiConfig.getCaptchaType(); if ("math".equals(captchaType)) { String capText = captchaProducerMath.createText(); capStr = capText.substring(0, capText.lastIndexOf("@")); code = capText.substring(capText.lastIndexOf("@") + 1); image = captchaProducerMath.createImage(capStr); } else if ("char".equals(captchaType)) { capStr = code = captchaProducer.createText(); image = captchaProducer.createImage(capStr); } redisCache.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES); // 转换流信息写出 FastByteArrayOutputStream os = new FastByteArrayOutputStream(); try { ImageIO.write(image, "jpg", os); } catch (IOException e) { return AjaxResult.error(e.getMessage()); } ajax.put("uuid", uuid); ajax.put("img", Base64.encode(os.toByteArray())); return ajax; } @GetMapping("/captchaCode") @Anonymous public AjaxResult getSmsCode(String phoneNumber, String smsType) throws ExecutionException, InterruptedException { //校验手机号 boolean isPhone = StringUtils.checkPhoneNumber(phoneNumber); if (!isPhone) { return AjaxResult.error("手机号不正确!"); } if (StringUtils.isBlank(smsType)) { return AjaxResult.error("参数异常!"); } //1.生成随机四位验证码 Random random = new Random(); int code = 1000 + random.nextInt(9000); String verifyKey = ""; switch (smsType) { case "login": verifyKey = CacheConstants.SMS_LOGIN_CODE_KEY + phoneNumber; break; case "register": verifyKey = CacheConstants.SMS_REGISTER_CODE_KEY + phoneNumber; break; case "update": verifyKey = CacheConstants.SMS_UPDATE_PASSWORD_CODE_KEY + phoneNumber; break; case "verify": verifyKey = CacheConstants.SMS_VERIFY_CODE_KEY + phoneNumber; break; } if (Strings.isBlank(verifyKey)) { return AjaxResult.error("参数异常!"); } //2.发送验证码 SendSms.sendMsg("次元时代", "SMS_491395317", phoneNumber, String.valueOf(code)); //sendSmsTencent.sendMsg("次元时代", "SMS_491395317", phoneNumber, String.valueOf(code)); //3.存入redis redisCache.setCacheObject(verifyKey, code, 120, TimeUnit.MINUTES); return AjaxResult.success("短信验证码发送成功!"); } }