react 项目--博客系统 ( 21 )

Loading......

接上一篇文章后开始实现文章管理器;

文章控制器:

  • 创建文章
  • 获取文章
    • 获取单个文章
    • 获取该用户关注的所有文章
    • 获取多个文章(全局文章)
  • 更新文章
  • 删除文章

首先实现创建文章

思路:

  • 获取请求数据
  • 获取内容验证
  • 获取作者信息
  • 创建文章
    • 生成文章别名
  • 存储数据
    • 存储文章和标签
  • 返回数据
    • 优化标签、优化作者
    • 返回文章、标签、作者数据

具体实现:

在 controller 和 routes 中创建文件 articles.js ;

按照思路在 controller 下的 articles.js 中逐步实现;(具体代码内容在尾部附有

 在 routes 中的 articles.js 完成路由的相关配置 ;

 之后在 initRoute.js 中添加访问地址;

 在工具栏创建文章创建验证;

 在终端输入 npm i unique-slug  安装 slug 库,并在工具栏 utils 中的 slug.js 中引入库;

验证:

在终端启动服务 npm run dev ,利用 postman 进行验证;

验证时注意 token 值是当前登录用户返回的 token 值 ;

详细代码:

controller / articles.js:

const HttpException = require("../exceptions/http_expetion");
const { validateCreateArticle } = require("../utils/validate/article_validate");
const Article = require("../models/article");
const User = require("../models/user");
const { getSlug } = require("../utils/slug");
const Tag = require("../models/tag");

//创建文章
module.exports.createArticle = async (req, res, next) => {
  try {
    //获取请求数据
    const { title, description, body, tags } = req.body.article
    //获取内容验证
    let { error, validate } = validateCreateArticle(title, description, body)
    if (!validate) {
      throw new HttpException(401, '文章内容不存在!!!', error)
    }
    //获取作者信息
    const { email } = req.user
    const author = await User.findByPk(email)
    if (!author) {
      throw new HttpException(401, '作者账号不存在!!!', 'author is not found!!!')
    }
    //创建文章
    //  生成文章别名
    let slug = getSlug()
    //  存储数据:
    let article = await Article.create({
      slug,
      title,
      description,
      body,
      UserEmail: author.email
    })
    //存储文章和标签的处理
    //  自定义
    //  数据库已有
    if (tags) {
      for (const i of tags) {
        let existTag = await Tag.findByPk(i)
        let newTag
        if (!existTag) {
          newTag = await Tag.create({ name: i })
          await article.addTag(newTag)
        } else {
          await article.addTag(existTag)
        }
      }
    }

    //返回数据 (文章、标签、作者)
    article = await Article.findByPk(slug, { include: Tag }) //追加标签

    //标签优化
    const newTags = []
    for (const i of article.dataValues.tags) {
      newTags.push(i.name)
    }
    article.dataValues.tags = newTags

    //作者优化
    delete author.dataValues.password
    delete author.dataValues.email
    article.dataValues.author = author

    res.status(201)
      .json({
        status: 1,
        message: '创建文章成功!!!',
        data: article.dataValues
      })
  } catch (err) {
    next(err);
  }
};


//获取文章:获取单个
module.exports.getArticle = async (req, res, next) => {
  try {

  } catch (err) {
    next(err);
  }
};


//获取文章:获取关注作者的多个文章
module.exports.getFollowArticle = async (req, res, next) => {
  try {

  } catch (err) {
    next(err);
  }
};


//获取文章:获取全局文章
module.exports.getArticles = async (req, res, next) => {
  try {

  } catch (err) {
    next(err);
  }
};


//更新文章
module.exports.updateArticles = async (req, res, next) => {
  try {

  } catch (err) {
    next(err);
  }
};


//删除文章
module.exports.deleteArticles = async (req, res, next) => {
  try {

  } catch (err) {
    next(err);
  }
};


routes / articles.js:

const express = require("express");
const router = express.Router()
const {authMiddleware} = require('../middleware/admin/auth_middleware')

const ArticlesController = require('../controller/articles')


router.get('/:slug',authMiddleware,ArticlesController.getArticle)
router.get('/follow',authMiddleware,ArticlesController.getFollowArticle)
router.get('/',authMiddleware,ArticlesController.getArticles)

router.post('/',authMiddleware,ArticlesController.createArticle)

router.put('/',authMiddleware,ArticlesController.updateArticles)
router.delete('/',authMiddleware,ArticlesController.deleteArticles)


module.exports = router

initRoute.js:

const userRoute = require('../routes/users')
const followRoute = require('../routes/follow')
const tagRoute = require('../routes/tags')
const articleRoute = require('../routes/articles')

const initRoute = (app)=>{
    app.use('/api/v1/users',userRoute)
    app.use('/api/v1/follow',followRoute)
    app.use('/api/v1/tags',tagRoute)
    app.use('/api/v1/articles',articleRoute)
}

module.exports = initRoute

utils / validate / article_validate.js :

const validator = require('validator')

//文章创建验证
module .exports.validateCreateArticle = (title,description,body)=>{
    let err = {}

    if(validator.isEmpty(title)){
        err.title = '文章标题不能为空 !!!'
    }
    if(validator.isEmpty(description)){
        err.description = '文章描述不能为空 !!!'
    }
    if(validator.isEmpty(body)){
        err.body = '文章内容不能为空 !!!'
    }

    let validate = Object.keys(err).length < 1

    return {err,validate}
}

utils / slug.js :

const uniqueSlug = require('unique-slug')

module.exports.getSlug =()=>{
    let radomSlug = uniqueSlug()
    return radomSlug
}

未完待续......

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值