app端忘记密码功能实现

This commit is contained in:
2025-06-24 13:38:36 +08:00
parent d91012ee1b
commit 1f7f4bf537
8 changed files with 158 additions and 9 deletions

View File

@ -0,0 +1,6 @@
package com.fuyuanshen.constants;
public class RedisConstants {
public static final String APP_SMS_TOKEN = "app_sms_forgotPassword:";
}

View File

@ -143,11 +143,6 @@ public class AuthController {
}
@Log("app用户登录")
@ApiOperation("app用户登录")
@AnonymousPostMapping(value = "/app/login")

View File

@ -133,4 +133,8 @@ public class APPUser extends BaseEntity implements Serializable {
@ApiModelProperty(hidden = true)
private Integer userType;
/**
* 地区
*/
private String region;
}

View File

@ -0,0 +1,27 @@
package com.fuyuanshen.modules.system.domain.dto.app;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
/**
* @author: 默苍璃
* @date: 2025-06-1818:36
*/
@Data
public class APPForgotPasswordDTO {
@NotBlank(message = "手机号不能为空")
@ApiModelProperty(value = "手机号APP登录")
private String phoneNumber;
@NotBlank(message = "密码不能为空")
@ApiModelProperty(value = "密码")
private String password;
@ApiModelProperty(value = "验证码")
@NotBlank(message = "验证码不能为空")
private String verificationCode;
}

View File

@ -0,0 +1,37 @@
package com.fuyuanshen.modules.system.domain.vo;
import com.fuyuanshen.base.BaseEntity;
import com.fuyuanshen.modules.system.domain.Dept;
import com.fuyuanshen.modules.system.domain.Job;
import com.fuyuanshen.modules.system.domain.Role;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.Set;
/**
* @author: 默苍璃
* @date: 2025-06-1211:34
*/
@Data
public class APPUserVo {
@ApiModelProperty(value = "ID", hidden = true)
private Long id;
@ApiModelProperty(value = "用户昵称")
private String nickName;
@ApiModelProperty(value = "用户性别")
private String gender;
@ApiModelProperty(value = "电话号码")
private Long phone;
}

View File

@ -29,8 +29,10 @@ import com.fuyuanshen.modules.system.domain.User;
import com.fuyuanshen.modules.system.domain.app.APPUser;
import com.fuyuanshen.modules.system.domain.dto.UserPassVo;
import com.fuyuanshen.modules.system.domain.dto.UserQueryCriteria;
import com.fuyuanshen.modules.system.domain.dto.app.APPForgotPasswordDTO;
import com.fuyuanshen.modules.system.domain.dto.app.APPUserDTO;
import com.fuyuanshen.modules.system.domain.query.APPUserQuery;
import com.fuyuanshen.modules.system.domain.vo.APPUserVo;
import com.fuyuanshen.modules.system.domain.vo.ConsumerVo;
import com.fuyuanshen.modules.system.enums.UserType;
import com.fuyuanshen.modules.system.mapper.UserMapper;
@ -46,6 +48,7 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.annotations.Param;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.crypto.password.PasswordEncoder;
@ -91,10 +94,17 @@ public class APPUserController {
@ApiOperation("用户中心")
@GetMapping(value = "/get")
@PreAuthorize("@el.check('appUser:get')")
public ResponseVO<APPUser> getAPPUser(UserQueryCriteria criteria) {
public ResponseVO<APPUserVo> getAPPUser() {
String userName = SecurityUtils.getCurrentUsername();
return null;
// return ResponseVO.success(appUserService.getAPPUser(criteria));
APPUser appUser = appUserService.getLoginData(userName);
APPUserVo appUserVo = new APPUserVo();
appUserVo.setId(appUser.getId());
appUserVo.setNickName(appUser.getNickName());
appUserVo.setGender(appUser.getGender());
appUserVo.setPhone(appUser.getPhone());
return ResponseVO.success(appUserVo);
}
@Log("app用户注册")
@ -103,7 +113,7 @@ public class APPUserController {
public ResponseVO<String> APPRegister(@Validated @RequestBody APPUserDTO user) throws Exception {
//暫定0000
if (user.getVerificationCode() == null || !"0000".equals(user.getVerificationCode())) {
if (!"0000".equals(user.getVerificationCode())) {
throw new BadRequestException("验证码错误");
}
appUserService.addUser(user);
@ -115,9 +125,36 @@ public class APPUserController {
@PutMapping
@PreAuthorize("@el.check('appUser:edit')")
public ResponseVO<String> updateUser(@Validated(APPUser.Update.class) @RequestBody APPUser appUser) throws Exception {
Long userId = SecurityUtils.getCurrentUserId();
if(!userId.equals(appUser.getId())){
throw new BadRequestException("不能修改他人资料");
}
APPUser updUser= new APPUser();
updUser.setId(appUser.getId());
updUser.setNickName(appUser.getNickName());
updUser.setAvatarPath(appUser.getAvatarPath());
updUser.setRegion(appUser.getRegion());
updUser.setGender(appUser.getGender());
appUserService.updateById(appUser);
return ResponseVO.success("success");
}
@Log("忘记密码")
@ApiOperation("忘记密码")
@PostMapping(value = "/forgotPassword")
@PreAuthorize("@el.check('appUser:edit')")
public ResponseVO<String> forgotPassword(@RequestBody APPForgotPasswordDTO appForgotPasswordDTO) throws Exception {
appUserService.forgotPassword(appForgotPasswordDTO);
return ResponseVO.success("success");
}
@Log("发送验证码")
@ApiOperation("发送验证码")
@PostMapping(value = "/sendSms")
@PreAuthorize("@el.check('appUser:edit')")
public ResponseVO<String> sendSms(@Param("phoneNumber") String phoneNumber) throws Exception {
appUserService.sendSms(phoneNumber);
return ResponseVO.success("success");
}
}

View File

@ -21,6 +21,7 @@ import com.fuyuanshen.modules.security.service.dto.app.AppRoleDto;
import com.fuyuanshen.modules.system.domain.Role;
import com.fuyuanshen.modules.system.domain.app.APPUser;
import com.fuyuanshen.modules.system.domain.dto.UserQueryCriteria;
import com.fuyuanshen.modules.system.domain.dto.app.APPForgotPasswordDTO;
import com.fuyuanshen.modules.system.domain.dto.app.APPUserDTO;
import com.fuyuanshen.modules.utils.ResponseVO;
import com.fuyuanshen.utils.PageResult;
@ -54,4 +55,8 @@ public interface APPUserService extends IService<APPUser> {
ResponseVO<Object> addUser(APPUserDTO user);
Integer selectRoleByUserLevel(Set<Role> roles);
void forgotPassword(APPForgotPasswordDTO appForgotPasswordDTO);
void sendSms(String phoneNumber);
}

View File

@ -15,6 +15,7 @@
*/
package com.fuyuanshen.modules.system.service.impl.app;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.crypto.digest.MD5;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@ -22,17 +23,21 @@ import com.fuyuanshen.exception.BadRequestException;
import com.fuyuanshen.modules.system.domain.Role;
import com.fuyuanshen.modules.system.domain.app.APPUser;
import com.fuyuanshen.modules.system.domain.dto.UserQueryCriteria;
import com.fuyuanshen.modules.system.domain.dto.app.APPForgotPasswordDTO;
import com.fuyuanshen.modules.system.domain.dto.app.APPUserDTO;
import com.fuyuanshen.modules.system.mapper.app.APPUserMapper;
import com.fuyuanshen.modules.system.service.app.APPUserService;
import com.fuyuanshen.modules.utils.ResponseVO;
import com.fuyuanshen.utils.*;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import java.util.Set;
import static com.fuyuanshen.constants.RedisConstants.APP_SMS_TOKEN;
/**
* @author Zheng Jie
* @date 2018-11-23
@ -45,6 +50,10 @@ public class APPUserServiceImpl extends ServiceImpl<APPUserMapper, APPUser> impl
private final PasswordEncoder passwordEncoder;
@Autowired
private final RedisUtils redisUtils;
/**
* 查询APP/小程序用户
*
@ -96,4 +105,33 @@ public class APPUserServiceImpl extends ServiceImpl<APPUserMapper, APPUser> impl
return 0;
}
@Override
public void forgotPassword(APPForgotPasswordDTO appForgotPasswordDTO) {
String phoneNumber = appForgotPasswordDTO.getPhoneNumber();
APPUser appUser = appUserMapper.appFindByUsername(phoneNumber);
if (appUser == null) {
throw new BadRequestException("手机号不存在");
}
Object verificationCode = redisUtils.get(APP_SMS_TOKEN + phoneNumber);
if (verificationCode == null) {
throw new BadRequestException("验证码已过期");
}
if(!appForgotPasswordDTO.getVerificationCode().equals(verificationCode.toString())){
throw new BadRequestException("验证码错误");
}
appUser.setPassword(appForgotPasswordDTO.getPassword());
appUserMapper.updateById(appUser);
}
@Override
public void sendSms(String phoneNumber) {
if (appUserMapper.appFindByUsername(phoneNumber) == null) {
throw new BadRequestException("手机号不存在");
}
// todo 发送验证码
redisUtils.set(APP_SMS_TOKEN + phoneNumber, RandomUtil.randomNumbers(4), 5 * 60);
}
}