大事件项目记录12-文章管理接口开发-总

发布于:2025-06-30 ⋅ 阅读:(22) ⋅ 点赞:(0)

一、文章管理接口。

        共有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测试,这三个接口均通过测试。

        至此,大事件的后端接口基本开发完毕。