基于PHP实现一个简单的在线聊天功能

一直很想试着做一做这个有意思的功能,感觉复杂的不是数据交互和表结构,麻烦的是前端展..于是..

需求分析

要实现功能,首先要做前端,经过对比其他网站的在线聊天功能,发现除了基本的聊天功能以外,还要注意以下几点.

1.一次只能和一个人聊天,但是可以随意切换其他人.
2.如果用户是从"发送消息" 入口进来的,那么当前马上就切换到对应的聊天窗口,而且如果之前有过聊天记录,应该把聊天记录也展示出来.
3.如果是从"我的消息" 入口进来的,那么应该不显示任何聊天记录.等待选择聊天对象.
4."我"发送的消息显示在右边,"对方"发送的消息显示在左边,也可以相反,总之要不一样.
5.切换聊天的时候不能刷新整个页面,否则体验很差.  发送消息也同理,所以应该用ajax.
6.要保证在线聊天的及时性,应该每隔一段很短的时间,就要与服务端通信,也就是说要轮询ajax.

前端页面

经过简单的需求分析,然后又找了找其他的网站,对比了一下功能在界面的展示,最终确定界面. 然后花了几个小时做好了.

成品
这里写图片描述

这是最终全部做完(包括后端) 的效果.

点击左侧可以切换,下方多行文本框,输入聊天信息,然后点击发送.

整个流程大概就是这样.

数据库

回头来看需求, 很明显,首先要有一张表格,存放双方的对话,想了想决定这样定义字段:
这里写图片描述
主要是这两个字段:
user_id 表示消息发送的主体
chat_user 表示消息接收的主题

这样定义的好处是,可以轻易从一条消息中轻易辨别哪个是发送方,哪个是接收方,为前端的展示做准备.

但是这样还不够

有了这张表,就可以通过当前登录的session中的用户ID, 去进行查询,可以得知在跟哪些人聊天. 但是这样并不方便,而且要进行复杂的处理.

1.假设有一条消息是己方发送的,那么就插入数据 ‘己方’ ‘对方’ ‘内容’,同时可以知道当前聊天中的一个人是’对方’.
2.但是假设有一条消息是对方发送的,对当前用户来说,数据就是 ‘对方’ ‘己方’ ‘内容’.

也就是说,想要实现多人聊天,就要获取当前正在跟 ‘我’ 聊天的用户们.不论是对方发送的,还是 ‘我’ 发送的,都应该计算在内. 要对数据库遍历两次,而且很多对当前来说是重复,无用的数据. 在”获取聊天对方的主体” 这一步时, 只需要知道两个人是否有聊天关系即可,具体内容不用关心.

所以还要一张聊天关系表. 我是这样定义字段的:
这里写图片描述

其中user_id 和 chat_user 为双主键,不能同时相等. 这样就只记录了聊天关系,不记录聊天内容,搜索起来也方便得多.
‘我’ 是user_id ‘对方’ 是chat_user

举个例子 第一个字段表示 我与ID为9的用户 有一个聊天关系, 所以在’我’的界面上,就应该有这个用户. 同理 第二条字段表示 对方与我有聊天关系,那么在对方的界面上,就要有我这个用户.

一般来说聊天关系是相互的, 但是也可以删除. 删除聊天关系并不等于删除聊天记录.
比如,在我的界面上,我把与9号用户的聊天关系删除了,那么我就看不到与9号用户的聊天信息了, 但是对9号用户来说,我还在他的界面上,随时可以向我发送消息. 当他向我发送消息时,服务端又要生成一条数据 ‘我’ ‘对方’ ,这样,我与对方的聊天关系又建立起来了,同时,聊天记录一直都没有被删除过,所以,当重新建立聊天关系时,可以展示出聊天记录.

而且,删除聊天关系后, 我也可以重新发起聊天, 再次建立聊天关系.
所以这张表建立之后提供很多方便, 上面分析的需求,展示聊天记录,也可以很好的完成.

代码就不放了,说一下实现思路

首先,主要功能有一个控制器,两张表,两个模型. 至于头像,昵称什么的,不计算在主要功能内.

控制器MessageController 一共有五个方法.

1.showPage() ,用来应对非ajax请求,用户通过浏览器访问时,比如第一次进入聊天界面,就是通过浏览器访问的,这时候调用showPage方法,这时候,后台只获取聊天关系(第四个方法),展示在界面左侧. 其他不作处理.

2.newChat(),用来应对非ajax请求, 比如我通过用户个人资料页面,点击发送消息,这时候就调用这个方法. 先判断聊天关系是否存在,如果存在就不处理,如果不存在,就插入一个聊天关系. 并且要获取所有聊天关系(第四个方法),最新的排上面,把用户ID转到界面上.为后面做准备.

3.getChatText(), 用来应对ajax请求. 用来获取聊天信息.
‘我’ 这个用户来到聊天界面上后, 前端就开始进行ajax轮询.不停访问getChatText()这个方法. 这时有两种情况.

1 当前正在与某个用户聊天,js就发送一个请求到getChatText方法,参数是对方的用户ID.  因为'我'的ID 可以从服务端session获取到.然后通过这两个信息去数据库获取聊天消息.返回json格式,js进行数据处理,节点操作,等等,然后把消息展示出来.2.当前没有正在与某个用户聊天,那ajax暂不启动,当选择了聊天对象的时候再启动轮询.

4.getChatTemp()方法,获取当前登录用户的聊天关系. 作为一个工具函数,供第一个和第二个函数使用.

5.pushChat(),用来应对ajax请求, 也就是发送消息请求. 把聊天消息插入数据库而已.

差不多就这样.

总体实现了在线聊天的基本功能,但是有缺陷, 获取聊天消息的时候,我是无论有没有新消息,都全部获取到. 然后清空聊天框,再填充.
这样的结果是, 当聊天信息很多的时候,滚动条会有问题, 每次发送消息,滚动条都会先滚动到最上面,再滚动下来. 有个解决方案是,在聊天关系上加一个字段,存储两个人的消息数. 获取完数据的时候,先统计一下,看看是不是比原来的多了,如果多了,就只获取多的数据,然后更新消息数目. 如果没多,那就舍弃数据,不做处理.

其实一开始就是这么想的,但是不知道后面为什么又做成了全部获取.
失算啊失算.

以上.

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

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

相关文章

【黄啊码】微信小程序+php实现即时通讯聊天功能

一、PHP7安装Swoole扩展 PHP swoole 扩展下载地址 Github:https://github.com/swoole/swoole-src/tags php官方扩展库:http://pecl.php.net/package/swoole 开源中国:http://git.oschina.net/swoole/swoole/tags 1、自定义安装 # 下载wg…

【黄啊码】我问ChatGPT如何学习PHP语言,它是这么说的

大家好,我是黄啊码,最近大家都在流行整chatGPT,今天它来了!别人都在吹嘘它万能,能够代替程序员写代码,今天我们就让它教教我们学习PHP语言: 黄啊码: 如何有效学习php语言&#xff1…

【亲测可运营】PHP匿名在线聊天室/语音聊天室/多国语言版在线聊天室

简介 PHP匿名在线聊天室源码/自定义群组聊天系统/可设置密码支持自适应多端访问运营版,一款支持多国语言的在线群聊系统源码,可以新建一个群组,然后设置密码,或者公开访问都可以,聊天都是匿名的,方式还是不…

开悟和通货膨胀!!!

大家好,我是txp,今天给大家聊一个非技术性的话题:开悟和抵抗通货膨胀。 不知道大家看到这两个词的时候,是什么感觉,可以停顿一下,让自己思考一下! 在展开这个话题之前,我先总结一下自…

网红马斯克的无聊公司

西雅图IT圈:seattleit 【今日作者】拖拉机 IT圈里烧柴油的干货担当 16年底 美国钢铁侠 埃隆马斯克 成立了一家叫做 The Boring Company (无聊公司) 的微商公司 开始的时候 马斯克声称这家公司 主要从事挖隧道这种无聊的工作 然而这家公司的主…

UE4 摇杆JoyStick-Touch Interface Setup

1.创建 2、属性 USTRUCT() struct FTouchInputControl {GENERATED_USTRUCT_BODY()//自由活动图片// basically mirroring SVirtualJoystick::FControlInfo but as an editable classUPROPERTY(EditAnywhere, Category"Control", meta(ToolTip"For sticks, this …

算法:第一节课Master定理

1、ctex:要求用Tex编辑器进行作业的书写 2、与东大本科有差距,还需要多点努力才行。 3、 4、考试不考概念 5、 6、时间复杂度和空间复杂度 7、算法好坏的评价标准 8、基本运算 9、时间复杂度 10、第二章:重要的来了 11、 12、 13、 假设矩阵…

马斯克 超级计算机,特斯拉布局超级计算机 野心是全自动驾驶

美东时间周一举行的2021年计算机视觉和模式识别会议上,特斯拉人工智能与自动驾驶视觉部门主管安德烈卡帕蒂(Andrej Karpathy)公布了特斯拉超级计算机集群Dojo。卡帕蒂表示,Dojo尚未进行基准测试,根据FLOPS的排名来看,第五位的英伟…

100offer举办的「寻找实干和坚持的技术力量」开源项目投票排名分析程序

2019独角兽企业重金招聘Python工程师标准>>> 由于100offer举办的「寻找实干和坚持的技术力量」开源项目投票活动没有按照票数排序的功能,所以本文写了个小程序来实现这个功能,代码如下: import org.jsoup.Jsoup; import org.jsoup…

qt解析joystick飞行摇杆按键信息

项目场景: 最近入手一款图马斯特飞行摇杆,本来是想用来玩游戏,但是想到以前做过遥控车,如果用这个来代替遥控器应该比较爽,于是用Qt编写了一个解析手柄按键信息的demo软件。 测试效果还不错:下面是demo软…

马思特中国实现2020年全年盈利目标300%

近日,全球著名的金属加工液解决方案企业马思特液体解决方案(以下称“马思特”)公布了2020年度中国区业绩,基于公司在技术研发和人力资源两方面的投入和行业优势,2020年度马思特中国在疫情蔓延下仍然逆势向上&#xff0…

马斯洛提出动机理论_动机理论:工作背后的动力机制

是什么在激励你努力工作呢?下面的要素你是如何排序的?通过填写这样的题项,我们大致能了解到一个人工作的动机是什么,作为雇主我们能根据自身的情况挑选我们需要的某种动机类型的员工,或者设计出更高效的方式来更好满足已有员工需求,为员工创造更大的价值,最终也能够让员…

先进制造业不断发展,马思特以三大优势服务中国市场

近日,马思特液体解决方案(以下称“马思特”)公布中国区业绩。得益于公司团队的密切协作,马思特中国2020上半年即实现全年盈利目标的140%。 “在如此困难的时期一家公司能够保持盈利,有赖于所有员工的共同努力。”马思特…

马思特php,全面解析曝光图马思特t300和t300rs有何区别?哪个好?爆料真实使用心得...

这两款图马思特t300和t300rs区别还是有的哈,款式和配置是不一样的,图马思特T300RSTH8A手柄套餐更大气一些,我自己用的是图马思特T300RSTH8A手柄套餐,性价比蛮高的,款式也是我喜欢的,多时尚的,整…

如何评价马云和马斯克在世界人工智能大会的对话?

来源:刘锋的未来课堂 马云和马斯克在世界人工智能大会的对话,虽然风轻云淡,天马行空,但两个人其实是针锋相对的,马云的观点是认为人工智能还是人类的工具,为人类的未来提供服务,马斯克继续保持他…

C++面向对象编程(类和对象)

全部学完提供一个练习的项目,在博主的主页可以找到该免费资源 文章目录 一、封装示例1:访问权限struct 和 class 区别检测数据有效性:练习1:练习2:构造函数析构函数构造函数的调用和分类拷贝构造函数调用时机初始化列表…

马斯克要求推特工程师默写代码,开始着手整顿美国职场?

要说世间谁最熟悉代码,程序员敢说第二,应该没人敢称第一。但这群和代码打交道最多的人,也会被代码难住,比如被要求默写一段代码! 最近,马斯克要求推特工程师默写代码登上热搜榜,成为网友们讨论…

互联网日报 | 3月22日 星期一 | 苹果iMac Pro全球下架;知乎更新上市招股书;字节跳动成立朝夕光年奇想基金...

今日看点 ✦ 知乎更新招股书:最高融资超10亿美元,腾讯阿里京东认购 ✦ 字节跳动成立朝夕光年奇想基金(NIF),将投资游戏创业团队 ✦ 京东云联合京东物流、京东生鲜共同打造“京东冷链溯源平台” ✦ 工商银行资产托管规模…

关于苹果开发者协议更新的相关问题

最近进入开发者中心相信大家都会看到如下图所示的信息,同时最近很多道友在群里咨询有关开发者协议更新的问题,基本可以肯定的是密保问题答案给忘记了,忘记密保问题就真的不能更细协议了?当然不是,接下里就给大家介绍一…

ChatGLM2-6B、ChatGLM-6B 模型介绍及训练自己数据集实战

介绍 ChatGLM-6B是开源的文本生成式对话模型,基于General Language Model(GLM)框架,具有62亿参数,结合模型蒸馏技术,实测在2080ti显卡训练中上(INT4)显存占用6G左右, 优点:1.较低的部署门槛: FP16 半精度下,ChatGLM-6B 需要至少 13GB 的显存进行推理&a…