cloudroam
2025-03-31 f060439c675cb9185252cfc8f034853290863c62
fix 登录
已修改4个文件
已添加1个文件
233 ■■■■ 文件已修改
src/main/java/com/mzl/flower/dto/request/UserLoginDTO.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/dto/request/UserPhoneLoginDTO.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/service/register/SmsService.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/service/system/UserService.java 119 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/web/login/CustomerLoginController.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/dto/request/UserLoginDTO.java
@@ -21,4 +21,10 @@
    @ApiModelProperty(value = "图形验证码id")
    private String codeId;
    @ApiModelProperty(value = "用户类型")
    private String userType;
}
src/main/java/com/mzl/flower/dto/request/UserPhoneLoginDTO.java
对比新文件
@@ -0,0 +1,19 @@
package com.mzl.flower.dto.request;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class UserPhoneLoginDTO {
    @ApiModelProperty(value = "用户名/手机号码", required = true)
    private String username;
    @ApiModelProperty(value = "短信验证码")
    private String smsCode;
    @ApiModelProperty(value = "用户类型")
    private String userType;
}
src/main/java/com/mzl/flower/service/register/SmsService.java
@@ -50,7 +50,8 @@
        if(existsCode(dto.getTel())){
            throw new ValidationException("短信验证码已发送,请勿频繁发送");
        }
        String smsCode = generateSmsCode();
//        String smsCode = generateSmsCode();
        String smsCode ="888888";
        String key;
        if(Constants.USER_TYPE.admin.name().equals(dto.getUserType())){
            key = SMS_CODE_KEY + SEPARATOR + Constants.USER_TYPE.admin.name() + SEPARATOR + dto.getTel();
@@ -66,13 +67,14 @@
        Map<String, String> paramMap = new HashMap<>();
        paramMap.put("code", smsCode);
        try {
            SmsUtil.sendSms(dto.getTel(),smsProperties.getVerificationCode(),paramMap);
            stringCacheClient.set(SMS_CODE_KEY + SEPARATOR + SEPARATOR + dto.getTel(),smsCode,60);
            stringCacheClient.set(key,smsCode,600);
        } catch (ClientException e) {
            throw new RuntimeException("短信发送失败");
        }
//        try {
//            //暂时不实际发送验证码
//            SmsUtil.sendSms(dto.getTel(),smsProperties.getVerificationCode(),paramMap);
        stringCacheClient.set(SMS_CODE_KEY + SEPARATOR + SEPARATOR + dto.getTel(),smsCode,60);
        stringCacheClient.set(key,smsCode,600);
//        } catch (ClientException e) {
//            throw new RuntimeException("短信发送失败");
//        }
        //todo 发送短信
    }
src/main/java/com/mzl/flower/service/system/UserService.java
@@ -8,6 +8,8 @@
import com.mzl.flower.constant.Constants;
import com.mzl.flower.dto.request.BindWechatDTO;
import com.mzl.flower.dto.request.CreateWechatUserDTO;
import com.mzl.flower.dto.request.UserLoginDTO;
import com.mzl.flower.dto.request.UserPhoneLoginDTO;
import com.mzl.flower.dto.request.customer.UpdateCustomerDTO;
import com.mzl.flower.dto.request.system.*;
import com.mzl.flower.dto.response.current.CurrentUserDTO;
@@ -534,41 +536,41 @@
            // 获取锁,最多等待 10 秒,锁自动释放时间 30 秒
            if (lock.tryLock(10, 30, TimeUnit.SECONDS)) {
                try{
                // 其次查找当前loginName是prephonenume的,userType是customer的用户存在不存在
                if (StringUtils.isEmpty(dto.getPurePhoneNumber()) && StringUtils.isEmpty(dto.getPhoneNumber())) {
                    throw new ValidationException("微信获取的电话号码为空!无法注册");
                }
                // 1:查看用户存在不存在
                List<String> userTypes = new ArrayList<>();
                userTypes.add(dto.getUserType());
                User user = findByLoginName(dto.getPurePhoneNumber(), userTypes);
                if (ObjectUtils.isEmpty(user)) {
                    // 是新用户,需要注册
                    user = new User();
                    user.setId(UUIDGenerator.getUUID());
                    user.setLoginName(dto.getPurePhoneNumber());
                    user.setTel(dto.getPurePhoneNumber());
                    user.setNickName(dto.getPurePhoneNumber());
                    user.setPassword(passwordEncoder.encode("12345678"));
                    user.setType(dto.getUserType());
                    user.setStatus(Constants.STATUS_ACTIVE);
                    user.setIsSys(Constants.N);
                    user.create();
                    userMapper.insert(user);
                    // 注册商户信息
                    UpdateCustomerDTO updateCustomerDTO = new UpdateCustomerDTO();
                    updateCustomerDTO.setUserId(user.getId());
                    if (StringUtils.isNotBlank(dto.getPurePhoneNumber())) {
                        updateCustomerDTO.setName("花满芫-" + dto.getPurePhoneNumber().substring(dto.getPurePhoneNumber().length() - 4));
                    // 其次查找当前loginName是prephonenume的,userType是customer的用户存在不存在
                    if (StringUtils.isEmpty(dto.getPurePhoneNumber()) && StringUtils.isEmpty(dto.getPhoneNumber())) {
                        throw new ValidationException("微信获取的电话号码为空!无法注册");
                    }
                    customerService.addOrUpdateCustomer(updateCustomerDTO);
                }
                    // 1:查看用户存在不存在
                    List<String> userTypes = new ArrayList<>();
                    userTypes.add(dto.getUserType());
                    User user = findByLoginName(dto.getPurePhoneNumber(), userTypes);
                    if (ObjectUtils.isEmpty(user)) {
                        // 是新用户,需要注册
                        user = new User();
                        user.setId(UUIDGenerator.getUUID());
                        user.setLoginName(dto.getPurePhoneNumber());
                        user.setTel(dto.getPurePhoneNumber());
                        user.setNickName(dto.getPurePhoneNumber());
                        user.setPassword(passwordEncoder.encode("12345678"));
                        user.setType(dto.getUserType());
                        user.setStatus(Constants.STATUS_ACTIVE);
                        user.setIsSys(Constants.N);
                        user.create();
                        userMapper.insert(user);
                BindWechatDTO wechatDTO = new BindWechatDTO();
                wechatDTO.setRealName(dto.getPurePhoneNumber());
                bindWechat(user.getId(), dto.getOpenId(), dto.getUnionId(), dto.getSessionKey(), wechatDTO);
                        // 注册商户信息
                        UpdateCustomerDTO updateCustomerDTO = new UpdateCustomerDTO();
                        updateCustomerDTO.setUserId(user.getId());
                        if (StringUtils.isNotBlank(dto.getPurePhoneNumber())) {
                            updateCustomerDTO.setName("花满芫-" + dto.getPurePhoneNumber().substring(dto.getPurePhoneNumber().length() - 4));
                        }
                        customerService.addOrUpdateCustomer(updateCustomerDTO);
                    }
                    BindWechatDTO wechatDTO = new BindWechatDTO();
                    wechatDTO.setRealName(dto.getPurePhoneNumber());
                    bindWechat(user.getId(), dto.getOpenId(), dto.getUnionId(), dto.getSessionKey(), wechatDTO);
                }finally {
                    lock.unlock();
                }
@@ -586,4 +588,55 @@
    }
    public User registPhoneUser(UserPhoneLoginDTO dto) {
        String RETISTER_KEY = "%s_%s";
        RLock lock = redissonClient.getLock(String.format(RETISTER_KEY, dto.getUsername(), dto.getUserType()));
        try {
            // 获取锁,最多等待 10 秒,锁自动释放时间 30 秒
            if (lock.tryLock(10, 30, TimeUnit.SECONDS)) {
                try {
                    // 其次查找当前loginName是prephonenume的,userType是customer的用户存在不存在
                    if (StringUtils.isEmpty(dto.getUsername()) && StringUtils.isEmpty(dto.getUsername())) {
                        throw new ValidationException("电话号码为空!无法注册");
                    }
                    // 1:查看用户存在不存在
                    List<String> userTypes = new ArrayList<>();
                    userTypes.add(dto.getUserType());
                    User user = findByLoginName(dto.getUsername(), userTypes);
                    if (ObjectUtils.isEmpty(user)) {
                        // 是新用户,需要注册
                        user = new User();
                        user.setId(UUIDGenerator.getUUID());
                        user.setLoginName(dto.getUsername());
                        user.setTel(dto.getUsername());
                        user.setNickName(dto.getUsername());
                        user.setPassword(passwordEncoder.encode("12345678"));
                        user.setType(dto.getUserType());
                        user.setStatus(Constants.STATUS_ACTIVE);
                        user.setIsSys(Constants.N);
                        user.create();
                        userMapper.insert(user);
                        // 注册商户信息
                        UpdateCustomerDTO updateCustomerDTO = new UpdateCustomerDTO();
                        updateCustomerDTO.setUserId(user.getId());
                        if (StringUtils.isNotBlank(dto.getUsername())) {
                            updateCustomerDTO.setName("智信-" + dto.getUsername().substring(dto.getUsername().length() - 4));
                        }
                        customerService.addOrUpdateCustomer(updateCustomerDTO);
                        return user;
                    }
                } finally {
                    lock.unlock();
                }
            }
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        return null;
    }
}
src/main/java/com/mzl/flower/web/login/CustomerLoginController.java
@@ -14,6 +14,7 @@
import com.mzl.flower.constant.Constants;
import com.mzl.flower.dto.request.CreateWechatUserDTO;
import com.mzl.flower.dto.request.UserLoginDTO;
import com.mzl.flower.dto.request.UserPhoneLoginDTO;
import com.mzl.flower.dto.response.customer.CustomerDTO;
import com.mzl.flower.dto.response.wx.WxUserVO;
import com.mzl.flower.entity.system.User;
@@ -259,4 +260,74 @@
            }
        }
    }
    @PostMapping("/login/customer/phone/v2")
    @ApiOperation(value = "手机验证码登录系统", notes = "手机验证码登录系统")
    public ResponseEntity<ReturnDataDTO<OAuth2AccessToken>>  loginPhoneV2(HttpServletRequest request,
                                                                          @RequestBody UserPhoneLoginDTO loginDTO) {
        String tel = loginDTO.getUsername();
        String smsCode = loginDTO.getSmsCode();
        if (StringUtils.isBlank(tel)) {
            throw new ValidationException("手机号码不能为空");
        }
        if (StringUtils.isBlank(smsCode)) {
            throw new ValidationException("手机验证码不能为空");
        }
        //从缓存中获取验证码
        String smsCacheCode = stringCacheClient.get(SMS_CODE_KEY + SEPARATOR + Constants.USER_TYPE.customer.name() + SEPARATOR + tel);
        if (!StringUtils.equals(smsCode, smsCacheCode)) {
            throw new ValidationException("手机验证码不正确");
        }
        User user = userService.findByTel(tel, Constants.USER_TYPE.customer.name());
        String tokenCache ="";
        if(user == null){
            loginDTO.setUserType(Constants.USER_TYPE.customer.name());
            User user1 = userService.registPhoneUser(loginDTO);
            if(org.springframework.util.StringUtils.isEmpty(user1)){
                throw new ValidationException("注册用户信息报错");
            }
            tokenCache = stringCacheClient.get(TOKEN_KEY + SEPARATOR + user1.getId());
            CustomerDTO currentCustomer = customerMapper.getCurrentCustomer(user1.getId());
            if (ObjectUtils.isEmpty(currentCustomer)) {
                throw new ValidationException("用户不存在");
            }
            if (currentCustomer.getIsEnabled() == false) {
                throw new ValidationException("用户已禁用,请联系管理员");
            }
            tokenCache = stringCacheClient.get(TOKEN_KEY + SEPARATOR + user1.getId());
            if (StringUtils.isNotBlank(tokenCache))  {
                //强制删除token,下线
                removeToken(tokenCache,user.getId());
            }
        }else{
            CustomerDTO currentCustomer = customerMapper.getCurrentCustomer(user.getId());
            if (ObjectUtils.isEmpty(currentCustomer)) {
                throw new ValidationException("用户不存在");
            }
            if (currentCustomer.getIsEnabled() == false) {
                throw new ValidationException("用户已禁用,请联系管理员");
            }
            tokenCache = stringCacheClient.get(TOKEN_KEY + SEPARATOR + user.getId());
            if (StringUtils.isNotBlank(tokenCache))  {
                //强制删除token,下线
                removeToken(tokenCache,user.getId());
            }
        }
        try {
            PhoneAuthenticationToken authRequest = new PhoneAuthenticationToken(tel, smsCode, Constants.USER_TYPE.customer.name());
            authRequest.setDetails(authenticationDetailsSource.buildDetails(request));
            Authentication authentication = authenticationManager.authenticate(authRequest);
            OAuth2AccessToken token = loginService.getAccessToken(authentication, Constants.USER_TYPE.customer.name());
            //删除缓存中的验证码
            stringCacheClient.delete(SMS_CODE_KEY + SEPARATOR + Constants.USER_TYPE.customer.name() + SEPARATOR + tel);
            stringCacheClient.set(TOKEN_KEY + SEPARATOR + user.getId(),token.getValue());
            return returnData(R.SUCCESS.getCode(),token);
        }catch (UsernameNotFoundException e){
            throw new ValidationException("用户不存在");
        }catch (Exception e) {
            log.error(e.getMessage(), e);
            throw new BaseException(R.RUNTIME_EXCEPTION.getCode(),"登录错误");
        }
    }
}