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();