一、文章管理接口。
共有5个,分别为:
1.新增文章;
2.文章列表(条件分页) ;
3.获取文章详情;
4.更新文章;
5.删除文章。
二、详解。
1.新增文章。
ArticleController.java:
@PostMapping
public Result add(@RequestBody Article article){
articleService.add(article);
return Result.success();
}
ArticleService.java:
//新增文章
void add(Article article);
ArticleServiceInterface.java:
@Override
public void add(Article article) {
//补充属性值
article.setCreateTime(LocalDateTime.now());
article.setUpdateTime(LocalDateTime.now());
Map<String,Object> map = ThreadLocalUtil.get();
Integer UserId = (Integer) map.get("id");
article.setCreateUser(UserId);
articleMapper.add(article);
}
ArticleMapper.java:
// 新增
@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);
使用Postman运行测试:
**********************************************参数校验****************************************************
实体类添加相关参数校验的注解,并添加@Validated注解:
当已有的注解不能满足所有的校验需求,特殊的情况需要自定义校验(自定义校验注解) 。
具体步骤为:
1.自定义注解State;
2. 自定义校验数据的类StateValidation实现ConstraintValidator接囗
3.在需要校验的地方使用自定义注解。
对于参数state进行自定义参数校验:
新建子包annotate,并新建注解State.java:
@Documented //元注解
@Target(ElementType.FIELD) //元注解
@Retention(RetentionPolicy.RUNTIME) //元注解
@Constraint(validatedBy = {StateValidation.class}) //指定提供校验规则的类
public @interface State {
//提供校验失败的提示信息
String message() default "State参数的值只能为已发布或者草稿";
//指定分组
Class<?>[] groups() default {};
//负载 获取State注解的附加信息
Class<? extends Payload>[] payload() default {};
}
新建子包Validation,并新建自定义校验数据的类StateValidation实现ConstraintValidator接囗:
public class StateValidation implements ConstraintValidator<State,String> {
/**
*
* @param value 将来要校验的信息
* @param constraintValidatorContext
* @return false--> 校验不通过 反之,通过
*/
@Override
public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
//提供校验规则
if(value == null){
return false;
}
if(value.equals("已发布") || value.equals("草稿")){
return true;
}
return false;
}
}
最后在实体类Article上使用注解即可:
使用Postman测试:
2.文章列表(条件分页) 。
ArticleController.java:
@GetMapping
public Result<PageBean<Article>> list(
Integer pageNum,
Integer pageSize,
@RequestParam(required = false) Integer categoryId,
@RequestParam(required = false) String state
){
PageBean<Article> pb = articleService.list(pageNum,pageSize,categoryId,state);
return Result.success(pb);
}
ArticleService.java:
//条件分页列表查询
PageBean<Article> list(Integer pageNum, Integer pageSize, Integer categoryId, String state);
pom.xml添加分页插件PageHelper:
<!--PageHelper坐标-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.6</version>
</dependency>
ArticleServiceInterface.java:
@Override
public PageBean<Article> list(Integer pageNum, Integer pageSize, Integer categoryId, String state) {
//1.创建PageBean对象
PageBean<Article> pb = new PageBean<>();
//2.开启分页查询 PageHelper
PageHelper.startPage(pageNum,pageSize);
//3.调用Mapper
Map<String,Object> map = ThreadLocalUtil.get();
Integer userId = (Integer) map.get("id");
List<Article> as = articleMapper.list(userId,categoryId,state);
//Page中提供了方法,可以获取PageHelper分页查询后 得到的总记录条数和当前页数据
Page<Article> p = (Page<Article>) as;
//将数据填充到PageBean对象中
pb.setTotal(p.getTotal());
pb.setItems(p.getResult());
return pb;
}
ArticleMapper.java:
List<Article> list(Integer userId, Integer categoryId, String state);
新建动态SQL文件,在resources目录下新建与ArticleMapper.java所在位置同样的文件路径,并新建文件ArticleMapper.xml,命名与ArticleMapper必须相同:
ArticleMapper.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.azhyyi.mapper.ArticleMapper">
<!--动态SQL-->
<select id="list" resultType="org.azhyyi.entity.Article">
select * from article
<where>
<if test="categoryId!= null">
category_id=#{categoryId}
</if>
<if test="state!= null">
and state=#{state}
</if>
and create_user=#{userId}
</where>
</select>
</mapper>
使用Postman运行测试:
3.获取文章详情;
4.更新文章;
5.删除文章。
ArticleController.java:
@GetMapping("/detail")
public Result<Article> detail(Integer id){
Article c = articleService.findById(id);
return Result.success(c);
}
@PutMapping
public Result update(@RequestBody @Validated Article article){
articleService.update(article);
return Result.success();
}
@DeleteMapping
public Result delete(Integer id){
articleService.deleteById(id);
return Result.success();
}
ArticleService.java:
ArticleServiceInterface.java:
@Override
public Article findById(Integer id) {
Article a = articleMapper.findById(id);
return a;
}
@Override
public void deleteById(Integer id) {
articleMapper.deleteById(id);
}
@Override
public void update(Article article) {
article.setUpdateTime(LocalDateTime.now());
articleMapper.update(article);
}
ArticleMapper.java:
//获取文章详情
@Select("select * from article where id=#{id}")
Article findById(Integer id);
//删除文章
@Delete("delete from article where id=#{id}")
void deleteById(Integer id);
//更新文章
@Update("update article set title=#{title},content=#{content},cover_img=#{coverImg}," +
"state=#{state},category_id=#{categoryId},update_time=#{updateTime}" +
"where id=#{id} ")
void update(Article article);
使用Postman测试,这三个接口均通过测试。
至此,大事件的后端接口基本开发完毕。