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

184 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第12天,点击查看活动详情

前言

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

最近我打算写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: "",
        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>

以上的代码没有什么好介绍的了,我们已经写了好几遍了,如果有报错看一下浏览器控制台有什么错误,自己修改一下就好了。

image.png

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查找文章我忘了当时给没给你们写了,如果你没有写的话,将文章拉到最后,我已经更新到了仓库,前后端的项目都已经是最新的代码了。