修改个人资料接口的总结

本文总结了修改用户个人信息接口的设计与实现,包括获取登录信息、修改头像昵称等基本信息、更改登录密码以及验证和更换手机号的过程。强调了在修改过程中缓存与数据库同步的重要性,以及对各种校验和安全措施的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值