当前位置: 首页 > news >正文

从零开始用react + tailwindcss + express + mongodb实现一个聊天程序(八) 聊天框用户列表

 简单画了个聊天框 就是咱们的HomePage.jsx

1.后端接口开发

     在server/src/index.js 新增 messagesRoutes

先引入 

import messageRoutes from './routes/message.route.js'

// 消息接口

app.use('/api/messages', messageRoutes)

在routes文件夹下新建message.route.js 有3个路由  左侧用户列表 点击用户获取消息列表  发送消息接口

在controllers下面 新建message.controller.js 先实现获取前端左侧边栏用户列表接口

import User from '../models/user.model.js';

export const getUsersForSidebar = async (req, res) => {

    try {

        // 获取当前登录用户的id

        const loggedInUserId = req.user._id;

        // 过滤用户 所有不等于当前用户id 的用户 .select 查询时排除password

        const filteredUsers = await User.find({ _id: { $ne: loggedInUserId } }).select("-password");

        res.status(200).json(filteredUsers);

    } catch (error) {

        console.log("error in getSidebarUsers: ");

        res.status(500).json({ message: error.message });

    }

}

// 点击左侧用户时,获取该用户与当前用户之间的聊天记录

export const getMessages = async (req, res) => {

}

// 发送消息

export const sendMessage = async (req, res) => {

}

2.测试接口

使用postman测试接口成功

3.前端页面

修改HomePage.jsx页面

 在components下面  新建3个组件 Sidebar NoChatSelected ChatBox

新建useChatStore.js

import {create} from "zustand";

import toast from "react-hot-toast"

import axiosInstance from "../lib/axios";

export const useChatStore = create((set, get) => ({

    users: [],

    selectedUser: null,

    isUserLoading:false,

    getUsers: async () => {

        set({isUserLoading: true});

       try {

            const res = await axiosInstance.get("/messages/users");

            set({users: res.data});

       } catch{

            toast.error("Error while fetching users");

       } finally{

            set({isUserLoading: false});

       }

    },

    // 选择一个联系人

    setSelectedUser: (user) => {

        set({selectedUser: user});

    }

}))

然后我们完善Sidebar.jsx

import { useEffect} from "react"
import { useChatStore } from "../store/useChatStore"
import {User} from "lucide-react"const Sidebar = () => {const {getUsers,users,selectedUser, setSelectedUser,isUsersLoading} = useChatStore()useEffect(() => {getUsers()},[getUsers])if(isUsersLoading) return <div>Loading...</div>return (<aside className="h-full w-20 lg:w-72 border-r border-base-300 flex flex-col transition-all duration-200"><div className="border-b border-base-300 w-full p-5"><div className="flex items-center gap-2"><User  className="size-6" /><span className="font-medium hidden lg:block">联系人</span></div>{/* 在线人员过滤 */}</div><div className="overflow-y-auto w-full py-3">{users.map((user) =>(<buttonkey={user._id}onClick={() => setSelectedUser(user)}className={`w-full p-3 flex items-center gap-3hover:bg-base-300 transition-colors${selectedUser?._id===user._id ? "bg-base-300 ring-l ring-base-300":""}`}><div className="relative mx-auto lg:mx-0"><img src={user.profilePic || "https://picsum.photos/200" }alt={user.userName}className="size-12 object-cover rounded-full"/></div>{/* 用户信息 只在大屏显示 */}<div className="hidden lg:block text-left min-w-0"><div className="font-medium truncate">{user.userName}</div></div></button>))}</div></aside>)
}export default Sidebar

效果如下

 

好这篇就到这 下一篇 实现聊天功能

相关文章:

从零开始用react + tailwindcss + express + mongodb实现一个聊天程序(八) 聊天框用户列表

简单画了个聊天框 就是咱们的HomePage.jsx 1.后端接口开发 在server/src/index.js 新增 messagesRoutes 先引入 import messageRoutes from ./routes/message.route.js // 消息接口 app.use(/api/messages, messageRoutes) 在routes文件夹下新建message.route.js 有3个路…...

Linux网络 TCP全连接队列与tcpdump抓包

TCP全连接队列 在 Linux 网络中&#xff0c;TCP 全连接队列&#xff08;也称为 Accept 队列&#xff09;是一个重要的概念&#xff0c;用于管理已经完成三次握手&#xff0c;即已经处于 established 状态但尚未被应用程序通过 accept( ) 函数处理的 TCP 连接&#xff0c;避免因…...

水滴tabbar canvas实现思路

废话不多说之间看效果图,只要解决了这个效果水滴tabbar就能做出来了 源码地址 一、核心实现步骤分解 布局结构搭建 使用 作为绘制容器 设置 width=600, height=200 基础尺寸 通过 JS 动态计算实际尺寸(适配高清屏) function initCanvas() {// 获取设备像素比(解决 Re…...

鸿蒙通过用户首选项实现数据持久化

鸿蒙通过用户首选项实现数据持久化 1.1 场景介绍 用户首选项为应用提供Key-Value键值型的数据处理能力&#xff0c;支持应用持久化轻量级数据&#xff0c;并对其修改和查询。当用户希望有一个全局唯一存储的地方&#xff0c;可以采用用户首选项来进行存储。Preferences会将该…...

在Ubuntu中,某个文件的右下角有一把锁的标志是什么意思?

在Ubuntu中&#xff0c;某个文件的右下角有一把锁的标志是什么意思&#xff1f; 在 Ubuntu&#xff08;或其他基于 GNOME 文件管理器的 Linux 发行版&#xff09;中&#xff0c;文件或文件夹的右下角出现一把“锁”标志&#xff0c;通常表示 你当前的用户没有该文件/文件夹的写…...

7.1.1 计算机网络的组成

文章目录 物理组成功能组成工作方式完整导图 物理组成 计算机网络是将分布在不同地域的计算机组织成系统&#xff0c;便于相互之间资源共享、传递信息。 计算机网络的物理组成包括硬件和软件。硬件中包含主机、前端处理器、连接设备、通信线路。软件中包含协议和应用软件。 功…...

使用 Docker 部署 RabbitMQ 的详细指南

使用 Docker 部署 RabbitMQ 的详细指南 在现代应用程序开发中&#xff0c;消息队列系统是不可或缺的一部分。RabbitMQ 是一个流行的开源消息代理软件&#xff0c;它实现了高级消息队列协议&#xff08;AMQP&#xff09;。本文将详细介绍如何使用 Docker 部署 RabbitMQ&#xf…...

岛屿的数量(BFS)

给你一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中)。 岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外&#xff0c;你可以假设该网格的四条边均被水包…...

线上JVM OOM问题,如何排查和解决?

今天咱们来聊聊让无数 Java 开发者头疼的 JVM OOM&#xff08;Out Of Memory&#xff0c;内存溢出&#xff09;问题。在面试中&#xff0c;OOM 问题也是面试官的“心头好”&#xff0c;因为它能直接考察你对 JVM 的理解&#xff0c;以及你在实际问题面前的排查和解决能力。 一…...

Linux的缓存I/O和无缓存IO

一、I/O缓存的背景 I/O缓存是指在内存里开辟一块区域&#xff0c;存放用来接收用户输入和用于计算机输出的数据&#xff0c;以减小系统开销和提高外设效率。linux对IO文件的操作分为不带缓存的IO操作和带缓存的IO操作&#xff08;标准IO操作&#xff09;。为什么存在C标准I/O库…...

【弹性计算】弹性裸金属服务器和神龙虚拟化(三):弹性裸金属技术

弹性裸金属服务器和神龙虚拟化&#xff08;三&#xff09;&#xff1a;弹性裸金属技术 1.弹性裸金属技术背景1.1 传统 KVM 虚拟化系统导致 CPU 计算特性损失1.2 传统 KVM 虚拟化系统导致资源争抢不可避免1.3 传统 KVM 虚拟化系统导致 I/O 性能瓶颈 2.弹性裸金属技术实现2.1 VPC…...

【MySQL】(2) 库的操作

SQL 关键字&#xff0c;大小写不敏感。 一、查询数据库 show databases; 注意加分号&#xff0c;才算一句结束。 二、创建数据库 {} 表示必选项&#xff0c;[] 表示可选项&#xff0c;| 表示任选其一。 示例&#xff1a;建议加上 if not exists 选项。 三、字符集编码和排序…...

Hyper-V -docker-vmware 三者的关系

1. Docker 正常运行&#xff0c;需要启动Hyper-V &#xff0c;打开 hypervisorlaunchtype 2.VMware 正常时&#xff0c;需要关闭Hyper-V &#xff0c;关闭 hypervisorlaunchtype 2.1资源管理器->CPU 里要开启虚拟化 2.2 服务-停掉HV服务 2.3 控制面板 不勾选 2.4 …...

IP-----双重发布

目录 6.双重发布 1.重发布的作用 2.部署条件 1.必须存在ASBR 2.种子度量值 3.重发布的规则 4.重发布的数量 5.重发布的场景 1.场景和规则 2.直连和静态 3.动态RIP 4.动态OSPF 5.更改开销值 6.重发布的问题1 7.重发布的问题2 1.流量 2.前缀列表 3.偏移列表 4…...

【新立电子】探索AI眼镜背后的黑科技,FPC如何赋能实时翻译与语音识别,点击了解未来沟通的新方式!

在全球化的今天&#xff0c;语言障碍成为人们沟通与交流的一大难题。AI眼镜作为一种新兴的智能设备&#xff0c;正在通过实时翻译与语音识别功能&#xff0c;打破语言壁垒&#xff0c;为人们提供无缝沟通的解决方案。FPC在AI眼镜中的应用&#xff0c;为实时翻译与语音识别功能的…...

LeetCode 热题 100_寻找两个正序数组的中位数(68_4_困难_C++)(二分查找)(先合并再挑选中位数;划分数组(二分查找))

LeetCode 热题 100_寻找两个正序数组的中位数&#xff08;68_4&#xff09; 题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;先合并再挑选中位数&#xff09;&#xff1a;思路二&#xff08;划分数组&#xff08;二分查找…...

Java多线程与高并发专题——深入ReentrantReadWriteLock

深入ReentrantReadWriteLock 读写锁出现原因 synchronized和ReentrantLock都是互斥锁。如果说有一个操作是读多写少的&#xff0c;还要保证线程安全的话。如果采用上述的两种互斥锁&#xff0c;效率方面很定是很低的。在这种情况下&#xff0c;咱们就可以使用ReentrantReadWr…...

【Python 语法】算法合集

查找二分查找代码大 O 表示法 广度优先搜索代码 狄克斯特拉算法 递归递归调用栈 分而治之&#xff08;divide and conquer&#xff0c;D&C&#xff09;贪心教室调度问题背包问题集合覆盖问题 动态规划背包问题旅游行程最优化 遇到问题时&#xff0c; 如果不确定该如何 高效…...

[STM32]从零开始的STM32 BSRR、BRR、ODR寄存器讲解

一、前言 学习STM32一阵子以后&#xff0c;相信大家对STM32 GPIO的控制也有一定的了解了。之前在STM32 LED的教程中也教了大家如何使用寄存器以及库函数控制STM32的引脚从而点亮一个LED&#xff0c;之前的寄存器只是作为一个引入&#xff0c;并没有深层次的讲解&#xff0c;在教…...

C++ ++++++++++

初始C 注释 变量 常量 关键字 标识符命名规则 数据类型 C规定在创建一个变量或者常量时&#xff0c;必须要指定出相应的数据类型&#xff0c;否则无法给变量分配内存 整型 sizeof关键字 浮点型&#xff08;实型&#xff09; 有效位数保留七位&#xff0c;带小数点。 这个是保…...

【VMware虚拟机】Linux下ubuntu连接网络详细讲解!

原理讲解 window上网需要网络适配器&#xff0c;通过家用路由器下发WLAN&#xff0c;自分配ip地址&#xff0c;连接即用 linux同理&#xff1a;在VMware虚拟机上需要”虚拟路由器“。对应为虚拟网络编辑器 1.打开虚拟网络编辑器 2.点击NAT&#xff0c;NAT模式和DHCP必须选上…...

歌词滚动姬:5分钟掌握专业级歌词制作的艺术

歌词滚动姬&#xff1a;5分钟掌握专业级歌词制作的艺术 【免费下载链接】lrc-maker 歌词滚动姬&#xff5c;可能是你所能见到的最好用的歌词制作工具 项目地址: https://gitcode.com/gh_mirrors/lr/lrc-maker 歌词滚动姬&#xff08;LRC Maker&#xff09;是一款完全免费…...

eLabFTW电子实验室笔记本架构设计与Docker容器化部署指南

eLabFTW电子实验室笔记本架构设计与Docker容器化部署指南 【免费下载链接】elabftw :notebook: eLabFTW is the most popular open source electronic lab notebook for research labs. 项目地址: https://gitcode.com/gh_mirrors/el/elabftw eLabFTW作为开源电子实验室…...

功能子图检测技术在集成电路设计中的应用与优化

1. 功能子图检测技术概述 在集成电路设计领域&#xff0c;功能子图检测是一项基础而关键的技术。简单来说&#xff0c;它就像是在一堆乐高积木搭建的复杂结构中&#xff0c;找出那些功能相同但拼法可能不同的组件模块。这项技术的核心任务是判断一个给定的子图Q是否是目标图G的…...

ESP32/ESP8266固件备份全攻略:esptool与flash_download_tool实战详解

1. 项目概述&#xff1a;为什么我们需要备份ESP32/8266的固件&#xff1f; 在嵌入式开发或者物联网项目中&#xff0c;ESP32和ESP8266这两款芯片的应用已经非常普遍了。无论是做智能家居、数据采集还是各种DIY小玩意儿&#xff0c;我们经常会在上面编写和烧录固件。但不知道你…...

英特尔N150处理器深度解析:从N100升级看嵌入式一体机效能进化

1. 从N100到N150&#xff1a;一次务实且精准的效能升级在嵌入式与一体机领域&#xff0c;选择一颗合适的处理器&#xff0c;往往意味着在性能、功耗、成本和扩展性之间找到那个微妙的平衡点。过去几年&#xff0c;英特尔的N100处理器凭借其出色的能效比&#xff0c;成为了众多办…...

AR/VR智能眼镜主板设计:从高通平台选型到量产调试全解析

1. 项目概述&#xff1a;从芯片到眼镜&#xff0c;一次完整的AR/VR智能眼镜主板设计之旅 最近几年&#xff0c;智能眼镜的浪潮又回来了&#xff0c;但这次不再是简单的信息提示器&#xff0c;而是真正能承载复杂应用、具备独立计算能力的VR/AR终端。我作为硬件开发的老兵&#…...

如何用Red Panda Dev-C++打造轻量高效的C++开发环境

如何用Red Panda Dev-C打造轻量高效的C开发环境 【免费下载链接】Dev-CPP A greatly improved Dev-Cpp 项目地址: https://gitcode.com/gh_mirrors/dev/Dev-CPP 在当今C开发工具日益臃肿的背景下&#xff0c;Red Panda Dev-C以其轻量级架构和现代化功能&#xff0c;为开…...

URDF导入Unity实战指南:坐标系转换与物理仿真校准

1. 为什么URDF导入Unity这件事&#xff0c;2025年依然让人抓耳挠腮你刚在ROS里调通了机械臂的运动学解算&#xff0c;PID参数也压得差不多了&#xff0c;信心满满地想把模型拖进Unity做可视化调试——结果双击URDF文件&#xff0c;Unity弹出一串红色报错&#xff1a;“Unknown …...

STM32F4实战:用CubeMX和HAL库搞定MT6825磁编码器的SPI读取(附完整代码)

STM32F4实战&#xff1a;用CubeMX和HAL库搞定MT6825磁编码器的SPI读取&#xff08;附完整代码&#xff09; 在工业自动化、机器人控制和精密测量领域&#xff0c;高精度角度传感器是不可或缺的核心部件。MT6825作为一款14位绝对式磁旋转编码器芯片&#xff0c;以其SPI接口、0.3…...