From a34dfc308ff8c9b03fd555935b7661c5b78885c1 Mon Sep 17 00:00:00 2001 From: wangxiang <1827945911@qq.com> Date: Sat, 23 Dec 2023 11:01:42 +0800 Subject: [PATCH] feat: app phone login --- .../kicc/system/controller/AppController.java | 9 +- .../cloud/kicc/system/service/AppService.java | 7 ++ .../system/service/impl/AppServiceImpl.java | 110 ++++++++++++++---- 3 files changed, 103 insertions(+), 23 deletions(-) diff --git a/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/controller/AppController.java b/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/controller/AppController.java index b155e1ab..8d779492 100644 --- a/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/controller/AppController.java +++ b/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/controller/AppController.java @@ -30,7 +30,6 @@ import java.util.Map; public class AppController { private final AppService appService; - private final ISsoUserService iSsoUserService; @Inner(false) @@ -57,4 +56,12 @@ public class AppController { return R.ok(user.get(0)); } + + @Inner(false) + @GetMapping("/phoneRegister") + public R phoneRegister(String phone, String captcha, String identityProvider) { + return R.ok(appService.phoneRegister(phone, captcha, identityProvider)); + } + + } diff --git a/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/service/AppService.java b/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/service/AppService.java index 4bf3cb66..fa3878a9 100644 --- a/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/service/AppService.java +++ b/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/service/AppService.java @@ -1,6 +1,7 @@ package com.cloud.kicc.system.service; import com.cloud.kicc.common.core.api.R; +import com.cloud.kicc.common.data.entity.SsoUser; /** *

@@ -19,4 +20,10 @@ public interface AppService { */ R sendSmsCode(String mobile); + /** + * 手机号一键注册 + * @param phone 手机号 + * @param captcha 验证码 + */ + SsoUser phoneRegister(String phone, String captcha, String identityProvider); } diff --git a/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/service/impl/AppServiceImpl.java b/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/service/impl/AppServiceImpl.java index 2aa00ca4..d77ebb56 100644 --- a/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/service/impl/AppServiceImpl.java +++ b/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/service/impl/AppServiceImpl.java @@ -1,21 +1,34 @@ package com.cloud.kicc.system.service.impl; -import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.lang.Validator; +import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.RandomUtil; import cn.javaer.aliyun.sms.SmsClient; +import cn.javaer.aliyun.sms.SmsTemplate; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.cloud.kicc.common.core.api.R; import com.cloud.kicc.common.core.constant.CacheConstants; import com.cloud.kicc.common.core.constant.SecurityConstants; -import com.cloud.kicc.common.data.entity.KiccUser; -import com.cloud.kicc.system.service.AppService; -import com.cloud.kicc.system.service.UserService; +import com.cloud.kicc.common.core.exception.CheckedException; +import com.cloud.kicc.common.core.exception.ValidateCodeException; +import com.cloud.kicc.common.data.entity.SsoUser; +import com.cloud.kicc.system.api.entity.Dept; +import com.cloud.kicc.system.api.entity.User; +import com.cloud.kicc.system.api.entity.UserRole; +import com.cloud.kicc.system.service.*; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; -import java.util.List; +import java.util.Arrays; +import java.util.Optional; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; /** *

@@ -31,10 +44,12 @@ import java.util.concurrent.TimeUnit; public class AppServiceImpl implements AppService { private final RedisTemplate redisTemplate; - - private final UserService userService; - private final SmsClient smsClient; + private final UserService userService; + private final ConfigService configService; + private final DeptService deptService; + private final UserRoleService userRoleService; + private final ISsoUserService iSsoUserService; /** * 发送手机验证码 @@ -44,28 +59,79 @@ public class AppServiceImpl implements AppService { */ @Override public R sendSmsCode(String phone) { - List user = userService.getUserByPhone(phone); - - if (CollUtil.isEmpty(user)) { - log.info("手机号未注册:{}", phone); - return R.ok(Boolean.FALSE, "手机号未注册"); - } - Object codeObj = redisTemplate.opsForValue().get(CacheConstants.VERIFICATION_CODE + phone); - if (codeObj != null) { log.info("手机号验证码未过期:{},{}", phone, codeObj); return R.ok(Boolean.FALSE, "验证码发送过频繁"); } - String code = RandomUtil.randomNumbers(Integer.parseInt(SecurityConstants.PHONE_CODE_SIZE)); log.info("手机号生成验证码成功:{},{}", phone, code); - redisTemplate.opsForValue().set(CacheConstants.VERIFICATION_CODE + phone, code, SecurityConstants.CODE_TIME, - TimeUnit.SECONDS); - - // 调用短信通道发送 - this.smsClient.sendVerificationCode("ali-code",phone); + redisTemplate.opsForValue().set(CacheConstants.VERIFICATION_CODE + phone, code, SecurityConstants.CODE_TIME, TimeUnit.SECONDS); + smsClient.send(SmsTemplate.builder() + .templateCode(code) + .phoneNumbers(ListUtil.of(phone)) + .signName("长沙康来") + .build()); return R.ok(Boolean.TRUE, code); } + + @Transactional(rollbackFor = Exception.class) + public SsoUser phoneRegister(String phone, String captcha, String identityProvider) { + // 设置不区分大小写,全部以小写验证 + Validator.validateMobile(phone, "手机号码不合法"); + String code = captcha.toLowerCase(); + if (CharSequenceUtil.isBlank(code)) { + throw new ValidateCodeException("验证码不能为空"); + } + String key = CacheConstants.VERIFICATION_CODE + phone; + Object codeObj = redisTemplate.opsForValue().get(key); + redisTemplate.delete(key); + if (ObjectUtil.isEmpty(codeObj) || !code.equals(codeObj)) { + throw new ValidateCodeException("验证码不合法"); + } + if (iSsoUserService.count(Wrappers.lambdaQuery().eq(SsoUser::getPhone, phone)) > 0) { + throw new ValidateCodeException("当前用户已经注册,不能重复注册"); + } + + // 进行注册用户 + String initDeptId = configService.getValueByKey("app.init.deptId"); + Dept dept = deptService.getById(initDeptId); + Optional.ofNullable(dept).orElseThrow(() -> new CheckedException("当前部门无效请重新在参数管理中配置!")); + String initUserType = configService.getValueByKey("app.init.deptId"); + String initTenantId = configService.getValueByKey("app.init.tenantId"); + String initRoleIds = configService.getValueByKey("app.init.roleIds"); + String initPassword = configService.getValueByKey("appid.password"); + + SsoUser ssoUser = new SsoUser(); + ssoUser.setUserName(phone); + ssoUser.setNickName(phone); + ssoUser.setPassword(new BCryptPasswordEncoder().encode(initPassword)); + ssoUser.setPhone(phone); + ssoUser.setIdentityProvider(identityProvider); + iSsoUserService.save(ssoUser); + + User user = new User(); + user.setCasUserId(ssoUser.getId()); + user.setDeptId(dept.getDeptId()); + user.setDeptName(dept.getName()); + user.setUserType(initUserType); + user.setTenantId(initTenantId); + userService.save(user); + + // 处理角色授权 + String[] roles = initRoleIds.split(","); + userRoleService.saveBatch(Arrays.stream(roles).map(roleId -> { + UserRole ur = new UserRole(); + ur.setUserId(user.getId()); + ur.setRoleId(roleId); + ur.setTenantId(initTenantId); + return ur; + }).collect(Collectors.toList())); + // 处理原密码给到APP自动一键登陆 + ssoUser.setPassword(initPassword); + return ssoUser; + } + + }