• 30:第三章:开发通行证服务:13:开发【更改/完善用户信息,接口】;(使用***BO类承接参数,并使用了参数校验)


    说明:

    (1)本篇博客内容:开发【更改/完善用户信息,接口】;

    目录

     零:本篇博客合理性说明;(或者说是:【更改/完善用户信息,接口】是什么)

    一:正式开发;

    1.在【model】模型工程中,创建UpdateUserInfoBO类,以用于承接【更改/完善用户信息,接口】的参数;

    2.在【api】接口工程的UserControllerApi接口中,定义【更改/完善用户信息,接口】;

    3.在【user】用户微服务的UserController类中,去实现【更改/完善用户信息,接口】;

    4.在【user】用户微服务的UserService接口中,定义一个【修改/完善用户信息,并且激活用户】的方法;;;在UserServiceImpl中,实现这个方法;

    (1)在【user】用户微服务的UserService接口中,定义一个【修改/完善用户信息,并且激活用户】的方法

    (2)在UserServiceImpl中,实现这个方法;

    三:测试; 


     零:本篇博客合理性说明;(或者说是:【更改/完善用户信息,接口】是什么)


    一:正式开发;

    1.在【model】模型工程中,创建UpdateUserInfoBO类,以用于承接【更改/完善用户信息,接口】的参数;

    UpdateUserInfoBO类:

    1. package com.imooc.bo;
    2. import com.fasterxml.jackson.annotation.JsonFormat;
    3. import org.hibernate.validator.constraints.Length;
    4. import javax.validation.constraints.*;
    5. import java.util.Date;
    6. public class UpdateUserInfoBO {
    7. @NotBlank(message = "用户ID不能为空")
    8. private String id;
    9. @NotBlank(message = "用户昵称不能为空")
    10. @Length(max = 12, message = "用户昵称不能超过12位")
    11. private String nickname;
    12. @NotBlank(message = "用户头像不能为空")
    13. private String face;
    14. @NotBlank(message = "真实姓名不能为空")
    15. private String realname;
    16. @Email
    17. @NotBlank(message = "邮件不能为空")
    18. private String email;
    19. //判断字符串是否为空,最好使用@NotBlank;而判断integer,需要使用@NotNull
    20. @NotNull(message = "请选择一个性别")
    21. @Min(value = 0, message = "性别选择不正确")
    22. @Max(value = 1, message = "性别选择不正确")
    23. private Integer sex;
    24. @NotNull(message = "请选择生日日期")
    25. @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") // 解决前端日期字符串传到后端后,转换为Date类型
    26. private Date birthday;
    27. @NotBlank(message = "请选择所在城市")
    28. private String province;
    29. @NotBlank(message = "请选择所在城市")
    30. private String city;
    31. @NotBlank(message = "请选择所在城市")
    32. private String district;
    33. public String getId() {
    34. return id;
    35. }
    36. public void setId(String id) {
    37. this.id = id;
    38. }
    39. public String getNickname() {
    40. return nickname;
    41. }
    42. public void setNickname(String nickname) {
    43. this.nickname = nickname;
    44. }
    45. public String getFace() {
    46. return face;
    47. }
    48. public void setFace(String face) {
    49. this.face = face;
    50. }
    51. public String getRealname() {
    52. return realname;
    53. }
    54. public void setRealname(String realname) {
    55. this.realname = realname;
    56. }
    57. public String getEmail() {
    58. return email;
    59. }
    60. public void setEmail(String email) {
    61. this.email = email;
    62. }
    63. public Integer getSex() {
    64. return sex;
    65. }
    66. public void setSex(Integer sex) {
    67. this.sex = sex;
    68. }
    69. public Date getBirthday() {
    70. return birthday;
    71. }
    72. public void setBirthday(Date birthday) {
    73. this.birthday = birthday;
    74. }
    75. public String getProvince() {
    76. return province;
    77. }
    78. public void setProvince(String province) {
    79. this.province = province;
    80. }
    81. public String getCity() {
    82. return city;
    83. }
    84. public void setCity(String city) {
    85. this.city = city;
    86. }
    87. public String getDistrict() {
    88. return district;
    89. }
    90. public void setDistrict(String district) {
    91. this.district = district;
    92. }
    93. }

    说明:

    (1)这个BO类就是用于承接【更改/完善用户信息,接口】的参数,也就是下面这个表单的内容;;;所以,这个接口中的属性不是瞎写的;

    (2)我们使用这个BO类承接参数的时候,也加了很多校验;

              ● 利用 @JsonFormat注解来解决时间问题,在【RESTful开发风格6:RESTful基本使用四:JSON序列化;(jackson组件,以及其中的 @JsonFormat注解来解决时间问题;)】第一次介绍过;

    (3)其实,这个表单内容,在前端也做了校验;(这个很容易理解,以前自己写C#窗体程序的时候,也在前端的窗体上做过校验,类似)

    2.在【api】接口工程的UserControllerApi接口中,定义【更改/完善用户信息,接口】;

    1. /**
    2. * 【修改/完善用户信息,接口】
    3. * @param updateUserInfoBO
    4. * @return
    5. */
    6. @ApiOperation(value = "修改/完善用户信息", notes = "修改/完善用户信息", httpMethod = "POST")
    7. @PostMapping("/updateUserInfo") //设置路由,这个是需要前后端约定好的;
    8. public GraceJSONResult updateUserInfo(@RequestBody @Valid UpdateUserInfoBO updateUserInfoBO,
    9. BindingResult result);

    说明:

    (1)内容说明;

              ● 一旦校验失败,有错误信息后,我们就可以通过【BindingResult result】来获取对应的错误信息;所以,这儿在参数中,也引入了【BindingResult result】;

    3.在【user】用户微服务的UserController类中,去实现【更改/完善用户信息,接口】;

    1. /**
    2. * 【修改/完善用户信息,接口】
    3. *
    4. * @param updateUserInfoBO
    5. * @param result
    6. * @return
    7. */
    8. @Override
    9. public GraceJSONResult updateUserInfo(@Valid UpdateUserInfoBO updateUserInfoBO,
    10. BindingResult result) {
    11. //0.判断BindingResult中是否保存了验证失败的错误信息,如果有,说明前端的输入是有问题的;
    12. // 那么,我们就获取这个错误信息,并构建一个GraceJSONResult统一返回对象,返回;
    13. if (result.hasErrors()) {
    14. Map<String, String> map = getErrorsFromBindingResult(result);//所以,这个类需要继承BaseController
    15. return GraceJSONResult.errorMap(map);
    16. }
    17. //1. 执行更新操作
    18. userService.updateUserInfo(updateUserInfoBO);
    19. return GraceJSONResult.ok();
    20. }

    说明:

    (1)内容说明;

    4.在【user】用户微服务的UserService接口中,定义一个【修改/完善用户信息,并且激活用户】的方法;;;在UserServiceImpl中,实现这个方法;

    (1)在【user】用户微服务的UserService接口中,定义一个【修改/完善用户信息,并且激活用户】的方法

    ……………………………………………………

    (2)在UserServiceImpl中,实现这个方法;

    1. /**
    2. * 修改/完善用户信息,并且激活用户;
    3. *
    4. * @param updateUserInfoBO
    5. */
    6. @Override
    7. public void updateUserInfo(UpdateUserInfoBO updateUserInfoBO) {
    8. //把前端传过来的updateUserInfoBO中的属性值,copy到一个AppUser对象中去;
    9. AppUser userInfo = new AppUser();
    10. BeanUtils.copyProperties(updateUserInfoBO, userInfo);
    11. //重新设置其更新时间
    12. userInfo.setUpdatedTime(new Date());
    13. //设置其用户状态,把其状态设为1(即已激活);
    14. userInfo.setActiveStatus(UserStatus.ACTIVE.type);
    15. //和mybatis-plus的套路基本一样,我们使用updateByPrimaryKeySelective()方法(这个方法只去更新数据库表中那些userInfo中有的,,没有的不会动);
    16. // 而不使用updateByPrimaryKey();(这个方法会全部更新数据库表的内容,,userInfo没有的,就会设为空了),
    17. int result = appUserMapper.updateByPrimaryKeySelective(userInfo);
    18. if (result != 1) {//如果上面方法的返回值不为1,就表示这个更新操作出了问题,那么我们就抛出一个异常;
    19. GraceException.display(ResponseStatusEnum.USER_UPDATE_ERROR);
    20. }
    21. }

    说明:

    (1)内容说明;


    三:测试; 

    声明:

    我们可以在Swagger2页面上去测试,也可以使用Postman去测试;

    测试:

    (1)先全局install一下整个项目;

    (2)然后,启动【user】微服务的主启动类;

    (3)然后,访问页面去更新/完善用户信息;

  • 相关阅读:
    stable diffusion模型训练时数据量
    python 常用的内置函数
    2022年全网最全最细最流行的自动化测试工具有哪些?
    pytorch中一维卷积,二维卷积,三维卷积,层次特征注意力
    AI人工智能培训老师叶梓:大数据治理的关键工具:开源数据血缘分析系统
    FFmpeg开发笔记(五十七)使用Media3的Transformer加工视频文件
    【强化学习论文合集 | 2019年合集】一. ICML-2019 强化学习论文
    算法训练 第六周
    记录:2022-9-12 多路归并 超级丑数 败者树 调度算法实现 帧分配 系统抖动 内存映射文件 内核内存分配
    使用jsch和commons-pool2为sftp创建连接池
  • 原文地址:https://blog.csdn.net/csucsgoat/article/details/125592699