添加管理员

前面定义的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

为什么要这么区分:

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

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐