开始

做更新操作,业务逻辑介绍

image.png
昵称如果不填写,直接保存会有提示
image.png
image.png

前端事件
image.png
前端保存事件
image.png
image.png
手机号
image.png

image.png

image.png

image.png

写后端代码

创建新的controller
image.png

image.png

  1. @RestController
  2. @Api(value = "用户信息接口",tags = "用户信息相关接口")
  3. @RequestMapping("userInfo")
  4. public class CenterUserController {
  5. }

userId不动,还需要一个user的BO对象

image.png

@RestController
@Api(value = "用户信息接口",tags = "用户信息相关接口")
@RequestMapping("userInfo")
public class CenterUserController {

    @Autowired
    private CenterUserService centerUserService;

    @ApiOperation(value = "修改用户信息",notes = "修改用户信息",httpMethod = "POST")
    @PostMapping("update")
    public IMOOCJSONResult update(
            @ApiParam(name = "userId",value = "用户id",required = true)
            @RequestParam(name = "userId") String userId,
            @RequestBody UserBO userBO
            ) {
        Users user = centerUserService.queryUserInfo(userId);
        return IMOOCJSONResult.ok(user);
    }
}

定义好的BO对象
image.png

改个名字CenterUserBO
image.png
确定
image.png
image.png

package com.imooc.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;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getConfirmPassword() {
        return confirmPassword;
    }

    public void setConfirmPassword(String confirmPassword) {
        this.confirmPassword = confirmPassword;
    }

    public String getNickname() {
        return nickname;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }

    public String getRealname() {
        return realname;
    }

    public void setRealname(String realname) {
        this.realname = realname;
    }

    public String getMobile() {
        return mobile;
    }

    public void setMobile(String mobile) {
        this.mobile = mobile;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Integer getSex() {
        return sex;
    }

    public void setSex(Integer sex) {
        this.sex = sex;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    @Override
    public String toString() {
        return "CenterUserBO{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", confirmPassword='" + confirmPassword + '\'' +
                ", nickname='" + nickname + '\'' +
                ", realname='" + realname + '\'' +
                ", mobile='" + mobile + '\'' +
                ", email='" + email + '\'' +
                ", sex=" + sex +
                ", birthday=" + birthday +
                '}';
    }
}

引入这个BO对象
image.png

@RestController
@Api(value = "用户信息接口",tags = "用户信息相关接口")
@RequestMapping("userInfo")
public class CenterUserController {

    @Autowired
    private CenterUserService centerUserService;

    @ApiOperation(value = "修改用户信息",notes = "修改用户信息",httpMethod = "POST")
    @PostMapping("update")
    public IMOOCJSONResult update(
            @ApiParam(name = "userId",value = "用户id",required = true)
            @RequestParam(name = "userId") String userId,
            @RequestBody CenterUserBO userBO
            ) {
        Users user = centerUserService.queryUserInfo(userId);
        return IMOOCJSONResult.ok(user);
    }
}

service层

CenterUserService
image.png

 /**
    * 修改用户信息
    * @param userId
    * @param centerUserBO
    */
   public void updateUserInfo(String userId, CenterUserBO centerUserBO);

ctrl+F12。BO对象和这里的users大部分属性是一致的
image.png
image.png
把centerUserBO里面的对象拷贝到updateUser对象里面
image.png

@Transactional(propagation = Propagation.REQUIRED)
    @Override
    public void updateUserInfo(String userId, CenterUserBO centerUserBO) {
        Users updateUser=new Users();
        BeanUtils.copyProperties(centerUserBO,updateUser);
    }

image.png
修改后,重新根据这个userId,再查询出来这个对象
image.png

@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);
    }

接口的返回类型也改成Users
image.png

 /**
    * 修改用户信息
    * @param userId
    * @param centerUserBO
    */
   public Users updateUserInfo(String userId, CenterUserBO centerUserBO);

controller代码完善

获取到新的对象后,要把数据覆盖本地的cookie里面。
image.png

image.png
之前我们在用户注册完毕也会有一个对象。放到cookie之前把一些没有必要显示的数据 set设置为null
image.png
这些代码都复制过来,借鉴一下
image.png

image.png
这里setNullProperty属性虽然和passportController代码有重复。
image.png
后续在整合完redis后,会做修改。会把这些重复的代码去掉。也会返回新的VO对象,。会有token这么个概念。

image.png

 @ApiOperation(value = "修改用户信息",notes = "修改用户信息",httpMethod = "POST")
    @PostMapping("update")
    public IMOOCJSONResult update(
            @ApiParam(name = "userId",value = "用户id",required = true)
            @RequestParam(name = "userId") String userId,
            @RequestBody CenterUserBO userBO
            , HttpServletRequest request, HttpServletResponse response
            ) {

        Users userResult = centerUserService.updateUserInfo(userId,userBO);

        userResult=setNullProperty(userResult);
        CookieUtils.setCookie(request,response,"user", JsonUtils.objectToJson(userResult),true);
       // TODO 后续要改,增加令牌token,会整合进redis,分布式会话
        return IMOOCJSONResult.ok();
    }
    private Users setNullProperty(Users userResult) {
        userResult.setPassword(null);
        userResult.setMobile(null);
        userResult.setEmail(null);
        userResult.setMobile(null);
        userResult.setCreatedTime(null);
        userResult.setUpdatedTime(null);
        userResult.setBirthday(null);
        return userResult;
    }

测试

maven install
image.png
重启服务

image.png

image.png

刷新当前页面,页面上 依然是最新的修改后的数据
image.png

数据库内修改后的数据
image.png
image.png

结束