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

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


父亲的歌声与背后的心酸截屏来自抖音云衡微语不错!谁又能体会到一个70来岁的父亲长达5年多时间,用歌声陪伴受车祸儿子醒来。短短抖音视频谁又知道快乐的歌声背后老父亲经历了多少心酸?这种陌生人的感慨,这种不为不同的关注点,相同的是真爱60后父亲和00后儿子对话香奈儿J12腕表之家钟表文化疫情两年多,期间正赶上儿子大学毕业,虽然没法去参加他的毕业典礼,好在他辗转回来休假,至少能在周边找个安静的地方舒舒服服度个假。儿子12岁离家去海外读书,漂泊了十年之父亲这个身份,是如何重塑男性大脑的?成为父母对任何人来说都是浓墨重彩的一笔,随之而来的是方方面面的人生转变。今天,我们就从脑科学的角度出发,看看父亲和母亲的身份,将怎样重塑男性和女性的大脑?怀孕引发的妈妈大脑变化我们大平原(二百九十一)母亲的百宝箱母亲的百宝箱文高延新在老家正房的角落有一对木制的搬箱。搬箱箱体全桐木打造,每当母亲打开拿东西,总会有一股自然的清香飘出。搬箱四角铜包,正面有一对铜锁把门。搬箱通体经岁月洗礼由大红逐任天野8岁被母亲抛弃,父亲再婚娶小15岁娇妻后,继母就是我亲妈2010年,演员蓝天野凭借电视剧我是特种兵获得了华鼎奖最佳男配角的提名。从那之后,他身上便多了一个称号苦命硬汉。为什么是苦命硬汉?因为任天野年仅8岁的时候就被母亲抛弃了。从那之后他诗歌妈妈,让我再看看你的容颜在房屋倒塌的一瞬,我惊恐的合上双眼。眼前的光明剎然消逝,只留下一个冰冷的空间!倾盆大雨冲涮着我的躯体,游走的灵魂飘荡在云端。我看到挚爱的亲人在为我奔走营救,母亲的呼唤让我泪水连连妈进大学依然苦钻数学,湖南工商大学在省大学生数学竞赛中创佳绩近日,湖南省大学生数学竞赛委员会和湖南省数学会公布2022年竞赛评审结果。湖南省工商大学获数学专业组一等奖9项二等奖4项三等奖5项,非数学组一等奖21项二等奖17项三等奖25项,获让不支持5G的设备也能享受5G网络领势5G随身WIFI6路由器体验开篇碎碎念Hi,大家好,2019年是5G元年,到如今,5G如火如荼建设之中,各位用上5G了吗?今天就来体验一款不一样的5G产品领势5G随身WIFI6路由器,它长这个样,非常迷你和小不管人生是否成功,只要你努力了,那你就不会遗憾!在头条看见彼此是缘分让我遇见了今日头条,今年下半年时,我才正式开始写头条,以前我都是登陆的头条极速版,看文章领金币!了解今日头条写作自从做西瓜视频以后才正式了解头条,知道头条也能写Soul为用户构筑网络安全墙,打造无压力社交环境社交安全是互联网社交平台的一个高频词。一是在高强度生活学习工作压力下的大多数年轻人对于他人的信任感正在变得越来越薄弱。二是因为网络带来的不确定性和风险性导致很多网民无法放心地交友。住酒店一登记身份证,警察就找上门了,这是犯过什么事吗?现在出门旅游已经是一件稀疏平常的小事,而出门在外晚上自然要入住酒店,毕竟喜欢晚上野外露营的毕竟是极少数人。大多数人还是喜欢躺在宾馆的浴缸中美美的泡上一澡,洗去白天一天的疲劳。然而,
广东宏远放弃活力悍将,广厦核心仍未复出,霍华德被严重高估广东宏远放弃活力悍将,广厦核心仍未复出,霍华德被严重高估。广东宏远在这个赛季已经开始更多地使用年轻球员了,在易建联退役之后杜锋希望有一些核心小将挺身而出,所以一些处于球队边缘没有太(体育)第20届厦门马拉松定于11月27日鸣枪开跑新华社厦门11月21日电(记者颜之宏付敏)记者21日从厦门马拉松赛事组委会了解到,在年初经历了一次赛事延期后,2022年厦门马拉松定于11月27日在厦门国际会展中心鸣枪开跑。据赛事壮观的开幕式标志着2022年卡塔尔世界杯的开始2022年卡塔尔世界杯在AlBayt体育场举行的揭幕战中,厄瓜多尔队与东道主卡塔尔队取得了胜利开局在一场令人惊叹的开幕式后开始了。有67372人参加了A组的比赛,由于恩纳巴伦西亚(举报!有人开挂!3人23三分差点合砍100分,无敌啊勇士客场127120战胜火箭,终于是终结了本赛季客场8连败的尴尬纪录。心疼火箭,巅峰时正面打不过,现在勇士状态不对劲了,还是在你身上找自信。不过今天火箭打不过也不丢人,毕竟能把勇士中国男篮力争最好成绩,乔帅有望以老带新,重点考察CBA第二阶段男篮世预赛还剩最后一个窗口期,目前中国男篮已经提前晋级世界杯,下一轮比赛并没有成绩上的压力,不过为了在世界杯分组中占据更好的位置,第六个窗口期仍然会全力以赴,乔尔杰维奇将迎来执教中儿的离去,匆匆忙忙儿啊!你走得如此的匆忙,想必是有紧急的任务在身吧?你离去的那一刻,一定有好多好多的话要对妈妈说吧?我儿从小到大一直都是乖巧而懂事的娃,你的一切都不用爸妈为你而操心,就连到青春期的叛晚安语录清空负能量,是为了给自己卸下负担晚安语录Nov21(1)生活很匆忙,别错过日落和晚霞在每一个值得珍惜的日子里拼命去成为自己想成为的人晚安(2)时间不一定能证明很多东西,但是一定能看透很多东西。坚信自己的选择,不动领导力的根基市面上有很多关于当代领导素质的书籍和课程,其中讲述了各种需要去培养的美德要有耐心而不急躁要真诚而不肤浅要有同理心,不对他人的困扰和问题漠然置之要心胸开阔,不狭隘要弃绝,不自恋要知足63岁卡塔尔太后高奢战袍火了!200万胸针真壕,这哪像63岁?卡塔尔莫扎太后是个传奇女人,她的人生真的可以用披荆斩棘来形容了,说她是卡塔尔的甄嬛,或者是卡塔尔的武则天,可真是恰如其分了。卡塔尔被誉为是富得流油的国家,人均GDP在世界上都是名列重磅!卡塔尔世界杯,且看巴西锋线,梅西一拳难敌多手面对如此豪华的桑巴大军,梅西你准备好了吗?areuready?那么是本届世界杯的最有力争夺者?答案是巴西!自从2021美洲杯之后,巴西还没有品尝过失利的滋味,并且经常在热身赛血洗对卡塔尔世界杯中国元素引台媒关注来源看台海微信视频加载中2022年卡塔尔世界杯11月20日在海湾球场打响。本届世界杯上满满的含中量,成为岛内媒体的关注点。台媒报道称,世界杯上中国元素和中国贡献随处可见,中国制造与