# 用户中心
本节要实现的如下图,个人资料的基本信息修改
# 用户信息回显接口
进入该页面要获取用户信息
package cn.mrcode.foodiedev.api.controller.center;
import cn.mrcode.foodiedev.common.util.JSONResult;
import cn.mrcode.foodiedev.pojo.Users;
import cn.mrcode.foodiedev.service.center.CenterUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* @author mrcode
* @date 2021/2/18 20:55
*/
@Api(value = "用户中心", tags = {"用户中心相关接口"})
@RequestMapping("center")
@RestController
public class CenterController {
@Autowired
private CenterUserService centerUserService;
@ApiOperation(value = "获取用户信息", notes = "获取用户信息", httpMethod = "GET")
@GetMapping("userInfo")
public JSONResult userInfo(
@ApiParam(name = "userId", value = "用户id", required = true)
@RequestParam String userId) {
Users user = centerUserService.queryUserInfo(userId);
return JSONResult.ok(user);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package cn.mrcode.foodiedev.service.impl.center;
import cn.mrcode.foodiedev.mapper.UsersMapper;
import cn.mrcode.foodiedev.pojo.Users;
import cn.mrcode.foodiedev.service.center.CenterUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
/**
* @author mrcode
* @date 2021/2/18 20:59
*/
@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
@Service
public class CenterUserServiceImpl implements CenterUserService {
@Autowired
public UsersMapper usersMapper;
@Transactional(propagation = Propagation.SUPPORTS)
@Override
public Users queryUserInfo(String userId) {
Users user = usersMapper.selectByPrimaryKey(userId);
user.setPassword(null);
return user;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 个人信息修改接口
这里的信息都是必填的,首先需要在前端用 js 进行校验。然后发起请求到后端进行修改
@ApiOperation(value = "修改用户信息", notes = "修改用户信息", httpMethod = "POST")
@PostMapping("update")
public JSONResult update(
@ApiParam(name = "userId", value = "用户id", required = true)
@RequestParam String userId,
@RequestBody @Valid CenterUserBO centerUserBO,
BindingResult result,
HttpServletRequest request, HttpServletResponse response) {
System.out.println(centerUserBO);
// 判断 BindingResult 是否保存错误的验证信息,如果有,则直接 return
if (result.hasErrors()) {
Map<String, String> errorMap = getErrors(result);
return JSONResult.errorMap(errorMap);
}
Users userResult = centerUserService.updateUserInfo(userId, centerUserBO);
// 脱敏之后,写会 cookie 中,更新前端页面中各处显示的信息,比如昵称在右上角显示的
userResult = setNullProperty(userResult);
CookieUtils.setCookie(request, response, "user",
JsonUtils.objectToJson(userResult), true);
// TODO 后续要改,增加令牌 token,会整合进 redis,分布式会话
return JSONResult.ok();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
BO 主要学习下这里面的验证信息,这里使用了 hibernate validator 来实现一些字段的验证
package cn.mrcode.foodiedev.pojo.bo.center;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.*;
import java.util.Date;
@ApiModel(value="用户对象", description="从客户端,由用户传入的数据封装在此entity中")
public class CenterUserBO {
@ApiModelProperty(value="用户名", name="username", example="json", required = false)
private String username;
@ApiModelProperty(value="密码", name="password", example="123456", required = false)
private String password;
@ApiModelProperty(value="确认密码", name="confirmPassword", example="123456", required = false)
private String confirmPassword;
@NotBlank(message = "用户昵称不能为空")
@Length(max = 12, message = "用户昵称不能超过12位")
@ApiModelProperty(value="用户昵称", name="nickname", example="杰森", required = false)
private String nickname;
@Length(max = 12, message = "用户真实姓名不能超过12位")
@ApiModelProperty(value="真实姓名", name="realname", example="杰森", required = false)
private String realname;
@Pattern(regexp = "^(((13[0-9]{1})|(15[0-9]{1})|(18[0-9]{1}))+\\d{8})$", message = "手机号格式不正确")
@ApiModelProperty(value="手机号", name="mobile", example="13999999999", required = false)
private String mobile;
@Email
@ApiModelProperty(value="邮箱地址", name="email", example="imooc@imooc.com", required = false)
private String email;
@Min(value = 0, message = "性别选择不正确")
@Max(value = 2, message = "性别选择不正确")
@ApiModelProperty(value="性别", name="sex", example="0:女 1:男 2:保密", required = false)
private Integer sex;
@ApiModelProperty(value="生日", name="birthday", example="1900-01-01", required = false)
private Date birthday;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
service
@Transactional(propagation = Propagation.REQUIRED)
@Override
public Users updateUserInfo(String userId, CenterUserBO centerUserBO) {
Users updateUser = new Users();
BeanUtils.copyProperties(centerUserBO, updateUser);
updateUser.setId(userId);
updateUser.setUpdatedTime(new Date());
usersMapper.updateByPrimaryKeySelective(updateUser);
// 更新之后,把新的用户信息返回
return queryUserInfo(userId);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
前端点击保存修改之后,后端修改完成响应后,前端直接刷新了当前页面。
在这里需要说一下的是,看 bean 验证只有 nickname 用户昵称是必须的属性 @NotBlank(message = "用户昵称不能为空")
,也就是说,该接口支持的业务逻辑是:
- nickname 必须
- 其他字段都是选填,如果不修改,可以不传递该字段,要修改就必须符合条件才能经过验证
- 不能将已经设置过的字段取消掉,也就是可以设置空字符串,但是对于数值类、邮箱这种正则验证的,就不能设置成空字符串
学习下这里的业务设计。