基于手机号添加邮箱登陆功能

Controller层

@ApiOperation(value = "手机号或者邮箱登录(L)", notes = "若登录成功,则返回data为token", response = LoginVO.class)
    @ApiImplicitParam(name = "param", value = "登录参数", required = true, dataType = "LoginParam", paramType = "body")
    @ApiResponses({
            @ApiResponse(code = 40002, message = "该账号不存在"),
            @ApiResponse(code = 40003, message = "该账户被禁用(个人用户)"),
            @ApiResponse(code = 40073, message = "账号审核中(企业用户)"),
            @ApiResponse(code = 40074, message = "账号审核失败(企业用户)"),
    })
    @PostMapping("login/v2")
    public ResponseData loginV2(@RequestBody @Valid LoginParamV2 param, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            return errorMsg(bindingResult);
        }
        //userService
        User user = userService.login(param);
        String accessToken = UUID.randomUUID().toString().replace("-", "");
        CurrentInfo currentInfo = new CurrentInfo(user.getId(), user.getUsername(), user.getNickname(), accessToken);
        redisTemplate.opsForValue().set(RedisKeyPrefix.LOGIN_TOKEN_KEY_PREFIX + accessToken, currentInfo);
        redisTemplate.expire(RedisKeyPrefix.LOGIN_TOKEN_KEY_PREFIX + accessToken, 7, TimeUnit.DAYS);
        return ResponseData.ok(accessToken);
    }

涉及类

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class CurrentInfo implements Serializable {

    /**
     * "身份信息"参数名称
     */
    public static final String PRINCIPAL_ATTRIBUTE_NAME = CurrentInfo.class.getName() + ".PRINCIPAL";

    /**
     * 用户ID
     */
    private Long userId;

    /**
     * 账号
     */
    private String username;

    /**
     * 昵称
     */
    private String nickname;

    /**
     * token
     */
    private String accessToken;

    private static final long serialVersionUID = -2338669778607213069L;


}

/**
 * redis key
 *
 * @author: liuben
 * @date: 2019-07-08
 */
public class RedisKeyPrefix {

    /**
     * 用户登录token
     */
    public static final String LOGIN_TOKEN_KEY_PREFIX = "user:login:";

    /**
     * 注册验证码
     */
    public static final String USER_REGISTER_PREFIX = "user:register:code:";

    /**
     * 忘记密码验证码
     */
    public static final String USER_FORGET_PWD_PREFIX = "user:forgetPwd:code:";

    /**
     * 修改密码
     */
    public static final String USER_UPDATE_PREFIX = "user:updatePwd:code:";
    /**
     * 绑定手机号
     */
    public static final String USER_BIND_PHONE_PREFIX = "user:bindPhone:code:";

    /**
     * 提醒发货次数
     */
    public static final String ORDER_REMIND_SHIP_COUNT_PREFIX = "sw:orderRemindShipCount:";

    public static final String SHARE_COOKBOOK_CODE = "sw:share:code:";

}

参数:

//前端传入
@ApiModel
@Data
public class LoginParamV2 implements Serializable {

    private static final long serialVersionUID = -7903768589278794381L;

    @ApiModelProperty("手机号/邮箱")
    @NotBlank
    @Pattern(regexp =Constant.PHONE_REGEXP + "|"+Constant.EMAIL_REGEXP, message = "account必须为手机号或者邮箱格式")
    private String username;
//+"|"+Constant.EMAIL_REGEXP
    @ApiModelProperty("密码")
    @NotBlank
    private String password;

}

//返回页面参数
@Getter
@Setter
@ApiModel
public class LoginVO  implements Serializable {

    @ApiModelProperty(value = "token",required = true)
    private String accessToken;

    @ApiModelProperty(value = "0是未启用  1是启用",required = true)
    private Boolean status;

    @ApiModelProperty(value = "0是未启用  1是启用",required = true)
    private Boolean check;

    @ApiModelProperty(value = "0个人  1 企业 2经销商",required = true)
    private Integer type;
}

//Constant
public class Constant {

    public static final String PHONE_REGEXP = "(^[1][2,3,4,5,6,7,8,9][0-9]{9}$)";

    public static final String EMAIL_REGEXP = "(^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$)";

    public static final String LANGUAGE_HEADER = "LOCALE-LANGUAGE";
}

UserServiceImpl

@Override
    public User login(LoginParamV2 param) {
        Example example = new Example(User.class);
        Example.Criteria criteria = example.createCriteria();
        //判断是用邮件登陆还是用手机号登陆
        if (Pattern.matches(Constant.PHONE_REGEXP, param.getUsername())) {
            criteria.andEqualTo("username", param.getUsername());
        } else {
            criteria.andEqualTo("email", param.getUsername());
        }
        User user = userMapper.selectOneByExample(example);
        if (Objects.isNull(user)) {
            throw new BusinessException(ApiResult.USERNAME_IS_NOT_EXIST);
        }
        //用户存在 判断密码和数据库里密码是否一致
        if (!DigestUtils.md5Hex(param.getPassword()).equals(user.getPassword())) {
            throw new BusinessException(ApiResult.PASSWORD_ERROR);
        }
        //登陆类型是公司或者经销商
        if (user.getType() == UserType.COMPANY.ordinal() || user.getType() == UserType.DEALER.ordinal()) {
            //check为null表示未审核
            if (user.getCheck() == null) {
                throw new BusinessException(ApiResult.USER_ACCOUT_CHECK);
            }
            //check为false表示审核失败
            if (!user.getCheck()) {
                throw new BusinessException(ApiResult.USER_ACCOUT_FAIL);
            }
        }
        //status未启用
        if (!user.getStatus()) {
            throw new BusinessException(ApiResult.BE_LOCKED);
        }
        return user;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值