一个很正常的目录
前情回顾
在前一篇博客我们成功的编写了登录与注册的接口,但是还存在着一些问题,这篇博客我们将会更深入的对登录与注册的进行讲解。
数据传输对象(DTO)
我们在登录或者注册时,其实只用到了User对象的某些属性,在访问别的用户时也不该把别的用户的密码等字段给查询出来,这时候如果我们全都使用User对象则会产生部分冗余的字段,这些冗余的部分就如我们前面说过的一样会降低数据传输的效率,所以我们首先从这里入手,创建出不同情形下所需要用到的DTO。
创建登录和注册功能的DTO
UserLoginDTO
用户登录时我们只需要用户输入用户名和密码,所以UserLoginDTO中仅有两个字段:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserLoginDTO {
@NotNull(message = "账号不允许为空")
private String username;
@NotNull(message = "密码不允许为空")
private String password;
}
而注册时我们只希望用户去填写用户名、密码、昵称即可完成注册:
UserRegisterDTO
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserRegisterDTO {
@NotNull(message = "用户名不允许为空")
private String username;
@NotNull(message = "密码不允许为空")
private String password;
@NotNull(message = "昵称不允许为空")
private String nickname;
}
完成了两个字段的编写之后我们就要去Controller层以及Service层对我们的代码进行修改,将原本接受的User对象转为相应的DTO对象
修改UserDao
/**
* 通过登录的账号查询是否存在该用户
*
* @param loginName 登录名,可能是username也可能是email
* @return 返回用户密码
*/
@Select("SELECT id,password FROM tb_user WHERE username = #{loginName}")
User userLogin(@Param("loginName") String loginName);
修改UserController
@PostMapping("/register")
public CommonResult<String> register(@RequestBody UserRegisterDTO urDTO) {
userService.userRegister(urDTO);
return new CommonResult<>(20000, "OK", "注册成功");
}
@PostMapping("/login")
public CommonResult<String> login(@RequestBody UserLoginDTO ulDTO) {
String res = userService.userLogin(ulDTO);
return new CommonResult<>(20000, "OK", res);
}
修改UserService
public void userRegister