【7.0.4】【c】更新重置密码

pull/22/head
fengshuonan 2021-06-07 22:53:07 +08:00
parent 2da22f7751
commit c4c18bb543
8 changed files with 229 additions and 60 deletions

View File

@ -61,7 +61,12 @@ public enum CustomerExceptionEnum implements AbstractExceptionEnum {
/**
*
*/
EMAIL_REPEAT(RuleConstants.BUSINESS_ERROR_TYPE_CODE + CustomerConstants.CUSTOMER_EXCEPTION_STEP_CODE + "05", "邮箱重复,请更换邮箱");
EMAIL_REPEAT(RuleConstants.BUSINESS_ERROR_TYPE_CODE + CustomerConstants.CUSTOMER_EXCEPTION_STEP_CODE + "05", "邮箱重复,请更换邮箱"),
/**
*
*/
EMAIL_VERIFY_COD_ERROR(RuleConstants.BUSINESS_ERROR_TYPE_CODE + CustomerConstants.CUSTOMER_EXCEPTION_STEP_CODE + "06", "邮箱验证码错误,请重新输入邮箱验证码");
/**
*

View File

@ -31,4 +31,24 @@ public class CustomerConfigExpander {
return ConfigContext.me().getSysConfigValueWithDefault("CUSTOMER_REG_EMAIL_CONTENT", String.class, "感谢您注册Guns官方论坛请点击此激活链接激活您的账户<a href=\"http://localhost:8080/customer/active?verifyCode={}\">http://localhost:8080/customer/active?verifyCode={} </a>");
}
/**
*
*
* @author fengshuonan
* @date 2021/6/7 15:42
*/
public static String getResetPwdMailTitle() {
return ConfigContext.me().getSysConfigValueWithDefault("CUSTOMER_RESET_PWD_EMAIL_TITLE", String.class, "Guns官网验证");
}
/**
*
*
* @author fengshuonan
* @date 2021/6/7 15:42
*/
public static String getResetPwdMailContent() {
return ConfigContext.me().getSysConfigValueWithDefault("CUSTOMER_RESET_PWD_EMAIL_CONTENT", String.class, "您的验证码是【{}】,此验证码用于修改登录密码,请不要泄露给他人,如果不是您本人操作,请忽略此邮件。");
}
}

View File

@ -34,7 +34,7 @@ public class CustomerController {
* @author fengshuonan
* @date 2021/06/07 11:40
*/
@PostResource(name = "注册C端用户", path = "/customer/reg", requiredPermission = false, requiredLogin = false)
@PostResource(name = "注册", path = "/customer/reg", requiredPermission = false, requiredLogin = false)
public ResponseData reg(@RequestBody @Validated(CustomerRequest.reg.class) CustomerRequest customerRequest) {
customerService.reg(customerRequest);
return new SuccessResponseData();
@ -46,7 +46,7 @@ public class CustomerController {
* @author fengshuonan
* @date 2021/6/7 16:03
*/
@GetResource(name = "激活C端用户", path = "/customer/active", requiredPermission = false, requiredLogin = false)
@GetResource(name = "激活用户", path = "/customer/active", requiredPermission = false, requiredLogin = false)
public ResponseData active(@Validated(CustomerRequest.active.class) CustomerRequest customerRequest) {
customerService.active(customerRequest);
return new SuccessResponseData();
@ -58,79 +58,34 @@ public class CustomerController {
* @author fengshuonan
* @date 2021/06/07 11:40
*/
@PostResource(name = "C端用户登录", path = "/customer/login", requiredPermission = false, requiredLogin = false)
@PostResource(name = "登录", path = "/customer/login", requiredPermission = false, requiredLogin = false)
public ResponseData login(@RequestBody @Validated LoginRequest loginRequest) {
LoginResponse loginResponse = customerService.login(loginRequest);
return new SuccessResponseData(loginResponse);
}
/**
*
* -
*
* @author fengshuonan
* @date 2021/06/07 11:40
*/
@PostResource(name = "添加", path = "/customer/add")
public ResponseData add(@RequestBody @Validated(CustomerRequest.add.class) CustomerRequest customerRequest) {
customerService.add(customerRequest);
@PostResource(name = "找回密码-发送邮件", path = "/customer/sendResetPwdEmail", requiredPermission = false, requiredLogin = false)
public ResponseData sendResetPwdEmail(@Validated(CustomerRequest.sendResetPwdEmail.class) CustomerRequest customerRequest) {
customerService.sendResetPwdEmail(customerRequest);
return new SuccessResponseData();
}
/**
*
*
*
* @author fengshuonan
* @date 2021/06/07 11:40
*/
@PostResource(name = "删除", path = "/customer/delete")
public ResponseData delete(@RequestBody @Validated(CustomerRequest.delete.class) CustomerRequest customerRequest) {
customerService.del(customerRequest);
@PostResource(name = "重置密码", path = "/customer/resetPassword", requiredPermission = false, requiredLogin = false)
public ResponseData resetPassword(@Validated(CustomerRequest.resetPassword.class) CustomerRequest customerRequest) {
customerService.resetPassword(customerRequest);
return new SuccessResponseData();
}
/**
*
*
* @author fengshuonan
* @date 2021/06/07 11:40
*/
@PostResource(name = "编辑", path = "/customer/edit")
public ResponseData edit(@RequestBody @Validated(CustomerRequest.edit.class) CustomerRequest customerRequest) {
customerService.edit(customerRequest);
return new SuccessResponseData();
}
/**
*
*
* @author fengshuonan
* @date 2021/06/07 11:40
*/
@GetResource(name = "查看详情", path = "/customer/detail")
public ResponseData detail(@Validated(CustomerRequest.detail.class) CustomerRequest customerRequest) {
return new SuccessResponseData(customerService.detail(customerRequest));
}
/**
*
*
* @author fengshuonan
* @date 2021/06/07 11:40
*/
@GetResource(name = "获取列表", path = "/customer/list")
public ResponseData list(CustomerRequest customerRequest) {
return new SuccessResponseData(customerService.findList(customerRequest));
}
/**
*
*
* @author fengshuonan
* @date 2021/06/07 11:40
*/
@GetResource(name = "分页查询", path = "/customer/page")
public ResponseData page(CustomerRequest customerRequest) {
return new SuccessResponseData(customerService.findPage(customerRequest));
}
}

View File

@ -0,0 +1,98 @@
package cn.stylefeng.roses.kernel.customer.modular.controller;
import cn.stylefeng.roses.kernel.customer.modular.request.CustomerRequest;
import cn.stylefeng.roses.kernel.customer.modular.service.CustomerService;
import cn.stylefeng.roses.kernel.rule.pojo.response.ResponseData;
import cn.stylefeng.roses.kernel.rule.pojo.response.SuccessResponseData;
import cn.stylefeng.roses.kernel.scanner.api.annotation.ApiResource;
import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource;
import cn.stylefeng.roses.kernel.scanner.api.annotation.PostResource;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* C
*
* @author fengshuonan
* @date 2021/06/07 11:40
*/
@RestController
@ApiResource(name = "C端用户表")
public class CustomerManageController {
@Resource
private CustomerService customerService;
/**
*
*
* @author fengshuonan
* @date 2021/06/07 11:40
*/
@PostResource(name = "添加", path = "/customer/add")
public ResponseData add(@RequestBody @Validated(CustomerRequest.add.class) CustomerRequest customerRequest) {
customerService.add(customerRequest);
return new SuccessResponseData();
}
/**
*
*
* @author fengshuonan
* @date 2021/06/07 11:40
*/
@PostResource(name = "删除", path = "/customer/delete")
public ResponseData delete(@RequestBody @Validated(CustomerRequest.delete.class) CustomerRequest customerRequest) {
customerService.del(customerRequest);
return new SuccessResponseData();
}
/**
*
*
* @author fengshuonan
* @date 2021/06/07 11:40
*/
@PostResource(name = "编辑", path = "/customer/edit")
public ResponseData edit(@RequestBody @Validated(CustomerRequest.edit.class) CustomerRequest customerRequest) {
customerService.edit(customerRequest);
return new SuccessResponseData();
}
/**
*
*
* @author fengshuonan
* @date 2021/06/07 11:40
*/
@GetResource(name = "查看详情", path = "/customer/detail")
public ResponseData detail(@Validated(CustomerRequest.detail.class) CustomerRequest customerRequest) {
return new SuccessResponseData(customerService.detail(customerRequest));
}
/**
*
*
* @author fengshuonan
* @date 2021/06/07 11:40
*/
@GetResource(name = "获取列表", path = "/customer/list")
public ResponseData list(CustomerRequest customerRequest) {
return new SuccessResponseData(customerService.findList(customerRequest));
}
/**
*
*
* @author fengshuonan
* @date 2021/06/07 11:40
*/
@GetResource(name = "分页查询", path = "/customer/page")
public ResponseData page(CustomerRequest customerRequest) {
return new SuccessResponseData(customerService.findPage(customerRequest));
}
}

View File

@ -104,4 +104,21 @@ public class CustomerFactory {
return loginUser;
}
/**
*
*
* @author fengshuonan
* @date 2021/6/7 15:27
*/
public static SendMailParam createResetPwdEmail(String mail, String randomCode) {
String title = CustomerConfigExpander.getResetPwdMailTitle();
String template = CustomerConfigExpander.getResetPwdMailContent();
SendMailParam sendMailParam = new SendMailParam();
sendMailParam.setTo(mail);
sendMailParam.setTitle(title);
sendMailParam.setContent(StrUtil.format(template, randomCode));
return sendMailParam;
}
}

View File

@ -36,7 +36,7 @@ public class CustomerRequest extends BaseRequest {
* BCrypt
*/
@ChineseDescription("密码")
@NotBlank(message = "密码BCrypt不能为空", groups = {add.class, edit.class, reg.class})
@NotBlank(message = "密码BCrypt不能为空", groups = {add.class, edit.class, reg.class, resetPassword.class})
private String password;
/**
@ -52,7 +52,7 @@ public class CustomerRequest extends BaseRequest {
*
*/
@ChineseDescription("邮箱")
@NotBlank(message = "邮箱不能为空", groups = {reg.class})
@NotBlank(message = "邮箱不能为空", groups = {reg.class, sendResetPwdEmail.class, resetPassword.class})
private String email;
/**
@ -65,7 +65,7 @@ public class CustomerRequest extends BaseRequest {
*
*/
@ChineseDescription("邮箱或手机验证码")
@NotBlank(message = "激活码不能为空", groups = active.class)
@NotBlank(message = "激活码不能为空", groups = {active.class, resetPassword.class})
private String verifyCode;
/**
@ -110,4 +110,16 @@ public class CustomerRequest extends BaseRequest {
public @interface active {
}
/**
*
*/
public @interface sendResetPwdEmail {
}
/**
*
*/
public @interface resetPassword {
}
}

View File

@ -41,6 +41,22 @@ public interface CustomerService extends IService<Customer> {
*/
LoginResponse login(LoginRequest loginRequest);
/**
*
*
* @author fengshuonan
* @date 2021/6/7 22:11
*/
void sendResetPwdEmail(CustomerRequest customerRequest);
/**
*
*
* @author fengshuonan
* @date 2021/6/7 22:13
*/
void resetPassword(CustomerRequest customerRequest);
/**
*
*

View File

@ -2,6 +2,7 @@ package cn.stylefeng.roses.kernel.customer.modular.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.RandomUtil;
import cn.stylefeng.roses.kernel.auth.api.SessionManagerApi;
import cn.stylefeng.roses.kernel.auth.api.exception.AuthException;
import cn.stylefeng.roses.kernel.auth.api.exception.enums.AuthExceptionEnum;
@ -166,6 +167,51 @@ public class CustomerServiceImpl extends ServiceImpl<CustomerMapper, Customer> i
return new LoginResponse(loginUser, jwtToken, defaultJwtPayload.getExpirationDate());
}
@Override
@Transactional(rollbackFor = Exception.class)
public void sendResetPwdEmail(CustomerRequest customerRequest) {
// 验证邮箱是否存在
LambdaQueryWrapper<Customer> customerLambdaQueryWrapper = new LambdaQueryWrapper<>();
customerLambdaQueryWrapper.eq(Customer::getEmail, customerRequest.getEmail());
Customer customer = this.getOne(customerLambdaQueryWrapper, false);
if (customer == null) {
return;
}
// 邮箱验证码
String randomCode = RandomUtil.randomNumbers(6);
// 存储到数据库验证码
customer.setVerifyCode(randomCode);
this.updateById(customer);
// 发送邮箱验证码
SendMailParam resetPwdEmail = CustomerFactory.createResetPwdEmail(customerRequest.getEmail(), randomCode);
mailSenderApi.sendMailHtml(resetPwdEmail);
}
@Override
public void resetPassword(CustomerRequest customerRequest) {
// 检查校验码是否正确
LambdaQueryWrapper<Customer> customerLambdaQueryWrapper = new LambdaQueryWrapper<>();
customerLambdaQueryWrapper.eq(Customer::getEmail, customerRequest.getEmail())
.and(i -> i.eq(Customer::getVerifyCode, customerRequest.getVerifyCode()));
Customer customer = this.getOne(customerLambdaQueryWrapper, false);
// 如果不存在则为验证码错误
if (customer == null) {
throw new CustomerException(CustomerExceptionEnum.EMAIL_VERIFY_COD_ERROR);
}
// 根据请求密码,重置账号的密码
String password = customerRequest.getPassword();
String encrypt = passwordStoredEncryptApi.encrypt(password);
customer.setPassword(encrypt);
this.updateById(customer);
}
@Override
public void add(CustomerRequest customerRequest) {
Customer customer = new Customer();