Commit 5afb96eb authored by zhouxudong's avatar zhouxudong

添加短信发送记录

parent d6c1ff21
......@@ -93,6 +93,12 @@
<artifactId>nimbus-jose-jwt</artifactId>
<version>9.23</version>
</dependency>
<!--启用Spring Boot的配置处理器。-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<build>
......
......@@ -20,9 +20,9 @@ import java.util.Arrays;
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
private final String[] createNeedToFill = {
"createPerson", "createTime", "updatePerson", "updateTime", "version"
"createBy", "createTime", "updateBy", "updateTime", "version"
};
private final String[] updateNeedToFill = {"updatePerson", "updateTime"};
private final String[] updateNeedToFill = {"updateBy", "updateTime"};
private final Class[] ignoreAutoFillEntity = {};
@Override
......@@ -45,7 +45,7 @@ public class MyMetaObjectHandler implements MetaObjectHandler {
.forEach(
property -> {
if (metaObject.hasSetter(property)) {
if (property.endsWith("Person")) {
if (property.endsWith("By")) {
this.setFieldValByName(property, userInfo.getUserName(), metaObject);
}
......
......@@ -4,8 +4,8 @@ import lombok.Getter;
@Getter
public enum SendMsgTypeEnum {
REGISTER(1,"345","注册"),
LOGIN(2,"234","登录");
REGISTER(1,"a0072fe0c74c47e59fbf700a4ce94350","注册"),
LOGIN(2,"a0072fe0c74c47e59fbf700a4ce94350","登录");
private final Integer code;
private final String templateId;
......@@ -25,4 +25,12 @@ public enum SendMsgTypeEnum {
}
return null;
}
public static String getName(Integer code){
for (SendMsgTypeEnum bt: values()){
if (bt.code.equals(code)){
return bt.templateId;
}
}
return null;
}
}
......@@ -30,6 +30,7 @@ public class SysPcLoginController {
*/
@PostMapping("/login")
public String login(@Validated @RequestBody LoginVo loginVo) {
return this.sysUserInfoService.loginPc(loginVo);
}
......@@ -44,16 +45,7 @@ public class SysPcLoginController {
public String phoneLogin(@Validated @RequestBody PhoneLoginVo phoneLoginVo) {
return sysUserInfoService.phoneLogin(phoneLoginVo);
}
/**
* @description: pc-退出登录
* @date: 2023/11/20 9:40
* @param: [request]
* @return: boolean
*/
@PostMapping("logout")
public boolean logout(HttpServletRequest request) {
return this.sysUserInfoService.logout(request.getHeader("token"));
}
/**
* @description: 核对手机号是否已经注册
* @date: 2023/11/20 9:40
......@@ -74,6 +66,16 @@ public class SysPcLoginController {
public boolean sendMsg(@RequestBody @Validated SendPhoneVo sendPhoneVo) {
return this.sysUserInfoService.sendMsg(sendPhoneVo);
}
/**
* @description: 发送短信
* @date: 2023/11/20 14:21
* @param: [phone]
* @return: boolean
*/
@PostMapping("/sendMsg/{phone}")
public boolean sendMsg(String phone) {
return this.sysUserInfoService.sendMsg(phone);
}
/**
* @description: 注册
......
package com.lyy.user.moudle.login.vo;
import lombok.*;
import java.util.List;
/**
* @Author:zhouxudong
* @version: 1.0
* @Date: 2023/11/20 14:38
* @Description: 短信返回格式
*/
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class SmsVo {
private String code;
private String description;
private List<Object> result;
//返回样例
/* {
"result": [{
"total": 1,
"originTo": "18731081812",
"createTime": "2023-11-20T06:05:08Z",
"from": "8823112010314",
"smsMsgId": "0521b98d-75ae-467f-9672-8a9707095e67_28147916",
"countryId": "CN",
"status": "000000"
}],
"code": "000000",
"description": "Success"
}*/
}
package com.lyy.user.moudle.smslog.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.*;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* 短信发送记录表;
*
* @author : http://www.chiner.pro
* @date : 2023-11-20
*/
@TableName("sys_sms_log")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Accessors(chain = true)
public class SysSmsLogEntity implements Serializable {
/** 主键id */
@TableId private String id;
/** 返回标识符 */
private String code;
/** 返回字段描述 */
private String description;
/** json格式字符串 */
private String result;
/** 短信类型 */
private String type;
private String phone;
/** 乐观锁 */
@Version
@TableField(value = "version", fill = FieldFill.INSERT)
private Integer version;
/** 创建人 */
@TableField(value = "create_by", fill = FieldFill.INSERT)
private String createBy;
/** 创建时间 */
@TableField(value = "create_time", fill = FieldFill.INSERT)
private Date createTime;
/** 更新人 */
@TableField(value = "update_by", fill = FieldFill.UPDATE)
private String updateBy;
/** 更新时间 */
@TableField(value = "update_time", fill = FieldFill.UPDATE)
private Date updateTime;
}
package com.lyy.user.moudle.smslog.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.lyy.user.moudle.smslog.entity.SysSmsLogEntity;
import org.apache.ibatis.annotations.Mapper;
/**
* @author: zhouxudong
* @version: 1.0
* @createTime: 2023/11/20 15:02
* @description: 短信发送记录表
*/
@Mapper
public interface SysSmsLogMapper extends BaseMapper<SysSmsLogEntity> {}
package com.lyy.user.moudle.smslog.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.lyy.user.moudle.smslog.entity.SysSmsLogEntity;
/**
* @author: zhouxudong
* @version: 1.0
* @createTime: 2023/11/20 15:01
* @description: 短信发送记录表
*/
public interface SysSmsLogService extends IService<SysSmsLogEntity> {
}
package com.lyy.user.moudle.smslog.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.lyy.user.moudle.smslog.entity.SysSmsLogEntity;
import com.lyy.user.moudle.smslog.mapper.SysSmsLogMapper;
import org.springframework.stereotype.Service;
import com.lyy.user.moudle.smslog.service.SysSmsLogService;
/**
* @author: zhouxudong
* @version: 1.0
* @createTime: 2023/11/20 15:01
* @description: 短信发送记录表
*/
@Service
public class SysSmsLogServiceImpl extends ServiceImpl<SysSmsLogMapper, SysSmsLogEntity> implements SysSmsLogService {}
package com.lyy.user.moudle.user.controller;
import com.lyy.user.moudle.user.service.SysUserInfoService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
/**
* @Author:zhouxudong
*
* @version: 1.0 @Date: 2023/11/20 15:21 @Description: 用户模块
*/
@RestController
@RequestMapping("/user")
@RequiredArgsConstructor
public class SysUserController {
private final SysUserInfoService sysUserInfoService;
/**
* @description: pc-退出登录
* @date: 2023/11/20 9:40
* @param: [request]
* @return: boolean
*/
@PostMapping("logout")
public boolean logout(HttpServletRequest request) {
return this.sysUserInfoService.logout(request.getHeader("token"));
}
}
......@@ -53,6 +53,13 @@ public interface SysUserInfoService extends IService<SysUserInfo> {
* @return: boolean
**/
boolean sendMsg(SendPhoneVo sendPhoneVo);
/**
* @description: 发送短信
* @date: 2023/11/16 18:36
* @param: [phone]
* @return: boolean
**/
boolean sendMsg(String phone);
//用户注册
boolean sign(RegisterVo registerVo);
}
package com.lyy.user.moudle.user.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.ReUtil;
......@@ -11,12 +12,16 @@ import com.lyy.user.config.LyyConfig;
import com.lyy.user.config.exception.ServiceException;
import com.lyy.user.constant.Constants;
import com.lyy.user.enums.SendMsgTypeEnum;
import com.lyy.user.moudle.login.vo.SmsVo;
import com.lyy.user.moudle.smslog.entity.SysSmsLogEntity;
import com.lyy.user.moudle.smslog.service.SysSmsLogService;
import com.lyy.user.moudle.user.entity.SysUserInfo;
import com.lyy.user.moudle.user.mapper.SysUserInfoMapper;
import com.lyy.user.moudle.user.service.SysUserInfoService;
import com.lyy.user.moudle.user.vo.*;
import com.lyy.user.util.jwt.JwtTokenUtil;
import com.lyy.user.util.sms.SendMsgUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -39,10 +44,12 @@ import java.util.concurrent.TimeUnit;
*/
@Service
@Slf4j
@RequiredArgsConstructor
public class SysUserInfoServiceImpl extends ServiceImpl<SysUserInfoMapper, SysUserInfo>
implements SysUserInfoService {
@Autowired LyyConfig lyyConfig;
private final LyyConfig lyyConfig;
private final SysSmsLogService sysSmsLogService;
@Autowired(required = false)
private StringRedisTemplate stringRedisTemplate;
......@@ -64,14 +71,13 @@ public class SysUserInfoServiceImpl extends ServiceImpl<SysUserInfoMapper, SysUs
}
// 设置token
// String token = getToken(sysUserInfo, type);
String token = JwtTokenUtil.createToken(sysUserInfo,null);
String token = JwtTokenUtil.createToken(sysUserInfo, null);
stringRedisTemplate
.opsForValue()
.set(Constants.token + token, sysUserInfo.getUserId().toString(), 15, TimeUnit.DAYS);
return token;
}
public boolean checkPassword(String realPassword, String password) {
String md5Password =
DigestUtils.md5DigestAsHex((password + lyyConfig.getPasswordSalt()).getBytes());
......@@ -114,19 +120,27 @@ public class SysUserInfoServiceImpl extends ServiceImpl<SysUserInfoMapper, SysUs
}
String phone = phoneLoginVo.getPhone();
String code = phoneLoginVo.getCode();
String msgCode =
stringRedisTemplate
.opsForValue()
.get(Constants.MSG_KEY + SendMsgTypeEnum.LOGIN.getCode() + ":" + phone);
String msgCode = getPhoneKey(phone, SendMsgTypeEnum.LOGIN.getCode());
if (StringUtils.isBlank(msgCode)) {
throw new ServiceException("验证码失效,请重新发送");
}
if (!code.equals(msgCode)) {
throw new ServiceException("验证码有误");
}
return JwtTokenUtil.createToken(sysUserInfo,null);
return JwtTokenUtil.createToken(sysUserInfo, null);
}
/**
* @description: 获取验证码 如果需要类型 则在key上拼接 type :Constants.MSG_KEY + sendPhoneVo.getType() + ":" +
* sendPhoneVo.getPhone();
* @date: 2023/11/20 14:29
* @param: [phone, type]
* @return: java.lang.String
*/
private String getPhoneKey(String phone, Integer type) {
return stringRedisTemplate
.opsForValue()
.get(Constants.MSG_KEY + SendMsgTypeEnum.LOGIN.getCode() + ":" + phone);
}
/**
* @description: 退出
* @date: 2023/11/16 18:17
......@@ -152,6 +166,38 @@ public class SysUserInfoServiceImpl extends ServiceImpl<SysUserInfoMapper, SysUs
return this.count(lambdaQueryWrapper) > 0;
}
@Override
public boolean sendMsg(String phone) {
check(phone);
String key = Constants.MSG_KEY + phone;
String code = stringRedisTemplate.opsForValue().get(key);
if (StringUtils.isNotBlank(code)) {
throw new ServiceException("短信以发送,请勿重复发送");
}
int randomInt = RandomUtil.randomInt(100000, 999999);
List<Integer> temp = new ArrayList<>();
temp.add(randomInt);
// 发送短信
String result = sendMsgUtils.sendMsg(phone, SendMsgTypeEnum.getTemplateId(1), temp.toString());
log.info("发送短信信息:{},返回结果:{}", randomInt, result);
if (ObjectUtils.isEmpty(result)) {
throw new ServiceException("短信发送失败");
}
SmsVo smsVo = BeanUtil.toBean(result, SmsVo.class);
SysSmsLogEntity sysSmsLog = new SysSmsLogEntity();
sysSmsLog
.setCode(smsVo.getCode())
.setDescription(smsVo.getDescription())
.setType("登录/注册")
.setResult(result)
.setPhone(phone);
this.sysSmsLogService.save(sysSmsLog);
if (!"000000".equals(smsVo.getCode())) {
throw new ServiceException("短信发送失败,请稍后重试");
}
stringRedisTemplate.opsForValue().set(key, String.valueOf(randomInt), 5, TimeUnit.MINUTES);
return true;
}
/**
* @description: 发送短信
* @date: 2023/11/16 18:36
......@@ -178,10 +224,22 @@ public class SysUserInfoServiceImpl extends ServiceImpl<SysUserInfoMapper, SysUs
sendPhoneVo.getPhone(),
SendMsgTypeEnum.getTemplateId(sendPhoneVo.getType()),
temp.toString());
if (ObjectUtils.isEmpty(result)) {
SmsVo smsVo = BeanUtil.toBean(result, SmsVo.class);
if (ObjectUtils.isEmpty(smsVo)) {
throw new ServiceException("短信发送失败");
}
log.info("发送短信返回结果:{}", result);
log.info("发送短信信息:{},返回结果:{}", randomInt, result);
SysSmsLogEntity sysSmsLog = new SysSmsLogEntity();
sysSmsLog
.setCode(smsVo.getCode())
.setDescription(smsVo.getDescription())
.setType(SendMsgTypeEnum.getName(sendPhoneVo.getType()))
.setResult(result)
.setPhone(sendPhoneVo.getPhone());
this.sysSmsLogService.save(sysSmsLog);
if (!"000000".equals(smsVo.getCode())) {
throw new ServiceException("短信发送失败,请稍后重试");
}
stringRedisTemplate.opsForValue().set(key, String.valueOf(randomInt), 5, TimeUnit.MINUTES);
return true;
}
......@@ -199,8 +257,7 @@ public class SysUserInfoServiceImpl extends ServiceImpl<SysUserInfoMapper, SysUs
if (checkPhone(phone)) {
throw new ServiceException("手机号已经注册");
}
String key = Constants.MSG_KEY + SendMsgTypeEnum.REGISTER.getCode() + ":" + phone;
String code = stringRedisTemplate.opsForValue().get(key);
String code = getPhoneKey(phone, SendMsgTypeEnum.REGISTER.getCode());
if (StringUtils.isBlank(code)) {
throw new ServiceException("验证码已失效");
}
......
......@@ -34,3 +34,10 @@ mybatis-plus:
#逻辑已删除值
logic-delete-value: 0
logic-not-delete-value: 1
sms:
appKey: J12997I0SJ988a4Hjmk72WmuP51i
appSecret: I6bUKWfZU51i9FSsXGGg9XkN2GRw
appUrl: https://smsapi.cn-north-4.myhuaweicloud.com:443/sms/batchSendSms/v1
sender: 8823112010314
signature: 立业云
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lyy.user.moudle.smslog.mapper.SysSmsLogMapper">
</mapper>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment