[记录七] Vue(全家桶)+node+koa2+mysql+nginx+redis,博客全栈项目之node后台部分接口编写

导语:

暑假在家闲着无事,就琢磨着做一个web博客练练手,现在已经做完了,把过程分享出来给大家看看,分享一下学习经验。这是第五篇,开始编写后台接口,为前端接口提供提供基础,主要讲博客,用户接口。

微信搜索 【web小馆】,回复 ”全栈博客项目“,即可获取 项目源码和后续的实战文章教程

一,用户接口

1,退出登陆

 router.post('/logout', async (ctx) => {
  try {
  // 将登录信息清空
  if (ctx.session.username&&ctx.session.realname) {
    ctx.session = null
    ctx.body = {code: 1, message: '退出成果'}
    } else {
    ctx.body = {code: 0, message: '未登陆'}
    // 跳转到登录页
    // ctx.response.redirect('/login') 
    }
  // 跳转到登录页或网站首页
  } catch(err) {
  throw new Error(err)
  }
 })

根据ctx里面是否有用户的session信息来判断有没有登陆,如果有登录就把session的信息重置掉,并且返回用户退出登陆成功。

2,用户修改名字


router.post('/updata/name', async function (ctx, next) {
  const { name } = ctx.request.body
  let username = ctx.session.username       //获取操作的对象的账户
  const data = await updataname(username, name)
  //console.log(data.username)
  if (data) {
    ctx.body = new SuccessModel(name,'修改成功')
    return 
  }
  ctx.body = new ErrorModel('修改失败')
})

通过前端表单的上传,我们后台拿到了新的名字,然后对ctx里面的用户对象进行操作,执行sql语句从而把数据库里面的名字也给改成最新的名字。

3,修改用户的头像

//更换用户的头像
router.post("/updata/avatar", async (ctx) => {
  // 上传单个文件
  let {body:getBody,files} = ctx.request
  // const file = ctx.request.files.file; // 获取上传文件
  // 创建可读流
  if (files) {
    const reader = fs.createReadStream(files.file.path);
    const basename = path.basename(files.file.path)
    let filePath = path.join(__dirname, '../','public/images') + `/${basename}`;
    // 创建可写流
    const upStream = fs.createWriteStream(filePath);
    // 可读流通过管道写入可写流
    reader.pipe(upStream);
    if (env === 'env') {
      avatar_url = `${ctx.origin}:8000/api/file/avatar?pic=${basename}`
    } else {
      avatar_url = `http://47.112.***.***:80/api/file/avatar?pic=${basename}`
    }
    
    getBody = {...getBody, avatar_url}

    //进行对新头像的存入数据库的操作
    let username = ctx.session.username       //获取操作的对象的账户
    
    //
    const data = await updataavatar(username, avatar_url)
  }
  ctx.body = new SuccessModel(getBody)
})

这里首先要明确的是,所有文件的上传都是将文件上传到对应服务器(电脑的特定文件夹)中,然后把能够返回该文件的操作字符串(可以是一个接口,也可以是文件的位置)写入到数据库中,下次想要访问这个文件直接可以在数据库中找到对应的位置,然后再通过接口调用,放回到前端页面中。

二,博客接口

1,查看博客列表


router.get('/list', async function (ctx, next) {
    let lei = ctx.query.lei || ''
    const keyword = ctx.query.keyword || ''
    // console.log(ctx.query) 
    let num = ctx.query.num
    // console.log(ctx.session)
    let listData = await getList(lei, keyword, num)
    let moreData = await getList(lei, keyword , num + 10)

    let more
    // console.log(more.length)
    if (moreData.length > 0) {
      more = 'true'
    } else {
      more = 'false'
    }
    ctx.body = new SuccessModel(listData,more)
})

可以通过模糊查找,也可以返回整个博客列表,顺便查询一下有没有更多的博客,我们这里写了每次下拉刷新10条博客,并且返回是否还有博客,如果有就返回true,否则就false。

2,博客详情


router.get('/detail', async function (ctx, next) {
  const data = await getDetail(ctx.query.id)
  // console.log(data)
  if (data == null) {
    ctx.body = new ErrorModel(data)
    return
  }
  ctx.body = new SuccessModel(data)
})

将数据库里面的对应博客详情数据全部拿出来,返回给前端,这里是通过文章的id进行筛选的。

3,阅读量点击增加

router.get('/addhit', async function (ctx, next) {
  // console.log(ctx.query.id, ctx.query.num)
  const data = await addHit(ctx.query.id, ctx.query.num)
  
  // console.log(data)
  if (data == null) {
    ctx.body = new ErrorModel(data)
    return
  }
  ctx.body = new SuccessModel(data)
})

点击后对应文章的阅读量就会加一,同样是通过文章的id进行辨别的。

4,点赞

router.get('/addgood', async function (ctx, next) {
  // console.log(ctx.query.id, ctx.query.num)
  const data = await addGood(ctx.query.id, ctx.query.num)
  data.user = await infogood(ctx.query.idstr,ctx.session.username)   //做到要开始对用户的good
  // console.log(data)
  if (data == null) {
    ctx.body = new ErrorModel(data)
    return
  }
  ctx.body = new SuccessModel(data)
})

对对应文章的总赞数进行加一并且写入数据库中,然后对用户的点赞数据进行更新,同样是写入数据库中。

5,收藏

router.get('/addlike', async function (ctx, next) {
  // console.log(ctx.query.id, ctx.query.num)
  let data = await addLike(ctx.query.id, ctx.query.num)
  data.user = await infolike(ctx.query.idstr,ctx.session.username)   //做到要开始对用户的like
  // console.log(data)
  if (data == null) {
    ctx.body = new ErrorModel(data)
    return
  }
  ctx.body = new SuccessModel(data)
})

对对应文章的总收藏数进行加一并且写入数据库中,然后对用户的收藏数据进行更新,同样是写入数据库中。

6,取消点赞和取消收藏


router.get('/sublike', async function (ctx, next) {
  // console.log(ctx.query.id, ctx.query.num)
  let data = await subLike(ctx.query.id, ctx.query.num)
  data.user = await infolike(ctx.query.idstr,ctx.session.username)   //做到要开始对用户的like
  // console.log(data)
  if (data == null) {
    ctx.body = new ErrorModel(data)
    return
  }
  ctx.body = new SuccessModel(data)
})

router.get('/subgood', async function (ctx, next) {
  // console.log(ctx.query.id, ctx.query.num)
  let data = await subGood(ctx.query.id, ctx.query.num)
  data.user = await infogood(ctx.query.idstr,ctx.session.username)   //做到要开始对用户的like
  // console.log(data)
  if (data == null) {
    ctx.body = new ErrorModel(data)
    return
  }
  ctx.body = new SuccessModel(data)
})

对对应文章的总赞和收藏数进行减一并且写入数据库中,然后对用户的赞和收藏数据进行更新,同样是写入数据库中。

7,获取文章评论功能

router.get('/comments', async function (ctx, next) {
  const data = await getComment(ctx.query.id)

  // console.log(data)
  if (data == null) {
    ctx.body = new ErrorModel(data)
    return
  }
  ctx.body = new SuccessModel(data)
})

把对应文章的用户评论json数据进行返回到前端,前端拿到数据后就在页面上的评论框中显示出来。

8,用户评论文章

router.post('/postcomments', async function (ctx, next) {
  const { comments, id } = ctx.request.body
  // console.log(comments, id)
  const data = await postComment(comments, id)
  // console.log(data)
  if (data == null) {
    ctx.body = new ErrorModel(data)
    return
  }
  ctx.body = new SuccessModel(data)
})

通过表单提交,获取用户的评论信息,以及文章的id,将信息通过sql语句写入到数据库中。

在这里插入图片描述

你们的赞就是对我最大的鼓励。谢谢~

在这里插入图片描述
微信搜索【web小馆】,回复全栈博客项目,即可获取项目源码和后续的实战文章教程。每天用最简单朴实的语言,潜移默化的提升你的计算机基础知识和前端技术。小米粥,一个专注的web全栈工程师,我们下期再见!

在这里插入图片描述
node后台

猜你喜欢

转载自blog.csdn.net/gitchatxiaomi/article/details/108229129
今日推荐