微服务项目->在线oj系统(Java-Spring)----8.0
·
添加管理员

前面定义的SysUserSaveDTO类
@Data
public class SysUserSaveDTO {
@Schema(description = "用户账号")
private String userAccount;
@Schema(description = "用户密码")
private String password;
}
增加Service
@Override
public int add(SysUserSaveDTO sysUserSaveDTO) {
// checkParams(sysUserSaveDTO);
//重复
//将dto转为实体
List<SysUser> sysUserList = sysUserMapper.selectList(new LambdaQueryWrapper<SysUser>()
.eq(SysUser::getUserAccount, sysUserSaveDTO.getUserAccount()));
//isNotEmpty 不为空返回true
if (CollectionUtil.isNotEmpty(sysUserList)) {
//用户已经存在
//自定义的异常 公共的异常类
throw new ServiceException(ResultCode.AILED_USER_EXISTS);
}
SysUser sysUser = new SysUser();
sysUser.setUserAccount(sysUserSaveDTO.getUserAccount());
sysUser.setPassword(BCryptUtils.encryptPassword(sysUserSaveDTO.getPassword()));
return sysUserMapper.insert(sysUser);
}
详细解释
首先,我们要对传入的账号进行检测,如果我们发现数据库里面以及有了这个账号,那么抛出异常
下面自定义一个异常类继承于运行时异常
@Getter
public class ServiceException extends RuntimeException {
private ResultCode resultCode;
public ServiceException(ResultCode resultCode) {
this.resultCode = resultCode;
}
}

接下来我们对增加去数据库的内容进行创建

这里遗留一个问题:
我们的创建人ID以及修改人ID怎么获得(于token相关)
我们将前端传输给我们的账号密码进行设置(对密码进行加密然后储存)
这里我们就有疑问了,那我们的创建时间之类的怎么办?
我们修改之前创建的 BaseEntity类,对它加入一些mybatis-plus相关的注释
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<mybatis-plus.version>3.5.5</mybatis-plus.version>
@Data
public class BaseEntity implements Serializable {
@TableField(fill = FieldFill.INSERT)
private Long createBy;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.UPDATE)
private Long updateBy;
@TableField(fill = FieldFill.UPDATE)
private LocalDateTime updateTime;
}
添加管理Mybatis类
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
//创建人 获取当前用户用户id 如何获取当前调用接口的用户的id呢?
this.strictInsertFill(metaObject, "createBy", Long.class,100L );
}
@Override
public void updateFill(MetaObject metaObject) {
}
}
这样,在我们插入数据的时候,我们只需要提供账号和密码即可,服务器会自动帮我们填入创建时间,创建人,以及修改时候的修改时间修改人
我们如果在一个项目中使用的mybatis-plus的相关注解但是没有配置数据库url(即使是间接),可能报错,找不到database Url
这里我们就可以对使用的启动类上面添加

排除 DataSourceAutoConfiguration 自动配置类。
当然如果我们要对账号和密码进行限制,我们需要进行额外操作
这里我们可以使用Validated
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
添加注解

@Getter
@Setter
public class ValidationDTO {
@NotNull(message = "昵称不能为null")
private String nickName;
@NotEmpty(message = "用户账号不能为空")
private String userAccount;
@NotBlank(message = "用户密码不能为空,并且不能只包含空格")
@Size(min = 5, max = 10, message = "密码长度不能少于5位,不能大于10位")
private String password;
@Min(value = 0, message = "年龄不能小于0岁")
@Max(value = 60, message = "年龄不能大于60岁")
private int age;
@Email(message = "必须符合邮箱格式")
private String email;
@Pattern(regexp = "^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\\d{8}$", message = "手机号码格式不正确")
private String phone;
@Past(message = "开始日期必须是过去的日期")
private LocalDate startDate;
@Future(message = "结束日期必须是未来的日期")
private LocalDate endDate;
}
异常捕获
@ExceptionHandler(BindException.class)
public R<Void> handleBindException(BindException e) {
log.error(e.getMessage());
String message = join(e.getAllErrors(),
DefaultMessageSourceResolvable::getDefaultMessage, ", ");
return R.fail(ResultCode.FAILED_PARAMS_VALIDATE.getCode(), message);
}
private <E> String join(Collection<E> collection, Function<E, String>
function, CharSequence delimiter) {
if (CollUtil.isEmpty(collection)) {
return StrUtil.EMPTY;
}
return collection.stream().map(function).filter(Objects::nonNull).collect(Collectors.joining(delimiter));
}
这里我们再来讲讲为什么要有Entity、DTO、VO划分
Entity、DTO、VO

简单来说:
- Entity: 和数据库表一一对应
- VO:传给前端的数据,只包含我们想传给前端的代码
- DTO :接受前端给我们的数据
DTO

Entity


VO

为什么要这么区分:

还可以对返回值进行选择,将不想给客户端暴露的信息不进行封装(例如密码)
更多推荐



所有评论(0)