专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

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:获取留言失败!}复制代码
  至此,可以愉快地进行留言

理响永州思政课第二课(大学版)坚持党的领导青春报党老师同学们,青年主题高燃剧觉醒年代,你们看过吗?同学们看过。老师南陈北李,相约建党,从此,近代中国开启了青春梦想与革命理想激烈碰撞的时代。我们为什么要建党?觉醒年代激荡青春梦想近代如何选择感官玩具,不妨参考年龄指南为了让婴儿蹒跚学步的孩子甚至大孩子受益,专家们权衡了最好的感官玩具选择。如今,我们的孩子很容易被可供选择的玩具淹没。作为一个4岁孩子的母亲,我一直在努力寻找能让女儿快乐的玩具,为更因为疏忽,导致引产五个月性染色体异常男宝,痛不欲生,我想离婚我跟我老公是16年9月结婚的,因为我们俩都挺喜欢小孩的,一直也没有避孕,很顺利的在17年元旦过后就发现怀孕了,第一次怀孕开心激动的心情溢于言表,我尽情地享受着初为人母的喜悦的心情。威聚焦丨联合督导指出问题多方联动提升森林防灭火能力近日,由云南省森林消防总队丽江市支队牵头,丽江市农业农村局超高压输电公司等成员单位协同组成的工作组,对丽江市永胜县开展联合防火督导检查,现场指出隐患问题,面对面帮带解决整改。12月某红书上学育儿,差点让我的育儿变成悲剧说起某红书,精致猪猪女孩们应该都不会陌生,各种各样的真人种草笔记,为妹子们打开了购物的新世界。后来,越来越多的家长开始在上面分享自己的育儿故事,渐渐地这里也成了新手父母在岗培训的聚凌晨!特斯拉发布重要消息每经编辑杜宇据特斯拉官方微博2023年1月3日消息,2022年第四季度,特斯拉全球生产了超过43。9万辆汽车,交付了超过40。5万辆汽车。2022年全年,特斯拉全球共交付了131万iPhone15性能大升级,果粉蓄势待发又到了一年一度的果粉期待时刻每年新款的到来都会让果粉满怀期待但iPhone的续航一直被吐槽,安卓阵营已经用上了200W的快充,但苹果一直还维持在40W以内,而日前外媒报道称iPho2499元性价比拉满!荣耀平板V8Pro评测有颜又有料,比iPad更香一直以来提起平板电脑,iPad总是一个不可忽视的存在,平板市场的分类也总是被大家调侃成iPad和其它。然而这两年,在线办公学习和居家娱乐的需求在快速增长,平板电脑因其比手机更大比笔比亚迪12月销量超23万辆,同比增长137,全年销量超186万辆2023年1月2日,比亚迪汽车打破常规发布销量时间,要比去年发布时间早一点,主要还是销量太好了,数据显示,2022年12月份比亚迪汽车销量为235197辆,同比增长137。3,截至关注一季度重大项目丨达州200个项目亮相全省重大项目现场推进活动,计划总投资2034。1亿元来源四川日报川观新闻航拍达州分会场现场。漆楚良摄川观新闻记者袁城霖1月3日上午,四川省2023年一季度重大项目现场推进活动举行。记者从达州分会场了解到,达州共有200个项目参加此次货币基金收益走高多只提前闭门谢客年底岁末,盈利下降已持续几个月的货币基金市场现如今悄悄地转暖,许多流行种类七天年收益率已超出2。天弘支付宝余额宝最新的七日年化收益率达到1。88,创下近6个月的高点。图片来源视觉中
大众下调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。该网站透露,湖人队多名球员伤病不断,无法上场打球,严重影响战绩,已经让浓眉哥深感失望,而詹姆斯受伤后虽然湖人迎来一波三连胜,但是面对残阵
友情链接:快好知快生活快百科快传网中准网文好找聚热点快软网