mirror of https://gitee.com/stylefeng/roses
【7.0.4】【c】更新重置密码
parent
2da22f7751
commit
c4c18bb543
|
@ -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", "邮箱验证码错误,请重新输入邮箱验证码");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 错误编码
|
* 错误编码
|
||||||
|
|
|
@ -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>");
|
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, "您的验证码是【{}】,此验证码用于修改登录密码,请不要泄露给他人,如果不是您本人操作,请忽略此邮件。");
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,7 +34,7 @@ public class CustomerController {
|
||||||
* @author fengshuonan
|
* @author fengshuonan
|
||||||
* @date 2021/06/07 11:40
|
* @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) {
|
public ResponseData reg(@RequestBody @Validated(CustomerRequest.reg.class) CustomerRequest customerRequest) {
|
||||||
customerService.reg(customerRequest);
|
customerService.reg(customerRequest);
|
||||||
return new SuccessResponseData();
|
return new SuccessResponseData();
|
||||||
|
@ -46,7 +46,7 @@ public class CustomerController {
|
||||||
* @author fengshuonan
|
* @author fengshuonan
|
||||||
* @date 2021/6/7 16:03
|
* @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) {
|
public ResponseData active(@Validated(CustomerRequest.active.class) CustomerRequest customerRequest) {
|
||||||
customerService.active(customerRequest);
|
customerService.active(customerRequest);
|
||||||
return new SuccessResponseData();
|
return new SuccessResponseData();
|
||||||
|
@ -58,79 +58,34 @@ public class CustomerController {
|
||||||
* @author fengshuonan
|
* @author fengshuonan
|
||||||
* @date 2021/06/07 11:40
|
* @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) {
|
public ResponseData login(@RequestBody @Validated LoginRequest loginRequest) {
|
||||||
LoginResponse loginResponse = customerService.login(loginRequest);
|
LoginResponse loginResponse = customerService.login(loginRequest);
|
||||||
return new SuccessResponseData(loginResponse);
|
return new SuccessResponseData(loginResponse);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 添加
|
* 找回密码-发送邮件
|
||||||
*
|
*
|
||||||
* @author fengshuonan
|
* @author fengshuonan
|
||||||
* @date 2021/06/07 11:40
|
* @date 2021/06/07 11:40
|
||||||
*/
|
*/
|
||||||
@PostResource(name = "添加", path = "/customer/add")
|
@PostResource(name = "找回密码-发送邮件", path = "/customer/sendResetPwdEmail", requiredPermission = false, requiredLogin = false)
|
||||||
public ResponseData add(@RequestBody @Validated(CustomerRequest.add.class) CustomerRequest customerRequest) {
|
public ResponseData sendResetPwdEmail(@Validated(CustomerRequest.sendResetPwdEmail.class) CustomerRequest customerRequest) {
|
||||||
customerService.add(customerRequest);
|
customerService.sendResetPwdEmail(customerRequest);
|
||||||
return new SuccessResponseData();
|
return new SuccessResponseData();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 删除
|
* 重置密码
|
||||||
*
|
*
|
||||||
* @author fengshuonan
|
* @author fengshuonan
|
||||||
* @date 2021/06/07 11:40
|
* @date 2021/06/07 11:40
|
||||||
*/
|
*/
|
||||||
@PostResource(name = "删除", path = "/customer/delete")
|
@PostResource(name = "重置密码", path = "/customer/resetPassword", requiredPermission = false, requiredLogin = false)
|
||||||
public ResponseData delete(@RequestBody @Validated(CustomerRequest.delete.class) CustomerRequest customerRequest) {
|
public ResponseData resetPassword(@Validated(CustomerRequest.resetPassword.class) CustomerRequest customerRequest) {
|
||||||
customerService.del(customerRequest);
|
customerService.resetPassword(customerRequest);
|
||||||
return new SuccessResponseData();
|
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));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
|
@ -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));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -104,4 +104,21 @@ public class CustomerFactory {
|
||||||
return loginUser;
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,7 +36,7 @@ public class CustomerRequest extends BaseRequest {
|
||||||
* 密码,BCrypt
|
* 密码,BCrypt
|
||||||
*/
|
*/
|
||||||
@ChineseDescription("密码")
|
@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;
|
private String password;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -52,7 +52,7 @@ public class CustomerRequest extends BaseRequest {
|
||||||
* 注册时,必填邮箱
|
* 注册时,必填邮箱
|
||||||
*/
|
*/
|
||||||
@ChineseDescription("邮箱")
|
@ChineseDescription("邮箱")
|
||||||
@NotBlank(message = "邮箱不能为空", groups = {reg.class})
|
@NotBlank(message = "邮箱不能为空", groups = {reg.class, sendResetPwdEmail.class, resetPassword.class})
|
||||||
private String email;
|
private String email;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -65,7 +65,7 @@ public class CustomerRequest extends BaseRequest {
|
||||||
* 邮箱或手机验证码
|
* 邮箱或手机验证码
|
||||||
*/
|
*/
|
||||||
@ChineseDescription("邮箱或手机验证码")
|
@ChineseDescription("邮箱或手机验证码")
|
||||||
@NotBlank(message = "激活码不能为空", groups = active.class)
|
@NotBlank(message = "激活码不能为空", groups = {active.class, resetPassword.class})
|
||||||
private String verifyCode;
|
private String verifyCode;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -110,4 +110,16 @@ public class CustomerRequest extends BaseRequest {
|
||||||
public @interface active {
|
public @interface active {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发送找回密码邮件
|
||||||
|
*/
|
||||||
|
public @interface sendResetPwdEmail {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 重置密码
|
||||||
|
*/
|
||||||
|
public @interface resetPassword {
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -41,6 +41,22 @@ public interface CustomerService extends IService<Customer> {
|
||||||
*/
|
*/
|
||||||
LoginResponse login(LoginRequest loginRequest);
|
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);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 新增
|
* 新增
|
||||||
*
|
*
|
||||||
|
|
|
@ -2,6 +2,7 @@ package cn.stylefeng.roses.kernel.customer.modular.service.impl;
|
||||||
|
|
||||||
import cn.hutool.core.bean.BeanUtil;
|
import cn.hutool.core.bean.BeanUtil;
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
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.SessionManagerApi;
|
||||||
import cn.stylefeng.roses.kernel.auth.api.exception.AuthException;
|
import cn.stylefeng.roses.kernel.auth.api.exception.AuthException;
|
||||||
import cn.stylefeng.roses.kernel.auth.api.exception.enums.AuthExceptionEnum;
|
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());
|
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
|
@Override
|
||||||
public void add(CustomerRequest customerRequest) {
|
public void add(CustomerRequest customerRequest) {
|
||||||
Customer customer = new Customer();
|
Customer customer = new Customer();
|
||||||
|
|
Loading…
Reference in New Issue