导语:
暑假在家闲着无事,就琢磨着做一个web博客练练手,现在已经做完了,把过程分享出来给大家看看,分享一下学习经验。这是第五篇,开始编写后台接口,为前端接口提供提供基础,主要讲博客,用户接口。
微信搜索 【web小馆】,回复 ”全栈博客项目“,即可获取 项目源码和后续的实战文章教程。
本文的目录
- 一,用户接口
- 1,退出登陆
- 2,用户修改名字
- 3,修改用户的头像
- 二,博客接口
- 1,查看博客列表
- 2,博客详情
- 3,阅读量点击增加
- 4,点赞
- 5,收藏
- 6,取消点赞和取消收藏
- 7,获取文章评论功能
- 8,用户评论文章
一,用户接口
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小馆】,回复全栈博客项目,即可获取项目源码和后续的实战文章教程。每天用最简单朴实的语言,潜移默化的提升你的计算机基础知识和前端技术。小米粥,一个专注的web全栈工程师,我们下期再见!