reactkoa2mongodb实现留言功能(可体验)
头条创作挑战赛
本文同步本人掘金平台的文章:https:juejin。cnpost6982713711584608270
留言功能在社交中占据很重要的作用。这里实现的留言功能,参考微信朋友圈的方式:
用户发送一个TOPIC话题,读者可以在该话题下面进行评论,也可以对该话题下的留言进行评论。但是始终只会展示两层树的评论。
当然,也可以像掘金这样进行嵌套多层树的结构展示。臣妾觉得嵌套得太深
实际完成的效果如下:
体验站点请戳jimmyarea。com。前端实现
使用技术reactantdesigntypescript
在上面的截图中,很明显,就是一个表单的设计,外加一个列表的展示。
表单的设计使用了antdesign框架自带的form组件:复制代码
这里限制了输入的主题名称的长度为630;内容是30300字符
针对留言的展示,这里使用的是antdesign自带的List和Comment组件:Listloading{loadingMsg}itemLayouthorizontalpagination{{size:small,total:count,showTotal:()共{count}条,pageSize,current:activePage,onChange:changePage,}}dataSource{list}renderItem{(item:any,index:any)(List。Itemactions{〔〕}key{index}List。Item。Metaavatar{{item。userId?。username?。slice(0,1)?。toUpperCase()}Avatar}title{b{item。subject}b}description{{item。content}{子留言}span用户{item。userId?。username}发表于{moment(item。meta?。createAt)。format(YYYYMMDDHH:mm:ss)}spanspan{item。canDel?(removeMsg(item)}DeleteOutlinedDelete):null}replyMsg(item)}MessageOutlinedReplyspan{回复的内容}{item。childrenitem。children。length?({item。children。map((innerItem:any,innerIndex:any)(Commentkey{innerIndex}author{span{innerItem。subject}span}avatar{{innerItem。userId?。username?。slice(0,1)?。toUpperCase()}Avatar}content{p{innerItem。content}}datetime{Tooltiptitle{moment(innerItem。meta?。createAt)。format(YYYYMMDDHH:mm:ss,)}span{moment(innerItem。meta?。createAt)。fromNow()}spanTooltip}actions{〔{innerItem。canDel?(removeMsg(innerItem)}DeleteOutlinedDelete):null},replyMsg(innerItem)}MessageOutlinedReply,〕}))}):null}{回复的表单}{replyObj。iditem。idreplyObj。piditem。id?():null}}List。Item)}复制代码
当然,如果是多级地树结构嵌套,你完全可以只是使用Comment组件进行递归调用
列表是对用户发表的主题,留言以及子留言的展示。如果你纵览上面的代码片段,你会发现里面有一个Form表单。
是的,其Form表单就是给留言使用的,其结构仅仅是剔除了主题留言中的subject字段输入框,但是实际传参我还是会使用到。
完整的前端代码可前往jimmyarea留言(前端)查看。后端
使用的技术:mongodb数据库,这里我使用到了其ODMmongoosekoa2一个Node框架pm2进程守卫apidoc用来生成接口文档(如果你留意体验站点,右上角有一个文档的链接,链接的内容就是生成的文档内容)
这里的搭建就不进行介绍了,可以参考koa2官网配合百度解决
其实,本质上还是增删改查的操作。
首先,我们对自己要存储的数据结构schema进行相关的定义:constmongooserequire(mongoose)constSchemamongoose。Schema定义留言字段letMessageSchemanewSchema({关联字段用户的iduserId:{type:mongoose。Schema。Types。ObjectId,ref:User},type:Number,1是留言,2是回复subject:String,留言主题content:String,留言内容pid:{父idtype:String,default:1},replyTargetId:{回复目标记录id,和父pid有所不同type:String,default:1},meta:{createAt:{type:Date,default:Date。now()},updateAt:{type:Date,default:Date。now()}}})mongoose。model(Message,MessageSchema)复制代码
这里有个注意的点userId字段,这里我直接关联了注册的用户。
完成了字段的设定之后,下面就可以进行增删改查了。
详细的crud代码可以到jimmyarea留言(后端)查看。
本篇的重点是,对评论的话题和留言,如何转换成两层的树型结构呢?
这就是涉及到了pid这个字段,也就是父节点的id:话题的pid为1,话题下留言的pid为话题的记录值。如下代码:letcountawaitMessage。count({pid:1})letdataawaitMessage。find({pid:1})。skip((current1)pageSize)。limit(pageSize)。sort({meta。createAt:1})。populate({path:userId,select:usernameidselect:usernameidid是排除id})。lean(true)添加lean变成js的json字符串constpidsArray。isArray(data)?data。map(ii。id):〔〕;letresReply〔〕if(pids。length){resReplyawaitMessage。find({pid:{in:pids}})。sort({meta。createAt:1})。populate({path:userId,select:usernameidselect:usernameidid是排除id})}constlistdata。map(item{constchildrenJSON。parse(JSON。stringify(resReply。filter(ii。piditem。id。toString())))引用问题consttranformChildrenchildren。map(innerItem({。。。innerItem,canDel:innerItem。userIdinnerItem。userId。id。toString()(user。iduser。id。toString())?1:0}))return{。。。item,children:tranformChildren,canDel:item。userIditem。userId。id。toString()(user。iduser。id。toString())?1:0}})if(list){ctx。body{results:list,current:1,count}return}ctx。body{code:10002,msg:获取留言失败!}复制代码
至此,可以愉快地进行留言
大众下调2022年在华销量目标!新能源赛道上传统大厂开始乏力了?2022年剩下已不到两个月的时间了,今年定下的小目标,大家都完成了吗?在汽车圈,一直流行着10月销量看全年的说法,也就是说,过了金九银十后,各大车企的销量基本就不会再有大的涨幅了,
唐太宗分封的凌烟阁二十四功臣的人生结局1司徒赵国公长孙无忌(?659年)今河南洛阳人。少年相识,参与策划玄武门之变,官拜宰相。因反对自己的亲外甥李治改立武则天为皇后,被诬陷其谋反削爵流放到今重庆市彭水县,上吊而死。长孙
吴亦凡就这样写下了自己的结局,留下的三个疑问,是时候解开了在许多年后以后,人们提起2022年11月25日,或许会想起是这天下午的一则通报,敲响了内娱流量时代最后的丧钟。吴亦凡的案子一审判了。数罪并罚,一共十三年。回到故事卡开头,去年7月3
吃饭时刷视频下饭电子榨菜成为年轻人佐餐标配电子榨菜成为年轻人佐餐标配吃饭时刷视频电视剧或者综艺下饭到了饭点儿,外卖摆上桌后先支起iPad或手机,之后再吃饭,这已经成为当代年轻人用餐的新潮流。近来,大家又为这种下饭视频或音频
刘伟伟新基中欧成长先锋成立中证网讯(记者徐金忠)11月23日,由中欧基金产业趋势投资专家刘伟伟担纲的中欧成长先锋混合型基金正式成立。据基金合同生效公告显示,该基金首次公开募集规模已超11。5亿元,认购户数超
超级新秀SOMEONE狂怒坦克先锋佛罗里达狂欢队带给大家的印象如同他们的队名一样,始终保持着狂野奔放的状态,狂欢队招募的选手似乎都被团队氛围所感染,无论来自哪个国家和文化圈,他们总能为我们带来超乎想象的精彩比赛,以
湖人将帅谈贝弗利被驱逐他在保护他的队友北京时间11月23日,今日太阳主场迎战湖人。全场战罢,太阳115105战胜湖人。赛后,湖人后卫拉塞尔威斯布鲁克在接受采访时,谈及末节帕特里克贝弗利被罚下我喜欢它,个人而言。保护和理
文体市场面面观把握观赛经济新商机卡塔尔世界杯激战正酣。国际足联预计,本届世界杯将会吸引全球超过50亿观众观看。观赛经济持续升温,带动相关行业迎来发展新机遇。沉浸式观赛需求旺盛,VR市场方兴未艾。在本届世界杯期间,
开通新航线开启新空间RCEP红利加速释放最新数据显示,今年前10个月,我国对区域全面经济伙伴关系协定(RCEP)其他14个成员国进出口增长8。4,持续显示出RCEP区域贸易自由化优势。RCEP生效实施以来,我国各地积极探
OPPO中国区总裁刘波押注底层核心技术,加强精细化运营21世纪经济报道记者骆轶琪广州报道在早被预估会跌破3亿台大关的中国智能机市场,今年显得有些波谲云诡。最近的双十一大促期间,连苹果也显著加码参与降价活动。这让手机厂商今年面临的发展命
重磅消息媒体曝安东尼戴维斯对重回鹈鹕持开放态度消息来源著名体育媒体TheAthletic。该网站透露,湖人队多名球员伤病不断,无法上场打球,严重影响战绩,已经让浓眉哥深感失望,而詹姆斯受伤后虽然湖人迎来一波三连胜,但是面对残阵