From ab5d5c888ec0aa5854e24cee0713b1a6b05186f7 Mon Sep 17 00:00:00 2001 From: efren <79289982@qq.com> Date: Fri, 18 Jul 2025 13:33:25 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BF=98=E8=AE=B0=E5=AF=86=E7=A0=81=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E6=8E=A5=E5=8F=A3=EF=BC=9A=E5=8F=91=E9=80=81=E9=AA=8C?= =?UTF-8?q?=E8=AF=81=E7=A0=81=EF=BC=8C=E8=AE=BE=E7=BD=AE=E6=96=B0=E5=AF=86?= =?UTF-8?q?=E7=A0=81=E7=AD=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../login/controller/LoginController.java | 53 +++++++++++ .../system/login/service/BaseUserService.java | 21 +++++ .../service/impl/BaseUserServiceImpl.java | 87 +++++++++++++++++++ src/main/resources/application-master.yml | 1 + 4 files changed, 162 insertions(+) diff --git a/src/main/java/com/coscoshipping/ebtp/system/login/controller/LoginController.java b/src/main/java/com/coscoshipping/ebtp/system/login/controller/LoginController.java index aaca972..ebaf056 100644 --- a/src/main/java/com/coscoshipping/ebtp/system/login/controller/LoginController.java +++ b/src/main/java/com/coscoshipping/ebtp/system/login/controller/LoginController.java @@ -1,6 +1,7 @@ package com.coscoshipping.ebtp.system.login.controller; +import com.chinaunicom.mall.ebtp.common.base.entity.BaseCacheUser; import com.chinaunicom.mall.ebtp.common.base.entity.BaseResponse; import com.chinaunicom.mall.ebtp.common.exception.common.CommonExceptionEnum; import com.coscoshipping.ebtp.system.login.common.CaptchaGenerator; @@ -104,4 +105,56 @@ public class LoginController { public BaseResponse changePasswordOnFirstLogin(@RequestBody ChangePasswordVo vo) { return BaseResponse.success(iBaseUserService.changeSupplierPasswordOnFirstLogin(vo.getUserId(), vo.getNewPassword())); } + + /** + * 忘记密码-发送验证码 + * @param vo + * 传入账号(是否需要账号或手机号?如果均可,需要对应修改一下查询逻辑), 根据sysUser(暂时注释)查询手机号,查询空继续查询sysSupplierUser获取手机号 发送验证码 + * *******注意!!!!本地调试 发送验证码检查数据库中手机号字段或加断点,确认手机号mobilePhone必须是自己的手机号,不要随便发送给别人!!!!!! + * 当前接口后续看是否需要类型区分,暂时先不区分,只做供应商账号的忘记密码,集团账号可以系统管理员重置密码 + * 如果需要区分类型,前端页面需要有下拉选择哪种用户 + * @return 是否发送成功 + */ + @ApiOperation("忘记密码-发送验证码") + @PostMapping("/forgotPassword/sendCode") + public BaseResponse sendForgotPasswordCode(@RequestBody LoginUserVo vo) { + BaseCacheUser baseCacheUser = iBaseUserService.getPhoneByAccount(vo.getAccount()); + if (baseCacheUser == null) { + return BaseResponse.fail("账号不存在", null); + } + boolean sent = iBaseUserService.sendSmsCode(baseCacheUser); + return BaseResponse.success(sent); + } + + /** + * 忘记密码-验证验证码 成功后继续设置新密码 + * 如果忘记密码分开两个页面,第一个页面输入账号和验证码,校验成功第二个页面输入新密码 则调用这个接口+设置新密码接口 + * 如果忘记密码仅一个页面,输入账号、验证码和新密码,则直接调用设置新密码接口 + * @param vo 传递account账号 和 identifying验证码 + * @return 是否验证成功 + */ + @ApiOperation("忘记密码-验证验证码") + @PostMapping("/forgotPassword/verifyCode") + public BaseResponse verifyForgotPasswordCode(@RequestBody LoginUserVo vo) { + boolean valid = iBaseUserService.verifySmsCode(vo.getAccount(), vo.getIdentifying()); + if (!valid) { + return BaseResponse.fail("验证码错误", null); + } + return BaseResponse.success(true); + } + + /** + * 忘记密码-设置新密码 并删除验证码的redis + * @param vo 传递account账号 和 上一步的验证码(防止直接调用进入这里) 和 password新密码 + * @return 是否设置成功 + */ + @ApiOperation("忘记密码-设置新密码") + @PostMapping("/forgotPassword/reset") + public BaseResponse resetForgotPassword(@RequestBody LoginUserVo vo) { + boolean valid = iBaseUserService.verifySmsCode(vo.getAccount(), vo.getIdentifying()); + if (!valid) { + return BaseResponse.fail("验证码错误", null); + } + return BaseResponse.success(iBaseUserService.resetPasswordWithCode(vo.getAccount(), vo.getPassword())); + } } diff --git a/src/main/java/com/coscoshipping/ebtp/system/login/service/BaseUserService.java b/src/main/java/com/coscoshipping/ebtp/system/login/service/BaseUserService.java index f93dd62..c0002a7 100644 --- a/src/main/java/com/coscoshipping/ebtp/system/login/service/BaseUserService.java +++ b/src/main/java/com/coscoshipping/ebtp/system/login/service/BaseUserService.java @@ -1,6 +1,7 @@ package com.coscoshipping.ebtp.system.login.service; import com.chinaunicom.mall.ebtp.cloud.security.starter.entity.SecurityEntity; +import com.chinaunicom.mall.ebtp.common.base.entity.BaseCacheUser; import com.chinaunicom.mall.ebtp.common.base.service.IBaseService; import com.coscoshipping.ebtp.system.login.entity.BaseSelf; import com.coscoshipping.ebtp.system.user.entity.SysUser; @@ -43,4 +44,24 @@ public interface BaseUserService extends IBaseService { * @return 是否修改成功 */ boolean changeSupplierPasswordOnFirstLogin(Long userId, String newPassword); + + /** + * 根据账号获取手机号 + */ + BaseCacheUser getPhoneByAccount(String account); + + /** + * 发送短信验证码到指定手机号,并存入Redis + */ + boolean sendSmsCode(BaseCacheUser baseCacheUser); + + /** + * 校验账号和验证码 + */ + boolean verifySmsCode(String account, String code); + + /** + * 校验通过后重置密码 + */ + boolean resetPasswordWithCode(String account, String newPassword); } diff --git a/src/main/java/com/coscoshipping/ebtp/system/login/service/impl/BaseUserServiceImpl.java b/src/main/java/com/coscoshipping/ebtp/system/login/service/impl/BaseUserServiceImpl.java index a4fad11..3e30f57 100644 --- a/src/main/java/com/coscoshipping/ebtp/system/login/service/impl/BaseUserServiceImpl.java +++ b/src/main/java/com/coscoshipping/ebtp/system/login/service/impl/BaseUserServiceImpl.java @@ -16,6 +16,11 @@ import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import cn.hutool.core.util.IdUtil; +import com.chinaunicom.mall.ebtp.common.base.entity.BaseResponse; +import com.chinaunicom.mall.ebtp.common.sms.client.SmsFeignClient; +import com.chinaunicom.mall.ebtp.common.sms.entity.SmsSendResponse; +import com.chinaunicom.mall.ebtp.common.util.PropertyUtils; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; @@ -102,6 +107,9 @@ public class BaseUserServiceImpl extends BaseServiceImpl userinfoRedisTemplate; + @Autowired + private SmsFeignClient smsFeignClient; + @Override public BaseSelf idcardLogin(String account, String password) { try { @@ -120,6 +128,7 @@ public class BaseUserServiceImpl extends BaseServiceImpl userList = this.list(new LambdaQueryWrapper().eq(SysUser::getEmployeeNumber, account)); +// if (userList != null && !userList.isEmpty()) { +// SysUser user = userList.get(0); +// cacheUser.setMobilePhone(user.getMobile()); +// cacheUser.setUserType("0"); // 集团用户 +// cacheUser.setUserId(user.getUserId()); +// cacheUser.setLoginName(user.getEmployeeNumber()); +// redisTemplate.opsForValue().set("FORGOT_PWD_USER:" + account, cacheUser, 10, TimeUnit.MINUTES); +// return cacheUser; +// } + // 再查供应商用户SysSupplierUser + List supplierUserList = sysSupplierUserMapper.selectList( + new LambdaQueryWrapper().eq(SysSupplierUser::getUsername, account) + ); + if (supplierUserList != null && !supplierUserList.isEmpty()) { + SysSupplierUser user = supplierUserList.get(0); + cacheUser.setMobilePhone(user.getMobile()); + cacheUser.setUserType("2"); // 供应商 + cacheUser.setUserId(user.getUserId().toString()); + cacheUser.setLoginName(user.getUsername()); + redisTemplate.opsForValue().set("FORGOT_PWD_USER:" + account, cacheUser, 10, TimeUnit.MINUTES); + return cacheUser; + } + return null; + } + + @Override + public boolean sendSmsCode(BaseCacheUser baseCacheUser) { + // 生成验证码 + String code = String.valueOf((int)((Math.random() * 9 + 1) * 100000)); + // 发送短信 + log.info("发送短信验证码到:{},验证码:{}", baseCacheUser.getMobilePhone(), code); + String message = "您的验证码是:" + code + ",请在5分钟内输入。"; + BaseResponse templateSMSBaseResponse = smsFeignClient.sendSms(new String[]{baseCacheUser.getMobilePhone()}, "1180212", new String[]{message}, PropertyUtils.getSnowflakeId(), null); + redisTemplate.opsForValue().set("FORGOT_PWD_CODE:" + baseCacheUser.getLoginName(), code, 5, TimeUnit.MINUTES); + return templateSMSBaseResponse.isSuccess(); + } + + @Override + public boolean verifySmsCode(String account, String code) { + Object redisCode = redisTemplate.opsForValue().get("FORGOT_PWD_CODE:" + account); + return code != null && code.equals(redisCode); + } + + @Override + public boolean resetPasswordWithCode(String account, String newPassword) { + Object redisCode = redisTemplate.opsForValue().get("FORGOT_PWD_CODE:" + account); + if (redisCode == null) return false; + // 获取用户信息 + BaseCacheUser cacheUser = (BaseCacheUser) redisTemplate.opsForValue().get("FORGOT_PWD_USER:" + account); + if (cacheUser == null || cacheUser.getUserType() == null) return false; + boolean result = false; + if ("0".equals(cacheUser.getUserType())) { + // 集团用户 + SysUser user = this.getById(cacheUser.getUserId()); + if (user == null) return false; + user.setPassword(Md5Util.encode(newPassword)); + result = this.updateById(user); + } else if ("2".equals(cacheUser.getUserType())) { + // 供应商 + SysSupplierUser supplierUser = sysSupplierUserMapper.selectById(cacheUser.getUserId()); + if (supplierUser == null) return false; + String mm2 = RSA.encrypt(newPassword, publickey); + supplierUser.setPassword(Md5Util.encode(newPassword)); + result = sysSupplierUserMapper.updateById(supplierUser) > 0; + } else { + return false; + } + // 删除验证码 + redisTemplate.delete("FORGOT_PWD_CODE:" + account); + redisTemplate.delete("FORGOT_PWD_USER:" + account); + return result; + } + public static void main(String args[]) throws Exception { // String rsa = // "ObMojRm4G31O91lJDyV7rT7fmkJ0x/tMz+t2gZa1M5RtZm6cTiaAT6eblAQzjuMbNNU6DoD/YloITzn2jnQH4g2nMj1Y8TXdSEK/q8QSoLb8QVb26SuMt1xuv1hklU0yzkqCtGW7GnRArMMlgQjh04GwAcj6TikEFjKvEGGETm4="; diff --git a/src/main/resources/application-master.yml b/src/main/resources/application-master.yml index 2810889..811f27b 100644 --- a/src/main/resources/application-master.yml +++ b/src/main/resources/application-master.yml @@ -227,6 +227,7 @@ allow: - ^GET\./?v1/userinfo/oauth/check_token$ - ^GET\./?outer/v1.0/auth/.*$ - ^GET\./?v1/login/getCaptcha$ + - ^POST\./?v1/login/forgotPassword/.*$ #feign调用 mall: