You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

UserServiceImpl.java 6.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. /**
  2. * Copyright (c) 2022 雷掣 All rights reserved.
  3. *
  4. * https://www.lc_crm.com
  5. *
  6. * 版权所有,侵权必究!
  7. */
  8. package io.renren.service.impl;
  9. import com.alibaba.fastjson.JSONObject;
  10. import com.aliyuncs.CommonRequest;
  11. import com.aliyuncs.CommonResponse;
  12. import com.aliyuncs.DefaultAcsClient;
  13. import com.aliyuncs.IAcsClient;
  14. import com.aliyuncs.exceptions.ClientException;
  15. import com.aliyuncs.exceptions.ServerException;
  16. import com.aliyuncs.http.MethodType;
  17. import com.aliyuncs.profile.DefaultProfile;
  18. import io.renren.common.exception.ErrorCode;
  19. import io.renren.common.exception.RenException;
  20. import io.renren.common.redis.RedisKeys;
  21. import io.renren.common.service.impl.BaseServiceImpl;
  22. import io.renren.common.validator.AssertUtils;
  23. import io.renren.dao.UserDao;
  24. import io.renren.dto.LoginQuickDTO;
  25. import io.renren.entity.AppSysUserEntity;
  26. import io.renren.entity.TokenEntity;
  27. import io.renren.entity.UserEntity;
  28. import io.renren.dto.LoginDTO;
  29. import io.renren.service.AppSysUserService;
  30. import io.renren.service.TokenService;
  31. import io.renren.service.UserService;
  32. import io.renren.util.CacheUtils;
  33. import lombok.extern.slf4j.Slf4j;
  34. import org.apache.commons.codec.digest.DigestUtils;
  35. import org.apache.commons.lang3.StringUtils;
  36. import org.springframework.beans.factory.annotation.Autowired;
  37. import org.springframework.beans.factory.annotation.Value;
  38. import org.springframework.stereotype.Service;
  39. import java.util.HashMap;
  40. import java.util.Map;
  41. import java.util.Random;
  42. import java.util.UUID;
  43. @Service
  44. @Slf4j
  45. public class UserServiceImpl extends BaseServiceImpl<UserDao, UserEntity> implements UserService {
  46. @Autowired
  47. private TokenService tokenService;
  48. @Autowired
  49. private AppSysUserService appSysUserService;
  50. @Autowired
  51. private CacheUtils cacheUtils;
  52. @Value("${aliyun.sms.access_key}")
  53. private String accessKey;
  54. @Value("${aliyun.sms.access_secret}")
  55. private String accessSecret;
  56. @Value("${aliyun.sms.sign_name}")
  57. private String signName;
  58. @Value("${aliyun.sms.template_code}")
  59. private String templateCode;
  60. @Override
  61. public UserEntity getByMobile(String mobile) {
  62. return baseDao.getUserByMobile(mobile);
  63. }
  64. @Override
  65. public UserEntity getUserByUserId(Long userId) {
  66. return baseDao.getUserByUserId(userId);
  67. }
  68. @Override
  69. public Map<String, Object> login(LoginDTO dto) {
  70. AppSysUserEntity userEntity = appSysUserService.selectByUserName(dto.getMobile());
  71. AssertUtils.isNull(userEntity, ErrorCode.ACCOUNT_PASSWORD_ERROR);
  72. //密码错误
  73. if(!userEntity.getPassword().equals(DigestUtils.sha256Hex(dto.getPassword()))){
  74. throw new RenException(ErrorCode.ACCOUNT_PASSWORD_ERROR);
  75. }
  76. //获取登录token
  77. TokenEntity tokenEntity = tokenService.createToken(userEntity.getId());
  78. Map<String, Object> map = new HashMap<>(2);
  79. map.put("token", tokenEntity.getToken());
  80. map.put("expire", tokenEntity.getExpireDate().getTime() - System.currentTimeMillis());
  81. return map;
  82. }
  83. @Override
  84. public Map<String, Object> loginQuick(LoginQuickDTO dto) {
  85. AppSysUserEntity userEntity = appSysUserService.selectByUserName(dto.getMobile());
  86. boolean validateFlag = false;
  87. //校验手机验证码
  88. String code = cacheUtils.get(RedisKeys.getVerificationCodeKey(dto.getMobile()))!=null?cacheUtils.get(RedisKeys.getVerificationCodeKey(dto.getMobile())).toString():null;
  89. if(StringUtils.isNotEmpty(code) && dto.getVerificationCode().equals(code)){
  90. validateFlag = true;
  91. }else{
  92. if(userEntity!=null && userEntity.getSuperUser()!=null
  93. && userEntity.getSuperUser()==1 && dto.getVerificationCode().equals(userEntity.getDefaultVerificationCode()) ){
  94. validateFlag = true;
  95. }
  96. }
  97. if (validateFlag==false){
  98. throw new RenException("手机验证码错误");
  99. }
  100. cacheUtils.remove(RedisKeys.getVerificationCodeKey(dto.getMobile()));
  101. if (userEntity==null){
  102. //新增用户
  103. userEntity = new AppSysUserEntity();
  104. userEntity.setUsername(dto.getMobile());
  105. userEntity.setMobile(dto.getMobile());
  106. appSysUserService.insert(userEntity);
  107. log.info("mobile={}添加完成",dto.getMobile());
  108. }
  109. //获取登录token
  110. TokenEntity tokenEntity = tokenService.createToken(userEntity.getId());
  111. Map<String, Object> map = new HashMap<>(2);
  112. map.put("token", tokenEntity.getToken());
  113. map.put("expire", tokenEntity.getExpireDate().getTime() - System.currentTimeMillis());
  114. return map;
  115. }
  116. @Override
  117. public Boolean getverificationCode(String mobile) {
  118. try {
  119. // 生成验证码并存储到redis中
  120. // String code = new Random().nextInt(9999)+"";
  121. String chars = "0123456789";
  122. char[] rands = new char[4];
  123. for (int i = 0; i < 4; i++) {
  124. int rand = (int) (Math.random() * 10);
  125. rands[i] = chars.charAt(rand);
  126. }
  127. String code = String.valueOf(rands);
  128. HashMap<String, Object> map = new HashMap<>();
  129. map.put("code", code);
  130. boolean isSend = send(mobile, signName, templateCode, map);
  131. if (isSend) {
  132. cacheUtils.remove(RedisKeys.getVerificationCodeKey(mobile));
  133. cacheUtils.set(RedisKeys.getVerificationCodeKey(mobile), code, 300L);
  134. }
  135. return isSend;
  136. }catch (Exception e){
  137. e.printStackTrace();
  138. }
  139. return null;
  140. }
  141. public boolean send(String phoneNum, String signName,String templateCode, Map<String, Object> code) {
  142. // 连接阿里云
  143. // 第一个参数一般不动,后面两个参数是我们申请用户组时保存的账户,密码
  144. DefaultProfile profile = DefaultProfile.getProfile("cn-qingdao", accessKey, accessSecret);
  145. IAcsClient client = new DefaultAcsClient(profile);
  146. // 构建请求
  147. CommonRequest request = new CommonRequest();
  148. request.setMethod(MethodType.POST);
  149. request.setDomain("dysmsapi.aliyuncs.com"); // 不要动
  150. request.setVersion("2017-05-25"); // 不要动
  151. request.setAction("SendSms");
  152. // 自定义的参数,手机号,验证码,签名,模板
  153. request.putQueryParameter("PhoneNumbers", phoneNum);
  154. request.putQueryParameter("SignName", signName);// 签名一般不变
  155. request.putQueryParameter("TemplateCode", templateCode);// 对应阿里云短信控制台我们设置的模板名
  156. request.putQueryParameter("TemplateParam", JSONObject.toJSONString(code));// code验证码
  157. try {
  158. CommonResponse response = client.getCommonResponse(request);
  159. System.out.println(response.getData());
  160. // 构建成功返回true
  161. return response.getHttpResponse().isSuccess();
  162. } catch (ServerException e) {
  163. e.printStackTrace();
  164. } catch (ClientException e) {
  165. e.printStackTrace();
  166. }
  167. // 构建失败返回false
  168. return false;
  169. }
  170. }