这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战
前一篇我们封装了验证权限工具,发表动态(增删改查)
今天我们做评论和回复评论功能
graph TD
评论 --> 验证登录 --> 获取要评论动态的id,用户id --> 发表评论 --> 获取当前文章下面的评论的id,然后进行评论
创建对应的表comment
CREATE TABLE IF NOT EXISTS `comment`(
id INT PRIMARY KEY AUTO_INCREMENT,
content VARCHAR(1000) NOT NULL,
moment_id INT NOT NULL, //文章id
user_id INT NOT NULL, //用户id
comment_id INT DEFAULT NULL, //回复的id
createAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updateAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY(moment_id) REFERENCES moment(id) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY(user_id) REFERENCES user(id) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY(comment_id) REFERENCES comment(id) ON DELETE CASCADE ON UPDATE CASCADE
);
发表评论
const Router = require("koa-router");
const commnetRouter = new Router({ prefix: "/commnet" });
const {
verifyAuth, //判断是否登录
verifyPermission //验证权限
} = require("../middleware/auth.middleware");
const {
create
} = require("../controller/comment.controller.js");
commnetRouter.post("/", verifyAuth(comment), create); //发表评论
module.exports = commnetRouter;
要获取到评论的内容,用户的id,评论动态的id
//comment.controller.js
class CommentController {
async create(ctx, next) {
const { momentId, content } = ctx.request.body;
const { id } = ctx.user;
const result = await service.create(momentId, content, id);
ctx.body = result;
}
}
module.exports = new CommentController();
将获取到评论的内容,用户的id,评论动态的id,传入到数据库中
//comment.service.js
const connection = require("../app/database");
class CommentService {
async create(commentId, content, userId) {
const statement = `INSERT INTO comment (content, moment_id, user_id) VALUES (?, ?, ?)`;
const [result] = await connection.execute(statement, [
content,
commentId,
userId,
]);
return result;
}
}
module.exports = new CommentService();
测试
获取评论
const Router = require("koa-router");
const commnetRouter = new Router({ prefix: "/commnet" });
const {
list
} = require("../controller/comment.controller.js");
commentRouter.get("/", list) //获取评论
module.exports = commnetRouter;
要获取文章的id
//comment.controller.js
class CommentController {
async list(ctx, next) {
const { commentId } = ctx.query;
const result = await service.getCommentsByMomentId(commentId);
ctx.body = result;
}
}
module.exports = new CommentController();
将获取到文章id,传入到数据库,进行查询
//comment.service.js
const connection = require("../app/database");
class CommentService {
async getCommentsByMomentId(commentId) {
const statement = `
SELECT
m.id, m.content, m.comment_id commentId, m.createAt createTime,
JSON_OBJECT('id', u.id, 'name', u.name) user
FROM comment m
LEFT JOIN user u ON u.id = m.user_id //这里要连接用户表,查询是那些用户发表了评论
WHERE moment_id = ?
`;
const [result] = await connection.execute(statement, [commentId]);
return result;
}
}
module.exports = new CommentService();
测试
回复评论
const Router = require("koa-router");
const commnetRouter = new Router({ prefix: "/commnet" });
const {
verifyAuth, //判断是否登录
} = require("../middleware/auth.middleware");
const {
reply
} = require("../controller/comment.controller.js");
commentRouter.post('/:commentId/reply', verifyAuth, reply) //回复评论
module.exports = commnetRouter;
获取评论文章id,用户id,回复评论内容,要回复的评论的id
//comment.controller.js
class CommentController {
async reply(ctx, next) {
const { momentId, content } = ctx.request.body;
const { commentId } = ctx.params;
const { id } = ctx.user;
const result = await service.reply(momentId, content, id, commentId);
ctx.body = result;
}
}
module.exports = new CommentController();
将获取评论文章id,用户id,回复评论内容,要回复的评论的id,传入到数据库,进行查询
//comment.service.js
const connection = require("../app/database");
class CommentService {
async reply(momentId, content, userId, commentId) {
try {
const statement = `
INSERT INTO comment (content, moment_id, user_id, comment_id) VALUES (?, ?, ?, ?)
`;
const [result] = await connection.execute(statement, [content,commentId,userId,momentId]);
return result;
} catch (error) {
console.log(error);
}
}
}
module.exports = new CommentService();
测试
修改评论
const Router = require("koa-router");
const commnetRouter = new Router({ prefix: "/commnet" });
const {
verifyAuth, //判断是否登录
verifyPermission //验证权限
} = require("../middleware/auth.middleware");
const {
update
} = require("../controller/comment.controller.js");
commentRouter.patch('/:commentId',verifyAuth,verifyPermission(comment), update) //修改评论
module.exports = commnetRouter;
获取修改内容,评论id
//comment.controller.js
class CommentController {
async update(ctx, next) {
const { commentId } = ctx.params;
const { content } = ctx.request.body;
const result = await service.update(commentId, content);
ctx.body = result;
}
}
module.exports = new CommentController();
将数据传入到数据库,并修改
//comment.service.js
const connection = require("../app/database");
class CommentService {
async update(commentId, content) {
try {
const statement = `UPDATE comment SET content = ? WHERE id = ?`;
const [result] = await connection.execute(statement, [
content,
commentId,
]);
return result;
} catch (err) {
console.log(err);
}
}
}
module.exports = new CommentService();
测试
删除评论
const Router = require("koa-router");
const commnetRouter = new Router({ prefix: "/commnet" });
const {
verifyAuth, //判断是否登录
verifyPermission //验证权限
} = require("../middleware/auth.middleware");
const {
remove
} = require("../controller/comment.controller.js");
commentRouter.delete("/:commentId",verifyAuth,verifyPermission, remove ) //删除评论
module.exports = commnetRouter;
获取要删除的评论id
//comment.controller.js
class CommentController {
async remove(ctx, next) {
const { commentId } = ctx.params;
const result = await service.remove(commentId);
ctx.body = result;
}
}
module.exports = new CommentController();
将数据传入到数据库,并修改
//comment.service.js
const connection = require("../app/database");
class CommentService {
async remove(commentId) {
try {
const statement = `DELETE FROM comment WHERE id = ?`
const [result] = await connection.execute(statement, [commentId])
return result
} catch (error) {
console.log(error);
}
}
}
module.exports = new CommentService();
测试
写接口的的流程
graph TD
创建路由 --> 验证中间件 --> 拿到数据进行处理 --> 传入数据库 --> 将结果返回给 --> 拿到最后的结果,然后返回给前端