You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

169 lines
4.2 KiB
JavaScript

7 months ago
const express = require('express')
const router = express.Router()
const {Article} = require('../../models')
const {or, Model} = require("sequelize");
const { Op } = require('sequelize');
const {
NotFoundError,
success,
failure
} = require('../../utils/response');
/**
* 公共方法白名单过滤
* @param req
* @returns {{title, content: (string|string|DocumentFragment|*)}}
*/
function filterBody(req) {
return {
title: req.body.title,
content: req.body.content
};
}
/**
* 公共方法查询当前文章
*/
async function getArticle(req) {
// 获取文章 ID
const { id } = req.params;
// 查询当前文章
const article = await Article.findByPk(id);
// 如果没有找到,就抛出异常
if (!article) {
throw new NotFoundError(`ID: ${ id }的文章未找到。`)
}
return article;
}
/**
* 查询文章列表
*/
/**
* 查询文章列表
* GET /admin/articles
*/
router.get('/', async function (req, res) {
try {
// 获取查询参数
const query = req.query;
// 获取分页所需要的两个参数currentPage 和 pageSize
// 如果没有传递这两个参数,就使用默认值
// 默认是第1页
// 默认每页显示 10 条数据
const currentPage = Math.abs(Number(query.currentPage)) || 1;
const pageSize = Math.abs(Number(query.pageSize)) || 10;
// 计算offset
const offset = (currentPage - 1) * pageSize;
// 定义查询条件
const condition = {
order: [['id', 'DESC']],
// 在查询条件中添加 limit 和 offset
limit: pageSize,
offset: offset
};
// 如果有 title 查询参数,就添加到 where 条件中
if (query.title) {
condition.where = {
title: {
[Op.like]: `%${query.title}%`
}
};
}
// 查询数据
// 将 findAll 方法改为 findAndCountAll 方法
// findAndCountAll 方法会返回一个对象,对象中有两个属性,一个是 count一个是 rows
// count 是查询到的数据的总数rows 中才是查询到的数据
const { count, rows } = await Article.findAndCountAll(condition);
// 查询文章列表
success(res, '查询文章列表成功。', {
articles: rows,
pagination: {
total: count,
currentPage,
pageSize,
}
});
} catch (error) {
failure(res, error);
}
});
/**
* 查询文章详情
*/
router.get('/:id', async (req, res) => {
try {
const article = await getArticle(req);
// 查询文章详情
success(res, '查询文章成功。', { article });
}catch (error){
failure(res, error);
}
})
/**
* 创建文章
* POST /admin/articles
*/
router.post('/', async function (req, res) {
try {
// 白名单过滤
const body = filterBody(req);
// 使用 req.body 获取到用户通过 POST 提交的数据,然后创建文章
const article = await Article.create(body);
// 创建文章注意这里状态码是201
success(res, '创建文章成功。', { article }, 201);
} catch (error) {
failure(res, error);
}
});
/**
* 删除文章
* DELETE /admin/articles/:id
*/
router.delete('/:id', async function (req, res) {
try {
const article = await getArticle(req);
// 删除文章
await article.destroy();
// 删除文章。文章已经被删掉了,不存在了,所以不需要传 data
success(res, '删除文章成功。');
} catch (error) {
failure(res, error);
}
});
/**
* 更新文章
* PUT /admin/articles/:id
*/
router.put('/:id', async function (req, res) {
try {
const article = await getArticle(req);
// 白名单过滤
const body = filterBody(req);
await article.update(body);
// 更新文章
success(res, '更新文章成功。', { article });
} catch (error) {
failure(res, error);
}
});
module.exports = router