1.app用户注册完自动登录

This commit is contained in:
2023-06-27 19:54:16 +08:00
parent aca47f35ff
commit 8f39a3122a
8 changed files with 152 additions and 37 deletions

View File

@@ -7,11 +7,8 @@ import com.njcn.common.pojo.enums.response.CommonResponseEnum;
import com.njcn.common.pojo.response.HttpResult;
import com.njcn.common.utils.HttpResultUtil;
import com.njcn.common.utils.LogUtil;
import com.njcn.user.pojo.param.UserParam;
import com.njcn.user.pojo.vo.app.AppUserResultVO;
import com.njcn.user.service.IAppUserService;
import com.njcn.web.controller.BaseController;
import com.njcn.web.utils.RequestUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
@@ -23,12 +20,9 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
/**
* 类的介绍:
*
@@ -67,6 +61,7 @@ public class AppUserController extends BaseController {
/**
* 手机app注册
* @return
*/
@OperateInfo(info = LogEnum.SYSTEM_COMMON, operateType = OperateType.ADD)
@PostMapping("register")
@@ -74,13 +69,26 @@ public class AppUserController extends BaseController {
@ApiImplicitParams({
@ApiImplicitParam(name = "phone", value = "手机号", required = true, paramType = "query"),
@ApiImplicitParam(name = "code", value = "验证码", required = true, paramType = "query"),
@ApiImplicitParam(name = "devCode", value = "设备码", required = true, paramType = "query"),
@ApiImplicitParam(name = "devCode", value = "设备码", required = true, paramType = "query")
})
public HttpResult<String> register(@Param("phone") String phone, @Param("code") String code, @Param("devCode") String devCode) {
String methodDescribe = getMethodDescribe("register");
LogUtil.njcnDebug(log, "{},手机号:{},验证码:{},设备码:{}", methodDescribe, phone,code,devCode);
appUserService.register(phone,code,devCode);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, "", methodDescribe);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, "success", methodDescribe);
}
/**
* app用户注册完自动登录
* @return
*/
@OperateInfo(info = LogEnum.SYSTEM_COMMON, operateType = OperateType.ADD)
@PostMapping("autoLogin")
@ApiOperation("app用户注册完自动登录")
public HttpResult<Object> autoLogin() {
String methodDescribe = getMethodDescribe("autoLogin");
Object object = appUserService.autoLogin();
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, object, methodDescribe);
}

View File

@@ -1,6 +1,6 @@
package com.njcn.user.service;
import com.njcn.user.pojo.vo.app.AppUserResultVO;
import com.njcn.common.pojo.response.HttpResult;
/**
* @author xuyang
@@ -21,7 +21,12 @@ public interface IAppUserService {
* @param code 验证码
* @param devCode 设备码
*/
void register(String phone, String code, String devCode);
void register(String phone, String code, String devCode);
/**
* 手机app注册完自动登录
*/
Object autoLogin();
/**
* 用户设置密码

View File

@@ -69,4 +69,10 @@ public interface IUserSetService extends IService<UserSet> {
* @date 2022/1/19 17:03
*/
UserSet getUserSetByUserId(String userId);
/**
* 功能描述: 生成app用户的信息
* @return
*/
UserSet addAppUserSet();
}

View File

@@ -4,12 +4,14 @@ import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.njcn.common.pojo.constant.PatternRegex;
import com.njcn.common.pojo.exception.BusinessException;
import com.njcn.common.pojo.response.HttpResult;
import com.njcn.common.utils.PubUtils;
import com.njcn.common.utils.sm.Sm4Utils;
import com.njcn.redis.pojo.enums.RedisKeyEnum;
@@ -20,21 +22,22 @@ import com.njcn.user.enums.UserResponseEnum;
import com.njcn.user.mapper.AppUserMapper;
import com.njcn.user.pojo.constant.UserState;
import com.njcn.user.pojo.constant.UserType;
import com.njcn.user.pojo.param.UserParam;
import com.njcn.user.pojo.po.Role;
import com.njcn.user.pojo.po.User;
import com.njcn.user.pojo.po.UserSet;
import com.njcn.user.pojo.po.app.AppInfoSet;
import com.njcn.user.pojo.po.app.AppSendMsg;
import com.njcn.user.pojo.vo.app.AppUserResultVO;
import com.njcn.user.service.*;
import com.njcn.web.utils.RestTemplateUtil;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.util.UriComponentsBuilder;
import java.net.URI;
import java.time.LocalDateTime;
import java.util.Collections;
import java.util.Objects;
@@ -169,22 +172,20 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, User> impleme
@Override
@Transactional(rollbackFor = {Exception.class})
public void register(String phone, String code, String devCode) {
AppUserResultVO appUserResultVo = new AppUserResultVO();
if (!PubUtils.match(PatternRegex.PHONE_REGEX, phone)){
throw new BusinessException(UserResponseEnum.REGISTER_PHONE_WRONG);
}
if (StringUtils.isBlank(devCode)) {
throw new BusinessException(UserResponseEnum.DEV_CODE_WRONG);
}
judgeCode(phone, code, devCode);
judgeCode(phone, code);
//先根据手机号查询是否已被注册
User user = this.lambdaQuery().eq(User::getPhone,phone).one();
if (!Objects.isNull(user)){
throw new BusinessException(UserResponseEnum.REGISTER_PHONE_REPEAT);
} else {
//新增用户配置表
UserParam.UserAddParam addUserParam = new UserParam.UserAddParam();
UserSet userSet = userSetService.addUserSet(addUserParam);
UserSet userSet = userSetService.addAppUserSet();
//新增用户表
User newUser = cloneUserBoToUser(phone,devCode,userSet);
//新增用户角色关系表
@@ -198,18 +199,18 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, User> impleme
appInfoSet.setSystemInfo(1);
appInfoSet.setHarmonicInfo(1);
appInfoSetService.save(appInfoSet);
//自动登录 && 发送密码短信
String password = redisUtil.getStringByKey(userSet.getId());
redisUtil.saveByKeyWithExpire("autoLogin",phone,5L);
}
}
@Override
public Object autoLogin() {
String phone = redisUtil.getStringByKey("autoLogin");
//发送密码短信
//sendPasswordMessage(phone,newUser.getId());
//获取登录信息
return autoLogin(phone);
}
@Override
@@ -260,7 +261,7 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, User> impleme
return result;
}
private void judgeCode(String phone, String code, String devCode) {
private void judgeCode(String phone, String code) {
String key = RedisKeyEnum.SMS_LOGIN_KEY.getKey() + phone;
String redisCode = redisUtil.getStringByKey(key);
if (StringUtils.isEmpty(redisCode) || !code.equalsIgnoreCase(redisCode)) {
@@ -271,6 +272,62 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, User> impleme
}
}
/**
* 发送默认密码短信给用户
* @param phone
* @param userId
*/
public void sendPasswordMessage(String phone, String userId) {
String msgTemplate = MessageEnum.getTemplateByCode(1);
//开始执行短信发送
//设置超时时间-可自行调整
System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
System.setProperty("sun.net.client.defaultReadTimeout", "10000");
//初始化ascClient需要的几个参数
//短信API产品名称短信产品名固定无需修改
final String product = "Dysmsapi";
//短信API产品域名接口地址固定无需修改
final String domain = "dysmsapi.aliyuncs.com";
//替换成你的AK
//你的accessKeyId,参考本文档步骤2
final String accessKeyId = "LTAI4FxsR76x2dq3w9c5puUe";
//你的accessKeySecret参考本文档步骤2
final String accessKeySecret = "GxkTR8fsrvHtixTlD9UPmOGli35tZs";
//初始化ascClient,暂时不支持多region请勿修改
IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
try {
DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
IAcsClient acsClient = new DefaultAcsClient(profile);
SendSmsRequest request = new SendSmsRequest();
request.setMethod(MethodType.POST);
request.setPhoneNumbers(phone);
//必填:短信签名-可在短信控制台中找到
request.setSignName("灿能云");
//必填:短信模板-可在短信控制台中找到,发送国际/港澳台消息时,请使用国际/港澳台短信模版
request.setTemplateCode(msgTemplate);
String password = redisUtil.getStringByKey(userId);
String code = "{\"code\":\"" + password + "\"}";
request.setTemplateParam(code);
//请求失败这里会抛ClientException异常
SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
if (sendSmsResponse.getCode() != null && "OK".equals(sendSmsResponse.getCode())) {
//成功发送短信验证码后,删除用户密码信息
redisUtil.delete(userId);
} else {
throw new BusinessException(UserResponseEnum.SEND_CODE_FAIL);
}
AppSendMsg appSendMsg = new AppSendMsg();
appSendMsg.setPhone(phone);
appSendMsg.setMessage(password);
appSendMsg.setSendTime(LocalDateTime.now());
appSendMsg.setSendStatus(sendSmsResponse.getCode() == null ? "无状态" : sendSmsResponse.getCode());
appSendMsgService.save(appSendMsg);
} catch (ClientException e) {
e.printStackTrace();
}
}
private User cloneUserBoToUser(String phone, String devCode, UserSet userSet) {
User user = new User();
//设置用户id
@@ -303,4 +360,21 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, User> impleme
return user;
}
/**
* 用户注册完成后自动登录
* @param phone 手机号码
* @return
*/
public Object autoLogin(String phone) {
String userUrl = "http://127.0.0.1:10215/pqs-auth/oauth/token";
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(userUrl)
.queryParam("grant_type", "sms_code")
.queryParam("client_id", "njcnapp")
.queryParam("client_secret", "njcnpqs")
.queryParam("phone", phone)
.queryParam("smsCode", "123456789");
URI uri = builder.build().encode().toUri();
return Objects.requireNonNull(RestTemplateUtil.post(uri, HttpResult.class).getBody()).getData();
}
}

View File

@@ -251,19 +251,21 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
return null;
}
BeanUtil.copyProperties(user, userVO);
Dept dept = deptService.getDeptById(user.getDeptId());
//非自定义部门
if (Objects.equals(dept.getType(),0)){
String areaId = deptService.getAreaIdByDeptId(user.getDeptId());
userVO.setAreaId(areaId);
userVO.setAreaName(areaFeignClient.selectIdArea(areaId).getData().getName());
} else {
userVO.setAreaName(deptService.getNameByDeptId(user.getDeptId()));
if (!Objects.isNull(user.getDeptId())){
Dept dept = deptService.getDeptById(user.getDeptId());
//非自定义部门
if (Objects.equals(dept.getType(),0)){
String areaId = deptService.getAreaIdByDeptId(user.getDeptId());
userVO.setAreaId(areaId);
userVO.setAreaName(areaFeignClient.selectIdArea(areaId).getData().getName());
} else {
userVO.setAreaName(deptService.getNameByDeptId(user.getDeptId()));
}
userVO.setDeptName(deptService.getNameByDeptId(user.getDeptId()));
userVO.setDeptLevel(dept.getPids().split(StrUtil.COMMA).length);
}
userVO.setDeptName(deptService.getNameByDeptId(user.getDeptId()));
userVO.setRoleList(roleService.getIdByUserId(id));
userVO.setRole(roleService.getNameByUserId(id));
userVO.setDeptLevel(dept.getPids().split(StrUtil.COMMA).length);
return userVO;
}

View File

@@ -80,6 +80,24 @@ public class UserSetServiceImpl extends ServiceImpl<UserSetMapper, UserSet> impl
return this.lambdaQuery().eq(UserSet::getUserId,userId).one();
}
@Override
public UserSet addAppUserSet() {
UserSet userSet = new UserSet();
String userId = IdUtil.simpleUUID();
userSet.setUserId(userId);
String secretKey = PubUtils.randomCode(16);
userSet.setSecretKey(secretKey);
Sm4Utils sm4 = new Sm4Utils(secretKey);
//随机生成8位密码
String password = PubUtils.getCode(8);
redisUtil.saveByKeyWithExpire(userId,password,10L);
//SM4加密初始默认密码
String strSm4 = sm4.encryptData_ECB(password);
userSet.setStandBy(strSm4);
this.save(userSet);
return userSet;
}
/**
* 修改密码公共方法
* @param id