package com.szwl.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.szwl.constant.ResponseCodesEnum;
import com.szwl.model.bo.R;
import com.szwl.model.bo.ResponseModel;
import com.szwl.model.entity.TAdmin;
import com.szwl.model.entity.TMessageCode;
import com.szwl.service.TAdminService;
import com.szwl.service.TMessageCodeService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.regex.Pattern;
/**
*
* 短信验证码 前端控制器
*
*
* @author wuhs
* @since 2022-04-14
*/
@Api(value = "/tMessageCode", tags = {"验证码"})
@RestController
@RequestMapping("/tMessageCode")
public class TMessageCodeController {
@Autowired
TAdminService tAdminService;
@Autowired
TMessageCodeService tMessageCodeService;
@ApiOperation(value = "获取上次发送验证码的时间")
@GetMapping("/getLastSendTime")
public ResponseModel> getLastSendTime(String phoneOrEmail) {
if (StringUtils.isEmpty(phoneOrEmail)) {
return R.fail(ResponseCodesEnum.A0100, "手机号或邮箱为空!");
}
// 查询该 手机号/邮箱 最后一次发送验证码的时间
Date lastSendTime = tMessageCodeService.getLastSendTime(phoneOrEmail);
// SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// String format = sdf.format(lastSendTime);
// return R.ok(format);
return R.ok(lastSendTime); // 返回时间戳
}
@ApiOperation(value = "发送注册验证码")
@PostMapping("/sentRegisterCode")
public ResponseModel> sentRegisterCode(String ifForeign, String phoneOrEmail, String hostName) {
if (StringUtils.isEmpty(phoneOrEmail)) {
// 说明参数为空
return R.fail(ResponseCodesEnum.A0100, "手机号或邮箱为空!");
}
// 查询该 手机号/邮箱 最后一次发送验证码的时间
Date lastSendTime = tMessageCodeService.getLastSendTime(phoneOrEmail);
long lastTime = lastSendTime.getTime();
long currentTime = System.currentTimeMillis();
if (currentTime - lastTime < 10 * 60 * 1000) {
return R.fail("请勿频繁发送,10分钟后再试");
}
String SZ = "Sunzee";
String companyType = "";
if (StringUtils.isNotEmpty(hostName) && SZ.equals(hostName)) {
companyType = "0";
} else {
companyType = "1";
}
// 如果是国内
if (ifForeign.equals("0")) {
// 定义国内手机号和邮箱的正则表达式
String phoneReg = "^1[3-9]\\d{9}$";
String emailReg = "^[a-zA-Z0-9_-]+([a-zA-Z0-9_.-]*[a-zA-Z0-9])*@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$";
// 判断 phoneOrEmail 是手机号还是邮箱
if (Pattern.matches(phoneReg, phoneOrEmail)) {
//检测是否已有手机号注册
LambdaQueryWrapper query = Wrappers.lambdaQuery();
query.eq(TAdmin::getPhone, phoneOrEmail);
List list = tAdminService.list(query);
if (list.size() > 0) {
return R.fail(ResponseCodesEnum.A0202, "用户手机号已存在");
}
// 国内发送短信
String result = tMessageCodeService.sentMessage("0", phoneOrEmail, companyType);
return R.ok(result);
} else if (Pattern.matches(emailReg, phoneOrEmail)) {
// 检测是否已有邮箱注册
LambdaQueryWrapper query = Wrappers.lambdaQuery();
query.eq(TAdmin::getEmail, phoneOrEmail);
List list = tAdminService.list(query);
if (list.size() > 0) {
return R.fail(ResponseCodesEnum.A0207, "用户邮箱已存在");
}
// 国内发送邮箱
String result = tMessageCodeService.sentEmail("0", phoneOrEmail);
return R.ok(result);
} else {
System.out.println("不是有效的手机号或邮箱地址");
return R.fail(ResponseCodesEnum.A0100, "不是有效的手机号或邮箱地址");
}
} else {
//检测是否已有邮箱注册
LambdaQueryWrapper query = Wrappers.lambdaQuery();
query.eq(TAdmin::getEmail, phoneOrEmail);
List list = tAdminService.list(query);
if (list.size() > 0) {
return R.fail(ResponseCodesEnum.A0207, "用户邮箱已存在");
}
//国外发邮件
String result = tMessageCodeService.sentEmail("0", phoneOrEmail);
return R.ok(result);
}
}
@ApiOperation(value = "发送忘记密码验证码")
@PostMapping("/sentForgetCode")
public ResponseModel> sentForgetCode(String ifForeign, String username, String phoneOrEmail, String hostName) {
if (StringUtils.isEmpty(username)) {
return R.fail(ResponseCodesEnum.A0100, "用户名为空!");
}
if (ifForeign.equals("2")) {
ifForeign = "0";
}
String SZ = "Sunzee";
String companyType = "";
if (StringUtils.isNotEmpty(hostName) && SZ.equals(hostName)) {
companyType = "0";
} else {
companyType = "1";
}
// 如果是国内
if (ifForeign.equals("0")) {
if (StringUtils.isEmpty(phoneOrEmail)) {
return R.fail(ResponseCodesEnum.A0100, "手机号或邮箱为空!");
}
// 定义国内手机号和邮箱的正则表达式
String phoneReg = "^1[3-9]\\d{9}$";
String emailReg = "^[a-zA-Z0-9_-]+([a-zA-Z0-9_.-]*[a-zA-Z0-9])*@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$";
// 判断 phoneOrEmail 是手机号还是邮箱
if (Pattern.matches(phoneReg, phoneOrEmail)) {
System.out.println("忘记密码 >>> 这是一个手机号");
//检测是否已有手机号注册
LambdaQueryWrapper query = Wrappers.lambdaQuery();
query.eq(TAdmin::getPhone, phoneOrEmail);
query.eq(TAdmin::getUsername, username);
List list = tAdminService.list(query);
if (list.size() <= 0) { // 说明手机未注册
return R.fail(ResponseCodesEnum.A0001, "登录名或手机号出错");
}
//国内发送短信
String result = tMessageCodeService.sentMessage("1", phoneOrEmail, companyType);
return R.ok(result);
} else if (Pattern.matches(emailReg, phoneOrEmail)) {
System.out.println("忘记密码 >>> 这是一个邮箱地址");
//检测是否已有邮箱注册
LambdaQueryWrapper query = Wrappers.lambdaQuery();
query.eq(TAdmin::getEmail, phoneOrEmail);
query.eq(TAdmin::getUsername, username);
List list = tAdminService.list(query);
if (list.size() <= 0) { // 邮箱未注册
return R.fail(ResponseCodesEnum.A0001, "登录名或邮箱出错");
}
//国内发邮件
String result = tMessageCodeService.sentEmail("1", phoneOrEmail);
return R.ok(result);
} else {
System.out.println("忘记密码 >>> 不是有效的手机号或邮箱地址");
return R.fail(ResponseCodesEnum.A0001, "非有效的手机号或邮箱地址");
}
} else {
if (StringUtils.isEmpty(phoneOrEmail)) {
return R.fail(ResponseCodesEnum.A0100, "邮箱为空!");
}
//检测是否已有邮箱注册
LambdaQueryWrapper query = Wrappers.lambdaQuery();
query.eq(TAdmin::getEmail, phoneOrEmail);
query.eq(TAdmin::getUsername, username);
List list = tAdminService.list(query);
if (list.size() <= 0) {
return R.fail(ResponseCodesEnum.A0001, "登录名或邮箱出错");
}
//海外发邮件
String result = tMessageCodeService.sentEmail("1", phoneOrEmail);
return R.ok(result);
}
}
@ApiOperation(value = "校验验证码")
@PostMapping("/checkForgetCode")
public ResponseModel> checkForgetCode(String ifForeign, String code, String phoneOrEmail) {
if (StringUtils.isEmpty(code)) {
return R.fail(ResponseCodesEnum.A0100, "验证码为空!");
}
if (ifForeign.equals("2")) {
ifForeign = "0";
}
LambdaQueryWrapper query2 = Wrappers.lambdaQuery();
if (ifForeign.equals("0")) {
query2.eq(TMessageCode::getPhone, phoneOrEmail);
} else {
query2.eq(TMessageCode::getPhone, phoneOrEmail);
}
query2.eq(TMessageCode::getType, "1");//1,忘记密码验证码
query2.eq(TMessageCode::getStatus, "0");
List messageCodeList = tMessageCodeService.list(query2);
if (messageCodeList.size() > 0) {
TMessageCode tMessageCode = messageCodeList.get(messageCodeList.size() - 1);
if (!tMessageCode.getCode().equals(code)) {
return R.fail(ResponseCodesEnum.A0002, "验证码错误");
} else {
tMessageCode.setStatus("1");
tMessageCode.setModifyDate(new Date());
tMessageCodeService.saveOrUpdate(tMessageCode);
return R.ok();
}
} else {
return R.fail(ResponseCodesEnum.A0002, "没有找到验证码");
}
}
}