| | |
| | | import java.util.stream.Collectors; |
| | | |
| | | import javax.annotation.Resource; |
| | | import javax.validation.constraints.NotBlank; |
| | | |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.panzhihua.common.model.dtos.community.microCommercialStreet.BindUserPhoneDTO; |
| | | import com.panzhihua.common.model.vos.community.microCommercialStreet.McsLoginUserInfoVO; |
| | | import org.apache.commons.lang.time.DateFormatUtils; |
| | | import org.apache.commons.lang.time.DateUtils; |
| | |
| | | @Slf4j |
| | | @Service |
| | | public class UserServiceImpl implements UserService { |
| | | |
| | | private static final String DEFAULT_IMAGE_URL = "https://www.psciio.com//idcard/91313573d071436ab1f934231b31c6e5.jpg"; |
| | | |
| | | @Resource |
| | | private UserDao userDao; |
| | | @Resource |
| | |
| | | public R addMcsMerchantUser(McsMerchantDTO mcsMerchantDTO) { |
| | | SysUserDO sysUserDO; |
| | | sysUserDO = userDao.selectOne(new QueryWrapper<SysUserDO>().lambda() |
| | | .eq(SysUserDO::getAccount, mcsMerchantDTO.getAccount()).eq(SysUserDO::getType, 11)); |
| | | .eq(SysUserDO::getPhone, mcsMerchantDTO.getPhone()).eq(SysUserDO::getType, 11)); |
| | | String encode = new BCryptPasswordEncoder().encode(mcsMerchantDTO.getPassword()); |
| | | if (nonNull(sysUserDO)) { |
| | | return R.fail("账户已经存在"); |
| | | BeanUtils.copyProperties(mcsMerchantDTO, sysUserDO); |
| | | sysUserDO.setAccount(mcsMerchantDTO.getAccount()); |
| | | sysUserDO.setStatus(mcsMerchantDTO.getAccountStatus()); |
| | | sysUserDO.setPhone(mcsMerchantDTO.getPhone()); |
| | | sysUserDO.setPassword(encode); |
| | | sysUserDO.setPlaintextPassword(mcsMerchantDTO.getPassword()); |
| | | userDao.updateById(sysUserDO); |
| | | McsLoginUserInfoVO loginUserInfoVO = new McsLoginUserInfoVO(); |
| | | BeanUtils.copyProperties(sysUserDO, loginUserInfoVO); |
| | | return R.ok(loginUserInfoVO); |
| | | } |
| | | // sys_user 表 |
| | | sysUserDO = new SysUserDO(); |
| | | String encode = new BCryptPasswordEncoder().encode(mcsMerchantDTO.getPassword()); |
| | | BeanUtils.copyProperties(mcsMerchantDTO, sysUserDO); |
| | | sysUserDO.setAccount(mcsMerchantDTO.getAccount()); |
| | | sysUserDO.setType(11); |
| | |
| | | String account = mcsMerchantDTO.getAccount(); |
| | | String phone = mcsMerchantDTO.getPhone(); |
| | | Integer accountStatus = mcsMerchantDTO.getAccountStatus(); |
| | | String name = mcsMerchantDTO.getName(); |
| | | if (isNotBlank(account)) { |
| | | sysUserDO.setAccount(account); |
| | | } |
| | |
| | | } |
| | | if (nonNull(accountStatus)) { |
| | | sysUserDO.setStatus(accountStatus); |
| | | } |
| | | if (isNotBlank(name)) { |
| | | sysUserDO.setName(name); |
| | | } |
| | | try { |
| | | userDao.updateById(sysUserDO); |
| | |
| | | } |
| | | |
| | | /** |
| | | * 发送验证码登录 |
| | | * 发送验证码 |
| | | * @param phone 手机号 |
| | | * @param clientIP 用户ip |
| | | * @param prefixKey redis Key 前缀 |
| | |
| | | * @return |
| | | */ |
| | | @Override |
| | | public R sendMessageCodeForLogin(String phone, String clientIP, String prefixKey, Integer limit, Integer timeout) { |
| | | public R sendMessageCode(String phone, String clientIP, String prefixKey, Integer limit, Integer timeout) { |
| | | ValueOperations<String, String> opsForValue = stringRedisTemplate.opsForValue(); |
| | | if (isNotBlank(clientIP)) { |
| | | String redisKey = String.join("::", prefixKey, clientIP); |
| | | Long increment = opsForValue.increment(redisKey, 1); |
| | | if (increment > limit) { |
| | | return R.fail("请求频繁,请稍后再试"); |
| | | return R.fail(String.format("请求过于频繁,请%d分钟后再次尝试!", timeout/60)); |
| | | } |
| | | stringRedisTemplate.expire(redisKey, timeout, TimeUnit.SECONDS); |
| | | } |
| | |
| | | } |
| | | return R.fail(); |
| | | } |
| | | |
| | | /** |
| | | * 根据openId获取微商业街用户 |
| | | * @param openid |
| | | * @return |
| | | */ |
| | | @Override |
| | | public R getMcsUserByOpenId(String openid) { |
| | | SysUserDO sysUserDO = userDao.selectOne(new QueryWrapper<SysUserDO>().lambda().eq(SysUserDO::getOpenid, openid).eq(SysUserDO::getType, 11)); |
| | | McsLoginUserInfoVO loginUserInfoVO = null; |
| | | if (nonNull(sysUserDO) && isNotBlank(sysUserDO.getOpenid())) { |
| | | loginUserInfoVO = new McsLoginUserInfoVO(); |
| | | BeanUtils.copyProperties(sysUserDO, loginUserInfoVO); |
| | | } |
| | | return R.ok(loginUserInfoVO); |
| | | } |
| | | |
| | | /** |
| | | * 商业街用户微信授权-绑定手机号 |
| | | * @param bindUserPhoneDTO |
| | | * @return |
| | | */ |
| | | @Override |
| | | public R bindOrAddMcsUser(BindUserPhoneDTO bindUserPhoneDTO) { |
| | | String phone = bindUserPhoneDTO.getPhone(); |
| | | String openId = bindUserPhoneDTO.getOpenId(); |
| | | String redisKey = String.join("::", phone, bindUserPhoneDTO.getCode()); |
| | | Boolean hasKey = stringRedisTemplate.hasKey(redisKey); |
| | | if (hasKey) { |
| | | //通过验证 |
| | | SysUserDO sysUserDO = userDao.selectOne(new QueryWrapper<SysUserDO>().lambda().eq(SysUserDO::getPhone, phone).eq(SysUserDO::getType, 11)); |
| | | if (nonNull(sysUserDO)) { |
| | | //已有用户 |
| | | sysUserDO.setOpenid(openId); |
| | | int result = userDao.updateById(sysUserDO); |
| | | if (result > 0) { |
| | | McsLoginUserInfoVO loginUserInfoVO = new McsLoginUserInfoVO(); |
| | | BeanUtils.copyProperties(sysUserDO, loginUserInfoVO); |
| | | stringRedisTemplate.delete(redisKey); |
| | | return R.ok(loginUserInfoVO); |
| | | } |
| | | return R.fail("绑定失败,请重试"); |
| | | } else { |
| | | //自动创建用户 |
| | | McsMerchantDTO mcsMerchantDTO = new McsMerchantDTO(); |
| | | mcsMerchantDTO.setAccount(phone); |
| | | mcsMerchantDTO.setPassword("88888888"); |
| | | mcsMerchantDTO.setAccountStatus(1); |
| | | mcsMerchantDTO.setPhone(phone); |
| | | mcsMerchantDTO.setName("用户" + retrieveRandomCode(5)); |
| | | mcsMerchantDTO.setImageUrl(DEFAULT_IMAGE_URL); |
| | | mcsMerchantDTO.setOpenId(openId); |
| | | R addUserResult = addMcsMerchantUser(mcsMerchantDTO); |
| | | if (R.isOk(addUserResult)) { |
| | | McsLoginUserInfoVO loginUserInfoVO = JSONObject.parseObject(JSONObject.toJSONString(addUserResult.getData()), McsLoginUserInfoVO.class); |
| | | loginUserInfoVO.setPlaintextPassword("88888888"); |
| | | stringRedisTemplate.delete(redisKey); |
| | | return R.ok(loginUserInfoVO); |
| | | } |
| | | return addUserResult; |
| | | } |
| | | } else { |
| | | return R.fail("验证码错误"); |
| | | } |
| | | } |
| | | |
| | | private String retrieveRandomCode(int length) { |
| | | Random r = new Random(); |
| | | StringBuilder rs = new StringBuilder(); |
| | | for (int i = 0; i < length; i++) { |
| | | rs.append(r.nextInt(10)); |
| | | } |
| | | return rs.toString(); |
| | | } |
| | | } |