uniapp+node.js前后端做帖子模块:获取帖子列表(社区管理平台的小程序)

目录

  • 0前提
  • 1.一些准备
    • 1.1表
      • 帖子表 post
      • 帖子评论表 postComment
      • 帖子点赞表 postLike
    • 1.2总体思路
  • 2.前端
  • 3.后端


👍 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富!


0前提

温馨提示:我做的思路可能是复杂化了,如果你觉得可以更加简便的话欢迎分享到评论区或者自己改写一下我的代码,我的后端是写的很简单的没有什么路由分发是直接写的,你可以自由优化
小程序的其他部分你可以看看我往期的文章

1.一些准备

1.1表

帖子表 post

字段名称类型(长度)允许空主键外键自增唯一说明
idint帖子id
titlevarchar(20)标题
contentvarchar(20)内容
imagesvarchar(200)详情表
classificationvarchar(20)帖子分类
likesint点赞数
commentsint评论数
sharesint分享数
userIdint用户id
communityIdint小区id
creatTimetimestamp创建时间
updateTimetimestamp数据改变时的时间

帖子评论表 postComment

字段名称类型(长度)允许空主键外键自增唯一说明
idint帖子评论id
contentvarchar(20)内容
imagesvarchar(200)详情表
postIdint帖子id
userIdint用户id
creatTimetimestamp创建时间
updateTimetimestamp数据改变时的时间

帖子点赞表 postLike

字段名称类型(长度)允许空主键外键自增唯一说明
idint帖子点赞id
postIdint帖子id
userIdint用户id
creatTimetimestamp创建时间
updateTimetimestamp数据改变时的时间

1.2总体思路

我这里做的社区管理平台的小程序,一个平台有很多小区,每一个小区都有自己的帖子模块,这里就是做的帖子模块的功能,用户进入首页时是进入到默认小区的首页。
当进入小区时,获取这个小区的帖子列表,还要区分用户是登陆情况还是没有登录下的获取帖子列表,当时用户登陆了之后还需要重新查询一下帖子列表,因为帖子列表上的帖子的点赞状态和用户有关,我们需要去判断一下帖子列表其中的帖子是否被这个用户点赞过然后变化帖子的点赞状态(在本文展示代码没有去判断用户是否登录,是直接默认用户登陆之后的去获取小区的帖子列表)

返回的帖子列表里面的帖子信息包括(发帖人头像和昵称,帖子分类,帖子标题,帖子内容,帖子图片,点赞数,回复数,分享数,是否被当前用户点赞,帖子的发布时间)

2.前端

前端:当进入首页时,页面加载的时候获取当前小区的帖子列表。在methods里面写好获取帖子列表的方法再去到onLoad里面去调用这个方法。先去全局变量vuex去获取到用户id和小区id(这个可以页面加载的时候先去获取本地数据然后赋值到全局变量中)然后发起请求url拼接参数(或者你可以将这个数据写在data里面,如果写在url后端接收就是req.query,如果是data就是req.body),然后将返回回来的帖子列表赋值到本页面中

<view class="tiezilist"><view v-for="(post, index) in postList" :key="index" class="tiezi" ><!-- 用户头像和昵称 +帖子分类--><view class="head"><view class="zuo"><image :src="post.avatar" mode="" class="img1"></image><view ><text>{{ post.nickname }}</text></br><text>{{ post.createTime }}</text></view></view><view class="you">#{{ post.classification }}</view></view><!-- 帖子标题、内容和图片 --><view class="" @click="goTieziDetails(post.id)"><view class="title">{{ post.title }}</view><view class="content">{{ post.content }}</view><view class="img"><image v-for="(image, imgIndex) in post.images" :key="imgIndex" :src="image" mode="" class="img3"></image></view></view><!-- 点赞、评论、分享图标和数字 --><view class="icons"><view><uni-icons :type="post.isLiked ? 'hand-up-filled' : 'hand-up'" @click="handleLike(post)"></uni-icons> {{ post.likes }}</view><view><uni-icons type="chat"></uni-icons>{{ post.comments }}</view><view><button @click="share(post)" open-type="share"   class="button"><uni-icons type="redo"></uni-icons></i>{{ post.shares }}</button></view></view></view>
</view>
  onLoad() {this.getCommunityPosts();},methods: {// 获取小区帖子列表async getCommunityPosts() {const communityId = this.$store.state.communityId;const userId = this.$store.state.user.id; // 当前用户IDconst res = await this.$myRequest({method: 'get',url: '/getCommunityPosts?communityId=' + communityId + '&userId=' + userId});//去判断帖子列表里面每一个帖子被用户点赞的的数据是不是大于0的是大于0点赞状态没有大于0就没有点赞状态if (res.data) {this.postList = res.data.map(post => {post.isLiked = post.likesByCurrentUser > 0;return post;});}},}

3.后端

后端:当前端传来用户id和小区id时去数据库里面查询这个小区id对应的帖子数据,再去查其中帖子点赞表里面的数据的对应用户id点赞过的帖子id,还有处理一下帖子里面的图片将字符串转为数组和帖子发布的时间处理一下

// 获取小区的帖子列表
app.get('/getCommunityPosts', (req, res) => {const userId = req.query.userIdconst communityId = req.query.communityIdconnection.query('SELECT post.*, user.name, user.avatar, COUNT(pl.id) AS likesByCurrentUser ' +'FROM post ' +'INNER JOIN user ON post.userId = user.id ' +'LEFT JOIN postLike pl ON post.id = pl.postId AND pl.userId = ? ' +'WHERE post.communityId = ? ' +'GROUP BY post.id',[userId, communityId],(error, results) => {if (error) {console.error(error);return res.status(500).json({error: 'false'});}// 处理帖子的图片字段,将逗号分割的字符串转为数组results = results.map(post => {post.images = post.images.split(',');post.createTime = formatTime(post.createTime); //将数据库中的时间格式转为前端显示的格式return post;});return res.json(results);});
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/708208.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IOC 和 AOP

IOC 所谓的IOC&#xff08;inversion of control&#xff09;&#xff0c;就是控制反转的意思。何为控制反转&#xff1f; 在传统的程序设计中&#xff0c;应用程序代码通常控制着对象的创建和管理。例如&#xff0c;一个对象需要依赖其他对象&#xff0c;那么它会直接new出来…

LNMP架构搭建

前言 LNMP架构是一种用于搭建Web服务器环境的解决方案&#xff0c;它由Linux、Nginx、MySQL&#xff08;或MariaDB&#xff09;、PHP&#xff08;或Python或Perl&#xff09;这四个开源软件组成。这种架构通常用于搭建高性能的网站和Web应用程序。 目录 一、编译安装nginx …

MySQL里的两个“二次”

文章中所有图片均来自网络 一、double write 第一个二次是mysql一个崩溃恢复很重要的特性-重复写入。 doublewrite缓冲区是位于系统表空间中的存储区域&#xff0c;在该区域中&#xff0c;InnoDB会在将页面写入数据文件中的适当位置之前&#xff0c;从InnoDB缓冲池中刷新这些页…

服务器常见的问题及解决方案

在面对硬件结构复杂、繁琐的服务器&#xff0c;企业不免会遇到服务器发生异常问题或者是出现系统故障的情况&#xff0c;从而导致重要数据的丢失&#xff0c;给企业造成巨大的损失&#xff0c;那么面对服务器异常&#xff0c;我们应该如何进行解决呢? 1.用户无法访问页面 对于…

React中使用useActive

1.引入 import { useActivate } from "react-activation";2.React Activation 在React中使用react-activation,其实就是类似于Vue中的keep-alive&#xff0c;实现数据的缓存&#xff1b; 源码&#xff1a; import { ReactNode, ReactNodeArray, Context, Component…

vue3+vite+ts配置多个代理并解决报404问题

之前配置接口代理总是报404,明明接口地址是对的但还是报是因数写法不对;用了vue2中的写法 pathRewrite改为rewrite 根路径下创建env文件根据自己需要名命 .env.development文件内容 # just a flag ENVdevelopment# static前缀 VITE_APP_PUBLIC_PREFIX"" # 基础模块…

为高频大功率设计的双面水冷厚膜电阻方案

EAK双面水冷厚膜电阻是一种具有良好散热性能的电阻器&#xff0c;常用于需要高效散热的电子设备中。其包括第一绝缘介质层、厚膜电阻层、第二绝缘介质层以及用于液体流通的金属腔体&#xff0c;第一绝缘介质层设置于金属腔体的上表面&#xff1b;第一绝缘介质层表面设有厚膜电阻…

Vue2:路由组件缓存技术

一、情景说明 我们的页面中 可能同时存在多个路由组件需要切换 有些路由组件中有input等输入框&#xff0c;当输入了内容后&#xff0c;点击其他组件按钮 再次切换回来时&#xff0c;内容被清空了 这样&#xff0c;用户体验就很差 这里&#xff0c;就用到路由组件缓存技术 二…

java常见的应用场景

Java 在软件开发、企业应用、移动应用、游戏开发等领域都有广泛的应用。 软件开发&#xff1a;Java 是一门功能强大的编程语言&#xff0c;可用于开发各种类型的软件&#xff0c;包括网站、桌面应用、嵌入式系统等。 企业应用&#xff1a;Java 是一种广泛用于企业级应用开发的…

nginx反向代理之缓存 客户端IP透传 负载均衡

一 缓存功能 缓存功能可以加速访问&#xff0c;如果没有缓存关闭后端服务器后&#xff0c;图片将无法访问&#xff0c;缓存功能默认关闭&#xff0c;需要开启。 相关选项&#xff1a; ​ proxy_cache zone_name | off; 默认off #指明调用的缓存&#xff0c;或关闭缓存机制;C…

MySql-多表设计-一对一

目录 一对一 一对一 一对一关系表在实际开发中应用起来比较简单&#xff0c;通常是用来做单表的拆分&#xff0c;也就是将一张大表拆分成两张小表&#xff0c;将大表中的一些基础字段放在一张表当中&#xff0c;将其他的字段放在另外一张表当中&#xff0c;以此来提高数据的操…

kali linux通过aircrack-ng命令破解wifi密码

相关阅读&#xff1a;如何破解攻击WiFi 百度安全验证https://baijiahao.baidu.com/s?id1764248756021219497&wfrspider&forpc上面2篇文章写得都很不错 一、前期准备工作 1、将无线网卡挂载到Kali上 ​ 将无线网卡插到电脑上&#xff0c;如果弹出检测到新的USB设备&…

10、电源管理入门之OPP介绍

目录 1. 什么是OPP,怎么用? 2. 系统初始化加载OPP信息 3. 触发使用 4. API介绍 之前的文章设置clock的时候多次提到了(Operating Performance Point)OPP,例如DEVFreq、CPUFreq等,在现代SoC上存在有Power Domain,也可以以Power Domain为单位进行OPP的电压频率定义。 …

成人年龄判断(个人学习笔记黑马学习)

结合前面学习的input输入语句&#xff0c;完成如下案例: 1.通过input语句&#xff0c;获取键盘输入&#xff0c;为变量age赋值。(注意转换成数字类型) 2.通过if判断是否是成年人&#xff0c;满足条件则输出提示信息&#xff0c;如下&#xff1a; 欢迎来到黑马儿童游乐场&#x…

什么是Rust 语言

Rust 是一种专注于性能和内存安全的系统编程语言&#xff0c;其设计目标包括提供&#xff1a;零开销抽象、移动语义、内存安全、线程无数据竞争、类型安全和实时 gc 等功能。Rust 使用 RAII&#xff08;Resource Acquisition Is Initialization&#xff09;管理资源&#xff0c…

Window系统安装USB Redirector结合cpolar实现远程访问本地USB设备

文章目录 前言1. 安装下载软件1.1 内网安装使用USB Redirector1.2 下载安装cpolar内网穿透 2. 完成USB Redirector服务端和客户端映射连接3. 设置固定的公网地址 前言 USB Redirector是一款方便易用的USB设备共享服务应用程序&#xff0c;它提供了共享和访问本地或互联网上的U…

图论|207. 课程表 210. 课程表 II

207. 课程表 你这个学期必须选修 numCourses 门课程&#xff0c;记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出&#xff0c;其中 prerequisites[i] [ai, bi] &#xff0c;表示如果要学习课程 ai 则 必须 先学习课程 …

Spark Bloom Filter Join

1 综述 1.1 目的 Bloom Filter Join&#xff0c;或者说Row-level Runtime Filtering&#xff08;还额外有一条Semi-Join分支&#xff09;&#xff0c;是Spark 3.3对运行时过滤的一个最新补充   之前运行时过滤主要有两个&#xff1a;动态分区裁剪DPP&#xff08;开源实现&am…

MongoDB聚合运算符:$concat

文章目录 语法举例 $concat聚合运算符返回多个字符串连接后的结果。 语法 { $concat: [ <expression1>, <expression2>, ... ] }<expression>可以是任何可以解析为字符串的表达式。如果表达式解析为null或引用的字段不存在&#xff0c;则返回null。 举例 …

迭代器模式:分离遍历逻辑与数据结构,实现统一访问接口与灵活扩展

文章目录 一、引言二、应用场景与技术背景三、模式定义与实现四、优缺点分析总结&#xff1a; 一、引言 ​ 迭代器模式&#xff08;Iterator Pattern&#xff09;是一种行为型设计模式&#xff0c;它提供了一种方法顺序访问聚合对象的元素&#xff0c;而又不暴露其底层表示。迭…