范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

reactkoa2mongodb实现留言功能(可体验)

  #头条创作挑战赛#
  本文同步本人掘金平台的文章:https://juejin.cn/post/6982713711584608270
  留言功能在社交中占据很重要的作用。这里实现的留言功能,参考微信朋友圈的方式:
  用户发送一个TOPIC话题,读者可以在该话题下面进行评论,也可以对该话题下的留言进行评论。但是始终只会展示两层树的评论。
  当然,也可以像掘金这样进行嵌套多层树的结构展示。臣妾觉得嵌套得太深~
  实际完成的效果如下:
  体验站点请戳 jimmyarea.com 。前端实现
  使用技术reactant designtypescript
  在上面的截图中,很明显,就是一个表单的设计,外加一个列表的展示。
  表单的设计使用了ant design框架自带的form组件: 复制代码
  这里限制了输入的主题名称的长度为6-30;内容是30-300字符
  针对留言的展示,这里使用的是ant design自带的List和Comment组件: `共 ${count} 条`,     pageSize,     current: activePage,     onChange: changePage,   }}   dataSource={list}   renderItem={(item: any, index: any) => (                     }         title={{item.subject}}         description={           <>             {item.content}             {/* 子留言 */}                                             用户 {item.userId?.username}  发表于                  {moment(item.meta?.createAt).format("YYYY-MM-DD HH:mm:ss")}                                               {item.canDel ? (                    removeMsg(item)}                   >                                            Delete                                    ) : null}                  replyMsg(item)}                 >                                        Reply                                                          {/* 回复的内容 */}             {item.children && item.children.length ? (               <>                 {item.children.map((innerItem: any, innerIndex: any) => (                   {innerItem.subject}}                     avatar={                                                {innerItem.userId?.username?.slice(0, 1)?.toUpperCase()}                                            }                     content={

{innerItem.content}} datetime={ {moment(innerItem.meta?.createAt).fromNow()} } actions={[ <> {innerItem.canDel ? ( removeMsg(innerItem)} > Delete ) : null} , replyMsg(innerItem)} > Reply , ]} /> ))} ) : null} {/* 回复的表单 */} {replyObj._id === item._id || replyObj.pid === item._id ? ( ) : null} } /> )} /> 复制代码   当然,如果是多级地树结构嵌套,你完全可以只是使用Comment组件进行递归调用   列表是对用户发表的主题,留言以及子留言的展示。如果你纵览上面的代码片段,你会发现里面有一个Form表单。   是的,其Form表单就是给留言使用的,其结构仅仅是剔除了主题留言中的subject字段输入框,但是实际传参我还是会使用到。   完整的前端代码可前往jimmyarea 留言(前端)查看。后端   使用的技术:mongodb 数据库,这里我使用到了其ODM mongoosekoa2 一个Node框架pm2 进程守卫apidoc 用来生成接口文档(如果你留意体验站点,右上角有一个"文档"的链接,链接的内容就是生成的文档内容)   这里的搭建就不进行介绍了,可以参考koa2官网配合百度解决~   其实,本质上还是增删改查的操作。   首先,我们对自己要存储的数据结构schema进行相关的定义:const mongoose = require("mongoose") const Schema = mongoose.Schema // 定义留言字段 let MessageSchema = new Schema({ // 关联字段 -- 用户的id userId: { type: mongoose.Schema.Types.ObjectId, ref: "User" }, type: Number, // 1是留言,2是回复 subject: String, // 留言主题 content: String, // 留言内容 pid: { // 父id type: 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为话题的记录值。如下代码:let count = await Message.count({pid: "-1"}) let data = await Message.find({pid: "-1"}) .skip((current-1) * pageSize) .limit(pageSize) .sort({ "meta.createAt": -1}) .populate({ path: "userId", select: "username _id" // select: "username -_id" -_id 是排除_id }) .lean(true) // 添加lean变成js的json字符串 const pids = Array.isArray(data) ? data.map(i => i._id) : []; let resReply = [] if(pids.length) { resReply = await Message.find({pid: {$in: pids}}) .sort({ "meta.createAt": 1}) .populate({ path: "userId", select: "username _id" // select: "username -_id" -_id 是排除_id }) } const list = data.map(item => { const children = JSON.parse(JSON.stringify(resReply.filter(i => i.pid === item._id.toString()))) // 引用问题 const tranformChildren = children.map(innerItem => ({ ...innerItem, canDel: innerItem.userId && innerItem.userId._id.toString() === (user._id&&user._id.toString()) ? 1 : 0 })) return { ...item, children: tranformChildren, canDel: item.userId && item.userId._id.toString() === (user._id&&user._id.toString()) ? 1 : 0 } }) if(list) { ctx.body = { results: list, current: 1, count } return } ctx.body = { code: 10002, msg: "获取留言失败!" } 复制代码   至此,可以愉快地进行留言~


早餐就喜欢这样吃,有菜有汤,荤素搭配,吃得营养又舒服我家早餐以面食为主,而最受欢迎的莫过于包子饺子馄饨面条这4样。面条因为做法简单灵活,是上桌率最高的,几乎每周都会有吧。相比挂面,自己做的手擀面口感要好很多,孩子也更喜欢。所以我通常中签茅台取酒时需要注意这几点(银座)昨天迫不及待的去取酒,一大早就赶往银座,取酒的过程非常的顺利,不过还的跟大家说一下需要注意的事项!第一取酒的时间最早是早上9点,因为取酒的系统9点才能启用工作,去早了还要等,建议9鸡蛋不要炒着吃了!试试这个吃法,解馋开胃,出锅后满屋香!进入春季以来,我们经历过寒冷的天气,盼来南方人最爱的春天,春季是万物复苏的日子,天气越来越舒服了,春季的天气会非常容易犯困,胃口会变得特别差,总不知道吃啥,吃大鱼大肉都吃腻了,不如茅台密码!瓶子上少了这6个字,八成都是水货,建议酒友牢记茅台密码!瓶子上少了这6个字,八成都是水货,建议酒友牢记当下的白酒市场上,茅台可是一举带火了酱香酒,以2。2万亿的身家远超老二五粮液,不仅坐稳了酒界天花板的宝座,更是国内首屈一指的五粮液永不分梨,那么大的梨是怎么放进瓶里的?看完终于懂了如今市面上的名酒,都有一个共同的特点,那就是传统。传统不仅意味着酒水历史悠久,同时还代表着品质地道。虽说传统是优点,但是在这个新鲜事物层出不穷的时代,它也成了一种缺点,因为大家都在河南洛阳宜阳县王勇强秦王寨里酿好酒黄红立许金安张珂贾晓洋从古至今,白酒贯穿中华文化几千年,美酒流淌于天地之间,爱其深切者甚多。宜阳县韩城镇秦王村的传奇存在,与秦王酒有关。史料记载,公元前308年,秦武王为打开秦国东青岛,一座轨道上的旅游城市来源海报新闻大众网海报新闻记者毛道光青岛报道青岛地处黄海之滨山东半岛南端,是自然资源禀赋极为优越的沿海开放城市,是知名的足球城影视城时尚城帆船之都,是国内外游客向往的旅游城市。青岛太原岢岚,限200位!每个周末说走就走3月25日起,每周六和周日,太铁增开一组太原东站至岢岚的列车。增开的列车为46014602次列车,是一条周末线路,从太原东站出发的时间为6时13分,途经太原阳曲忻州原平轩岗宁武神池三步一娘娘,五步一公主春光稀贵,如何以特别的方式抓住春天?记者近日走访北京故宫颐和园和玉渊潭公园等景区发现,随着春暖花开,汉服热再度升温。身着汉服,留影红墙绿瓦下,定格缤纷落英中,成为不少本地和外地游客来延庆,赏春花这份赏花攻略快收好春天来了,北京进入一年中最美的花期,赏花踏青正当时。来延庆,在温暖的春光里邂逅一片烂漫花海吧八达岭长城又被称为玉关天堑,为明代居庸关八景之一,是中国万里长城中极具代表性的一段,素有句容天王浮山樱花园邀请你来赏樱花借得春风揭面纱花团锦簇满枝杈3月18日上午第十届句容浮山樱花节在江苏省春季赏花胜地浮山樱花园盛大开幕轻歌曼舞,欢乐不停。开幕式在热情四溢的开场舞中拉开序幕,刚好遇见你梦之环灯火里的
达州这个山体公园即将呈现美得不像话达州全记录!不定期送福利!银杏红枫三角枫樱花红叶李西府海棠哪里?哪里?哪里有嫩乖?晚报妹带你去看西圣公园是以生态修复为主,兼具休闲观光健身锻炼为一体的综合性山体公园,于2020年启探村浙江金华雅湖古村,前带松溪后枕秀峦,古建景观美不胜收浙江金华,金东区,雅湖古村落。位于金华市金东区江东镇北部,村庄民风淳朴,素以耕读传家,历史文化底蕴深厚,历代名人贤士辈出。2016年入选为第四批中国传统村落。原名石塔下胡,后简称下重庆探亲(上篇)温馨且难忘的回忆2019年10月3日(周四)出发世界上最温暖的情感是什么?我认为是亲情。无论你多大离开故乡,或者你根本就没有在故乡呆过,但是你从小就得知你的先辈曾经在故乡出生和生活过,那么我想你也广州市海珠区有一栋尴尬的大楼,投资50亿,却被评为最丑建筑这里是刘小顺的旅行和生活研究所。海珠区是广州市的重要主城区之一,最近这些年的发展速度很快,大家有目共睹,比如我们都耳熟能详的广州新地标广州塔就是在海珠区。可实际上,海珠区除了广州塔隐藏在山东的绝美古村落,被誉为滨州小成都,一天50包吃住随着旅游业的发展,各个城市也在打造自己独特的景区,当地根据自身历史文化自己环境状况,开发展适合自己城市的旅游景点,比如如果是一座历史文化悠久的城市,就开发古城来吸引更多的游客,如果天津实现蓝天白云绿色转型双丰收从天塔观景台北望,远在百公里外的蓟州盘山若隐若现。向东望去,50公里外高530米的滨海新区周大福金融中心清晰可见。如今,像这样能北望盘山东观渤海的场景再现津城,而回首2013年年初抵御面板下行周期,深天马78亿大手笔定增豪赌车载显示21世纪经济报道记者张赛男实习生陆爽上海报道在面板行业陷入行业周期寒冬的情况下,深天马A(000050。SZ)抛出了一项78亿元的大手笔定增计划。高达78亿元的定增募资金额,在今年2021大陆居民最富裕的20个城市名单,网友感觉与现实差距太大经过几十年的发展,我国部分地区的老百姓已经过上了美满幸福的生活。衡量一个地方的富裕程度,最简单直接的就是家庭平均存款的多少。那么,家庭平均存款是如何算出来的呢?其实很简单,就是当地浙江省中部有个散装城市,区县互不相认,名字还常被大家读错这里是刘小顺的旅行和生活研究所。浙江省位于我国的华东地区,是一个经济相当发达的沿海省份,浙江省旅游资源丰富,一直都吸引着大量游客前来浙江游玩。说到浙江省著名的大城市,很多人都会想到作为云南省第二大城市的曲靖,为什么存在感那么低曲靖作为云南第二大城市,为什么存在感这么低?曲靖比起昆明,大理,丽江,香格里拉等城市,多数人都不知道云南还有曲靖这么个地方,它的存在感似乎很低,主要是因为这四点。一,曲靖旅游业不发烟台,让世界微醺龙口好品讲述烟台故事大小新闻客户端9月18日讯(YMG全媒体记者张洁济南摄影报道)17日,第三届中国国际文化旅游博览会迎来周末参观潮,不少市民走进烟台展区,感受烟台文化。在烟台展区旁,作为烟台唯一区市