1、修改之前应该先获取到用户的登陆信息。用户登陆的时候信息会存储到缓存中,因此我们只需要在缓存中直接取出即可,主要的代码实现:
/*
* 获取用户的个人资料,用于编辑的接口使用
* */
@RequestMapping(value = "/getUserData.json", method = RequestMethod.POST)
@ApiOperation(value = "获取用户的个人资料")
@ResponseBody
public String getUserData(
@ApiParam(name = "authentication", required = true, value = "鉴权码") @RequestParam() String authentication,
HttpServletRequest request){
//从缓存中获取到登录的信息
APIPrincipal apiPrincipal=(APIPrincipal) request.getSession()
.getAttribute(APIPrincipal.PREFIX_USER_SESSION);
return ApiResult.success(apiPrincipal);
}
2、修改用户的头像、昵称、性别、出生日期是一个接口。需要注意性别只能有二种情况(男或者女)没有第三种情况;出生日期我们需要使用的是日期的接受形式(@DateTimeFormat(pattern="yyyy-MM-dd-HH-mm-ss") Date birth)。用户的信息修改之后我们我们需要更新的不止是数据库,还有缓存中的数据(redisService.updateKeys(APIPrincipal.PREFIX_USER_SESSION + principal.getId() + "_*", principal);)
代码实现的主要思路:先从缓存中获取当前的用户信息,根据缓存中获取到的用户id就能查询出数据库中对于的记录。接下来就能修改用户的信息了。代码部分:
/**
*
* @author hou
* @desc 更新用户头像、昵称、性别、出生日期接口
* @param param
* @param authentication
* @param request
* @return
*/
@RequestMapping(value = "/updateUserInfo.json", method = RequestMethod.POST)
@ApiOperation(value = "更新用户头像、昵称、性别、出生日期接口")
@ResponseBody
public String updateUserInfo(
@ApiParam(value = "用户头像") @RequestParam(required=false) String photo ,
@ApiParam(value = "昵称") @RequestParam(required=false) String nickName,
@ApiParam(value = "性别") @RequestParam(required=false) AppUser.Sex sex,
@ApiParam(value = "出生日期") @RequestParam(required=false) @DateTimeFormat(pattern="yyyy-MM-dd-HH-mm-ss") Date birth,
HttpServletRequest request
){
//获取登录的信息
APIPrincipal principal=(APIPrincipal) request.getSession().getAttribute(APIPrincipal.PREFIX_USER_SESSION);
//根据id获取到当前的用户信息
AppUser user=this.appUserService.find(principal.getId());
if(user==null){
return ApiResult.error("用户不存在");
}
//头像的处理
if(!StringUtils.isEmpty(photo)){
user.setPhoto(photo);
principal.setPhoto(photo);
}
//昵称
if(!StringUtils.isEmpty(nickName)){
user.setNickname(nickName);
principal.setNickName(nickName);
}
//性别
if(null !=sex){
user.setSex(sex);
principal.setSex(sex);
}
//出生日期
if(null != birth){
user.setBirth(birth);
principal.setBirth(birth);
}
//保存修改
Long update=this.appUserService.update(user);
if(update<0){
return ApiUtils.error("修改失败");
}
//修改所有的登录缓存
redisService.updateKeys(APIPrincipal.PREFIX_USER_SESSION + principal.getId() + "_*", principal);
return ApiUtils.success();
}
3、修改登录密码的接口。修改成功之后需要提醒用户去登录。
代码的主要实现思路:在登录的时候我们会有一个授权码,只有授权码不变就一直显示登录状态。第一步还是需要获取缓存中的用户信息,第二步就是根据缓存中的用户id来获取数据库中的数据记录。第三步就是校验用户的原密码与输入的密码是否对应,输入的新密码是否符合格式要求。密码修改完成之后需要删除缓存中的授权码信息。代码实现:
/**
*
* @author hou
* @desc 修改登录密码接口
* @param authentication
* @param oldPwd
* @param newPwd
* @param request
* @return
*/
@RequestMapping(value = "/updateLoginPwd.json", method = RequestMethod.POST)
@ApiOperation(value = "修改登录密码接口")
@ResponseBody
public String updateLoginPwd(
@ApiParam(name = "authentication", required = true, value = "鉴权码") @RequestParam(value = "authentication") String authentication,
@ApiParam(name = "oldPwd", required = true, value = "原密码") @RequestParam(value = "oldPwd") String oldPwd,
@ApiParam(name = "newPwd", required = true, value = "新密码") @RequestParam(value = "newPwd") String newPwd,
HttpServletRequest request){
//获取登录信息
APIPrincipal principal=(APIPrincipal) request.getSession().getAttribute(APIPrincipal.PREFIX_USER_SESSION);
if (StringUtil.isEmpty(oldPwd) || StringUtil.isEmpty(newPwd)) {
return ApiUtils.error(Xerror.PARAM_INVALID, "参数错误");
}
//获取到这条数据
AppUser user=appUserService.find(principal.getId());
if(user==null){
return ApiUtils.error("用户不存在");
}
if(!XDigestUtils.md5(oldPwd).equals(user.getPassword())){
return ApiUtils.error("原密码不正确");
}
if(newPwd.length()<6|| newPwd.length()>16){
return ApiUtils.error("请输入6-16位密码,可使用数字、英文及下划线");
}
user.setPassword(XDigestUtils.md5Hex(newPwd));
Long update=appUserService.update(user);
if(update<0){
return ApiUtils.error("修改失败");
}
//让用户从新登录,从缓存中删除授权码
this.redisService.delete(authentication);
return ApiUtils.success();
}
4、修改手机号码分为二个接口(第一个是校验原来的手机号码,第二个就是修改手机号的校验)。
校验原来手机号的代码思想:首先还是需要从缓存中查询出当前用户的信息,其次就是根据缓存中用户的id查询出数据库中用户的数据记录。开始手机号+验证码的校验。在此过程中需要返回一个证明是当前用户的令牌。主要代码:
/**
*
* @author hou
* @desc 先校验原来手机号接口
* @param phone
* @param password
* @param code
* @return
*/
@RequestMapping(value = "/validPhone.json", method = RequestMethod.POST)
@ApiOperation(value = "验证原来手机号接口")
@ResponseBody
public String validPhone(
@ApiParam(name = "oldPhone", required = true, value = "原手机号") @RequestParam() String oldPhone,
@ApiParam(name = "oldCode", required = true, value = "原手机验证码") @RequestParam() String oldCode,
HttpServletRequest request){
//查询出登录时候的信息
APIPrincipal principal=(APIPrincipal) request.getSession().getAttribute(APIPrincipal.PREFIX_USER_SESSION);
//通过获取到的id查询出用户的实体
AppUser user=this.appUserService.find(principal.getId());
if(user==null){
return ApiUtils.error("用户不存在");
}
if(!user.getPhone().equals(oldPhone)){
return ApiUtils.error("您输入的原手机号和平台用户手机号不匹配");
}
//原手机号的验证码
String code = this.redisService.get(SendCodeType.ValidOldPhone.getDesc()+ user.getPhone(),
String.class);
if(StringUtils.isEmpty(code) || !code.equals(oldCode)){
return ApiUtils.error("原验证码错误或已过期");
}
redisService.delete(SendCodeType.ValidOldPhone.getDesc()+ user.getPhone());
String authentication = APIPrincipal.UUID();
redisService.save(authentication,oldPhone, 1800);
return ApiResult.success(authentication);
}
5、更换手机号。主要代码的实现思想:首先从缓存中获取当前的用户,在根据当前的用户id去查询数据库中的数据,其次校验原手机号获取到的令牌(这是一个标志,标志需要修改的是那个用户)、校验新手机号码、新验证码。代码实现:
/**
*
* @author hou
* @desc 更换手机号
* @param phone
* @param password
* @param code
* @return
*/
@RequestMapping(value = "/updatePhone.json", method = RequestMethod.POST)
@ApiOperation(value = "更换手机号接口")
@ResponseBody
public String updatePhone(
@ApiParam(required = true, value = "验证原手机号获取的令牌") @RequestParam() String authCode,
@ApiParam(required = true, value = "新手机号码") @RequestParam() String newPhone,
@ApiParam(required = true, value = "新验证码") @RequestParam() String newCode,
HttpServletRequest request){
//查询出登录时候的信息
APIPrincipal principal=(APIPrincipal) request.getSession().getAttribute(APIPrincipal.PREFIX_USER_SESSION);
//验证原手机号获取的令牌令牌校验
String oldPhone = redisService.get(authCode, String.class);
if(StringUtils.isEmpty(oldPhone) || !oldPhone.equals(principal.getPhone())){
return ApiResult.error("跟换手机号令牌失效或错误");
}
//通过id查询当前的数据
AppUser user=appUserService.find(principal.getId());
if(user==null){
return ApiUtils.error("用户不存在");
}
//看手机号是否已经绑定其他账号
AppUser appUser = appUserService.find("phone", newPhone);
if(appUser != null){
return ApiUtils.error("该手机号已经绑定了其他账号");
}
appUserService.checkPhone(newPhone);
//校验新手机号的验证码
String code=this.redisService.get(SendCodeType.BindNewPhone.getDesc()+newPhone, String.class);
if(StringUtils.isEmpty(code) || !code.equals(newCode)){
return ApiUtils.error("验证码错误或者已过去");
}
//手机号码
user.setPhone(newPhone);
principal.setPhone(newPhone);
//保存修改
Long update=this.appUserService.update(user);
if(update<0){
return ApiUtils.error("修改失败");
}
//删除缓存中的验证码
redisService.delete(SendCodeType.BindNewPhone.getDesc()+newPhone);
//更新当前用户的所有登录信息
redisService.updateKeys(APIPrincipal.PREFIX_USER_SESSION+user.getId()+"_*", principal);
return ApiResult.success();
}