当登录完成之后,我们需要实现一个文章分类的路由,里面含有获取文章路由(根据名称和别名)、添加文章分类、删除文章分类、添加文章分类(根据id参数)、文章分类更新路由;
//15.1 创建一个文章分类路由
const express = require('express')
const router = express.Router()
//15.5 导入文章路由处理模块
const articate_handler = require('../Touters-harder/articate')
//16.5 导入验证对象与执行对象
const expressJoi = require('@escook/express-joi')
const {articate_scheml,deletearticle_scheml,getarticle_scheml,updataarticle_scheml} = require('../scheml/articate')
//15.2 创建获取文章分类的路由
router.get('/getarticle',articate_handler.article_get)
//16.1 创建添加文章分类的路由
router.post('/addcates',expressJoi(articate_scheml),articate_handler.addcates)
//17.1 创建删除文章分类的路由
router.get('/deletearticle/:id',expressJoi(deletearticle_scheml),articate_handler.deletearticle)
//18.1 创建获取文章分类的路由
router.get('/cates/:id',expressJoi(getarticle_scheml),articate_handler.getarticlebyid)
//19.1 创建文章更新的路由
router.post('/updatecate',expressJoi(updataarticle_scheml),articate_handler.updatearticlebyid)
//15.3 向外暴露路由
module.exports = router
在此之前,我们需要创建一张文章分类的表:
这张表含有id、name、alias、is_delete四个列,最后一个列的意思就是标记是否删除的的作用,当我们需要删除这个记录的时候,我们就只需要将is_delete这个列设置为1,默认是0的;
这个路由需要我们需要新建我们找到Router文件夹,然后新建一个文件,名为articate.js,里面就存放这我们的路由代码,向外暴露这个路由模块,然后在服务器模块中挂载这个路由:
/1.2 我们将路由模块挂载到我们的服务器上
app.use('/api',router)
app.use('/my',router2)
app.use('/my/article',router3)
别看路由接口这么多,其实都是一个套路,和之前一样,我们需要到验证模块和路由函数执行模块同样新建一个articate.js,里面存放着我们需要的对象,有验证对象和路由函数执行对象,他们已经都在路由模块中进行了导入,那么这一期就从获取文章分类开始吧:
1、通过name和alias获取数据:
//15.8 导入数据库模块
const db = require('../Db/index')
//15.6 编写获取文章函数
exports.article_get = (req,res)=>{
//15.7 创建sql语句
//查询没有删除的数据
const sql = 'select * from ev_artice_cate where is_delete = 0 order by id asc'
db.query(sql,(err,results)=>{
if(err){return res.cc(err)}
if(results.rowsAffected == 0){return res.cc('获取数据失败')}
res.send({
status:200,
message:'获取数据成功',
data:results.recordset
})
})
}
当然,导入我们的数据库模块,然后编写获取文章的函数,因为是个get请求,我们需要提交name和alias,我们只能获取没有被删除的数据,使用数据库模块的query方法执行,然后在回调函数里面对数据进行响应给客户端;
2、创建添加文章分类的路由:
//16.2 编写添加文章分类函数
exports.addcates=(req,res)=>{
//16.6 编写sql语句
const sql = `select * from ev_artice_cate where name = '${req.body.name}' or alias = '${req.body.alias}'`
db.query(sql,(err,results)=>{
if(err){return res.cc(err)}
//16.7 判断是否重复的四种情况
if(results.recordset.length == 2){return res.cc('类名和别名重复')}
if(results.recordset.length == 1 && results.recordset[0].name == req.body.name
&& results.recordset[0].alias == req.body.alias){return res.cc('类名和别名重复')}
if(results.recordset.length == 1 && results.recordset[0].name == req.body.name ){return res.cc('名称重复')}
if(results.recordset.length == 1 && results.recordset[0].alias == req.body.alias){return res.cc('别名重复')}
//16.8 如果没有重复的话就可以进行数据插入了
const sql2 = `insert into ev_artice_cate values('${req.body.name}','${req.body.alias}',0)`
db.query(sql2,(err,results)=>{
if(err){return res.cc(err)}
if(results.rowsAffected != 1){return res.cc('插入失败')}
res.cc('插入成功',200)
})
})
}
添加数据需要用户提交数据,凡是提交的表单都需要我们后端进行验证,所以我们到验证模块来创建并暴露验证模块使用到路由上,怎么使用已经说过很多遍,就是第二个参数结合执行函数使用:
//16.3 为文章分类添加数据验证
const joi = require('joi')
const name = joi.string().required()
const alias = joi.string().alphanum().required()
//17.2 创建id规则
const id = joi.number().integer().min(1).required()
//16.4 向外暴露验证对象
exports.articate_scheml={
body:{
name,
alias
}
}
这个验证对象是要求名称为字符串且是必填项,要求别名是字母、字符串、还是必填;
因为我们插入数据是不能出现有重复的,所以我们判断了四种情况,也就是名称和别名相同的两种情况,还有是其中一种相同的情况,怎么有两种名称和别名相同呢?因为我们不止一条数据,可能一条数据是和名称相同,一条是和别名相同,另外就是一条数据两者都相同;
排除上面的数据之后就可以无脑插入数据了,因为我们的id为主键且自动增长,所以不需要我们插入;
3、删除文章:
//17.2 向外暴露id对象
exports.deletearticle_scheml = {
params:{
id
}
}
因为删除文章用的是用户传入的一个id参数,所以我们的验证规则就是params的id;
//17.3 编写删除函数并且向外暴露
exports.deletearticle=(req,res)=>{
//17.4 编写sql语句进行更改
const sql = `update ev_artice_cate set is_delete = 1 where id = ${req.params.id}`
db.query(sql,(err,results)=>{
if(err){return res.cc(err)}
if(results.rowsAffected != 1){return res.cc('删除失败')}
res.cc('更新成功',200)
})
}
删除函数也很简单,就是通过update将is_delete这一项有默认值设置为1就可以;
4、根据id获取文章分类:
//18.2 向外暴露获取文章类别的id
exports.getarticle_scheml = {
params:{
id
}
}
同样,根据id获取文章路由和删除一样也是通过参数传递的id;
//18.3 编写获取文章类别的函数
exports.getarticlebyid = (req,res)=>{
//18.4 编写sql语句并且执行
const sql = `select * from ev_artice_cate where id = ${req.params.id}`
db.query(sql,(err,results)=>{
if(err){return res.cc(err)}
if(results.recordset.length != 1){return res.cc('获取数据失败')}
res.send({
status:200,
message:'获取数据成功',
data:results.recordset[0]
})
})
}
同样通过selete的where条件传入id查询即可,查到之后响应给客户端,也是无脑操作;
5、更新文章:
//19.2 向外暴露更新文章的对象
exports.updataarticle_scheml = {
body:{
id,
name,
alias
}
}
要更新的话我们需要提交一个表单,而且信息是最全的,我们需要post请求,然后将id、name、alias的验证规则都加载到接口上;
//19.3 编写更新文章类别的函数
exports.updatearticlebyid = (req,res)=>{
//19.4 编写去重复的sql并且执行
const sql = `select * from ev_artice_cate where id != ${req.body.id} and (name = '${req.body.name}' or alias = '${req.body.alias}')`
db.query(sql,(err,results)=>{
//19.5 对数据进行判断,看看是否重复
if(err){return res.cc(err)}
if(results.recordset.length == 2){return res.cc('类名和别名重复')}
if(results.recordset.length == 1 && results.recordset[0].name == req.body.name
&& results.recordset[0].alias == req.body.alias){return res.cc('类名和别名重复')}
if(results.recordset.length == 1 && results.recordset[0].name == req.body.name ){return res.cc('名称重复')}
if(results.recordset.length == 1 && results.recordset[0].alias == req.body.alias){return res.cc('别名重复')}
//19.6 更新数据即可
const sql1 = `update ev_artice_cate set name = '${req.body.name}',alias = '${req.body.alias}' where id = ${req.body.id}`
db.query(sql1,(err,results)=>{
if(err){return res.cc(err)}
if(results.rowsAffected != 1){return res.cc('更新文章分类表失败')}
res.cc('更新文章分类成功')
})
})
}
这个更新函数需要一个去重的操作,也就是不能有和用户提交数据相同的情况,我们可以用到第一个路由的方法,四种情况,复制粘贴就可以,一样的,这里的查询语句要注意一下,我们先查找不是提交id的数据,然后对我们提交的数据进行对比,如果有就报错,没有的话就可以根据id来进行update了;
好了,这一期就到这,代码有点多,但和前面的雷同,操作起来还是很简单,毕竟就是一个套路,创建路由,使用验证规则,执行路由函数,对数据库操作,没有什么新东西,不过还是很适合练手;快去试试吧!