diff --git a/mhd-auth/src/main/java/com/mhd/auth/app/application/service/TokenLoginApplicationService.java b/mhd-auth/src/main/java/com/mhd/auth/app/application/service/TokenLoginApplicationService.java index 1698a9ed3..7c8b31d6b 100644 --- a/mhd-auth/src/main/java/com/mhd/auth/app/application/service/TokenLoginApplicationService.java +++ b/mhd-auth/src/main/java/com/mhd/auth/app/application/service/TokenLoginApplicationService.java @@ -179,34 +179,67 @@ public class TokenLoginApplicationService { } /** - * 注册 + * App注册(手机号 + 注册短信验证码 + 密码) */ - public void register(String username, String password) { - // 用户名或密码为空 错误 - if (StringUtils.isAnyBlank(username, password)) { - throw new ServiceException("用户/密码必须填写"); + public void register(LoginDTO loginDTO) { + String userPhone = loginDTO.getUserPhone(); // LoginDTO.java:27-28 + String verificationCode = loginDTO.getVerificationCode(); // LoginDTO.java:30-31 + String password = loginDTO.getPassword(); + + // 1. 基础校验 + if (StringUtils.isAnyBlank(userPhone, verificationCode, password)) { + throw new ServiceException("手机号、验证码、密码必须填写"); } - if (username.length() < UserConstants.USERNAME_MIN_LENGTH - || username.length() > UserConstants.USERNAME_MAX_LENGTH) { - throw new ServiceException("账户长度必须在2到20个字符之间"); - } - if (password.length() < UserConstants.PASSWORD_MIN_LENGTH - || password.length() > UserConstants.PASSWORD_MAX_LENGTH) { - throw new ServiceException("密码长度必须在5到20个字符之间"); + if (!RegexUtil.isPhoneLegal(userPhone)) { + throw new DigitalLogisticsException(UserError.USER_PHONE_REG_ERROR); } - // 注册用户信息 - SysUser sysUser = new SysUser(); - sysUser.setUserName(username); - sysUser.setNickName(username); - sysUser.setPassword(SecurityUtils.encryptPassword(password)); - //TODO app注册没写 - /*R registerResult = userServiceFeign.registerUserInfo(sysUser, SecurityConstants.INNER); + // 2. 校验注册短信验证码(发送时写入 redis,见 SmsApplicationService.java:112, :165) + String key = CacheConstants.SMS_REGISTER + userPhone; // "sms_register:" CacheConstants.java:51 + Object cache = redisService.getCacheObject(key); + if (cache == null || !ObjectUtil.equal(String.valueOf(cache), verificationCode)) { + recordLogininfor(userPhone, Constants.LOGIN_FAIL, "注册验证码错误", 1); + throw new ServiceException("验证码错误或已过期"); + } + // 3. 域名 → 一级组织(与 loginByVerificationCode :103-110 一致) + String path = loginDTO.getPath(); + AjaxResult topOrganizationIdR = organizationServiceFeign.getOrganizationByPath(path); + if (ObjectUtil.isNull(topOrganizationIdR) || ObjectUtil.isNull(topOrganizationIdR.get("data"))) { + throw new ServiceException("组织不存在,请检查登录域名"); + } + SysTenantsPo sysTenantsPo = JSON.parseObject(JSON.toJSONString(topOrganizationIdR.get("data")), SysTenantsPo.class); + Long topOrganizationId = sysTenantsPo.getOrganizationId(); + Long selectedOrgId = loginDTO.getOrganizationId(); // LoginDTO.java:37-38,App 选择组织时传 + Long organizationId = (selectedOrgId != null) ? selectedOrgId : topOrganizationId; + + // 4. 手机号已注册则直接提示(UserMapper.xml:199 按 user_phone+top_organization_id 查) + UserDTO query = new UserDTO(); + query.setUserPhone(userPhone); + query.setTopOrganizationId(topOrganizationId); + R exist = userServiceFeign.getUserByTopOrganizationUserPhone(query, SecurityConstants.INNER); + if (exist != null && exist.getData() != null && exist.getData().getUserPo() != null) { + throw new ServiceException("该手机号已注册,请直接登录"); + } + + // 5. 创建用户(复用验证码登录自动注册的同一链路: + // auth feign UserServiceFeign.java:47-48 → user-center UserAPI.java:332-336 + // → UserApplicationService.registerAddUser:1820-1927,内部已处理默认角色/YMS同步) + UserDTO userDTO = new UserDTO(); + userDTO.setUserPhone(userPhone); + userDTO.setUserPassword(SecurityUtils.encryptPassword(password)); + userDTO.setTopOrganizationId(topOrganizationId); + userDTO.setOrganizationId(organizationId); + userDTO.setOrganizationName(StringUtils.isNotBlank(loginDTO.getOrganizationName()) + ? loginDTO.getOrganizationName() : sysTenantsPo.getOrganizationName()); + R registerResult = userServiceFeign.registerAddUser(userDTO, SecurityConstants.INNER); if (R.FAIL == registerResult.getCode()) { throw new ServiceException(registerResult.getMsg()); - }*/ -// recordLogininfor(username, Constants.REGISTER, "注册成功"); + } + + // 6. 注册成功后清掉验证码并记日志 + redisService.deleteObject(key); + recordLogininfor(userPhone, Constants.REGISTER, "注册成功", 2); } /** diff --git a/mhd-auth/src/main/java/com/mhd/auth/app/interfaces/facade/AppTokenController.java b/mhd-auth/src/main/java/com/mhd/auth/app/interfaces/facade/AppTokenController.java index ff4654e0b..11e15aa1c 100644 --- a/mhd-auth/src/main/java/com/mhd/auth/app/interfaces/facade/AppTokenController.java +++ b/mhd-auth/src/main/java/com/mhd/auth/app/interfaces/facade/AppTokenController.java @@ -72,9 +72,9 @@ public class AppTokenController extends BaseController { @PostMapping("register") public R register(@RequestBody LoginDTO loginDTO) { - // 用户注册 - tokenLoginApplicationService.register(loginDTO.getUsername(), loginDTO.getPassword()); - return R.ok(); + // 用户注册(手机号+短信验证码+密码) + tokenLoginApplicationService.register(loginDTO); + return R.ok("注册成功"); } /**