基于 Vue3 和 WebSocket 实现的简单网页聊天应用

首先附上项目介绍,后面详细解释技术细节


1. chat-websocket

一个基于Vue3和WebSocket的简易网络聊天室项目,包括服务端和客户端部分。
项目地址 websocket-chat
下面是项目的主要组成部分和功能:

项目结构

chat-websocket/
|-- server/ # WebSocket 服务端
|   |-- run.js	# 服务端
|   |-- DBManager.js	#数据库对象管理
|-- src/
|   |-- components/
|   |   |-- ...  # Vue 组件
|   |-- assets/
|   |   |-- ...  # 静态资源
|   |-- views/
|   |   |-- Home.vue  # 主要视图组件
|   |   |-- Login.vue  # 登录视图组件
|   |-- router/
|   |-- App.vue
|   |-- main.js
|-- public/
|-- README.md
|-- ...

功能特性

  • 私聊功能:用户可以选择联系人进行一对一私聊,发送即时消息。
  • 群聊功能:用户可以加入群组,与群组成员进行群聊。
  • 修改用户名:用户可以在界面上直接修改自己的用户名。
  • 显示在线(连接)状态
  • 重新连接: WebSocket 断开连接后,用户可以重新连接服务器, 重新连接后, 会加载之前的聊天记录

技术栈

  • 前端框架: 使用 Vue3 作为前端框架,Element Plus 用于 UI 组件。

  • 后端框架: 后端使用 Node.js + Mysql 实现,使用 WebSocket 库 ws 作为 WebSocket 服务端。

  • WebSocket: 实时通信使用 WebSocket 技术,保证消息的实时性。


上面是项目介绍,下面介绍细节

2. 整体设计思路

  1. 前端使用Vue框架,快速搭建聊天室的原型,同时为了美观,使用Element Plus 用于 UI 组件.
  2. 前端页面 包含登陆页面Login和聊天页面Home
  3. 实时通信使用 WebSocket 技术,客户端发送请求,服务端结合数据库进行返回.
  4. 服务端使用Session机制,记录sessions[clientId],增加定时器定时清除session,用于24H过期机制.
  5. 服务端直接使用ws库建立连接,同时使用DBManager操作数据库对象,完成数据处理和传输.
  6. 为了方便消息分类传输,定义消息对象,客户端和服务端共有相同的消息对象.
    消息对象
    一次简单的登陆到获取消息的流程如图:
服务端返回成功,设置session_id,24H后过期
websocket
进入页面直接建立websocket连接
登陆
聊天页面
点击用户或群组
从服务端得到对应消息列表

一次简单的发送和获取消息的流程如图:

服务端接收,保存消息到数据库,并根据用户和群组进行实时转发
用户A发送消息
用户B收到

3. 前端设计实现

3.1 页面设计实现

聊天室布局参考Element Plus提供的布局
在这里插入图片描述
其中头部展示用户信息状态, 左边是群组和用户选择, 主界面就是聊天界面,展示聊天信息.
最终成品如下:
在这里插入图片描述
一些细节解释

  1. 用户头像根据用户名自动生成,用到了ui组件.

在这里插入图片描述

  1. 可以显示用户当前连接状态,当链接断开后,可以重新连接.

  2. 聊天信息包含三要素: 时间, 用户名, 内容, 如图所示.通过v-if判断消息放在左边还是右边
    在这里插入图片描述

  3. 发送栏固定,且接收和发送消息后聊天窗口(列表)自动到达底部.
    在这里插入图片描述

3.2 登陆逻辑设计实现

进入页面后已经建立websocket连接,单击登陆后发送请求,若成功则接收到username,uid,session_id,这三个参数,直接以cookie的形式保存在本地.

在这里插入图片描述
后续进入页面,服务端都会 验证session,进行持久化访问.

3.3 聊天逻辑设计实现

  1. 前端共享使用相同的socket对象.

在这里插入图片描述
在这里插入图片描述

  1. 每次单击群组或用户,根据当前选择发送请求获取接收不同类型消息

    群组消息在这里插入图片描述
    用户消息
    在这里插入图片描述

  2. 还需要在进入页面后获取用户和群组列表进行初始化
    在这里插入图片描述

  3. 无论是接收到群组还是用户消息,直接放入相同的列表,因为两种消息只需要显示三要素即可,后面分别解析
    在这里插入图片描述

4. 后端设计实现

4.1 数据库设计实现

设计数据库包含如下表:
在这里插入图片描述

表名列名数据类型说明
USERuidINTEGER用户ID(主键,自增)
nameVARCHAR(255)用户名
passwordVARCHAR(255)用户密码
GROUPSgidINTEGER群组ID(主键,自增)
nameVARCHAR(255)群组名
GMESSAGEidINTEGER消息ID(主键,自增)
gidINTEGER群组ID
uidINTEGER发送消息的用户ID
gnameVARCHAR(255)群组名
textTEXT消息内容
UMESSAGEidINTEGER消息ID(主键,自增)
s_uidINTEGER发送消息的用户ID
r_uidINTEGER接收消息的用户ID
textTEXT消息内容
timeTIMESTAMP消息发送时间
GROUP_USERuidINTEGER用户ID
gidINTEGER群组ID

还有与各表对应的管理类:
在这里插入图片描述

各表分别继承管理类

在这里插入图片描述

这里使用 Promise 的方式可以更好地处理异步代码

4.2 服务端设计实现

  1. 导入所需的模块和类

    • entity.js: 包含了用户和消息的实体类定义。
    • DBManager.js: 包含了与数据库交互的相关类。
    • ws: WebSocket 模块。
    • 创建了一些表格和实体对象的实例,用于存储和管理用户、群组、消息等信息。
  2. 常量和变量定义

    • SESSION_EXPIRY_TIME: 定义了会话过期时间,以毫秒为单位,用于定期检查会话是否过期。
    • Ws: WebSocket 模块的别名。
    • clients: 存储WebSocket连接的对象。
    • sessions: 存储用户会话信息。
      在这里插入图片描述
  3. 初始化WebSocket服务器

    • 定义一些事件处理函数,如handleOpenhandleClosehandleConnection等。
    • handleConnection中,处理了用户连接时的事件,包括消息的处理。
      在这里插入图片描述
  4. 消息处理

    • handleMessage函数用于处理收到的消息。根据消息类型进行相应的操作,包括群组聊天、获取初始数据、私聊等。
    • 使用数据库表格对象(如groupTablegmessageTable等)进行消息的存储和查询。
    • 通过WebSocket向指定用户或群组发送消息。
      在这里插入图片描述
  5. 用户登录

    • 当收到类型为MessageType.MESSAGE_LOGIN的消息时,处理用户登录逻辑。
    • 检查用户是否存在于数据库中,若不存在则插入新用户。
    • 为用户分配一个唯一的会话ID,将用户信息存储在sessions对象中。
    • 向客户端发送登录成功消息,并携带用户信息和会话ID。
      在这里插入图片描述

sessions的保存形式如下:

                          sessions[clientId] = {uid: uid,username: msg.data.username,ws: this,creationTime: Date.now(),sessionID: clientId,};

定时器判断是否过期

在这里插入图片描述

5. 展示

群组聊天

在这里插入图片描述
在这里插入图片描述

私聊

在这里插入图片描述

在这里插入图片描述

5. 小结

孟宁老师上课旁征博引,时不时与同学们互动 (指让同学们发数字),无论是前端网络编程,网络协议RPC,还是Linux内核网络协议栈,似乎都信手拈来,相信如果认真听课,加上自己的钻研,绝对受益匪浅.

对于这门课程,完全可以说是师傅领进门,修行看个人了,我们深入其中某个方向,也会有所建树.

此前只是接触过JS和Vue,并未熟练掌握它们,这次由于课程原因,尝试完全使用JS作为前后端代码,没有使用熟悉的Python和Java来构建后端,算是对自己的一次挑战.幸好有chatgpt在细节上的协助,结合各类组件丰富的文档,完成了这次项目.

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

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

相关文章

二分查找(非朴素)--在排序数组中查找元素的第一个和最后一个位置

个人主页:Lei宝啊 愿所有美好如期而遇 目录 本题链接 输入描述 输出描述 算法分析 1.算法一:暴力求解 2.算法二:朴素二分算法 3.算法三:二分查找左右端点 3.1查找左端点 3.1.1细节一:循环条件 3.1.2细节二…

pycharm找回误删的文件和目录

昨天不知道做了什么鬼操作,可能是运行了几个git命令,将项目里面的几个文件删除了,有点懵。 我知道pycharm可以找回文件的历史修改记录,但是对于删除的文件能否恢复,一直没试过。 找到删除文件的目录,点击右…

解决RestHighLevelClient报错missing authentication credentials for REST request

使用ElasticSearch Java API时遇到错误 "missing authentication credentials for REST request" 这是代码: RestHighLevelClient esClient new RestHighLevelClient(RestClient.builder(new HttpHost("localhost",9200,"http")));CreateIndexR…

utf8mb4_0900_ai_ci、utf8mb4_0900_as_ci、utf8mb4_0900_as_cs 这三者有什么区别

utf8mb4_0900_ai_ci, utf8mb4_0900_as_ci, 和 utf8mb4_0900_as_cs 是 MySQL 数据库中使用的字符集和校对规则。这些校对规则决定了如何比较和排序字符数据。它们属于 utf8mb4 字符集,这是 UTF-8 编码的超集,支持最多 4 个字节的字符,能够存储…

【开源】基于JAVA语言的创意工坊双创管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 管理员端2.2 Web 端2.3 移动端 三、系统展示四、核心代码4.1 查询项目4.2 移动端新增团队4.3 查询讲座4.4 讲座收藏4.5 小程序登录 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的创意工坊双创管理…

SpringBoot 增量/瘦身部署jar 包

背景 SpringBoot 项目的部署一般采用全量jar 包方式部署相关项目,如果我们对相关的Contrller\Service\Dao\Mapper 层进行相关业务调整就需要重新编译全量jar 包(包大小约为200M左右)实在太麻烦了。 本文:重点讲解使用SpringBoot 的增量/瘦身…

小型企业网设计-课设实验-爆款实验

可以按照我的配置依次配置&#xff0c;成品打包文件&#xff0c;请&#xff1a;Ensp888 <Huawei>sys Enter system view, return user view with CtrlZ. [Huawei]un in en Info: Information center is disabled. [Huawei]# [Huawei]sysname SW5 [SW5]# [SW5]vlan batch…

2007-2022年上市公司华证ESG工具变量数据(原始数据+处理代码+结果)

2007-2022年上市公司华证ESG工具变量数据&#xff08;原始数据处理代码结果&#xff09; 1、时间&#xff1a;2007-2022年 2、范围&#xff1a;上市公司 3、指标&#xff1a;证券代码、id、证券简称、year、华证_ESG综合评级、华证_ESG赋值 、华证_ESG综合得分、华证_E评级、…

Mysql 容易忘的 sql 指令总结

目录 一、操作数据库的基本指令 二、查询语句的指令 1、基本查询语句 2、模糊查询 3、分支查询 4、 分组查询 5、分组查询 6、基本查询总结&#xff1a; 7、子查询 8、连接查询 三、MySQL中的常用函数 1、时间函数 2、字符串函数 3、聚合函数 4、运算函数 四、表…

基于FPGA的数字电路(PWM脉宽调制)

一.PWM的制作原理 假如我们有一个锯齿波&#xff0c;然后在锯齿波上设置一个阈值&#xff08;黑色水平虚线&#xff09;&#xff0c;凡是大于该阈值时输出均为高电平&#xff0c;反之则为低电平&#xff0c;这样我们是不是就得到一个PWM信号呢&#xff1f;如果我们想调整它的占…

【Spring】spring的容器创建

目录 控制反转IOC 依赖注入DI 创建spring的容器方式&#xff1a; 思考&#xff1a; spring整合Junit4 控制反转IOC 把对象的创建和对象之间的调用过程&#xff0c;交给Spring管理&#xff0c;IOC是容器&#xff0c;是思想。&#xff01;&#xff01;&#xff01; 依赖注入…

算法导论复习(十三)最大流

前面一个写从哪里来的&#xff0c;第二个是还可以加多少流量&#xff0c;检查完的画下划线 找到一条增广链以后就对这条链上的数据进行处理 看看反向如何处理 还可以进行第三次检查 最后不能增加了就是最后的结果了

Java关键字(1)

Java中的关键字是指被编程语言保留用于特定用途的单词。这些关键字不能用作变量名或标识符。以下是Java中的一些关键字&#xff1a; public&#xff1a;表示公共的&#xff0c;可以被任何类访问。 private&#xff1a;表示私有的&#xff0c;只能被定义该关键字的类访问。 cl…

超详细YOLOv8姿态检测全程概述:环境、训练、验证与预测详解

目录 yolov8导航 YOLOv8&#xff08;附带各种任务详细说明链接&#xff09; 搭建环境说明 不同版本模型性能对比 不同版本对比 参数解释 模型解释 训练 训练示意代码 训练数据与.yaml配置方法 .yaml配置 数据集路径 标签数据说明 训练参数说明 训练过程示意及输出…

系列六、Consul

一、Consul 1.1、概述 Consul是一套开源的分布式服务发现和配置管理系统&#xff0c;由HashiCorp公司用Go语言开发。他提供了微服务系统中的服务治理、配置中心、控制总线等功能。这些功能中的每一个功能都可以单独使用&#xff0c;也可以一起使用以构建全方位的服务网格&…

【Web】vulhub-httpd apache解析漏洞复现(1)

目录 ①CVE-2017-15715 ②apache_parsing_vulnerability ①CVE-2017-15715 贴出源码&#xff1a; <?php if(isset($_FILES[file])) {$name basename($_POST[name]);$ext pathinfo($name,PATHINFO_EXTENSION);if(in_array($ext, [php, php3, php4, php5, phtml, pht]))…

Oracle VirtualBox中Linux系统基本使用方法——备赛笔记——2024全国职业院校技能大赛“大数据应用开发”赛项

前言 小北的这篇博客介绍的是关于用VirtualBox中下载好的ubuntu系统中&#xff0c;为搭建Hadoop平台所做的命令操作准备&#xff0c;希望能帮助不会的人有指引作用。 没有安装好VirtualBox中的ubuntu系统以及创建Hadoop账户的请参考小北之前的三篇博客&#xff1a; ubuntu18…

申请虚拟VISA卡Fomepay教程

fomepay 用下面的注册链接直达 https://gpt.fomepay.com/#/pages/login/index?dS21BA1 或者扫描下面图片的二维码直达注册 注册后尽量随用随充值不建议放大量现金在里面。

Java基础02-Java编程基础

文章目录 变量&#xff08;Variables&#xff09;局部变量和成员变量局部变量&#xff08;Local Variables&#xff09;成员变量&#xff08;Instance Variables&#xff09; 标识符&#xff08;Identifiers&#xff09;八种基本数据类型原始数据类型&#xff08;Primitive Dat…

uniapp中组件库的丰富NumberBox 步进器的用法

目录 基本使用 #步长设置 #限制输入范围 #限制只能输入整数 #禁用 #固定小数位数 #异步变更 #自定义颜色和大小 #自定义 slot API #Props #Events #Slots 基本使用 通过v-model绑定value初始值&#xff0c;此值是双向绑定的&#xff0c;无需在回调中将返回的数值重…