PHP框架+gatewayworker实现在线1对1聊天--发送消息(6)

news2025/1/6 19:46:31

文章目录

    • 发送消息原理说明
    • 发送功能实现
      • html部分
      • javascript代码
      • PHP代码

发送消息原理说明

接下来我们发送聊天的文本信息。点击发送按钮的时候,会自动将文本框里的内容发送出去。过程是我们将信息发送到服务器,服务器再转发给对方。文本框的id为msgcontent。
在这里插入图片描述

发送功能实现

html部分

给发送按钮添加一个函数,用来实现发送功能。

<button type="button" class="btn btn-primary" onclick="send_msg()">发送</button>

javascript代码

//下面这些变量都是从控制器的index方法传过来的,聊天过程中会经常用。
 var from_id='{$from_id}';
    var to_id='{$to_id}';
    var from_user_name='{$from_user_name}';
    from_user_name='我';
    var from_avatar='{$from_avatar}';
    var to_user_name='{$to_user_name}';
    var to_avatar='{$to_avatar}';
//发送信息
    function send_msg(){
        var content=$('#msgcontent').val();
        if(content==''){
            return false;
        }
        /*
		*to_id 对方的id
		*content 发送的内容,从文本框获取
		*type 发送的消息的类型,1表示文本,2表示图片,3表情
		*/
        $.post('/chat.php/Chat/send', {"to_id":to_id,"content":content,"type":1}, function(data){}, 'json');
        var html=render_from(content,1);
            $('#chat_content').append(html);
            $('#msgcontent').val('');


    }
    //将自己发送的内容渲染到聊天区域,根据类型不同,渲染不同的效果。
        function render_from(content,content_type){
        var html='<div class="media_right">' +
            '            <div class="media-body">' +
            '                <h4 class="media-heading">'+from_user_name+'</h4>' ;
            if(content_type==1){
            html+='                <p class="chat_msg_right">'+content+'</p>' ;
            }
            if(content_type==2 ){
                html+='                <p class="chat_msg_right"><img src="'+content+'"/></p>' ;
            }
            if(content_type==3 ){
                html+='                <p class="chat_msg_right"><img src="'+content+'" class="emoj_w"/></p>' ;
            }
            html+=
            '            </div>' +
            '            <div class="media-right">' +
            '                <img class="media-object avatar" src="'+from_avatar+'" alt="...">' +
            '            </div>' +
            '        </div>'
        return html;
    }

PHP代码

在ChatController.php里添加下面方法

 public function send(){
		//注册Gateway,必须有
        Gateway::$registerAddress = '127.0.0.1:1238';
        $type=I('type/d',0);
        $to_id=I('to_id/d',0);

        $from_id=$_SESSION['user_id'];
        $message=I('content/s','');
        $db_data=$data=[
            'type'=>'text',
            'content'=>$message,
            'from_id'=>$from_id,
            'to_id'=>$to_id,
            'content_type'=>$type
        ];
        //将聊天内容写入数据库
        $from_user_name=$this->table('user')->where("id={$from_id}")->value('user_name');
        $to_user_name=$this->table('user')->where("id={$to_id}")->value('user_name');
        $t=time();
        $db_data['from_user_name']=$from_user_name;
        $db_data['to_user_name']=$to_user_name;
        $db_data['add_time']=$t;
        $db_data['add_time_f']=format_time($t); //格式化时间
        unset($db_data['type']);
        $chat_id=$this->table('chat')->add($db_data);
        //判断接收方是否在线,在线发送,不在线不用发送给对方
        if(Gateway::isUidOnline($to_id)){
            $data['chat_id']=$chat_id;
            $data['from_user_name']=$from_user_name;
            $data['to_user_name']=$to_user_name;
            $data['from_id']=$from_id;
            $data['to_id']=$to_id;
            $message=json_encode($data);
            // 向uid的网站页面发送数据
            Gateway::sendToUid($to_id, $message);
        }
        //返回给前端的json数据,需要哪些返回哪些,我全返回了。
        return json(['status'=>200,'is_online'=>$is_online,'chat_id'=>$chat_id,'content'=>$data['content'],
            'content_type'=>$data['content_type'],
            'from_user_name'=>$from_user_name,
            'to_user_name'=>$to_user_name,
            'from_id'=>$from_id,
            'to_id'=>$to_id
        ]);
    }

发送消息到这儿就实现了。

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

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

相关文章

DuckDB:密钥管理器及其应用

密钥管理器(Secrets Manager)为所有使用密钥的后端提供了统一的用户界面。密钥信息可以被限定范围&#xff0c;因此不同的存储前缀可以有不同的密钥信息&#xff0c;例如允许在单个查询中连接跨组织的数据。密钥也可以持久化&#xff0c;这样就不需要在每次启动DuckDB时都指定它…

告别Kibana:Elasticsearch 桌面客户端的新变革

告别Kibana&#xff1a;Elasticsearch 桌面客户端的新变革 在大数据处理与分析领域&#xff0c;Elasticsearch 及其相关技术的应用日益广泛。长期以来&#xff0c;Kibana 在数据可视化与查询管理方面占据重要地位&#xff0c;但随着技术的不断发展&#xff0c;用户对于更高效、…

模块化通讯管理机在物联网系统中的应用

安科瑞刘鸿鹏 摘要 随着能源结构转型和智能化电网的推进&#xff0c;电力物联网逐渐成为智能电网的重要组成部分。本文以安科瑞ANet系列智能通信管理机为例&#xff0c;探讨其在电力物联网中的应用&#xff0c;包括数据采集、规约转换、边缘计算、远程控制等技术实践&#…

AAAI 2025论文分享┆一种接近全监督的无训练文档信息抽取方法:SAIL(文中附代码链接)

本推文详细介绍了一篇上海交通大学乐心怡老师课题组被人工智能顶级会议AAAI 2025录用的的最新论文《SAIL: Sample-Centric In-Context Learning for Document Information Extraction》。论文的第一作者为张金钰。该论文提出了一种无需训练的、以样本为中心的、基于上下文学习的…

SAP物料主数据界面增加客制化字段、客制化页签的方式

文章目录 前言一、不增加页签&#xff0c;只增加客制化字段二、增加物料主数据页签 前言 【SAP系统MM模块研究】 #SAP #MM #物料 #客制化 #物料主数据 项目上难免会遇到客户要在物料主数据的界面上&#xff0c;增加新字段的需求。 实现方式有&#xff1a; &#xff08;1&…

ROS2软件架构全面解析-学习如何设计通信中间件框架

前言 ROS&#xff08;Robot Operating System&#xff09; 2 是一个用于开发机器人应用的软件平台&#xff0c;也称为机器人软件开发工具包 (SDK)。 ROS2是ROS1的迭代升级版本 &#xff0c;最主要的升级点是引入DDS&#xff08;Data Distribution Service&#xff09;为基础的…

接口自动化测试流程、工具及其实践

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、接口自动化测试简介 接口自动化测试是指通过编写脚本或使用自动化工具&#xff0c;对软件系统的接口进行测试的过程。接口测试是软件测试中的一种重要测试类…

香橙派5plus单独编译并安装linux内核无法启动的原因分析与解决记录

1 说明 我依照官方手册编译单独编译linux内核&#xff0c;安装后重启出现内核启动失败的问题,编译和安装步骤如下&#xff1a;# 1. 克隆源码 git clone --depth1 -b orange-pi-6.1-rk35xx https://github.com/orangepi-xunlong/linux-orangepi# 2 配置源码 make rockchip_linu…

数据库知识汇总1

一. 数据库系统概述 信息需要媒体&#xff08;文本、图像视频等&#xff09;表现出来才能被人类所获取&#xff0c;媒体可以转换成比特或者符号&#xff0c;这些称为数据&#xff1b; 数据/信息的特点&#xff1a;爆炸式增长、无限复制、派生&#xff1b; 数据库是指长期长期…

Win32汇编学习笔记03.RadAsm和补丁

Win32汇编学习笔记03.RadAsm和补丁-C/C基础-断点社区-专业的老牌游戏安全技术交流社区 - BpSend.net 扫雷游戏啊下补丁 在扫雷游戏中,点关闭弹出一个确认框,确认之后再关闭,取消就不关闭 首先第一步就是确认关闭按钮响应的位置,一般都是 WM_CLOSE 的消息 ,消息响应一般都在过…

OSPF特殊区域(open shortest path first LSA Type7)

一、区域介绍 1、Stub区域 Stub区域是一种可选的配置属性。通常来说&#xff0c;Stub区域位于自治系统的边界&#xff0c;例如&#xff0c;只有一 个ABR的非骨干区域。在这些区域中&#xff0c;设备的路由表规模以及路由信息传递的数量都会大量减少。 kill 4 5类type 传递1 …

论文解读之Generative Dense Retrieval: Memory Can Be a Burden

本次论文解读&#xff0c;博主带来生成式稠密检索&#xff1a;记忆可能成为一种负担的论文分享 一、简介 生成式检索根据给定的查询&#xff0c;自回归地检索相关的文档标识符&#xff0c;在小规模的文档库中表现不错&#xff0c;通过使用模型参数记忆文档库&#xff0c;生成…

vue,使用unplugin-auto-import避免反复import,按需自动引入

项目库&#xff1a;https://github.com/unplugin/unplugin-auto-import 参考&#xff1a; https://juejin.cn/post/7012446423367024676 https://cloud.tencent.com/developer/article/2236166 背景&#xff1a; vue3项目中&#xff0c;基本所有页面都会引入vue3框架的api&…

[深度学习] 大模型学习1-大语言模型基础知识

大语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;是一类基于Transformer架构的深度学习模型&#xff0c;主要用于处理与自然语言相关的各种任务。简单来说&#xff0c;当用户输入文本时&#xff0c;模型会生成相应的回复或结果。它能够完成许多任务&…

OCR图片中文字识别(Tess4j)

文章目录 Tess4J下载 tessdataJava 使用Tess4j 的 demo Tess4J Tess4J 是 Tesseract OCR 引擎的 Java 封装库&#xff0c;它让 Java 项目更轻松地实现 OCR&#xff08;光学字符识别&#xff09;功能。 下载 tessdata 下载地址&#xff1a;https://github.com/tesseract-ocr/…

Vue2/Vue3使用DataV

Vue2 注意vue2与3安装DataV命令命令是不同的Vue3 DataV - Vue3 官网地址 注意vue2与3安装DataV命令命令是不同的 vue3vite 与 Vue3webpack 对应安装也不同vue3vite npm install kjgl77/datav-vue3全局引入 // main.ts中全局引入 import { createApp } from vue import Da…

【JVM】总结篇-字节码篇

字节码篇 Java虚拟机的生命周期 JVM的组成 Java虚拟机的体系结构 什么是Java虚拟机 虚拟机&#xff1a;指以软件的方式模拟具有完整硬件系统功能、运行在一个完全隔离环境中的完整计算机系统 &#xff0c;是物理机的软件实现。常用的虚拟机有VMWare&#xff0c;Visual Box&…

国内Ubuntu环境Docker部署Stable Diffusion入坑记录

国内Ubuntu环境Docker部署Stable Diffusion入坑记录 本文旨在记录使用dockerpython进行部署 stable-diffusion-webui 项目时遇到的一些问题&#xff0c;以及解决方案&#xff0c;原项目地址: https://github.com/AUTOMATIC1111/stable-diffusion-webui 问题一览&#xff1a; …

音频进阶学习九——离散时间傅里叶变换DTFT

文章目录 前言一、DTFT的解释1.DTFT公式2.DTFT右边释义1&#xff09; 复指数 e − j ω n e^{-j\omega n} e−jωn2&#xff09;序列与复指数相乘 x [ n ] ∗ e − j ω n x[n]*e^{-j\omega n} x[n]∗e−jωn复指数序列复数的共轭正交正交集 3&#xff09;复指数序列求和 3.DTF…

【Leecode】Leecode刷题之路第99天之恢复二叉搜索树

题目出处 99-恢复二叉搜索树-题目出处 题目描述 个人解法 思路&#xff1a; todo代码示例&#xff1a;&#xff08;Java&#xff09; todo复杂度分析 todo官方解法 99-恢复二叉搜索树-官方解法 方法1&#xff1a;显式中序遍历 思路&#xff1a; 代码示例&#xff1a;&…