From c4c18bb5433823a235ab913ace3df05c7afb46a3 Mon Sep 17 00:00:00 2001 From: fengshuonan Date: Mon, 7 Jun 2021 22:53:07 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=907.0.4=E3=80=91=E3=80=90c=E3=80=91?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=87=8D=E7=BD=AE=E5=AF=86=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../enums/CustomerExceptionEnum.java | 7 +- .../api/expander/CustomerConfigExpander.java | 20 ++++ .../controller/CustomerController.java | 67 +++---------- .../controller/CustomerManageController.java | 98 +++++++++++++++++++ .../modular/factory/CustomerFactory.java | 17 ++++ .../modular/request/CustomerRequest.java | 18 +++- .../modular/service/CustomerService.java | 16 +++ .../service/impl/CustomerServiceImpl.java | 46 +++++++++ 8 files changed, 229 insertions(+), 60 deletions(-) create mode 100644 kernel-s-customer/customer-business/src/main/java/cn/stylefeng/roses/kernel/customer/modular/controller/CustomerManageController.java diff --git a/kernel-s-customer/customer-api/src/main/java/cn/stylefeng/roses/kernel/customer/api/exception/enums/CustomerExceptionEnum.java b/kernel-s-customer/customer-api/src/main/java/cn/stylefeng/roses/kernel/customer/api/exception/enums/CustomerExceptionEnum.java index 5f7910999..57e3f7e45 100644 --- a/kernel-s-customer/customer-api/src/main/java/cn/stylefeng/roses/kernel/customer/api/exception/enums/CustomerExceptionEnum.java +++ b/kernel-s-customer/customer-api/src/main/java/cn/stylefeng/roses/kernel/customer/api/exception/enums/CustomerExceptionEnum.java @@ -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", "邮箱验证码错误,请重新输入邮箱验证码"); /** * 错误编码 diff --git a/kernel-s-customer/customer-api/src/main/java/cn/stylefeng/roses/kernel/customer/api/expander/CustomerConfigExpander.java b/kernel-s-customer/customer-api/src/main/java/cn/stylefeng/roses/kernel/customer/api/expander/CustomerConfigExpander.java index b7fcda572..127f74e44 100644 --- a/kernel-s-customer/customer-api/src/main/java/cn/stylefeng/roses/kernel/customer/api/expander/CustomerConfigExpander.java +++ b/kernel-s-customer/customer-api/src/main/java/cn/stylefeng/roses/kernel/customer/api/expander/CustomerConfigExpander.java @@ -31,4 +31,24 @@ public class CustomerConfigExpander { return ConfigContext.me().getSysConfigValueWithDefault("CUSTOMER_REG_EMAIL_CONTENT", String.class, "感谢您注册Guns官方论坛,请点击此激活链接激活您的账户:http://localhost:8080/customer/active?verifyCode={} "); } + /** + * 获取重置密码的邮件标题 + * + * @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, "您的验证码是【{}】,此验证码用于修改登录密码,请不要泄露给他人,如果不是您本人操作,请忽略此邮件。"); + } + } diff --git a/kernel-s-customer/customer-business/src/main/java/cn/stylefeng/roses/kernel/customer/modular/controller/CustomerController.java b/kernel-s-customer/customer-business/src/main/java/cn/stylefeng/roses/kernel/customer/modular/controller/CustomerController.java index 883f16c1e..162b50b85 100644 --- a/kernel-s-customer/customer-business/src/main/java/cn/stylefeng/roses/kernel/customer/modular/controller/CustomerController.java +++ b/kernel-s-customer/customer-business/src/main/java/cn/stylefeng/roses/kernel/customer/modular/controller/CustomerController.java @@ -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)); - } - } \ No newline at end of file diff --git a/kernel-s-customer/customer-business/src/main/java/cn/stylefeng/roses/kernel/customer/modular/controller/CustomerManageController.java b/kernel-s-customer/customer-business/src/main/java/cn/stylefeng/roses/kernel/customer/modular/controller/CustomerManageController.java new file mode 100644 index 000000000..b8467ce55 --- /dev/null +++ b/kernel-s-customer/customer-business/src/main/java/cn/stylefeng/roses/kernel/customer/modular/controller/CustomerManageController.java @@ -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)); + } + +} \ No newline at end of file diff --git a/kernel-s-customer/customer-business/src/main/java/cn/stylefeng/roses/kernel/customer/modular/factory/CustomerFactory.java b/kernel-s-customer/customer-business/src/main/java/cn/stylefeng/roses/kernel/customer/modular/factory/CustomerFactory.java index 12276e038..35eb546c4 100644 --- a/kernel-s-customer/customer-business/src/main/java/cn/stylefeng/roses/kernel/customer/modular/factory/CustomerFactory.java +++ b/kernel-s-customer/customer-business/src/main/java/cn/stylefeng/roses/kernel/customer/modular/factory/CustomerFactory.java @@ -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; + } + } diff --git a/kernel-s-customer/customer-business/src/main/java/cn/stylefeng/roses/kernel/customer/modular/request/CustomerRequest.java b/kernel-s-customer/customer-business/src/main/java/cn/stylefeng/roses/kernel/customer/modular/request/CustomerRequest.java index d9d0b9dae..d85438414 100644 --- a/kernel-s-customer/customer-business/src/main/java/cn/stylefeng/roses/kernel/customer/modular/request/CustomerRequest.java +++ b/kernel-s-customer/customer-business/src/main/java/cn/stylefeng/roses/kernel/customer/modular/request/CustomerRequest.java @@ -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 { + } + } \ No newline at end of file diff --git a/kernel-s-customer/customer-business/src/main/java/cn/stylefeng/roses/kernel/customer/modular/service/CustomerService.java b/kernel-s-customer/customer-business/src/main/java/cn/stylefeng/roses/kernel/customer/modular/service/CustomerService.java index fabee45e3..fe2ae0167 100644 --- a/kernel-s-customer/customer-business/src/main/java/cn/stylefeng/roses/kernel/customer/modular/service/CustomerService.java +++ b/kernel-s-customer/customer-business/src/main/java/cn/stylefeng/roses/kernel/customer/modular/service/CustomerService.java @@ -41,6 +41,22 @@ public interface CustomerService extends IService { */ 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); + /** * 新增 * diff --git a/kernel-s-customer/customer-business/src/main/java/cn/stylefeng/roses/kernel/customer/modular/service/impl/CustomerServiceImpl.java b/kernel-s-customer/customer-business/src/main/java/cn/stylefeng/roses/kernel/customer/modular/service/impl/CustomerServiceImpl.java index 683a3b3d5..dc47453ce 100644 --- a/kernel-s-customer/customer-business/src/main/java/cn/stylefeng/roses/kernel/customer/modular/service/impl/CustomerServiceImpl.java +++ b/kernel-s-customer/customer-business/src/main/java/cn/stylefeng/roses/kernel/customer/modular/service/impl/CustomerServiceImpl.java @@ -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 i return new LoginResponse(loginUser, jwtToken, defaultJwtPayload.getExpirationDate()); } + @Override + @Transactional(rollbackFor = Exception.class) + public void sendResetPwdEmail(CustomerRequest customerRequest) { + + // 验证邮箱是否存在 + LambdaQueryWrapper 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 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();