当前位置: 首页 > news >正文

Spring Boot + vue-element 开发个人博客项目实战教程(二十二、文章管理页面开发(1))

⭐ 作者简介:码上言


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


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

文章目录

  • 前言
  • 1、添加文章的页面
    • 1.1、基础页面编写
  • 2、添加api接口
  • 3、添加功能
    • 3.1、引入接口
    • 3.2、添加分类查询接口
    • 3.3、添加标签查询接口

前言

时隔三四个月了没更新了,差一点烂尾了,对不住各位小伙伴了现在才更新,这也是我们这个教程的最后一篇了,接下来可能还会更新一下项目的上线功能,大概会用一到两篇的文章写完,可能需要服务器,大家如果有条件的话还是要去搞一台自己的服务器,模拟真实的线上环境才能更好的学习,可以去拼夕夕买或者百度云也可以都挺便宜,四五十块钱就可以了,还是希望大家用真实的环境来学习。

最近我打算写redis的学习,各位小伙伴有需要的话可以去我的Redis从入门到实战专栏查看,有什么好的意见可以评论区告诉我或者加我好友沟通,

1、添加文章的页面

首先我们还是按照之前分类或标签的操作来写页面,我们在前端项目中新建两个文件,一个是add.vue,一个是list.vue。我们先从添加页面入手。

添加文章的业务比较复杂一些,因为里面包含了标签和分类的功能查询和保存,还涉及到图片的保存,所以比较重要,里面的知识点也比较多,我尽量将讲述清楚,大家也多多思考,有不会的可以关注下面的微信号,加我好友来一起讨论学习。

我们接下来先来写添加文章,打开前端项目,然后我们在/src/views/articles下的add.vue编写。
还是和之前添加标签或分类的一样,使用的mavon-editor编辑

1.1、基础页面编写

我们可以将分类的页面复制过来进行修改,或者自己来手动写一遍,建议自己写一遍,了解具体的编写思路。

<template>
    <el-card class="box-card">
    <!-- 设置文章管理 -->
    <div slot="header" class="clearfix">
      <span>添加文章</span>
    </div>

    <!-- 发布文章 -->
    <div class="article-title-container">
        <el-input size="medium"  v-model="article.title" placeholder="输入文章标题"/>
        <el-button type="warning" size="medium" @click="openDialog" style="margin-left:10px">保存草稿</el-button>
        <el-button type="danger" size="medium" @click="openDialog" style="margin-left:10px">发布文章</el-button>
    </div>
    <!-- 文章内容 -->
    <mavon-editor ref="md" v-model="article.content" style="height:calc(100vh - 260px)"/>

    <!-- 填写信息弹出框 -->
    <el-dialog :title="`发布文章:${article.title}`" :visible.sync="showDialog" width="30%">


      <el-form label-position="left" label-width="80px" :model="article" size="medium">
       
        <!-- 内容 -->  
      
      </el-form>

       <span slot="footer">
        <el-button @click="handleCancel">取 消</el-button>
        <el-button type="primary" @click="handleSubmit">发布</el-button>
      </span>
    </el-dialog>


 </el-card>
</template>

<script>
import { addArticle, updateArticle, getArticleById } from '@/api/article'


export default {
  name: 'Addarticle',

  created() {
    
  },

   data() {
    return {
      showDialog: false,
     
      article: {
        id: "",
        author: "",
        title: "",
        categoryId: "",
        content: "",
        categoryName: null
      }
    }
  },

  methods: {

    assertNotEmpty(target, msg) {
      if (!target) {
        this.$message({
          message: msg,
          type: "warning",
        });
        return false;
      }
      return true;
    },

     // 打开文章信息填写框
    openDialog() {
      if (
        this.assertNotEmpty(this.article.title, "请填写文章标题") &&
        this.assertNotEmpty(this.article.content, "请填写文章内容")
      ) {
        this.showDialog = true;
      }
    },

    handleSubmit() {
        this.showDialog = true;
        var body = this.article;
    },
    
    handleCancel() {
      this.showDialog = false;
    },
  }
 
}
</script>

<style rel="stylesheet/scss" lang="scss" scoped>

.article-title-container {
  display: flex;
  align-items: center;
  margin-bottom: 1.25rem;
  margin-top: 1.25rem;
}

  .box-card {
    width: 98%;
    margin: 1%;
  }
  .clearfix:before,
  .clearfix:after {
    display: table;
    content: "";
  }
  .clearfix:after {
    clear: both
  }
  .clearfix span {
    font-weight: 600;
  }

</style>

以上的代码没有什么好介绍的了,我们已经写了好几遍了,如果有报错看一下浏览器控制台有什么错误,自己修改一下就好了。
在这里插入图片描述
PS:如果左侧的导航栏没有显示这两个页面的话,你就去路由那边将这两个页面添加上即可。
以上基础的页面已经搭建好了,我们要去完成数据交互的部分。

2、添加api接口

先来添加一下后端的接口,打开/src/api文件,如果没有article.js文件则自己创建一个,然后我们打开文件,和之前的都一样,我们写一下接口。

import request from '@/utils/request'

export function articleList(query) {
    return request({
      url: '/article/list',
      method: 'post',
      data: query
    })
}

export function addArticle(data) {
  return request({
    url: '/article/create',
    method: 'post',
    data
  })
}

export function updateArticle(data) {
  return request({
    url: '/article/update',
    method: 'post',
    data
  })
}
export function deleteArticle(id) {
  return request({
    url: '/article/delete',
    method: 'post',
    params: { id }
  })
}

export function getArticleById(id){
  return request({
    url: '/article/info/' + id,
    method: 'get'
  })
}

最后的一个接口根据id查找文章我忘了当时给没给你们写了,如果你没有写的话,将文章拉到最后,我已经更新到了仓库,前后端的项目都已经是最新的代码了。

3、添加功能

准备工作已经完成,接下来我们来写实现的功能,其实重点就是弹出框里的数据交互操作比较复杂一些。

3.1、引入接口

我们先将接口引入到我们的add.vue文件中。

import { addArticle, updateArticle, getArticleById } from '@/api/article'

这里我们还会用到分类的接口,我们也先将分类的接口引入过来。

import { } from '@/api/category'

3.2、添加分类查询接口

我们还要完善一下后端的接口,我们这里添加文章的弹框需要查询全部的分类,或者根据输入的分类去查找有没有分类可供选择,所以我们要去添加一个查询分类的接口。

打开后端项目,我们先添加一个查询参数的对象,方便以后管理。

1、在bo包中新建一个CategoryBO.java

package com.blog.personalblog.bo;

import lombok.Data;

/**
* 分类查询条件
*
* @author: SuperMan
* @create: 2022-10-10
**/

@Data
    public class CategoryBO {

        /**
		 * 分类名称
		 */
        private String categoryName;
    }

2、然后我们去写接口,直接在原来的CategoryService.java中添加个接口即可

  /**
     * 搜索文章分类
     * @param bo
     * @return
     */
    List<Category> getCategoriesByName(CategoryBO bo);

3、数据查询mapper接口

	/**
     * 查询分类
     * @param bo
     * @return
     */
    List<Category> findCategoriesByName(CategoryBO bo);

4、实现分类数据库xml功能

 <select id="findCategoriesByName" parameterType="com.blog.personalblog.bo.CategoryBO" resultMap="BaseResultMap">
        select * from person_category
        <where>
            <if test="categoryName != null and companyName != ''">
                and category_name like #{companyName}
            </if>
        </where>
</select>

5、最后实现分类查询的实现类。

    @Override
    public List<Category> getCategoriesByName(CategoryBO bo) {
        List<Category> categoriesByName = categoryMapper.findCategoriesByName(bo);
        return categoriesByName;
    }

6、最后再写controller层

    /**
     * 搜索文章分类
     * @param bo
     * @return
     */
    @ApiOperation(value = "查询分类名称")
    @PostMapping("/getCategory")
    @OperationLogSys(desc = "查询分类名称", operationType = OperationType.SELECT)
    public JsonResult<Object> getCategoryByName(@RequestBody @Valid CategoryBO bo) {
        List<Category> categoriesByName = categoryService.getCategoriesByName(bo);
        return JsonResult.success(categoriesByName);
    }

写完,我们要测试一下接口通不通再去页面上去接接口,养成好的习惯。
在这里插入图片描述

3.3、添加标签查询接口

接下来还要写标签的查询接口,文章涉及到东西比较多,基本上把之前做的都整合在了一起,这是我们整个项目的重点灵活。和上边分类差不多,我们再来写一下标签。
1、在bo包中新建一个CategoryBO.java

package com.blog.personalblog.bo;

import lombok.Data;

/**
* @author: SuperMan
* @create: 2022-10-10
**/

@Data
    public class TagBO {

        /**
		 * 标签名称
		 */
        private String tagName;
    }

2、然后写接口,在原来的TagService中添加个接口即可

	/**
     * 搜索文章标签
     *
     * @param bo
     * @return
     */
    List<Tag> getTagsByTagName(TagBO bo);

3、数据查询mapper接口

	/**
     * 查询文章标签
     * @param bo
     * @return
     */
    List<Tag> findTagsByTagName(TagBO bo);

4、实现标签数据库xml功能

  <select id="findTagsByTagName" parameterType="com.blog.personalblog.bo.TagBO" resultMap="BaseResultMap">
        select * from person_tag
        <where>
            <if test="tagName != null and tagName != ''">
                and tag_name like '%${tagName}%'
            </if>
        </where>
    </select>

5、最后实现分类查询的实现类。

@Override
public List<Tag> getTagsByTagName(TagBO bo) {
   List<Tag> tagsByTagName = tagMapper.findTagsByTagName(bo);
   return tagsByTagName;
}

6、controller层

/**
* 按条件查询文章标签
* @param bo
* @return
*/
	@ApiOperation(value = "查询文章标签")
    @PostMapping("/selectTag")
    @OperationLogSys(desc = "查询文章标签", operationType = OperationType.SELECT)
    public JsonResult<Object> getTagByTagName(@RequestBody @Valid TagBO bo) {
        List<Tag> tagsByTagName = tagService.getTagsByTagName(bo);
        return JsonResult.success(tagsByTagName);
    }

7、测试接口

在这里插入图片描述
本来想一篇就写完的,但是后边还有很多功能,还有很多要写的,会导致整篇很长,不太好学习,所以我就把文章拆开了,篇幅不长方便查找。

上一篇:Spring Boot + vue-element 开发个人博客项目实战教程(二十一、个人介绍、公告管理、标签管理开发)
下一篇:Spring Boot + vue-element 开发个人博客项目实战教程(二十三、文章管理页面开发(2))

相关文章:

  • python地图库(一)—folium
  • cesium拾取pick系列(拾取坐标和对象)
  • 说一说js继承的方法和优缺点?
  • ARMv8/ARMv9的Exclusive机制深度解读
  • 机器学习——梯度下降算法
  • 64.【网络编程】
  • Python爬虫-网页认识
  • 面试官:深度不够,建议回去深挖
  • [ vulhub漏洞复现篇 ] Apache APISIX 默认密钥漏洞 CVE-2020-13945
  • 接口测试用例生成工具介绍及应用
  • C#接入 NPOI
  • 面试百问:项目上线后才发现bug怎么办?
  • SpringBoot+Vue实现前后端分离网上药店平台
  • Simulink 自动代码生成电机控制:基于Keil软件集成
  • LQ0103 子串分值【字符串】
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • Angular6错误 Service: No provider for Renderer2
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • Python学习之路16-使用API
  • Sequelize 中文文档 v4 - Getting started - 入门
  • tensorflow学习笔记3——MNIST应用篇
  • vue总结
  • yii2中session跨域名的问题
  • 闭包,sync使用细节
  • 从tcpdump抓包看TCP/IP协议
  • 分享一份非常强势的Android面试题
  • 给Prometheus造假数据的方法
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 利用jquery编写加法运算验证码
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 区块链将重新定义世界
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 如何用纯 CSS 创作一个货车 loader
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #Linux(权限管理)
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (南京观海微电子)——COF介绍
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (小白学Java)Java简介和基本配置
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .NET 8.0 中有哪些新的变化?
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • .sh文件怎么运行_创建优化的Go镜像文件以及踩过的坑
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...
  • [ 隧道技术 ] 反弹shell的集中常见方式(四)python反弹shell
  • []我的函数库
  • [20160902]rm -rf的惨案.txt