node:<14>登录和注册案例(3)文章分类接口

当登录完成之后,我们需要实现一个文章分类的路由,里面含有获取文章路由(根据名称和别名)、添加文章分类、删除文章分类、添加文章分类(根据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了;

好了,这一期就到这,代码有点多,但和前面的雷同,操作起来还是很简单,毕竟就是一个套路,创建路由,使用验证规则,执行路由函数,对数据库操作,没有什么新东西,不过还是很适合练手;快去试试吧!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程学渣ズ

谢谢老板

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值