DTO(Data Transfer Object)是一种数据传输对象,用于在不同层之间传输数据,通常用于在服务层和表现层之间传递数据。它是一个纯粹的数据对象,只包含属性和对应的访问器方法,不应该包含业务逻辑。
DTO 的使用有以下几个优点:
-
数据隔离:DTO 可以将服务层和表现层的数据隔离开来,避免直接暴露底层实体对象。
-
数据传输:DTO 可以用于在不同层之间传输数据,将复杂的领域对象转换为简单的数据对象。
-
数据封装:DTO 可以将多个实体对象的数据封装到一个对象中,方便进行数据传输和操作。
示例:
package com.xzc.student_health_system.controller.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.xzc.student_health_system.entity.Menu;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
@Data
@Getter
@Setter
public class UserDTO {
private Integer id;
private String username;
private String password;
private String nickname;
private String avatarUrl;
private String token;
private String role;
private List<Menu> menus;
}
@PostMapping("/login")
public Result login(@RequestBody UserDTO userDTO){
String username = userDTO.getUsername();
String password = userDTO.getPassword();
if (StrUtil.isBlank(username) || StrUtil.isBlank(password)) {
return Result.error(Constants.CODE_400, "参数错误");
}
UserDTO dto = userService.login(userDTO);
return Result.success(dto);
}
@Override
public UserDTO login(UserDTO userDTO) {
userDTO.setPassword(SecureUtil.md5(userDTO.getPassword()));
User one = getUserInfo(userDTO);
if (one != null){
BeanUtil.copyProperties(one,userDTO,true);
//设置token
String token = TokenUtils.genToken(one.getId().toString(),one.getPassword());
userDTO.setToken(token);
String role = one.getRole(); // ROLE_ADMIN
// 设置用户的菜单列表
List<Menu> roleMenus = getRoleMenus(role);
userDTO.setMenus(roleMenus);
return userDTO;
}else {
throw new ServiceException(Constants.CODE_600,"用户名或密码错误");
}
}
@Override
public User register(UserDTO userDTO) {
userDTO.setPassword(SecureUtil.md5(userDTO.getPassword()));
User one = getUserInfo2(userDTO);
User one2 =getUserInfo3(userDTO);
if(one2 != null) {
throw new ServiceException(Constants.CODE_600, "昵称已存在");
}
if (one == null) {
one = new User();
BeanUtil.copyProperties(userDTO, one, true);
// // 默认一个普通用户的角色
one.setRole(RoleEnum.ROLE_STUDENT.toString());
save(one); // 把 copy完之后的用户对象存储到数据库
} else {
throw new ServiceException(Constants.CODE_600, "用户已存在");
}
return one;
}
private User getUserInfo(UserDTO userDTO) {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("username", userDTO.getUsername());
queryWrapper.eq("password", userDTO.getPassword());
User one;
try {
one = getOne(queryWrapper); // 从数据库查询用户信息
} catch (Exception e) {
LOG.error(e);
throw new ServiceException(Constants.CODE_500, "系统错误");
}
return one;
}