app端忘记密码功能实现
This commit is contained in:
@ -0,0 +1,6 @@
|
|||||||
|
package com.fuyuanshen.constants;
|
||||||
|
|
||||||
|
public class RedisConstants {
|
||||||
|
|
||||||
|
public static final String APP_SMS_TOKEN = "app_sms_forgotPassword:";
|
||||||
|
}
|
@ -143,11 +143,6 @@ public class AuthController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Log("app用户登录")
|
@Log("app用户登录")
|
||||||
@ApiOperation("app用户登录")
|
@ApiOperation("app用户登录")
|
||||||
@AnonymousPostMapping(value = "/app/login")
|
@AnonymousPostMapping(value = "/app/login")
|
||||||
|
@ -133,4 +133,8 @@ public class APPUser extends BaseEntity implements Serializable {
|
|||||||
@ApiModelProperty(hidden = true)
|
@ApiModelProperty(hidden = true)
|
||||||
private Integer userType;
|
private Integer userType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 地区
|
||||||
|
*/
|
||||||
|
private String region;
|
||||||
}
|
}
|
@ -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;
|
||||||
|
}
|
@ -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;
|
||||||
|
|
||||||
|
}
|
@ -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.app.APPUser;
|
||||||
import com.fuyuanshen.modules.system.domain.dto.UserPassVo;
|
import com.fuyuanshen.modules.system.domain.dto.UserPassVo;
|
||||||
import com.fuyuanshen.modules.system.domain.dto.UserQueryCriteria;
|
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.dto.app.APPUserDTO;
|
||||||
import com.fuyuanshen.modules.system.domain.query.APPUserQuery;
|
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.domain.vo.ConsumerVo;
|
||||||
import com.fuyuanshen.modules.system.enums.UserType;
|
import com.fuyuanshen.modules.system.enums.UserType;
|
||||||
import com.fuyuanshen.modules.system.mapper.UserMapper;
|
import com.fuyuanshen.modules.system.mapper.UserMapper;
|
||||||
@ -46,6 +48,7 @@ import io.swagger.annotations.Api;
|
|||||||
import io.swagger.annotations.ApiOperation;
|
import io.swagger.annotations.ApiOperation;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
import org.apache.poi.ss.formula.functions.T;
|
import org.apache.poi.ss.formula.functions.T;
|
||||||
import org.springframework.security.access.prepost.PreAuthorize;
|
import org.springframework.security.access.prepost.PreAuthorize;
|
||||||
import org.springframework.security.crypto.password.PasswordEncoder;
|
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||||
@ -91,10 +94,17 @@ public class APPUserController {
|
|||||||
@ApiOperation("用户中心")
|
@ApiOperation("用户中心")
|
||||||
@GetMapping(value = "/get")
|
@GetMapping(value = "/get")
|
||||||
@PreAuthorize("@el.check('appUser:get')")
|
@PreAuthorize("@el.check('appUser:get')")
|
||||||
public ResponseVO<APPUser> getAPPUser(UserQueryCriteria criteria) {
|
public ResponseVO<APPUserVo> getAPPUser() {
|
||||||
String userName = SecurityUtils.getCurrentUsername();
|
String userName = SecurityUtils.getCurrentUsername();
|
||||||
return null;
|
APPUser appUser = appUserService.getLoginData(userName);
|
||||||
// return ResponseVO.success(appUserService.getAPPUser(criteria));
|
|
||||||
|
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用户注册")
|
@Log("app用户注册")
|
||||||
@ -103,7 +113,7 @@ public class APPUserController {
|
|||||||
public ResponseVO<String> APPRegister(@Validated @RequestBody APPUserDTO user) throws Exception {
|
public ResponseVO<String> APPRegister(@Validated @RequestBody APPUserDTO user) throws Exception {
|
||||||
|
|
||||||
//暫定0000
|
//暫定0000
|
||||||
if (user.getVerificationCode() == null || !"0000".equals(user.getVerificationCode())) {
|
if (!"0000".equals(user.getVerificationCode())) {
|
||||||
throw new BadRequestException("验证码错误");
|
throw new BadRequestException("验证码错误");
|
||||||
}
|
}
|
||||||
appUserService.addUser(user);
|
appUserService.addUser(user);
|
||||||
@ -115,9 +125,36 @@ public class APPUserController {
|
|||||||
@PutMapping
|
@PutMapping
|
||||||
@PreAuthorize("@el.check('appUser:edit')")
|
@PreAuthorize("@el.check('appUser:edit')")
|
||||||
public ResponseVO<String> updateUser(@Validated(APPUser.Update.class) @RequestBody APPUser appUser) throws Exception {
|
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);
|
appUserService.updateById(appUser);
|
||||||
return ResponseVO.success("success!!!");
|
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!!!");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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.Role;
|
||||||
import com.fuyuanshen.modules.system.domain.app.APPUser;
|
import com.fuyuanshen.modules.system.domain.app.APPUser;
|
||||||
import com.fuyuanshen.modules.system.domain.dto.UserQueryCriteria;
|
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.dto.app.APPUserDTO;
|
||||||
import com.fuyuanshen.modules.utils.ResponseVO;
|
import com.fuyuanshen.modules.utils.ResponseVO;
|
||||||
import com.fuyuanshen.utils.PageResult;
|
import com.fuyuanshen.utils.PageResult;
|
||||||
@ -54,4 +55,8 @@ public interface APPUserService extends IService<APPUser> {
|
|||||||
ResponseVO<Object> addUser(APPUserDTO user);
|
ResponseVO<Object> addUser(APPUserDTO user);
|
||||||
|
|
||||||
Integer selectRoleByUserLevel(Set<Role> roles);
|
Integer selectRoleByUserLevel(Set<Role> roles);
|
||||||
|
|
||||||
|
void forgotPassword(APPForgotPasswordDTO appForgotPasswordDTO);
|
||||||
|
|
||||||
|
void sendSms(String phoneNumber);
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
*/
|
*/
|
||||||
package com.fuyuanshen.modules.system.service.impl.app;
|
package com.fuyuanshen.modules.system.service.impl.app;
|
||||||
|
|
||||||
|
import cn.hutool.core.util.RandomUtil;
|
||||||
import cn.hutool.crypto.digest.MD5;
|
import cn.hutool.crypto.digest.MD5;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
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.Role;
|
||||||
import com.fuyuanshen.modules.system.domain.app.APPUser;
|
import com.fuyuanshen.modules.system.domain.app.APPUser;
|
||||||
import com.fuyuanshen.modules.system.domain.dto.UserQueryCriteria;
|
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.dto.app.APPUserDTO;
|
||||||
import com.fuyuanshen.modules.system.mapper.app.APPUserMapper;
|
import com.fuyuanshen.modules.system.mapper.app.APPUserMapper;
|
||||||
import com.fuyuanshen.modules.system.service.app.APPUserService;
|
import com.fuyuanshen.modules.system.service.app.APPUserService;
|
||||||
import com.fuyuanshen.modules.utils.ResponseVO;
|
import com.fuyuanshen.modules.utils.ResponseVO;
|
||||||
import com.fuyuanshen.utils.*;
|
import com.fuyuanshen.utils.*;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.security.crypto.password.PasswordEncoder;
|
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
import static com.fuyuanshen.constants.RedisConstants.APP_SMS_TOKEN;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Zheng Jie
|
* @author Zheng Jie
|
||||||
* @date 2018-11-23
|
* @date 2018-11-23
|
||||||
@ -45,6 +50,10 @@ public class APPUserServiceImpl extends ServiceImpl<APPUserMapper, APPUser> impl
|
|||||||
|
|
||||||
private final PasswordEncoder passwordEncoder;
|
private final PasswordEncoder passwordEncoder;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private final RedisUtils redisUtils;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询APP/小程序用户
|
* 查询APP/小程序用户
|
||||||
*
|
*
|
||||||
@ -96,4 +105,33 @@ public class APPUserServiceImpl extends ServiceImpl<APPUserMapper, APPUser> impl
|
|||||||
return 0;
|
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);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user