17. 用户-修改资料-持久层
(a) 规划SQL语句
执行修改资料时需要执行的SQL语句大致是:
update t_user set phone=?,email=?,gender=?,modified_user=?,modified_time=? where uid=?
在执行修改之前,还是需要验证用户数据是否存在、是否标记为删除,该功能对应的SQL语句在“修改密码”时已经完成。
另外,在刚刚打开页面时,还需要显示当前登录的用户的信息,则需要根据用户的uid查询相关需要显示的信息:
select username,phone,email,gender from t_user where uid=?
(b) 接口与抽象方法
在UserMapper.java
中添加抽象方法:
Integer updateInfo(User user);
关于查询的功能在“修改密码”时已经存在User findByUid(Integer uid)
方法,则无需重复声明。
© 配置映射
在UserMapper.xml
配置Integer updateInfo(User user)
的映射:
<!-- 更新个人资料 -->
<!-- Integer updateInfo(User user) -->
<update id="updateInfo">
UPDATE
t_user
SET
phone=#{phone},
email=#{email},
gender=#{gender},
modified_user=#{modifiedUser},
modified_time=#{modifiedTime}
WHERE
uid=#{uid}
</update>
然后,找到User findByUid(Integer uid)
的映射,补充查询字段:
<!-- 根据用户id查询用户数据 -->
<!-- User findByUid(Integer uid) -->
<select id="findByUid"
resultMap="UserEntityMap">
SELECT
username, phone,
email, gender,
password, salt,
is_delete
FROM
t_user
WHERE
uid=#{uid}
</select>
完成后,编写并执行“更新密码”的单元测试:
@Test
public void updateInfo() {
User user = new User();
user.setUid(7);
user.setPhone("13700137001");
user.setEmail("root@qq.com");
user.setGender(1);
Integer rows = mapper.updateInfo(user);
System.err.println("rows=" + rows);
}
并再次执行测试“根据用户id查询信息”的功能。
###################### 以上大纲步骤1 ######################
1.添加抽象方法
2.添加sql配置
3.测试
18. 用户-修改资料-业务层
(a) 规划异常
更新操作必然可能出现UpdateException
,在执行更新之前,应该检查用户数据,则可能出现UserNotFoundexception
。
(b) 接口与抽象方法
在IUserService
中添加抽象方法:
void changeInfo(Integer uid, String username, User user) throws UserNotFoundException, UpdateException;
User getByUid(Integer uid);
© 实现抽象方法
在UserServiceImpl
中实现以上抽象方法:
public void changeInfo(Integer uid, String username, User user) throws UserNotFoundException, UpdateException {
// 根据参数uid查询用户数据
// 判断查询结果是否为null:UserNotFoundException
// 判断查询结果中的isDelete是否为1:UserNotFoundException
// 将参数uid和参数username封装到参数user的uid和modifiedUser属性中
// 执行更新,获取返回值(受影响的行数)
// 判断受影响的行数是否不为1:UpdateException
}
public User getByUid(Integer uid) {
// 根据参数uid查询用户数据
// 判断查询结果是否为null:UserNotFoundException
// 判断查询结果中的isDelete是否为1:UserNotFoundException
// 将查询结果中不相关的数据设置为null
// 返回查询结果
}
具体实现为:
@Override
public void changeInfo(Integer uid, String username, User user) throws UserNotFoundException, UpdateException {
// 根据参数uid查询用户数据
User result = userMapper.findByUid(uid);
// 判断查询结果是否为null:UserNotFoundException
if (result == null) {
// 是:抛出UserNotFoundException
throw new UserNotFoundException(
"修改个人资料失败!用户数据不存在!");
}
// 判断查询结果中的isDelete是否为1:UserNotFoundException
if (result.getIsDelete() == 1) {
// 是:抛出UserNotFoundException
throw new UserNotFoundException(
"修改个人资料失败!用户数据不存在!");
}
// 将参数uid和参数username封装到参数user的uid和modifiedUser属性中
user.setUid(uid);
user.setModifiedUser(username);
user.setModifiedTime(new Date());
// 执行更新,获取返回值(受影响的行数)
Integer rows = userMapper.updateInfo(user);
// 判断受影响的行数是否不为1:UpdateException
if (rows != 1) {
throw new UpdateException(
"修改个人资料失败!更新数据时出现未知错误!");
}
}
@Override
public User getByUid(Integer uid) throws UserNotFoundException {
// 根据参数uid查询用户数据
User result = userMapper.findByUid(uid);
// 判断查询结果是否为null:UserNotFoundException
if (result == null) {
// 是:抛出UserNotFoundException
throw new UserNotFoundException(
"获取用户资料失败!用户数据不存在!");
}
// 判断查询结果中的isDelete是否为1:UserNotFoundException
if (result.getIsDelete() == 1) {
// 是:抛出UserNotFoundException
throw new UserNotFoundException(
"获取用户资料失败!用户数据不存在!");
}
// 将查询结果中不相关的数据设置为null
User user = new User();
user.setUsername(result.getUsername());
user.setPhone(result.getPhone());
user.setEmail(result.getEmail());
user.setGender(result.getGender());
// 返回查询结果
return user;
}
最后,在UserServiceTests
中编写并执行单元测试:
@Test
public void changeInfo() {
try {
Integer uid = 700;
String username = "系统管理员";
User user = new User();
user.setGender(1);
user.setPhone("13700137007");
user.setEmail("root@163.com");
service.changeInfo(uid, username, user);
System.err.println("OK");
} catch (ServiceException e) {
System.err.println(e.getClass().getName());
System.err.println(e.getMessage());
}
}
@Test
public void getByUid() {
try {
Integer uid = 7;
User data = service.getByUid(uid);
System.err.println(data);
} catch (ServiceException e) {
System.err.println(e.getClass().getName());
System.err.println(e.getMessage());
}
}
###################### 以上大纲步骤2 ######################
1.添加抽象方法
2.实现抽象方法
3.测试
19. 用户-修改资料-控制器层
(a) 统一处理异常
没有新的异常,则无需处理。
(b) 设计请求
设计“获取用户数据”的请求方式:
请求路径:/users/get_by_uid
请求参数:HttpSession session
请求方式:GET
响应数据:JsonResult<User>
设计“执行更新用户个人资料”的请求方式:
请求路径:/users/change_info
请求参数:User user, HttpSession session
请求方式:POST
响应数据:JsonResult<Void>
© 处理请求
在UserController
中:
@RequestMapping("change_info")
public JsonResult<Void> changeInfo(User user, HttpSession session) {
// 从session中获取uid和username
// 执行修改
// 返回成功
}
@GetMapping("get_by_uid")
public JsonResult<User> getByUid(HttpSession session) {
// 执行获取数据
// 返回成功与数据
}
具体实现为:
@RequestMapping("change_info")
public JsonResult<Void> changeInfo(User user, HttpSession session) {
// 从session中获取uid和username
Integer uid = getUidFromSession(session);
String username = getUsernameFromSession(session);
// 执行修改
userService.changeInfo(uid, username, user);
// 返回成功
return new JsonResult<>(SUCCESS);
}
@GetMapping("get_by_uid")
public JsonResult<User> getByUid(HttpSession session) {
// 执行获取数据
Integer uid = getUidFromSession(session);
User data = userService.getByUid(uid);
// 返回成功与数据
return new JsonResult<>(SUCCESS, data);
}
完成后,可以执行测试:
http://localhost:8080/users/get_by_uid
http://localhost:8080/users/change_info?gender=1&phone=111&email=222
###################### 以上大纲步骤3 ######################
1.用户控制器中添加代码
2.进行测试 浏览器输入网址,会出现相应内容。
20. 用户-修改资料-前端界面
1.更改ajax对应代码,
2.添加表单的相关代码 name="username"等