🧸安清h:个人主页
🎥个人专栏:【Spring篇】【计算机网络】【Mybatis篇】
🚦作者简介:一个有趣爱睡觉的intp,期待和更多人分享自己所学知识的真诚大学生。
目录
🎃1.修改密码 -持久层
✨1.1规划需要执行的SQL语句
✨1.2设计接口和抽象方法
✨1.3SQL的映射
✨1.4单元测试
🎃2.修改密码-业务层
✨2.1规划异常
✨2.2设计接口和抽象方法
🎃3.修改密码-控制层
✨3.1处理异常
✨3.2设计请求
✨3.3处理请求
🎃4.修改密码-前端页面
🚀1.个人资料-持久层
✨1.1规划需要执行的SQL语句
✨1.2接口与抽象方法的设计
✨1.3抽象方法的映射
✨1.4 完成功能测试
🚀2.个人资料-业务层
✨2.1规划异常
✨2.2接口和抽象方法
✨2.3实现抽象方法
✨2.4在测试类中测试
🚀3.个人资料-控制层
✨3.1处理异常
✨3.2设计请求
✨3.3处理请求
🚀4.个人资料-前端页面
需要用户提交原始密码和新密码,再根据当前登录的用户进行信息的修改操作。
🎃1.修改密码 -持久层
✨1.1规划需要执行的SQL语句
1.根据用户的uid修改用户password值
update t_user set password=?,modified_user=?,modified_time=? where uid=?
2. 根据uid查询用户的数据。在修改密码之前,首先要保证当前用户的数据存在,检测是否被标记为已经删除、检测输入的原始密码是否正确。
select * from t_user where uid=?
✨1.2设计接口和抽象方法
UserMapper接口,将以上的两个方法的抽象定义出来。将来映射到SQL语句上。
// 根据用户的uid来修改用户密码
// @param uid 用户的id
// @return 返回值为受影响的行数
Integer updatePasswordByUid(Integer uid,
String password, //用户输入的新密码
String modifiedUser, //修改的执行者
Date modifiedTime); //修改数据的时间
// 根据用户的uid来查询用户的数据
// @param uid 用户的id
// @return 如果找到则返回对象,反之则返回null值
User findByUid(Integer uid);
✨1.3SQL的映射
配置到映射文件中 UserMapper.xml文件中:
<update id="updatePasswordByUid">
update t_user set password=#{password},
modified_user=#{modifiedUser},
modified_time=#{modifiedTime}
where uid=#{uid}
</update>
<select id="findByUid" resultMap="UserEntityMap">
select * from t_user where uid=#{uid}
</select>
✨1.4单元测试
@Test
public void updatePasswordByUid(){
userMapper.updatePasswordByUid(2,"123456","管理员",new Date());
}
@Test
public void findByUid(){
System.out.println(userMapper.findByUid(6));
}
🎃2.修改密码-业务层
✨2.1规划异常
1.用户的源密码错误,is_delete=1,uid找不到,在用户没有发现的异常。
2.update在更新时,有可能产生未知的异常,UpdateException。
//用户在更新数据时产生的未知的异常
public class UpdateException extends ServiceException{
public UpdateException() {
super();
}
public UpdateException(String message) {
super(message);
}
public UpdateException(String message, Throwable cause) {
super(message, cause);
}
public UpdateException(Throwable cause) {
super(cause);
}
protected UpdateException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
✨2.2设计接口和抽象方法
1.执行用户修改密码的核心方法。
void changePassword(Integer uid,
String username,
String oldPassword,
String newPassword);
2.在实现类中实现当前的抽象方法
@Override
public void changePassword(Integer uid, String username, String oldPassword, String newPassword) {
User result = userMapper.findByUid(uid);
if(result == null || result.getIsDelete() ==1){
throw new UserNotFoundException("用户数据不存在");
}
// 原始密码和数据库中的密码进行比较
String oldMd5Password = getMD5Password(oldPassword,result.getSalt());
if(!result.getPassword().equals(oldMd5Password)){
throw new PasswordNotMatchException("密码错误");
}
// 将新的密码设置到数据库中,将新的密码进行加密再去更新
String newMd5Password = getMD5Password(newPassword, result.getSalt());
Integer rows = userMapper.updatePasswordByUid(uid,newMd5Password,username,new Date());
if(rows != 1){
throw new UpdateException("更新时数据产生未知的异常");
}
}
3. 在单元测试类中编写测试方法
@Test
public void changePassword(){
userService.changePassword(7,"timi","123","321");
}
🎃3.修改密码-控制层
✨3.1处理异常
UpdateException需要配置在统一的处理异常方法中。
else if(e instanceof UpdateException){
result.setState(5003);
result.setMessage("更新数据时产生未知的异常");
}
✨3.2设计请求
请求路径:/users/change_password
请求参数:String oldPassword,String newPassword(需要和表单中的name属性值保持一致)
请求类型:POST
响应结果:JsonResult<void>
✨3.3处理请求
@RequestMapping("change_password")
public JsonResult<Void> change_password(String oldPassword,String newPassword,HttpSession session){
Integer uid = getuidFromSession(session);
String username = getUsernameFromSession(session);
userService.changePassword(uid,username,oldPassword,newPassword);
return new JsonResult<>(OK);
}
🎃4.修改密码-前端页面
password.html中添加ajax请求的处理,不在手动编写ajax结构,直接复制,然后微调修改参数。
<script>
$("#btn-change-password").click(function (){
$.ajax({
url:"/users/change_password",
type:"POST",
data:$("#form-change-password").serialize(),
dataType:"JSON",
success:function (json){
if(json.state==200){
alert("修改密码成功");
}else{
alert("修改密码失败");
}
},
error:function (xhr){
alert("修改密码时产生未知的异常"+xhr.message);
}
});
});
</script>
🚀1.个人资料-持久层
✨1.1规划需要执行的SQL语句
1.更新用户信息的SQL语句:
update t_user set phone=?,email=?,gender=?,modified_user=?,modified_time=? where uid=?
2.根据用户名来查询用户的数据:
select * from t_user where uid=?
查询用户的数据不需要重复开发
✨1.2接口与抽象方法的设计
更新用户的信息方法的定义。
// 更新用户的数据信息
// @param user
// @return 返回值为收影响的行数
Integer updateInfoByUid(User user);
✨1.3抽象方法的映射
在UserMapper.xml文件中进行映射编写。
<update id="updateInfoByUid">
update t_user set
-- if表示条件判断标签,test接收的是一个返回值为boolean类型的条件,如果test条件的结果为true则执行if标签内部的语句
<if test="phone!=null">phone=#{phone},</if>
<if test="email!=null">email=#{email},</if>
<if test="gender!=null">gender=#{gender},</if>
modified_user=#{modifiedUser},
modified_time=#{modifiedTime}
where uid=#{uid}
</update>
✨1.4 完成功能测试
@Test
public void updateInfoByUid(){
User user = new User();
user.setUid(7);
user.setPhone("12345678");
user.setEmail("test003@qq.com");
user.setGender(1);
userMapper.updateInfoByUid(user);
}
🚀2.个人资料-业务层
✨2.1规划异常
1.设计两个功能:
- 当打开页面获取用户的信息并且填充到对应的文本框中。
- 检测用户是否点击了修改按钮,如果检测到则执行修改用户信息的操作。
2.打开页面可能找不到用户的数据,点击删除按钮之前需要再次的去检测用户的数据是否存在。
✨2.2接口和抽象方法
在service包下的IUService编写以下代码:
// 根据用户的id查询用户的数据
// @param uid 用户id
// @return 用户的数据
User getByUid(Integer uid);
// 更新用户的数据操作
// @param uid 用户的id
// @param username 用户名
// @param user 用户对象的数据
void changeInfo(Integer uid,String username,User user);
✨2.3实现抽象方法
在UserServiceImpl类中添加两个抽象方法的具体实现。
@Override
public User getByUid(Integer uid) {
User result = userMapper.findByUid(uid);
if(result == null || result.getIsDelete() == 1){
throw new UserNotFoundException("用户数据不存在");
}
User user = new User();
user.setUsername(result.getUsername());
user.setPhone(result.getPhone());
user.setEmail(result.getEmail());
user.setGender(result.getGender());
return user;
}
// user对象中的数据phone/email/gender,手动再将uid/username封装到user对象中
@Override
public void changeInfo(Integer uid, String username, User user) {
User result = userMapper.findByUid(uid);
if(result == null || result.getIsDelete() == 1){
throw new UserNotFoundException("用户数据不存在");
}
user.setUid(uid);
user.setModifiedUser(username);
user.setModifiedTime(new Date());
Integer rows = userMapper.updateInfoByUid(user);
if(rows != 1){
throw new UpdateException("更新时数据产生未知的异常");
}
}
✨2.4在测试类中测试
@Test
public void getByUid(){
System.out.println(userService.getByUid(7));
}
@Test
public void changeInfo(){
User user=new User();
user.setPhone("87654321");
user.setEmail("666333@qq.com");
user.setGender(0);
userService.changeInfo(7,"timi",user);
}
🚀3.个人资料-控制层
✨3.1处理异常
暂无。
✨3.2设计请求
1.设置-打开页面就发送当前用户数据的查询。即在打开页面的时候,页面就显示username,phone,email等信息。
请求路径:/users/get_by_uid
请求参数:HttpSession session
请求类型:GET
响应结果:JsonResult<User>
2.点击修改按钮发送用户的数据修改操作请求的设计。
请求路径:/users/change_info
请求参数:User user,HttpSession session
请求类型:POST
响应结果:JsonResult<Void>
✨3.3处理请求
@RequestMapping("get_by_uid")
public JsonResult<User> getByUid(HttpSession session){
User data = userService.getByUid(getuidFromSession(session));
return new JsonResult<>(OK,data);
}
@RequestMapping("change_info")
public JsonResult<Void> changeInfo(User user,HttpSession session){
// user对象有四部分数据:username,phone,email,gender
// uid数据需要再次封装到user对象中
Integer uid = getuidFromSession(session);
String username = getUsernameFromSession(session);
userService.changeInfo(uid,username,user);
return new JsonResult<>(OK);
}
}
🚀4.个人资料-前端页面
1.在打开userdata.html页面自动发送ajax请求(get_by_uid),查询到的数据填充到页面上。
<!-- 一旦检测到当前的页面被加载就会触发ready方法-->
// $(document).ready(function (){
//
// })
$(document).ready(function (){
$.ajax({
url:"/users/get_by_uid",
type:"GET",
data:$("#form-change-info").serialize(),
dataType:"JSON",
success:function (json){
if(json.state==200){
// 将查询的数据重新设置到控件中
$("#username").val(json.data.username)
$("#phone").val(json.data.phone)
$("#email").val(json.data.email)
let radio = json.data.gender == 0 ? $("#gender-female") : $("#gender-male");
// prop()表示给某个元素添加属性及属性的值
radio.prop("checked","checked")
}else{
alert("用户的数据不存在");
}
},
error:function (xhr){
alert("查询用户时产生未知的异常"+xhr.message);
}
});
})
2.在检测到用户点击了修改按钮之后也需要发送一个ajax请求(change_info)。
<script>
$("#btn-change-info").click(function (){
$.ajax({
url:"/users/change_info",
type:"POST",
data:$("#form-change-info").serialize(),
dataType:"JSON",
success:function (json){
if(json.state==200){
alert("用户信息修改成功");
// 修改成功后重新加载当前的页面
location.href="userdata.html"
}else{
alert("用户信息修改失败");
}
},
error:function (xhr){
alert("用户信息修改时产生未知的异常"+xhr.message);
}
});
});