【新增】改进用户注销接口
This commit is contained in:
@@ -210,8 +210,17 @@ public class AppUserController {
|
||||
* @param logoffRequest
|
||||
* @return
|
||||
*/
|
||||
@PostMapping("/logoff")
|
||||
@PostMapping("/delete")
|
||||
public Result<String> logoff(@RequestBody @Valid LogoffRequest logoffRequest) {
|
||||
return Result.isBool(userService.logoff(logoffRequest));
|
||||
}
|
||||
|
||||
/**
|
||||
* 注销发送验证码
|
||||
* @return
|
||||
*/
|
||||
@PostMapping("/delete/sendCode")
|
||||
public Result<Map<String, String>> deleteSendCode() {
|
||||
return userService.deleteSendCode();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.corewing.app.service;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import com.corewing.app.common.Result;
|
||||
import com.corewing.app.dto.api.CodeLoginRequest;
|
||||
import com.corewing.app.dto.api.ForgetPasswordRequest;
|
||||
import com.corewing.app.dto.api.LogoffRequest;
|
||||
@@ -9,6 +10,8 @@ import com.corewing.app.dto.biz.user.BizUserStatusRequest;
|
||||
import com.corewing.app.dto.biz.user.ResetPasswordRequest;
|
||||
import com.corewing.app.entity.User;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
|
||||
/**
|
||||
* 应用用户 Service 接口
|
||||
@@ -137,4 +140,10 @@ public interface UserService extends IService<User> {
|
||||
* @return
|
||||
*/
|
||||
boolean logoff(LogoffRequest logoffRequest);
|
||||
|
||||
/**
|
||||
* 删除发送验证码
|
||||
* @return
|
||||
*/
|
||||
Result<Map<String, String>> deleteSendCode();
|
||||
}
|
||||
|
||||
0
src/main/java/com/corewing/app/service/VerifyCodeService.java
Normal file → Executable file
0
src/main/java/com/corewing/app/service/VerifyCodeService.java
Normal file → Executable file
@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.corewing.app.common.Result;
|
||||
import com.corewing.app.common.page.PageContext;
|
||||
import com.corewing.app.dto.api.CodeLoginRequest;
|
||||
import com.corewing.app.dto.api.ForgetPasswordRequest;
|
||||
@@ -15,33 +16,44 @@ import com.corewing.app.entity.User;
|
||||
import com.corewing.app.mapper.UserMapper;
|
||||
import com.corewing.app.service.UserService;
|
||||
import com.corewing.app.service.VerifyCodeService;
|
||||
import com.corewing.app.util.I18nUtil;
|
||||
import com.corewing.app.util.Ip2RegionUtil;
|
||||
import com.corewing.app.util.RedisUtil;
|
||||
import com.corewing.app.util.*;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.codehaus.jettison.json.JSONObject;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.util.DigestUtils;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 应用用户 Service 实现类
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
|
||||
|
||||
private final VerifyCodeService verifyCodeService;
|
||||
private final Ip2RegionUtil ip2RegionUtil;
|
||||
private final UserMapper userMapper;
|
||||
private final RedisUtil redisUtil;
|
||||
@Resource
|
||||
private VerifyCodeService verifyCodeService;
|
||||
|
||||
@Resource
|
||||
private Ip2RegionUtil ip2RegionUtil;
|
||||
|
||||
@Resource
|
||||
private UserMapper userMapper;
|
||||
|
||||
@Resource
|
||||
private RedisUtil redisUtil;
|
||||
|
||||
@Resource
|
||||
private SmsBaoUtil smsBaoUtil;
|
||||
|
||||
@Resource
|
||||
private EmailUtil emailUtil;
|
||||
|
||||
public UserServiceImpl(VerifyCodeService verifyCodeService, Ip2RegionUtil ip2RegionUtil, UserMapper userMapper, RedisUtil redisUtil) {
|
||||
this.verifyCodeService = verifyCodeService;
|
||||
this.ip2RegionUtil = ip2RegionUtil;
|
||||
this.userMapper = userMapper;
|
||||
this.redisUtil = redisUtil;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Page<User> page(User user) {
|
||||
@@ -304,19 +316,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
|
||||
if(user == null) {
|
||||
throw new RuntimeException(I18nUtil.getMessage("error.user.not.found"));
|
||||
}
|
||||
String codeKey = "";
|
||||
Object checkCode = null;
|
||||
if(user.getEmail() != null) {
|
||||
codeKey = String.format("verify_code:%s:%s", "logoff", user.getEmail());
|
||||
checkCode = redisUtil.get(codeKey);
|
||||
}
|
||||
|
||||
if(checkCode == null) {
|
||||
if(user.getTelephone() != null) {
|
||||
codeKey = String.format("verify_code:%s:%s", "logoff", user.getTelephone());
|
||||
checkCode = redisUtil.get(codeKey);
|
||||
}
|
||||
}
|
||||
String codeKey = String.format("verify_code:%s:%s", "logoff", user.getUsername());
|
||||
Object checkCode = redisUtil.get(codeKey);
|
||||
|
||||
if(checkCode == null || !request.getCode().equalsIgnoreCase(checkCode.toString())) {
|
||||
throw new RuntimeException(I18nUtil.getMessage("error.verify.code.invalid"));
|
||||
@@ -327,4 +328,41 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
|
||||
this.removeById(user.getId());
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Result<Map<String, String>> deleteSendCode() {
|
||||
User user = this.getById(StpUtil.getLoginId().toString());
|
||||
if(user == null) {
|
||||
throw new RuntimeException(I18nUtil.getMessage("error.user.not.found"));
|
||||
}
|
||||
|
||||
String code = CommonGenerateUtil.generateCode();
|
||||
|
||||
// 保存到 Redis,key格式:verify_code:{type}:{account}
|
||||
String redisKey = String.format("verify_code:%s:%s", "logoff", user.getUsername());
|
||||
redisUtil.set(redisKey, code, CommonGenerateUtil.CODE_EXPIRE_MINUTES * 60);
|
||||
|
||||
log.info("验证码已生成: account={}, type={}, code={}", user.getUsername(), "logoff", code);
|
||||
|
||||
// 发送验证码
|
||||
if (!StringUtils.hasText(user.getTelephone())) {
|
||||
// 发送短信验证码
|
||||
boolean success = smsBaoUtil.sendVerifyCode(user.getTelephone(), code);
|
||||
if (!success) {
|
||||
throw new RuntimeException(I18nUtil.getMessage("error.sms.send.failed"));
|
||||
}
|
||||
Map<String, String> map = new HashMap<>();
|
||||
map.put("account", user.getTelephone());
|
||||
return Result.success(map);
|
||||
} else {
|
||||
// 发送邮件验证码
|
||||
boolean success = emailUtil.sendVerifyCode(user.getEmail(), code);
|
||||
if (!success) {
|
||||
throw new RuntimeException(I18nUtil.getMessage("error.email.send.failed"));
|
||||
}
|
||||
Map<String, String> map = new HashMap<>();
|
||||
map.put("account", user.getEmail());
|
||||
return Result.success(map);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
26
src/main/java/com/corewing/app/service/impl/VerifyCodeServiceImpl.java
Normal file → Executable file
26
src/main/java/com/corewing/app/service/impl/VerifyCodeServiceImpl.java
Normal file → Executable file
@@ -19,15 +19,8 @@ public class VerifyCodeServiceImpl implements VerifyCodeService {
|
||||
private final SmsBaoUtil smsBaoUtil;
|
||||
private final EmailUtil emailUtil;
|
||||
|
||||
/**
|
||||
* 验证码有效期(分钟)
|
||||
*/
|
||||
private static final int CODE_EXPIRE_MINUTES = 5;
|
||||
|
||||
/**
|
||||
* 验证码长度
|
||||
*/
|
||||
private static final int CODE_LENGTH = 6;
|
||||
|
||||
|
||||
public VerifyCodeServiceImpl(RedisUtil redisUtil, SmsBaoUtil smsBaoUtil, EmailUtil emailUtil) {
|
||||
this.redisUtil = redisUtil;
|
||||
@@ -50,11 +43,11 @@ public class VerifyCodeServiceImpl implements VerifyCodeService {
|
||||
}
|
||||
|
||||
// 生成验证码
|
||||
String code = generateCode();
|
||||
String code = CommonGenerateUtil.generateCode();
|
||||
|
||||
// 保存到 Redis,key格式:verify_code:{type}:{account}
|
||||
String redisKey = String.format("verify_code:%s:%s", type, account);
|
||||
redisUtil.set(redisKey, code, CODE_EXPIRE_MINUTES * 60);
|
||||
redisUtil.set(redisKey, code, CommonGenerateUtil.CODE_EXPIRE_MINUTES * 60);
|
||||
|
||||
log.info("验证码已生成: account={}, type={}, code={}", account, type, code);
|
||||
|
||||
@@ -106,17 +99,4 @@ public class VerifyCodeServiceImpl implements VerifyCodeService {
|
||||
return matched;
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成随机验证码
|
||||
*
|
||||
* @return 验证码
|
||||
*/
|
||||
private String generateCode() {
|
||||
Random random = new Random();
|
||||
StringBuilder code = new StringBuilder();
|
||||
for (int i = 0; i < CODE_LENGTH; i++) {
|
||||
code.append(random.nextInt(10));
|
||||
}
|
||||
return code.toString();
|
||||
}
|
||||
}
|
||||
|
||||
32
src/main/java/com/corewing/app/util/CommonGenerateUtil.java
Normal file
32
src/main/java/com/corewing/app/util/CommonGenerateUtil.java
Normal file
@@ -0,0 +1,32 @@
|
||||
package com.corewing.app.util;
|
||||
|
||||
import java.util.Random;
|
||||
|
||||
public class CommonGenerateUtil {
|
||||
|
||||
/**
|
||||
* 验证码长度
|
||||
*/
|
||||
private static final int CODE_LENGTH = 6;
|
||||
|
||||
|
||||
/**
|
||||
* 验证码有效期(分钟)
|
||||
*/
|
||||
public static final int CODE_EXPIRE_MINUTES = 5;
|
||||
|
||||
|
||||
/**
|
||||
* 生成随机验证码
|
||||
*
|
||||
* @return 验证码
|
||||
*/
|
||||
public static String generateCode() {
|
||||
Random random = new Random();
|
||||
StringBuilder code = new StringBuilder();
|
||||
for (int i = 0; i < CODE_LENGTH; i++) {
|
||||
code.append(random.nextInt(10));
|
||||
}
|
||||
return code.toString();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user