2019_07_02store 修改用户资料 第四天

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"等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员西柚柚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值