Spring Boot + vue-element 开发个人博客项目实战教程(十一、文章分类功能实现)

简介: Spring Boot + vue-element 开发个人博客项目实战教程(十一、文章分类功能实现)

⭐ 作者简介:码上言



⭐ 代表教程:Spring Boot + vue-element 开发个人博客项目实战教程



⭐专栏内容:零基础学Java个人博客系统

项目部署视频

https://www.bilibili.com/video/BV1sg4y1A7Kv/?vd_source=dc7bf298d3c608d281c16239b3f5167b

文章目录

前言

前面我们已经把用户功能完成了,包括接入Swagger文档、代码接口调试等操作,基础的东西还是要经常的练习,接下来我们要完成博客文章的分类功能,正如我们在创建文章的时候会选择文章属于哪一类,是Java还是C还是前端等相关的文章,这个需要我们进行单独的管理,尽量减少多表的关联。

一、分页插件Pagehelper

由于分类可能比较多,我们页面不可能全部展示出来,所以我们要使用数据分页,目的就是使数据不全部展示出来,影响页面的美观和布局,分页重要的就是第几页和一页展示几条数据的展示由于我们使用的是Mybatis所以我们来借助它的分页插件来完成分页,首先要将分页插件引入到我们项目中。

官方网址:https://github.com/pagehelper/Mybatis-PageHelper/blob/master/README_zh.md


1、引入依赖

我们把下面的依赖复制到pom.xml文件中添加依赖,别忘了刷新Maven

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.4.0</version>
</dependency>

如果下载不下来的话还可以手动下载jar包进行引入。

你可以从下面的地址中下载最新版本的 jar 包

https://oss.sonatype.org/content/repositories/releases/com/github/pagehelper/pagehelper/

https://repo1.maven.org/maven2/com/github/pagehelper/pagehelper/

由于使用了sql 解析工具,你还需要下载 jsqlparser.jar(需要和PageHelper 依赖的版本一致) :

https://repo1.maven.org/maven2/com/github/jsqlparser/jsqlparser/

2、配置分页插件

然后到我们的配置文件application.yml中添加分页插件的配置。

pagehelper:
    helperDialect: mysql
    reasonable: true
    supportMethodsArguments: true
    params: count=countSql

现在我们就可以在我们的项目中使用了。

3、分页请求类封装

我们将这个请求的类进行封装,因为这个是公共的分页请求,在以后的功能中还会用到,所以我们将请求类进行分装,这个是前端给我们传过来的参数,一共就两个属性,一个是页数,另一个是一页的数量。

我们在工具包config包中再建一个page包,然后把分页的类放在这个page包中。

新建一个请求类:PageRequest.java

package com.blog.personalblog.util;
import lombok.Data;
/**
 * 分页请求
 *
 * @author: SuperMan
 * @create: 2021-11-22
 */
@Data
public class PageRequest {
    /**
     * 页码
     */
    private int pageNum;
    /**
     * 每页的数据条数
     */
    private int pageSize;
}

4、分页返回类封装

我们在page包下再建一个返回类,主要放我们分页查询返回的数据。

新建一个分页返回类:PageResult.java

package com.blog.personalblog.config.page;
import lombok.Data;
import java.util.List;
/**
 * 分页返回类
 * 
 * @author: SuperMan
 * @create: 2021-11-22
 */
@Data
public class PageResult {
    /**
     * 当前页码
     */
    private int pageNum;
    /**
     * 每页数量
     */
    private int pageSize;
    /**
     * 记录总数
     */
    private long totalSize;
    /**
     * 页码总数
     */
    private int totalPages;
    /**
     * 存放返回数据
     */
    private List<?> result;
}

二、分类功能代码实现

总的添加的类如下:


1、添加实体类

首先新建一个分类的实体类为:Category.java类,代码和数据库字段对应即可。

package com.blog.personalblog.entity;
import lombok.Data;
import java.time.LocalDateTime;
/**
 * 博客分类
 *
 * @author: SuperMan
 * @create: 2021-11-21
 */
@Data
public class Category {
    /**
     * 主键id
     */
    private Integer categoryId;
    /**
     * 分类名称
     */
    private String categoryName;
    /**
     * 创建时间
     */
    private LocalDateTime createTime;
    /**
     * 更新时间
     */
    private LocalDateTime updateTime;
}

2、添加业务接口

和用户的一样,在我们创建的service包中,创建一个CategoryService.java类,具体干嘛的可以去看用户实现的那一篇,我这里不再多说,现在主要是多写代码。

package com.blog.personalblog.service;
import com.blog.personalblog.entity.Category;
import com.blog.personalblog.config.page.PageRequest;
import java.util.List;
/**
 * 博客分类实现接口
 *
 * @author: SuperMan
 * @create: 2021-11-21
 */
public interface CategoryService {
    /**
     * 获取所有的分类(分页)
     * @return
     */
    List<Category> getCategoryPage(PageRequest pageRequest);
    /**
     * 新建分类
     * @param category
     * @return
     */
    int saveCategory(Category category);
    /**
     * 修改分类
     * @param category
     * @return
     */
    int updateCategory(Category category);
    /**
     * 删除分类
     * @param categoryId
     */
    void deleteCategory(Integer categoryId);
    /**
     * 根据分类id查找分类
     * @param categoryId
     * @return
     */
    Category findById(Integer categoryId);
}

3、添加业务接口实现类

然后和用户一样,在Impl包中新建一个接口的实现类为CategoryServiceImpl.java,主要实现的分类管理的增删改查等操作。基本上和用户表的一样就是查询是分页查询要注意。

package com.blog.personalblog.service.Impl;
import com.blog.personalblog.entity.Category;
import com.blog.personalblog.mapper.CategoryMapper;
import com.blog.personalblog.service.CategoryService;
import com.blog.personalblog.config.page.PageRequest;
import com.github.pagehelper.PageHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
 * 博客分类实现类
 *
 * @author: SuperMan
 * @create: 2021-11-21
 */
@Service
public class CategoryServiceImpl implements CategoryService {
    @Autowired
    CategoryMapper categoryMapper;
    @Override
    public List<Category> getCategoryPage(PageRequest pageRequest) {
        int pageNum = pageRequest.getPageNum();
        int pageSize = pageRequest.getPageSize();
        PageHelper.startPage(pageNum,pageSize);
        List<Category> categoryList = categoryMapper.getCategoryPage();
        return categoryList;
    }
    @Override
    public int saveCategory(Category category) {
        return categoryMapper.create(category);
    }
    @Override
    public int updateCategory(Category category) {
        return categoryMapper.update(category);
    }
    @Override
    public void deleteCategory(Integer categoryId) {
        categoryMapper.delete(categoryId);
    }
    @Override
    public Category findById(Integer categoryId) {
        Category category = categoryMapper.getById(categoryId);
        if (category == null) {
            return null;
        }
        return category;
    }
}

这个里面重点就是分页的接口实现,通过我们前端传过来的两个值,使用PageHelper插件进行分页。不懂得可以去官方文档看看。

4、数据库查询接口实现

紧接着我们在mapper包中新建一个分类的mapper。

CategoryMapper.java

package com.blog.personalblog.mapper;
import com.blog.personalblog.entity.Category;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
 * 博客分类数据接口
 *
 * @author: SuperMan
 * @create: 2021-11-21
 */
@Repository
public interface CategoryMapper {
    /**
     * 创建
     * @param category
     * @return
     */
    int create(Category category);
    /**
     * 修改
     * @param category
     * @return
     */
    int update(Category category);
    /**
     * 分类列表(分页)
     * @return
     */
    List<Category> getCategoryPage();
    /**
     * 删除
     * @param id
     */
    void delete(Integer id);
    /**
     * 根据id查找分类
     * @param id
     * @return
     */
    Category getById(Integer id);
}

5、编写数据库xml

我们在resources文件下的mapper文件夹中新建一个CategoryMapper.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="com.blog.personalblog.mapper.CategoryMapper">
    <resultMap id="BaseResultMap" type="com.blog.personalblog.entity.Category">
        <result column="category_id" jdbcType="INTEGER" property="categoryId"/>
        <result column="category_name" jdbcType="VARCHAR" property="categoryName"/>
        <result column="create_time" jdbcType="TIMESTAMP" property="createTime"/>
        <result column="update_time" jdbcType="TIMESTAMP" property="updateTime"/>
    </resultMap>
    <select id="getCategoryPage" resultMap="BaseResultMap">
        select * from person_category
    </select>
    <insert id="create" parameterType="com.blog.personalblog.entity.Category" useGeneratedKeys="true" keyProperty="categoryId">
        INSERT INTO person_category (category_name)
        VALUES(#{categoryName})
    </insert>
    <update id="update" parameterType="com.blog.personalblog.entity.Category">
        update person_category
        <set>
            category_name = #{categoryName}
        </set>
        WHERE category_id = #{categoryId}
    </update>
    <delete id="delete" parameterType="java.lang.Integer">
        delete from person_category where category_id = #{categoryId, jdbcType=INTEGER}
    </delete>
    <select id="getById" resultType="com.blog.personalblog.entity.Category">
        select category_id from person_category where category_id = #{categoryId}
    </select>
</mapper>

6、编写接口层

最后写我们的controller层,这里我们先对分页返回的数据进行处理一下,我们在util包中新建一个分页工具为:PageUtil.java

package com.blog.personalblog.util;
import com.blog.personalblog.config.page.PageRequest;
import com.blog.personalblog.config.page.PageResult;
import com.github.pagehelper.PageInfo;
/**
 * 分页工具类
 *
 * @author: SuperMan
 * @create: 2021-11-22
 */
public class PageUtil {
    /**
     *  分页信息封装
     * @param pageRequest
     * @param pageInfo
     * @return
     */
    public static PageResult getPageResult(PageRequest pageRequest, PageInfo<?> pageInfo){
        PageResult pageResult = new PageResult();
        pageResult.setPageNum(pageInfo.getPageNum());
        pageResult.setPageSize(pageInfo.getPageSize());
        pageResult.setTotalSize(pageInfo.getTotal());
        pageResult.setTotalPages(pageInfo.getPages());
        pageResult.setResult(pageInfo.getList());
        return pageResult;
    }
}

这个主要是把返回的数据都封装到PageResult返回类中,里面含有分页的信息和数据列表。

接下来编写我们的controller,基本上和用户的一样,除了分页的列表。别忘了加上Swagger接口。

package com.blog.personalblog.controller;
import com.blog.personalblog.entity.Category;
import com.blog.personalblog.service.CategoryService;
import com.blog.personalblog.util.JsonResult;
import com.blog.personalblog.config.page.PageRequest;
import com.blog.personalblog.config.page.PageResult;
import com.blog.personalblog.util.PageUtil;
import com.github.pagehelper.PageInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.List;
/**
 * 分类管理接口
 * 
 * @author: SuperMan
 * @create: 2021-11-21
 */
@Api(tags = "分类管理")
@RestController
@RequestMapping("/category")
public class CategoryController {
    @Autowired
    CategoryService categoryService;
    /**
     * 分页查询列表
     * @param pageRequest
     * @return
     */
    @PostMapping("list")
    public JsonResult<Object> listPage(@RequestBody @Valid PageRequest pageRequest) {
        List<Category> categoryList = categoryService.getCategoryPage(pageRequest);
        PageInfo pageInfo = new PageInfo(categoryList);
        PageResult pageResult = PageUtil.getPageResult(pageRequest, pageInfo);
        return JsonResult.success(pageResult);
    }
    /**
     * 添加分类
     * @return
     */
    @ApiOperation(value = "添加分类")
    @PostMapping("/create")
    public JsonResult<Object> categoryCreate(@RequestBody @Valid Category category) {
        int isStatus = categoryService.saveCategory(category);
        if (isStatus == 0) {
            return JsonResult.error("添加分类失败");
        }
        return JsonResult.success();
    }
    /**
     * 修改分类
     * @return
     */
    @ApiOperation(value = "修改分类")
    @PostMapping("/update")
    public JsonResult<Object> categoryUpdate(@RequestBody @Valid Category category) {
        int isStatus = categoryService.updateCategory(category);
        if (isStatus == 0) {
            return JsonResult.error("修改分类失败");
        }
        return JsonResult.success();
    }
    /**
     * 删除
     * @return
     */
    @ApiOperation(value = "删除分类")
    @PostMapping("/delete/{id}")
    public JsonResult<Object> categoryDelete(@PathVariable(value = "id") int id) {
        categoryService.deleteCategory(id);
        return JsonResult.success();
    }
}

三、测试

分类功能功能已经实现,接下来大家可以自己用postman进行测试这四个接口是否有错误,和用户的基本一致。

这里我只说明一下查询的接口,我们需要传入两个参数。大家多添加几条分类进行分页测试。好啦,这一篇就到这里了,文章分类功能已经基本上完成。添加、修改、删除留给大家自己测一测。麻烦大家给点点赞啊!来点动力哈哈

目录
相关文章
|
1月前
|
Cloud Native Java C++
Springboot3新特性:开发第一个 GraalVM 本机应用程序(完整教程)
文章介绍如何在Spring Boot 3中利用GraalVM将Java应用程序编译成独立的本机二进制文件,从而提高启动速度、减少内存占用,并实现不依赖JVM运行。
179 1
Springboot3新特性:开发第一个 GraalVM 本机应用程序(完整教程)
|
1月前
|
前端开发 Java 数据安全/隐私保护
用户登录前后端开发(一个简单完整的小项目)——SpringBoot与session验证(带前后端源码)全方位全流程超详细教程
文章通过一个简单的SpringBoot项目,详细介绍了前后端如何实现用户登录功能,包括前端登录页面的创建、后端登录逻辑的处理、使用session验证用户身份以及获取已登录用户信息的方法。
162 2
用户登录前后端开发(一个简单完整的小项目)——SpringBoot与session验证(带前后端源码)全方位全流程超详细教程
|
1月前
|
Java API Apache
Springboot+shiro,完整教程,带你学会shiro
这篇文章提供了一个完整的Apache Shiro与Spring Boot结合使用的教程,包括Shiro的配置、使用以及在非Web和Web环境中进行身份验证和授权的示例。
64 2
Springboot+shiro,完整教程,带你学会shiro
|
1月前
|
前端开发 Java Apache
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
本文详细讲解了如何整合Apache Shiro与Spring Boot项目,包括数据库准备、项目配置、实体类、Mapper、Service、Controller的创建和配置,以及Shiro的配置和使用。
281 1
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
|
1月前
|
缓存 NoSQL Java
springboot的缓存和redis缓存,入门级别教程
本文介绍了Spring Boot中的缓存机制,包括使用默认的JVM缓存和集成Redis缓存,以及如何配置和使用缓存来提高应用程序性能。
93 1
springboot的缓存和redis缓存,入门级别教程
|
21天前
|
JSON Java Maven
实现Java Spring Boot FCM推送教程
本指南介绍了如何在Spring Boot项目中集成Firebase云消息服务(FCM),包括创建项目、添加依赖、配置服务账户密钥、编写推送服务类以及发送消息等步骤,帮助开发者快速实现推送通知功能。
53 2
|
2月前
|
JavaScript Java 关系型数据库
毕设项目&课程设计&毕设项目:基于springboot+vue实现的在线考试系统(含教程&源码&数据库数据)
本文介绍了一个基于Spring Boot和Vue.js实现的在线考试系统。随着在线教育的发展,在线考试系统的重要性日益凸显。该系统不仅能提高教学效率,减轻教师负担,还为学生提供了灵活便捷的考试方式。技术栈包括Spring Boot、Vue.js、Element-UI等,支持多种角色登录,具备考试管理、题库管理、成绩查询等功能。系统采用前后端分离架构,具备高性能和扩展性,未来可进一步优化并引入AI技术提升智能化水平。
毕设项目&课程设计&毕设项目:基于springboot+vue实现的在线考试系统(含教程&源码&数据库数据)
|
2月前
|
Java 关系型数据库 MySQL
毕设项目&课程设计&毕设项目:springboot+jsp实现的房屋租租赁系统(含教程&源码&数据库数据)
本文介绍了一款基于Spring Boot和JSP技术的房屋租赁系统,旨在通过自动化和信息化手段提升房屋管理效率,优化租户体验。系统采用JDK 1.8、Maven 3.6、MySQL 8.0、JSP、Layui和Spring Boot 2.0等技术栈,实现了高效的房源管理和便捷的租户服务。通过该系统,房东可以轻松管理房源,租户可以快速找到合适的住所,双方都能享受数字化带来的便利。未来,系统将持续优化升级,提供更多完善的服务。
毕设项目&课程设计&毕设项目:springboot+jsp实现的房屋租租赁系统(含教程&源码&数据库数据)
|
2月前
|
XML JavaScript Java
Spring Retry 教程
Spring Retry 是 Spring 提供的用于处理方法重试的库,通过 AOP 提供声明式重试机制,不侵入业务逻辑代码。主要步骤包括:添加依赖、启用重试机制、设置重试策略(如异常类型、重试次数、延迟策略等),并可定义重试失败后的回调方法。适用于因瞬时故障导致的操作失败场景。
Spring Retry 教程
|
1月前
|
数据采集 监控 Java
SpringBoot日志全方位超详细手把手教程,零基础可学习 日志如何配置及SLF4J的使用......
本文是关于SpringBoot日志的详细教程,涵盖日志的定义、用途、SLF4J框架的使用、日志级别、持久化、文件分割及格式配置等内容。
120 0
SpringBoot日志全方位超详细手把手教程,零基础可学习 日志如何配置及SLF4J的使用......

热门文章

最新文章