feat(member): 增加移动端给当前登录用户手机短信验证码发送与用户注销功能
This commit is contained in:
parent
fa81755e25
commit
568cf4a9be
@ -41,6 +41,7 @@ import org.dromara.common.core.exception.ServiceException;
|
||||
import org.dromara.common.core.utils.ValidatorUtils;
|
||||
import org.dromara.common.log.annotation.Log;
|
||||
import org.dromara.common.log.enums.BusinessType;
|
||||
import org.dromara.common.ratelimiter.annotation.RateLimiter;
|
||||
import org.dromara.common.satoken.utils.LoginHelper;
|
||||
import org.dromara.common.social.config.properties.SocialProperties;
|
||||
import org.dromara.common.social.utils.SocialUtils;
|
||||
@ -203,4 +204,25 @@ public class AppMemberController {
|
||||
}
|
||||
|
||||
|
||||
|
||||
@RateLimiter(key = "#phonenumber", time = 60, count = 1)
|
||||
@GetMapping("/sms/code")
|
||||
@Operation(summary = "给当前登录会员的手机号发送短信验证码")
|
||||
public R smsCode(@RequestParam String templateId) {
|
||||
service.smsCode(templateId);
|
||||
return R.ok();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Operation(summary = "用户注销")
|
||||
@Log(title = "用户注销 ", businessType = BusinessType.UPDATE)
|
||||
@PostMapping("/revoked")
|
||||
public R revoked(@RequestParam String smsCode) {
|
||||
service.revoked(smsCode);
|
||||
return R.ok();
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
@ -195,6 +195,7 @@ public class SysLoginService {
|
||||
loginUser.setNickname(member.getNickname());
|
||||
loginUser.setUserType(UserType.APP_USER.getUserType());
|
||||
loginUser.setUserSig(member.getUserSig());
|
||||
loginUser.setPhoneNumber(member.getPhoneHidden());
|
||||
return loginUser;
|
||||
}
|
||||
|
||||
|
@ -82,7 +82,7 @@ public class Constants
|
||||
/**
|
||||
* 验证码有效期(分钟)
|
||||
*/
|
||||
public static final Integer CAPTCHA_EXPIRATION = 2;
|
||||
public static final Integer CAPTCHA_EXPIRATION = 5;
|
||||
|
||||
/**
|
||||
* 令牌
|
||||
|
@ -107,6 +107,11 @@ public class LoginUser implements Serializable {
|
||||
*/
|
||||
private String nickname;
|
||||
|
||||
/**
|
||||
* 用户手机号
|
||||
*/
|
||||
private String phoneNumber;
|
||||
|
||||
/**
|
||||
* 角色对象
|
||||
*/
|
||||
|
@ -6,17 +6,18 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.wzj.soopin.member.domain.bo.MemberAccountBO;
|
||||
import com.wzj.soopin.member.domain.po.MemberAccount;
|
||||
import com.wzj.soopin.member.domain.vo.MemberAccountVO;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.apache.ibatis.annotations.Select;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 会员账户表Mapper接口
|
||||
*
|
||||
* @author zcc
|
||||
*/
|
||||
@Mapper
|
||||
public interface MemberAccountMapper extends BaseMapper<MemberAccount> {
|
||||
IPage<MemberAccountVO> selectAccountWithMember(Page<?> page, @Param("bo") MemberAccountBO bo);
|
||||
|
||||
|
@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.wzj.soopin.member.domain.po.MemberCart;
|
||||
import com.wzj.soopin.member.domain.bo.MemberCartBO;
|
||||
import com.wzj.soopin.member.domain.vo.MemberCartVO;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
@ -14,6 +15,7 @@ import java.util.List;
|
||||
*
|
||||
* @author zcc
|
||||
*/
|
||||
@Mapper
|
||||
public interface MemberCartMapper extends BaseMapper<MemberCart> {
|
||||
/**
|
||||
* 查询购物车列表
|
||||
|
@ -94,4 +94,16 @@ public interface IMemberService extends IService<Member> {
|
||||
* @return
|
||||
*/
|
||||
Page<ReferenceMemberVO> getByReference(ReferenceMemberQuery query);
|
||||
|
||||
/**
|
||||
* 给当前登录会员的手机号发送短信验证码
|
||||
* @param templateId
|
||||
*/
|
||||
void smsCode(String templateId);
|
||||
|
||||
/**
|
||||
* 账号注销
|
||||
* @param smsCode 短信验证码
|
||||
*/
|
||||
void revoked(String smsCode);
|
||||
}
|
||||
|
@ -4,6 +4,7 @@ import cn.dev33.satoken.secure.BCrypt;
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.date.LocalDateTimeUtil;
|
||||
import cn.hutool.core.lang.Assert;
|
||||
import cn.hutool.core.util.RandomUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import cn.hutool.json.JSONArray;
|
||||
import cn.hutool.json.JSONObject;
|
||||
@ -31,11 +32,16 @@ import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.common.core.constant.GlobalConstants;
|
||||
import org.dromara.common.core.constant.ResultCode;
|
||||
import org.dromara.common.core.domain.event.Constants;
|
||||
import org.dromara.common.core.domain.model.LoginUser;
|
||||
import org.dromara.common.core.exception.ServiceException;
|
||||
import org.dromara.common.redis.redis.RedisCache;
|
||||
import org.dromara.common.redis.utils.RedisUtils;
|
||||
import org.dromara.common.satoken.utils.LoginHelper;
|
||||
import org.dromara.common.tenant.helper.TenantHelper;
|
||||
import org.dromara.sms4j.api.SmsBlend;
|
||||
import org.dromara.sms4j.api.entity.SmsResponse;
|
||||
import org.dromara.sms4j.core.factory.SmsFactory;
|
||||
import org.dromara.system.domain.SysUser;
|
||||
import org.dromara.system.domain.vo.SysTenantVo;
|
||||
import org.dromara.system.mapper.SysUserMapper;
|
||||
@ -46,6 +52,7 @@ import org.springframework.scheduling.annotation.Scheduled;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.time.Duration;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
@ -376,4 +383,29 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper,Member> implemen
|
||||
objectPage.setRecords(list);
|
||||
return objectPage;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void smsCode(String templateId) {
|
||||
String phoneNumber = LoginHelper.getLoginUser().getPhoneNumber();
|
||||
String key = GlobalConstants.CAPTCHA_CODE_KEY + phoneNumber;
|
||||
String code = RandomUtil.randomNumbers(4);
|
||||
RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION));
|
||||
LinkedHashMap<String, String> map = new LinkedHashMap<>(1);
|
||||
map.put("code", code);
|
||||
SmsBlend smsBlend = SmsFactory.getSmsBlend("config2");
|
||||
SmsResponse smsResponse = smsBlend.sendMessage(phoneNumber, templateId, map);
|
||||
if (!smsResponse.isSuccess()) {
|
||||
log.error("短信验证码发送异常 => {}", smsResponse);
|
||||
throw new ServiceException("短信验证码发送异常");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void revoked(String smsCode) {
|
||||
LoginUser loginUser = LoginHelper.getLoginUser();
|
||||
String phoneNumber = loginUser.getPhoneNumber();
|
||||
String code = RedisUtils.getCacheObject(GlobalConstants.CAPTCHA_CODE_KEY + phoneNumber);
|
||||
Assert.isTrue(StrUtil.equals(smsCode, code), () -> new ServiceException("短信验证码错误"));
|
||||
memberMapper.updateById(Member.builder().id(loginUser.getUserId()).status(Constants.MEMBER_ACCOUNT_STATUS.FORBIDDEN).build());
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user