feat(member): 增加移动端给当前登录用户手机短信验证码发送与用户注销功能

This commit is contained in:
huk 2025-09-20 18:01:58 +08:00
parent fa81755e25
commit 568cf4a9be
8 changed files with 77 additions and 2 deletions

View File

@ -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();
}
}

View File

@ -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;
}

View File

@ -82,7 +82,7 @@ public class Constants
/**
* 验证码有效期分钟
*/
public static final Integer CAPTCHA_EXPIRATION = 2;
public static final Integer CAPTCHA_EXPIRATION = 5;
/**
* 令牌

View File

@ -107,6 +107,11 @@ public class LoginUser implements Serializable {
*/
private String nickname;
/**
* 用户手机号
*/
private String phoneNumber;
/**
* 角色对象
*/

View File

@ -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);

View File

@ -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> {
/**
* 查询购物车列表

View File

@ -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);
}

View File

@ -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());
}
}