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;
}