首先 先编写 发布评论 和评论列表的页面
只有登录的用户才能发布评论,所以这里有个判断,判断只有获取到用户的信息,才显示 发布评论的 按钮
const store = useStore();const loginUserInfo = store?.user?.userInfo;{loginUserInfo?.userId && (<div className={styles.enter}><Avatar src={avatar} size={40} /><div className={styles.content}><Input.TextAreaplaceholder="请输入评论"rows={4}value={inputVal}onChange={(event) => setInputVal(event?.target?.value)}/><Button type="primary" onClick={handleComment}>发表评论</Button></div></div>)}
然后 获取 所有的 评论 列表,渲染到页面上
<div className={styles.display}>{comments?.map((comment: any) => (<div className={styles.wrapper} key={comment?.id}><Avatar src={comment?.user?.avatar} size={40} /><div className={styles.info}><div className={styles.name}><div>{comment?.user?.nickname}</div><div className={styles.date}>{format(new Date(comment?.update_time),'yyyy-MM-dd hh:mm:ss')}</div></div><div className={styles.content}>{comment?.content}</div></div></div>))}</div>
这里 有 两个逻辑接口,一个是 发布评论的接口,一个是 获取所有评论数据的接口
首先 编写 发布评论的接口
1.首先获取 参数,一个参数是文章的id,一个是评论的内容
2.将这两个参数 传给 发布评论的接口
post('/api/comment/publish', {articleId: article?.id,content: inputVal,})
3.接下来 看下 发布评论的接口
4.新建 pages/api/comment/publish.ts
5.引入 数据库 和 session的配置
import { NextApiRequest, NextApiResponse } from 'next';import { withIronSessionApiRoute } from 'iron-session/next';import { ironOptions } from 'config/index';import { ISession } from 'pages/api/index';import { prepareConnection } from 'db/index';import { User, Article, Comment } from 'db/entity/index';import { EXCEPTION_COMMENT } from 'pages/api/config/codes';
6.通过 传过来的参数 获取 文章id 和 评论的内容
const { articleId = 0, content = '' } = req.body;
7.链接 评论接口的 数据库
const db = await prepareConnection();const commentRepo = db.getRepository(Comment);const comment = new Comment();
8.实例化 Comment类,根据 session信息,从users表中查询 当前用户,根据文章id,查询文章信息,将这些信息全部添加到 comment实例中,保存到 comment表中
const comment = new Comment();comment.content = content;comment.create_time = new Date();comment.update_time = new Date();const user = await db.getRepository(User).findOne({id: session?.userId,});const article = await db.getRepository(Article).findOne({id: articleId,});if (user) {comment.user = user;}if (article) {comment.article = article;}const resComment = await commentRepo.save(comment);
9.如果保存成功,则提示发布成功,否则提示发布失败
if (resComment) {res.status(200).json({code: 0,msg: '发表成功',data: resComment,});} else {res.status(200).json({...EXCEPTION_COMMENT.PUBLISH_FAILED,});}
10.当调用发布接口成功的时候,提示发布成功,并且将新发布的评论 添加到 评论列表中,显示在评论中。同时把评论框的内容清空。注意这个将 新发布的评论 添加到 评论列表的时候,使用react的不可变原则,使用concat方法。
request.post('/api/comment/publish', {articleId: article?.id,content: inputVal,}).then((res: any) => {if (res?.code === 0) {message.success('发表成功');const newComments = [{id: Math.random(),create_time: new Date(),update_time: new Date(),content: inputVal,user: {avatar: loginUserInfo?.avatar,nickname: loginUserInfo?.nickname,},},].concat([...(comments as any)]);setComments(newComments);setInputVal('');} else {message.error('发表失败');}});
11.最后拿到最新的 评论列表,将评论列表 遍历 渲染到页面上
<div className={styles.display}>{comments?.map((comment: any) => (<div className={styles.wrapper} key={comment?.id}><Avatar src={comment?.user?.avatar} size={40} /><div className={styles.info}><div className={styles.name}><div>{comment?.user?.nickname}</div><div className={styles.date}>{format(new Date(comment?.update_time),'yyyy-MM-dd hh:mm:ss')}</div></div><div className={styles.content}>{comment?.content}</div></div></div>))}</div>
