一、DTO是什么?
DTO (数据传输对象)
数据传输对象(DTO),是一种设计模式之间传输数据的软件应用系统。数据传输目标往往是数据访问对象从数据库中检索数据。数据传输对象与数据交互对象或数据访问对象之间的差异是一个以不具有任何行为除了存储和检索的数据(访问和存取器)。
简单了说:假设你数据库中定义了User类,包含用户名、密码、邮箱、手机号等等;当用户登录时一般只需要输入用户名和密码,那么传入服务端的用户名和密码就可以在controller层封装到UserDto实体类中
二、DTO解决的问题
DTO解决了在客户端和服务器端之间传递大量数据的问题,但是客户端往往需要更细粒度的数据访问
三、代码演示
@RestController
public class AccountController {
@Autowired
private UserService userService;
@Autowired
private JwtUtil jwtUtil;
@PostMapping("/login") //使用LoginDto接收前端登录时校验的用户名和密码
public Result login(@Validated @RequestBody LoginDto loginDto, HttpServletResponse response) {
// User user = userService.getOne(new QueryWrapper<User>().eq("username", loginDto.getUsername()));
// Assert.notNull(user,"用户不存在!");
// if (!user.getPassword().equals(SecureUtil.md5(loginDto.getPassword()))) //{
// return Result.fail("密码不正确!");
// }
// String jwt = jwtUtil.generateToken(user.getId());
// response.setHeader("Authorization",jwt);
// response.setHeader("Access-control-Expost-Headers","Authorization");
// return Result.success(MapUtil.builder().put("id",user.getId()));
}
}
LoginDto
@Data
public class LoginDto implements Serializable {
@NotBlank(message = "用户名不能为空!")
private String username;
@NotBlank(message = "密码不能为空!")
private String password;
}
User类
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("m_user")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@NotBlank(message = "昵称不能为空~")
private String username;
private String avatar;
@NotBlank(message = "邮箱不能为空~")
@Email(message = "邮箱格式不正确~")
private String email;
private String password;
private Integer status;
private LocalDateTime created;
private LocalDateTime lastLogin;
}