聊天室(一)___常见的基本功能实现

news2024/11/25 16:35:08

最近搞聊天室的人还挺多,正好自己也弄就总结自己遇到必不可少的一些功能,本篇文章主要为自己和看到我文章的人一种思路,希望大家不要把聊天室想的太复杂。

上图是我自己做的一个聊天室,类似微信的单聊群聊收藏等功能,根据自己现有需求,没有加朋友圈功能。

1、如何实现ctrl+回车换行,回车发送消息

如果你做的是 PC 端聊天室,免不了要实现换行功能,又有回车发送的便捷,我们该如何实现呢?

借助键盘的 keydown 事件,判断是否选中回车和 ctrl 键,然后添加对应的操作。具体实现代码如下:


<template>
<textarea
v-model="msg"
type="text"
    class="lemon-editor"
    @keydown="handleKeyCode($event)"
  ></textarea>
</template>
<script setup>
import { ref } from 'vue'
let msg = ref('')
function handleKeyCode(event) {
  if (event.keyCode == 13) {
    if (!event.ctrlKey) {
     //发送消息网络请求
      sendMsg(msg.value, 'TEXT')
      event.preventDefault()
    } else {
      msg.value = msg.value + '\n'
    }
  }
}
</script>

2、如何发送表情

表情就像文字一样很简单的,只不过就是可能稍微麻烦一点,我们需要把表情当作文字一样复制过来,然后遍历展示就 ok 了。

<template>  <div >    <span v-for="item in emojilist " @click="choiceEmoj(item)">      {{item}}    </span>  </div></template><script setup>import { ref } from 'vue'let emojilist = ref(['😁','😂','😃','😄','😅','😆','😉','😊','😋','😌','😍','😏','😒','😓','😔','😖','😘','😚','😜','😝','😞','😠','😡','😢','😣','😤','😥','😨','😩','😪','😫','😭','😰','😱','😲','😳','😵','😷','😸','😹','😺','😻','😼','😽','😾','😿','🙀','🙅','🙆','🙇','🙈','🙉','🙊','🙋','🙌','🙍','🙎','🙏',])let msg = ref('')function choiceEmoj(item) {      console.log('表情', item)      msg.value += item}</script>

上述实例中是一些常见的表情,除此之外你可以加一些适合你项目的常用表情,假设你是卖水果的,你可以加各种水果,如:

let emojilist = ref(['🍇','🍉','🍊','🍋','🍎','🍐','🍒','🍅','🍑','🍌','🍏','🥝','🍓','🥥'  ])

授人之鱼不如授人以渔,大家可以在网站上进行复制,各种表情特殊符号等一应俱全,参考以下链接:

https://www.emojiall.com/zh-hans/categories

3、聊天记录怎么存?

聊天室最重要的就是聊天记录存在哪?人比较多的时候,聊天记录都存储在服务器显然是不太合适,但如果放在本地存储,就会出现换个设备的时候聊天记录丢了,无法找回,大多数都会存储在本地,该如何存储呢?

如上图,聊天分为左右两部分:

<1>左边部分是聊天列表,显示的好友信息,和最后一条聊天内容。

<2>某个好友的所有聊天内容。

chat_list_data 左边聊天列表该如何存储?

我们将好友 id 作为对象的主键,确保好友的唯一性,将好友和聊天内容作为对象内容,每次收到好友信息,或者发送信息时,就需要更新一下。

具体格式如下:​​​​​​​

localStorage.setItem('chat_list_data',{  '1665542413547806722':{    userId:"1665542413547806722",    nickName: "l",    content: "11",    disturb: "N", //是否开启免打扰    num: 0, //未读消息数    personId: "1665554875533844482",    portrait: "https://baidu.com.cn/xzy-ti/2023/05/24/头像.jpg",    time: "2023/06/13 16:49:27"    top: "N",//是否置顶    userType: "normal",//好友状态    windowType: "SINGLE",//聊天类型 单聊、群聊    }})

chat_data 右边聊天记录如何存储?

与上边原理相似,聊天记录是一个大的对象,好友的 userId 作为主键,对象内包含好友信息或群信息以及聊天内容列表,发送或收到内容时,我们只需要更新对应好友的聊天信息就可以。具体存储格式如下:

​​​​​​​

localStorage.setItem('chat_data',{  '1665542413547806722':{    fromInfo: {      nickName: "wj34561",      portrait: "https://www.baidu.com.cn/xzy-ti/2023/06/02/头像.png",      userId: "1666284903407722498",      userType: "normal",    },    groupInfo: {},    list:[      {        content: "{\"url\":\"http://www.xxx.com/170029A001.jpg\",\"name\":\"微信图片_20230504145640_20230607170029A001.jpg\",\"type\":\"jpg\"}"        msgId: "local",        msgType: "IMAGE",        nickName: "zhangshuansuo",        personId: "1665554875533844482",        portrait: "http://xx.com/20230327183917A173.jpg"        time: "2023/06/07 17:00:43",        type: 2, //消息类型 通知、自己发送的、接收到的、发送失败、成功        userId: "1665554875533844482",        windowType: "SINGLE",      }    ]    }})

其中的 content 需要根据发送的聊天内容进行区分,有图片、视频、文字、文件、位置等。以上大家可以作为一个参考,具体的存储格式还是需要根据自己项目去结合。

聊天记录删除、好友删除、添加新好友等操作,关联到聊天记录的都需要更新本地储存的聊天记录,具体的使用 pinia 或 vuex 可自行选择。 

4、消息发送失败如何处理?

发送消息因为网络异常、好友删除、拉黑等因素,会导致消息发送失败,我们需要提示用户消息发送失败,可以进行重试或者提示信息。

给好友发送信息时,根据接口返回的结果,需要对不同类型的失败做对应处理。

不动手感觉没啥问题,做的时候才会知道一眼能看完的东西要做好多东西,希望大家也可以动手实践下,有问题欢迎评论区交流。

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

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

相关文章

python+requests接口自动化框架详解,没有比这个更详细的了

目录 为什么要做接口自动化框架 正常接口测试的流程是什么&#xff1f; 一、接口框架如下&#xff1a; 二、接口的数据规范设计---Case设计 2.1注册接口用例 2.2登录接口用例 三、创建utils包&#xff1a;用来存放公共的类 3.1 ParseExcel.py 操作封装excel的类&#xf…

【AI工具】-Stable Diffusion本地化部署教程

前言 今天我们要介绍的是时下最流行的AI绘图软件Stable Diffusion&#xff0c;虽然Diffusion.ai已经开放api&#xff0c;但是长时间的商业化调用我们需要购买很多的金币。所以我们需要找一个平替的AI绘图平台&#xff0c;现在主流市场中AI绘图软件主要就是OpenAI的DALLE、midj…

SSM会议管理系统

SSM会议管理系统 后端基于SSM、前端基于Freemarker写的会议管理系统、使用JDK8、mysql使用5.7版本 技术栈 Spring SpringMVC MyBatis Mysql Freemarker jqueryajax[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JGo0luHu-1687163482019)(img.png)] …

【Python 随练】打印水仙花数

题目&#xff1a; 打印出所有的"水仙花数"&#xff0c;所谓"水仙花数"是指一个三位数&#xff0c;其各位数字立方和等于该数 简介&#xff1a; 在本篇博客中&#xff0c;我们将解决一个经典的数学问题&#xff1a;打印出所有的水仙花数。水仙花数是指一…

Unity核心5——Tilemap

Tilemap 一般称之为瓦片地图或者平铺地图&#xff0c;是 Unity2017 中新增的功能&#xff0c;主要用于快速编辑 2D 游戏中的场景&#xff0c;通过复用资源的形式提升地图多样性 ​ 工作原理就是用一张张的小图排列组合为一张大地图 ​ 它和 SpriteShape 的异同 共同点&#x…

浅析GPT2中的autoregressive和BERT的autoencoding源码实现

经常使用BERT来做研究&#xff0c;因此对Encoder的架构较为熟悉&#xff0c;但是从来没有了解过GPT这样的Decoder架构&#xff0c;尤其对自回归的形式不知道源码是如何实现的。 为了方便对比和讨论&#xff0c;接来下所探讨的源码都是基于HuggingFace这个框架的。 Bert注意力…

基于亚马逊云科技Serverless,朝夕光年和Second Dinner携手打造年度手游

经典的漫威IP&#xff0c;酷炫的卡牌对战&#xff0c;丰富的故事情节&#xff0c;这款移动游戏《MARVEL SNAP》一经上线就深得全球玩家喜爱。在The Game Awards 2022的年度颁奖典礼上&#xff0c;它更是以出色的表现&#xff0c;一举斩获最佳移动游戏奖项。 其研发公司Second …

【ElasticSearch】中文分词器

ES默认的analyzer&#xff08;分词器&#xff09;&#xff0c;对英文单词比较友好&#xff0c;对中文分词效果不好。不过ES支持安装分词插件&#xff0c;增加新的分词器。 1、如何指定analyzer&#xff1f; 默认的分词器不满足需要&#xff0c;可以在定义索引映射的时候&#…

Python自动办公之合并多个PDF文件

本文基于使用pycharm平台&#xff0c;使用glob库和PyPDF2库实现 首先将需要合并的文件放于一个文件中 如下图 addpdf文件夹为需要合并的文件位置 good.py为代码块 代码如下 print(这个小代码仅仅用于合并pdf文件数量小于10的情况) print() from PyPDF2 import PdfMerger,P…

深度解析DuckDB的ScheduleEvents

深度解析DuckDB的ScheduleEvents 1.ScheduleEventData2.ScheduleEventsInternal3.SchedulePipeline 3.1 Event3.2 PipelineEventStack3.3 主逻辑4.可视化总结 书接上回熬夜三晚之深度解析DuckDB MetaPipeline&#xff0c;MetaPipeline在初始化的时候会构建出下面几个&#xff1…

【ARMv8/v9 异常模型入门及渐进2 - 系统控制寄存器 SCTRL_ELx 介绍】

文章目录 SCTRL_ELx 介绍背景ARMv8 SCTLR_ELx 介绍ARMv9 SCTLR_ELx 介绍 SCTRL_ELx 介绍背景 由于在做DFD 测试过程中需要测试 EL1 状态下的 self-hosted trace 功能&#xff0c;但是这个测试是在UEFI中做的&#xff0c;在开发验证阶段UEFI默认是运行在EL3 下的&#xff0c;所…

mac安装VsCode遇到的问题

万事开头难&#xff0c;头一次在安装生产工具的时候&#xff0c;就遇到了这么棘手的问题。百度和Google都试过了&#xff0c;网上的所有方式对我都没效果。最终自己阴差阳错解决了&#xff0c;我看内外网反馈这个问题的还挺多&#xff0c;在这里记录一下&#xff0c;希望可以帮…

Docker专题系列之十三:docker容器内安装vim编辑器

在使用docker时&#xff0c;有时候我们需要编辑配置文件&#xff0c;需要使用vim或者vi命令&#xff0c;但是会发现&#xff1a; root20ab69bedcdb:/etc/mysql# vim my.cnf bash: vim: command not found这是因为vim没有安装&#xff0c;使用如下命令安装&#xff1a; apt-ge…

Tomcat架构设计

Servlet规范 Servlet是JavaEE规范中的一种&#xff0c;主要是为了扩展Java作为Web服务的功能&#xff0c;统一定义了对应的接口&#xff0c;如Servlet接口&#xff0c;HttpRequest接口&#xff0c;HttpResponse接口&#xff0c;Filter接口。然后由具体的服务厂商来实现这些接口…

adroit java反编译

环境准备 靶机链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;4e5y 虚拟机网络链接模式&#xff1a;桥接模式 攻击机系统&#xff1a;kali linux 2021.1 信息收集 1.探测目标靶机ip地址 arp-scan -l 2.用nmap探测靶机开放端口和服务情况 nmap -p- -A -T4 19…

二分类结局变量Logistic回归临床模型预测—— 模型评价(一)

本节讲的是二分类结局变量的临床模型预测,与之前讲的Cox回归不同,https://lijingxian19961016.blog.csdn.net/article/details/124088364https://lijingxian19961016.blog.csdn.net/article/details/124088364https://lijingxian19961016.blog.csdn.net/article/details/1240…

基于springboot+Redis的前后端分离项目(二)-【黑马点评】

&#x1f381;&#x1f381;资源文件分享 链接&#xff1a;https://pan.baidu.com/s/1189u6u4icQYHg_9_7ovWmA?pwdeh11 提取码&#xff1a;eh11 商户查询缓存&#xff0c;缓存更新策略&#xff0c;缓存穿透 商户查询缓存a.什么是缓存1.为什么要使用缓存2.如何使用缓存 b.添加商…

一文读懂ISM频段

ISM&#xff08;工业、科学、医疗&#xff09;频段为国际电信联盟&#xff08;ITU&#xff09;《无线电规则》定义的指定无线电频段。这些频段是为电信之外的其他射频用途挪出的频段。因此&#xff0c; ISM频段虽然理论上可用于电信用途&#xff0c;但使用ISM频段的电信设备必须…

南卡OE Pro开放式耳机开售,将音质和舒适度提升至行业巅峰!

随着科技的不断发展和创新&#xff0c;开放式耳机作为一种全新的音频体验方式正逐渐走红。而在这个充满竞争的市场上&#xff0c;南卡品牌的最新款OE Pro开放式耳机如今上市&#xff0c;以其出色的表现和全能的功能成为行业的颠覆者。 南卡品牌在骨传导耳机音频技术领域有着超过…

【系统开发】尚硅谷 - 谷粒商城项目笔记(三):OSS阿里云存储

文章目录 OSS阿里云存储OSS基础配置OSS跨域设置原生sdk方式上传阿里云sdk方式上传将oss配置加入nacos加入网关的路由分发和前端整合测试 OSS阿里云存储 OSS基础配置 上传的账号信息存储在应用服务器 上传前先找应用服务器要一个policy上传策略&#xff0c;生成防伪签名 OSS跨…