新增文章功能
总说
过程参考黑马程序员SpringBoot3+Vue3全套视频教程,springboot+vue企业级全栈开发从基础、实战到面试一套通关_哔哩哔哩_bilibili
之前又偷懒几天。回老家没事干,玩也玩不好,一玩老是被家里人说。写代码吧还是,他们都看不懂,也没法说我
目录
总说
一、功能实现
1.1 Controller层
1.2 Service层
1.3 Impl层
1.4 Mapper层
1.5 测试接口
二、参数校验
2.1 validation自定义校验
2.1.1 新建注解
2.1.2 新建校验
2.1.3 添加注解
2.1.4 测试检验
一、功能实现
参数详情:
1.1 Controller层
创建ArticleController(之前创建过了就不用创建了),代码如下:
@RestController
@RequestMapping("/article")
public class ArticleController {
@Autowired
private ArticleService articleService;
@PostMapping
public Result add(@RequestBody Article article){
articleService.add(article);
return Result.success();
}
}
1.2 Service层
创建ArticleService,代码如下:
public interface ArticleService {
//添加文章
void add(Article article);
}
1.3 Impl层
创建ArticleServiceImpl,代码如下:
同时补充一些属性值
@Service
public class ArticleServiceImpl implements ArticleService {
@Autowired
private ArticleMapper articleMapper;
@Override
public void add(Article article) {
//补充属性值
article.setCreateTime(LocalDateTime.now());// 创建时间
article.setUpdateTime(LocalDateTime.now());// 更新时间
Map<String, Object> map = ThreadLocalUtil.get();
Integer id = (Integer)map.get("id");
article.setCreateUser(id);// 用户id
articleMapper.add(article);
}
}
1.4 Mapper层
创建ArticleMapper,代码如下:
@Mapper
public interface ArticleMapper {
//新增文章
@Insert("insert into article (title, content, cover_img, state, category_id, create_user, create_time, update_time)" +
" values (#{title}, #{content}, #{coverImg}, #{state}, #{categoryId}, #{createUser}, #{createTime}, #{updateTime})")
void add(Article article);
}
1.5 测试接口
创建一个新接口,如下:
二、参数校验
上面的新增文章过程中,没有对参数信息校验,我们对参数的要求如下:
来到pojo层的Article
2.1 validation自定义校验
2.1.1 新建注解
创建一个新目录anno
在这个目录下写一个注解State,如下图:
加入代码如下:
@Documented //元注解,用于描述注解的元数据
//@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Target({ElementType.FIELD}) //元注解,用于描述注解的适用范围,这里只用在属性上,只留field
@Retention(RetentionPolicy.RUNTIME)//元注解,用于描述注解的生命周期,这里只保留在运行时
@Constraint(validatedBy = {StateValidation.class} ) //元注解,用于指定是哪个类为该注解提供校验规则
public @interface State {
//提供校验失败的提示信息
String message() default "state的参数值只能是已发布或者草稿";
//指定分组
Class<?>[] groups() default {};
//指定负载,获取到State注解的附加信息
Class<? extends Payload>[] payload() default {};
}
2.1.2 新建校验
创建一个新目录validation
在这个目录下写一个注解StateValidation,如下图:
代码如下:
//<a,b> 第一个参数a是表示给哪个注解提供校验规则,第二个参数b是表示校验的数据类型
public class StateValidation implements ConstraintValidator<State, String> {
//value是将来要校验的数据,
@Override
public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
//提供校验规则
//return:false校验不通过,true校验通过
if(value == null)
return false;
if(value.equals("已发布") || value.equals("草稿"))
return true;
return false;
}
}
2.1.3 添加注解
我们来带pojo层的Article,修改代码如下:
@Data
public class Article {
private Integer id;//主键ID
//1~10个非空字符
@NotEmpty
@Pattern(regexp = "^\\S{1,10}$")
private String title;//文章标题
@NotEmpty
private String content;//文章内容
@NotEmpty
@URL
private String coverImg;//封面图像
@State
private String state;//发布状态 已发布|草稿
@NotNull
private Integer categoryId;//文章分类id
private Integer createUser;//创建人ID
private LocalDateTime createTime;//创建时间
private LocalDateTime updateTime;//更新时间
}
2.1.4 测试检验
我们将state的值删去,得到结果如下:
将结果上传git保存