首先 先编写 发布评论 和评论列表的页面

    只有登录的用户才能发布评论,所以这里有个判断,判断只有获取到用户的信息,才显示 发布评论的 按钮

    1. const store = useStore();
    2. const loginUserInfo = store?.user?.userInfo;
    3. {loginUserInfo?.userId && (
    4. <div className={styles.enter}>
    5. <Avatar src={avatar} size={40} />
    6. <div className={styles.content}>
    7. <Input.TextArea
    8. placeholder="请输入评论"
    9. rows={4}
    10. value={inputVal}
    11. onChange={(event) => setInputVal(event?.target?.value)}
    12. />
    13. <Button type="primary" onClick={handleComment}>
    14. 发表评论
    15. </Button>
    16. </div>
    17. </div>
    18. )}

    然后 获取 所有的 评论 列表,渲染到页面上

    1. <div className={styles.display}>
    2. {comments?.map((comment: any) => (
    3. <div className={styles.wrapper} key={comment?.id}>
    4. <Avatar src={comment?.user?.avatar} size={40} />
    5. <div className={styles.info}>
    6. <div className={styles.name}>
    7. <div>{comment?.user?.nickname}</div>
    8. <div className={styles.date}>
    9. {format(
    10. new Date(comment?.update_time),
    11. 'yyyy-MM-dd hh:mm:ss'
    12. )}
    13. </div>
    14. </div>
    15. <div className={styles.content}>{comment?.content}</div>
    16. </div>
    17. </div>
    18. ))}
    19. </div>

    这里 有 两个逻辑接口,一个是 发布评论的接口,一个是 获取所有评论数据的接口

    首先 编写 发布评论的接口

    1.首先获取 参数,一个参数是文章的id,一个是评论的内容
    2.将这两个参数 传给 发布评论的接口

    1. post('/api/comment/publish', {
    2. articleId: article?.id,
    3. content: inputVal,
    4. })

    3.接下来 看下 发布评论的接口
    4.新建 pages/api/comment/publish.ts
    5.引入 数据库 和 session的配置

    1. import { NextApiRequest, NextApiResponse } from 'next';
    2. import { withIronSessionApiRoute } from 'iron-session/next';
    3. import { ironOptions } from 'config/index';
    4. import { ISession } from 'pages/api/index';
    5. import { prepareConnection } from 'db/index';
    6. import { User, Article, Comment } from 'db/entity/index';
    7. import { EXCEPTION_COMMENT } from 'pages/api/config/codes';

    6.通过 传过来的参数 获取 文章id 和 评论的内容

    1. const { articleId = 0, content = '' } = req.body;

    7.链接 评论接口的 数据库

    1. const db = await prepareConnection();
    2. const commentRepo = db.getRepository(Comment);
    3. const comment = new Comment();

    8.实例化 Comment类,根据 session信息,从users表中查询 当前用户,根据文章id,查询文章信息,将这些信息全部添加到 comment实例中,保存到 comment表中

    1. const comment = new Comment();
    2. comment.content = content;
    3. comment.create_time = new Date();
    4. comment.update_time = new Date();
    5. const user = await db.getRepository(User).findOne({
    6. id: session?.userId,
    7. });
    8. const article = await db.getRepository(Article).findOne({
    9. id: articleId,
    10. });
    11. if (user) {
    12. comment.user = user;
    13. }
    14. if (article) {
    15. comment.article = article;
    16. }
    17. const resComment = await commentRepo.save(comment);

    9.如果保存成功,则提示发布成功,否则提示发布失败

    1. if (resComment) {
    2. res.status(200).json({
    3. code: 0,
    4. msg: '发表成功',
    5. data: resComment,
    6. });
    7. } else {
    8. res.status(200).json({
    9. ...EXCEPTION_COMMENT.PUBLISH_FAILED,
    10. });
    11. }

    10.当调用发布接口成功的时候,提示发布成功,并且将新发布的评论 添加到 评论列表中,显示在评论中。同时把评论框的内容清空。注意这个将 新发布的评论 添加到 评论列表的时候,使用react的不可变原则,使用concat方法。

    1. request
    2. .post('/api/comment/publish', {
    3. articleId: article?.id,
    4. content: inputVal,
    5. })
    6. .then((res: any) => {
    7. if (res?.code === 0) {
    8. message.success('发表成功');
    9. const newComments = [
    10. {
    11. id: Math.random(),
    12. create_time: new Date(),
    13. update_time: new Date(),
    14. content: inputVal,
    15. user: {
    16. avatar: loginUserInfo?.avatar,
    17. nickname: loginUserInfo?.nickname,
    18. },
    19. },
    20. ].concat([...(comments as any)]);
    21. setComments(newComments);
    22. setInputVal('');
    23. } else {
    24. message.error('发表失败');
    25. }
    26. });

    11.最后拿到最新的 评论列表,将评论列表 遍历 渲染到页面上

    1. <div className={styles.display}>
    2. {comments?.map((comment: any) => (
    3. <div className={styles.wrapper} key={comment?.id}>
    4. <Avatar src={comment?.user?.avatar} size={40} />
    5. <div className={styles.info}>
    6. <div className={styles.name}>
    7. <div>{comment?.user?.nickname}</div>
    8. <div className={styles.date}>
    9. {format(
    10. new Date(comment?.update_time),
    11. 'yyyy-MM-dd hh:mm:ss'
    12. )}
    13. </div>
    14. </div>
    15. <div className={styles.content}>{comment?.content}</div>
    16. </div>
    17. </div>
    18. ))}
    19. </div>