写在前面
上一篇中我们介绍了忘记密码状态下的重置密码的开发(其实也就是未登录状态),那么本篇我们就来介绍登录状态下重置密码功能开发,更新用户个人信息功能开发和获取用户详细信息功能开发从而完成所有用户信息功能的开发。里面的内容很多,希望大家对此有一个提前的认识。
介绍登录状态下重置密码功能开发
我们的开发顺序是service-->mybatis-->dao
,所以再次强调它的重要性!!!
打开UserController.java文件,写入以下代码:
/***
*
* 登录状态下的重置密码
*/
@RequestMapping(value = "login_reset_password.do",method = RequestMethod.GET) //这里就是具体的每个方法的url链接
@ResponseBody //自动序列化json功能
public ServerResponse<String> loginResetPassword(HttpSession session,String passwordOld,String passwordNew){
User user =(User)session.getAttribute(Const.CURRENT_USER); //注意这里我们已经在session里面拿到了用户的信息,因此后面使用的就是user对象本身了
if(user ==null){
return ServerResponse.createByErrorMessage("用户未登录");
}
return iUserService.loginResetPassword(passwordOld,passwordNew,user);
}
前面我们说过应该是接着打开IUserService.java文件,但是那是三者参数一致的情况下,如果参数不一致就不能进行这一步了,所以我们综合觉得还是使用下面的步骤为好:UserController--->UserServiceImpl-->IUserService-->
这样就是比较好的开发过程了:
接着打开UserServiceImpl.java文件:
/***
*
* 登录状态下的重置密码的接口类
*/
public ServerResponse<String> loginResetPassword(String passwordOld, String passwordNew,User user){
//为防止横向越权,我们要检验一下这个用户的旧密码(通常我们在修改密码这种关键信息的时候需要用户输入原来的密码进行身份确认)
// 而且我们查询的是一个 count(1),如果你不指定 id(通过旧密码标识),那么结果必定是true,也就是count>0;
int resultCount =userMapper.checkPasswordByUserId(MD5Util.MD5EncodeUtf8(passwordOld),user.getId());
if(resultCount ==0){//如果resultCount为0说明旧密码错误
return ServerResponse.createByErrorMessage("旧密码错误");
}
user.setPassword(MD5Util.MD5EncodeUtf8(passwordNew));
int rowCount =userMapper.updateByPrimaryKeySelective(user) ; //注意这里使用updateByPrimaryKeySelective是因为我们这里不能使用上面的根据用户名来修改密码,而且最好是选择性的更新,不是全部更新
if(rowCount>0){
return ServerResponse.createBySuccessMassage("密码修改成功");
}
return ServerResponse.createByErrorMessage("密码修改失败!");
}
这里需要注意几点:
1、updateByPrimaryKeySelective方法,我们没有使用之前定义的updatePasswordByUsername方法是因为我们这里不根据用户名来进行密码的修改;没有使用updateByPrimaryKey方法是因为我们希望我们的更新是有选择性的,不是全部都进行修改;
2、String question=userMapper.checkPasswordByUserId(MD5Util.MD5EncodeUtf8(passwordOld),user.getId());
看到这行代码大家就知道后面需要干嘛了:
打开UserMapper.java文件,里面新增代码:
//这里找不到对应的实现类,所以应该去UserMapper.xml里面进行配置
int checkPasswordByUserId(@Param("password")String password,@Param("userId")Integer userId); //注意mybatis传递多个参数时,需要使用param注解
然后去UserMapper.xml里面新增代码:
<select id="checkPasswordByUserId" resultType="int" parameterType="map"> <!--注意使用多个参数是是需要使用map的-->
select count(1) from store_user
where id = #{userId}
and password = #{password}
</select>
3、需要注意的一点是这里你不能仅仅只使用password 进行条件查询,因为可能有用户密码是相同的情况,然后受影响的行数必定大于0,后台还以为密码修改通过了呢,其实并没有,所以我们通过用户id和旧密码的条件查询限定,能很好的规避这一问题的发生。
最后记得打开IUserService.java文件,把我们接口类的声明添加进去:
ServerResponse<String> loginResetPassword(String passwordOld, String passwordNew,User user); //登录状态下的重置密码
这样我们登录状态下重置密码功能开发就完成了,接下来是用户个人信息更新功能的开发。
用户个人信息更新功能开发
打开UserController.java文件,写入以下代码:
/***
*
* 登录状态下的更新用户个人信息
*/
@RequestMapping(value = "update_information.do",method = RequestMethod.GET) //这里就是具体的每个方法的url链接
@ResponseBody //自动序列化json功能
public ServerResponse<User> updateInformation(HttpSession session,User user){
//这里的返回值是User因为我们需要将更新的用户信息添加到session里面,而且传递给前端使用使用session将用户信息进行保存,user重载新的用户数据
User currentUser =(User)session.getAttribute(Const.CURRENT_USER); //注意这里我们已经在session里面拿到了用户的信息,因此后面使用的就是user对象本身了
if(currentUser ==null){
return ServerResponse.createByErrorMessage("用户未登录");
}
//代码未写完!!!!
}
这里我们把后面的一段代码给去掉了,没有写完是因为这里写完的话跳跃性就很大,你难以理解,后面随着介绍会慢慢补充的。
接着打开UserServiceImpl.java文件:
/***
*
* 登录状态下的更新用户个人信息的接口类
*/
public ServerResponse<User> updateInformation(User user){
//用户名不可以被更新
//邮箱也要进行校验,校验新的邮箱是不是已经存在,并且存在的邮箱与我们的新邮箱相等的话,不能是我们当前这个用户的
int resultCount =userMapper.checkEmailByUserId(user.getEmail(),user.getId());
if(resultCount>0){ //说明此时邮箱被他人占用,提醒用户换一个试试
return ServerResponse.createByErrorMessage("该邮箱已经被使用,请更换邮箱并再次尝试更新");
}
User updateUser =new User(); //创建一个新的更新对象
updateUser.setId(user.getId()); //更新用户id
updateUser.setEmail(user.getEmail()); //更新用户邮箱
updateUser.setPhone(user.getPhone()); //更新用户电话
updateUser.setQuestion(user.getQuestion()); //更新用户问题
updateUser.setAnswer(user.getAnswer()); //更新用户答案
//注意密码在前面我们专门对其进行了更新,这里就不再需要
int rowCount =userMapper.updateByPrimaryKeySelective(updateUser);
if(rowCount>0){
return ServerResponse.createBySuccess("更新用户信息成功",updateUser);
}
return ServerResponse.createByErrorMessage("更新用户信息失败");
}
这里需要注意几点问题:
1、因为我们是根据用户名来进行登录的,因此用户名是不可以被更新的,必须从登录的用户里面取出来。还有就是在这里我们不进行密码的更新,因为我们之前针对密码已经进行过更新处理了。
2、我们需要对邮箱进行校验,校验新的邮箱是不是已经存在,并且存在的邮箱与我们的新邮箱相等的话,不能是我们当前这个用户的(言外之意就是被人已经占用了这个邮箱)。怕你们不理解,我再说一遍,我们就只要校验新的邮箱是不是被别人注册过了这一情况即可。至于新邮箱不存在那就更好了,没人使用你就可以使用了;新邮箱存在而且就是本用户的,那就说明你没修改邮箱,直接提交就可以了。
3、int resultCount =userMapper.checkEmailByUserId(user.getEmail(),user.getId());
看到这行代码大家就知道后面需要干嘛了:
打开UserMapper.java文件,里面新增代码:
//这里找不到对应的实现类,所以应该去UserMapper.xml里面进行配置
int checkEmailByUserId(@Param(value = "email")String email,@Param(value = "userId")Integer userId); //注意mybatis传递多个参数时,需要使用param注解
然后去UserMapper.xml里面新增代码:
<select id="checkEmailByUserId" resultType="int" parameterType="map"> <!--注意使用多个参数是是需要使用map的,而且邮箱被别人占用-->
select count(1) from store_user
where email = #{email}
and id != #{userId}
</select>
4、对于rowCount大于0或者等于0的判断成立结果是随着你在UserMapper.xml里面书写的sql语句的不同而发生变化的,不是一成不变的。
5、User updateUser =new User();
这里我们新创建了一个更新对象,其中我们是选择的更新了部分信息,你从更新的字段和updateByPrimaryKeySelective
方法就能看出来。
记得打开IUserService.java文件,把我们接口类的声明添加进去:
ServerResponse<User> updateInformation(User user); //登录状态下的更新用户个人信息
你以为这就结束了么,按照正常步骤是到此为止了,但是我们前面特意遗留了一段代码,打开UserController.java文件:
/***
*
* 登录状态下的更新用户个人信息
*/
@RequestMapping(value = "update_information.do",method = RequestMethod.GET) //这里就是具体的每个方法的url链接
@ResponseBody //自动序列化json功能
public ServerResponse<User> updateInformation(HttpSession session,User user){ //这里的返回值是User因为我们需要将更新的用户信息添加到session里面,而且传递给前端使用使用session将用户信息进行保存,user重载新的用户数据
User currentUser =(User)session.getAttribute(Const.CURRENT_USER); //注意这里我们已经在session里面拿到了用户的信息,因此后面使用的就是user对象本身了
if(currentUser ==null){
return ServerResponse.createByErrorMessage("用户未登录");
}
//因为传进来的用户信息也就是更新的用户信息里面是没有userId的,所以我们需要将它拿过来,这样可以防止越权问题
user.setId(currentUser.getId()); //所以id是不可以被更新的,我们是从登录里面获取的
user.setUsername(currentUser.getUsername()); //记得我们在接口实现类里面说过username是不可以被更新的,因为我们登录会用到它
ServerResponse<User> response =iUserService.updateInformation(user);
if(response.isSuccess()){
session.setAttribute(Const.CURRENT_USER,response.getData());
}
return response;
}
注意一下:因为传进来的用户信息也就是更新的用户信息里面是没有userId的,所以我们需要将它从登录里面拿过来,这样可以防止越权问题。我们在接口的实现类也说过username是不可以被更新的,因为我们登录会用到它,所以也是采取和userId相同的办法。最后我们需要对更新的状态进行判断,并将新的信息添加到session里面去。
这样本篇,我们关于登录状态下重置密码功能开发,更新用户个人信息功能开发的介绍就到此为止了,感谢你的赏阅!
网友评论