Commit 5afb96eb authored by zhouxudong's avatar zhouxudong

添加短信发送记录

parent d6c1ff21
...@@ -93,6 +93,12 @@ ...@@ -93,6 +93,12 @@
<artifactId>nimbus-jose-jwt</artifactId> <artifactId>nimbus-jose-jwt</artifactId>
<version>9.23</version> <version>9.23</version>
</dependency> </dependency>
<!--启用Spring Boot的配置处理器。-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
</dependencies> </dependencies>
<build> <build>
......
...@@ -20,9 +20,9 @@ import java.util.Arrays; ...@@ -20,9 +20,9 @@ import java.util.Arrays;
@Component @Component
public class MyMetaObjectHandler implements MetaObjectHandler { public class MyMetaObjectHandler implements MetaObjectHandler {
private final String[] createNeedToFill = { 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 = {}; private final Class[] ignoreAutoFillEntity = {};
@Override @Override
...@@ -45,7 +45,7 @@ public class MyMetaObjectHandler implements MetaObjectHandler { ...@@ -45,7 +45,7 @@ public class MyMetaObjectHandler implements MetaObjectHandler {
.forEach( .forEach(
property -> { property -> {
if (metaObject.hasSetter(property)) { if (metaObject.hasSetter(property)) {
if (property.endsWith("Person")) { if (property.endsWith("By")) {
this.setFieldValByName(property, userInfo.getUserName(), metaObject); this.setFieldValByName(property, userInfo.getUserName(), metaObject);
} }
......
...@@ -4,8 +4,8 @@ import lombok.Getter; ...@@ -4,8 +4,8 @@ import lombok.Getter;
@Getter @Getter
public enum SendMsgTypeEnum { public enum SendMsgTypeEnum {
REGISTER(1,"345","注册"), REGISTER(1,"a0072fe0c74c47e59fbf700a4ce94350","注册"),
LOGIN(2,"234","登录"); LOGIN(2,"a0072fe0c74c47e59fbf700a4ce94350","登录");
private final Integer code; private final Integer code;
private final String templateId; private final String templateId;
...@@ -25,4 +25,12 @@ public enum SendMsgTypeEnum { ...@@ -25,4 +25,12 @@ public enum SendMsgTypeEnum {
} }
return null; 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 { ...@@ -30,6 +30,7 @@ public class SysPcLoginController {
*/ */
@PostMapping("/login") @PostMapping("/login")
public String login(@Validated @RequestBody LoginVo loginVo) { public String login(@Validated @RequestBody LoginVo loginVo) {
return this.sysUserInfoService.loginPc(loginVo); return this.sysUserInfoService.loginPc(loginVo);
} }
...@@ -44,16 +45,7 @@ public class SysPcLoginController { ...@@ -44,16 +45,7 @@ public class SysPcLoginController {
public String phoneLogin(@Validated @RequestBody PhoneLoginVo phoneLoginVo) { public String phoneLogin(@Validated @RequestBody PhoneLoginVo phoneLoginVo) {
return sysUserInfoService.phoneLogin(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: 核对手机号是否已经注册 * @description: 核对手机号是否已经注册
* @date: 2023/11/20 9:40 * @date: 2023/11/20 9:40
...@@ -74,6 +66,16 @@ public class SysPcLoginController { ...@@ -74,6 +66,16 @@ public class SysPcLoginController {
public boolean sendMsg(@RequestBody @Validated SendPhoneVo sendPhoneVo) { public boolean sendMsg(@RequestBody @Validated SendPhoneVo sendPhoneVo) {
return this.sysUserInfoService.sendMsg(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: 注册 * @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> { ...@@ -53,6 +53,13 @@ public interface SysUserInfoService extends IService<SysUserInfo> {
* @return: boolean * @return: boolean
**/ **/
boolean sendMsg(SendPhoneVo sendPhoneVo); boolean sendMsg(SendPhoneVo sendPhoneVo);
/**
* @description: 发送短信
* @date: 2023/11/16 18:36
* @param: [phone]
* @return: boolean
**/
boolean sendMsg(String phone);
//用户注册 //用户注册
boolean sign(RegisterVo registerVo); boolean sign(RegisterVo registerVo);
} }
package com.lyy.user.moudle.user.service.impl; package com.lyy.user.moudle.user.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.ReUtil; import cn.hutool.core.util.ReUtil;
...@@ -11,12 +12,16 @@ import com.lyy.user.config.LyyConfig; ...@@ -11,12 +12,16 @@ import com.lyy.user.config.LyyConfig;
import com.lyy.user.config.exception.ServiceException; import com.lyy.user.config.exception.ServiceException;
import com.lyy.user.constant.Constants; import com.lyy.user.constant.Constants;
import com.lyy.user.enums.SendMsgTypeEnum; 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.entity.SysUserInfo;
import com.lyy.user.moudle.user.mapper.SysUserInfoMapper; import com.lyy.user.moudle.user.mapper.SysUserInfoMapper;
import com.lyy.user.moudle.user.service.SysUserInfoService; import com.lyy.user.moudle.user.service.SysUserInfoService;
import com.lyy.user.moudle.user.vo.*; import com.lyy.user.moudle.user.vo.*;
import com.lyy.user.util.jwt.JwtTokenUtil; import com.lyy.user.util.jwt.JwtTokenUtil;
import com.lyy.user.util.sms.SendMsgUtils; import com.lyy.user.util.sms.SendMsgUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -39,10 +44,12 @@ import java.util.concurrent.TimeUnit; ...@@ -39,10 +44,12 @@ import java.util.concurrent.TimeUnit;
*/ */
@Service @Service
@Slf4j @Slf4j
@RequiredArgsConstructor
public class SysUserInfoServiceImpl extends ServiceImpl<SysUserInfoMapper, SysUserInfo> public class SysUserInfoServiceImpl extends ServiceImpl<SysUserInfoMapper, SysUserInfo>
implements SysUserInfoService { implements SysUserInfoService {
@Autowired LyyConfig lyyConfig; private final LyyConfig lyyConfig;
private final SysSmsLogService sysSmsLogService;
@Autowired(required = false) @Autowired(required = false)
private StringRedisTemplate stringRedisTemplate; private StringRedisTemplate stringRedisTemplate;
...@@ -64,14 +71,13 @@ public class SysUserInfoServiceImpl extends ServiceImpl<SysUserInfoMapper, SysUs ...@@ -64,14 +71,13 @@ public class SysUserInfoServiceImpl extends ServiceImpl<SysUserInfoMapper, SysUs
} }
// 设置token // 设置token
// String token = getToken(sysUserInfo, type); // String token = getToken(sysUserInfo, type);
String token = JwtTokenUtil.createToken(sysUserInfo,null); String token = JwtTokenUtil.createToken(sysUserInfo, null);
stringRedisTemplate stringRedisTemplate
.opsForValue() .opsForValue()
.set(Constants.token + token, sysUserInfo.getUserId().toString(), 15, TimeUnit.DAYS); .set(Constants.token + token, sysUserInfo.getUserId().toString(), 15, TimeUnit.DAYS);
return token; return token;
} }
public boolean checkPassword(String realPassword, String password) { public boolean checkPassword(String realPassword, String password) {
String md5Password = String md5Password =
DigestUtils.md5DigestAsHex((password + lyyConfig.getPasswordSalt()).getBytes()); DigestUtils.md5DigestAsHex((password + lyyConfig.getPasswordSalt()).getBytes());
...@@ -114,19 +120,27 @@ public class SysUserInfoServiceImpl extends ServiceImpl<SysUserInfoMapper, SysUs ...@@ -114,19 +120,27 @@ public class SysUserInfoServiceImpl extends ServiceImpl<SysUserInfoMapper, SysUs
} }
String phone = phoneLoginVo.getPhone(); String phone = phoneLoginVo.getPhone();
String code = phoneLoginVo.getCode(); String code = phoneLoginVo.getCode();
String msgCode = String msgCode = getPhoneKey(phone, SendMsgTypeEnum.LOGIN.getCode());
stringRedisTemplate
.opsForValue()
.get(Constants.MSG_KEY + SendMsgTypeEnum.LOGIN.getCode() + ":" + phone);
if (StringUtils.isBlank(msgCode)) { if (StringUtils.isBlank(msgCode)) {
throw new ServiceException("验证码失效,请重新发送"); throw new ServiceException("验证码失效,请重新发送");
} }
if (!code.equals(msgCode)) { if (!code.equals(msgCode)) {
throw new ServiceException("验证码有误"); 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: 退出 * @description: 退出
* @date: 2023/11/16 18:17 * @date: 2023/11/16 18:17
...@@ -152,6 +166,38 @@ public class SysUserInfoServiceImpl extends ServiceImpl<SysUserInfoMapper, SysUs ...@@ -152,6 +166,38 @@ public class SysUserInfoServiceImpl extends ServiceImpl<SysUserInfoMapper, SysUs
return this.count(lambdaQueryWrapper) > 0; 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: 发送短信 * @description: 发送短信
* @date: 2023/11/16 18:36 * @date: 2023/11/16 18:36
...@@ -178,10 +224,22 @@ public class SysUserInfoServiceImpl extends ServiceImpl<SysUserInfoMapper, SysUs ...@@ -178,10 +224,22 @@ public class SysUserInfoServiceImpl extends ServiceImpl<SysUserInfoMapper, SysUs
sendPhoneVo.getPhone(), sendPhoneVo.getPhone(),
SendMsgTypeEnum.getTemplateId(sendPhoneVo.getType()), SendMsgTypeEnum.getTemplateId(sendPhoneVo.getType()),
temp.toString()); temp.toString());
if (ObjectUtils.isEmpty(result)) { SmsVo smsVo = BeanUtil.toBean(result, SmsVo.class);
if (ObjectUtils.isEmpty(smsVo)) {
throw new ServiceException("短信发送失败"); 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); stringRedisTemplate.opsForValue().set(key, String.valueOf(randomInt), 5, TimeUnit.MINUTES);
return true; return true;
} }
...@@ -199,8 +257,7 @@ public class SysUserInfoServiceImpl extends ServiceImpl<SysUserInfoMapper, SysUs ...@@ -199,8 +257,7 @@ public class SysUserInfoServiceImpl extends ServiceImpl<SysUserInfoMapper, SysUs
if (checkPhone(phone)) { if (checkPhone(phone)) {
throw new ServiceException("手机号已经注册"); throw new ServiceException("手机号已经注册");
} }
String key = Constants.MSG_KEY + SendMsgTypeEnum.REGISTER.getCode() + ":" + phone; String code = getPhoneKey(phone, SendMsgTypeEnum.REGISTER.getCode());
String code = stringRedisTemplate.opsForValue().get(key);
if (StringUtils.isBlank(code)) { if (StringUtils.isBlank(code)) {
throw new ServiceException("验证码已失效"); throw new ServiceException("验证码已失效");
} }
......
...@@ -34,3 +34,10 @@ mybatis-plus: ...@@ -34,3 +34,10 @@ mybatis-plus:
#逻辑已删除值 #逻辑已删除值
logic-delete-value: 0 logic-delete-value: 0
logic-not-delete-value: 1 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